- 打卡等级:常住居民II
- 打卡总天数:81
- 最近打卡:2025-06-02 13:37:13
超级版主
- 积分
- 12522
|
代码的解释很清楚的:
PWMA_CCR1=100; //设置占空比时间
PWMA_ARR=500; //设置周期时间
你只设置CCR1, 不改ARR,则PWM周期或频率不变,最大占空比100%,超过了不管给多大的值,都是100%!
你要先根据PWM周期或频率,计算ARR,然后再根据占空比计算CCR1。
#define FOSC 40000000UL
u32 frequency, period; //PWM频率、周期
float duty; //占空比, 0.0~1.0
u16 pscr; //前置分频 0~65535
u16 load_period; //装载的PWM周期数(PWM时钟数)
u16 load_duty; //装载的PWM占空比(PWM时钟数)
period = FOSC / frequency; //由PWM频率计算PWM周期
pscr = (u16)(period / 65536UL); //计算分频系数
load_period = (u16)(period / (pscr+1)); //计算装载周期值. 当period >= 65536, 则load_period在32768~65535之间,尽量得到最精确的数值。
load_duty = (u16)((float)load_period * duty); //计算装载占空比值, duty为占空比0.0~1.0.
PWMA_PSCR = pscr; // 预分频寄存器
PWMA_ARR = load_period; //设置周期时间
PWMA_CCR1 = load_duty; //设置占空比时间
|
|