STM32 PWM占空比的计算及输出比较时CCR不同

下面的这个是stm32的定时器逻辑图,上来有助于理解:

STM32 PWM占空比的计算及输出比较时CCR不同

 

TIM3的ARR寄存器和PSC寄存器,

确定PWM频率。
这里配置的这两个定时器确定了PWM的频率,我的理解是:PWM的周期(频率)就是ARR寄存器值与PSC寄存器值相乘得来,但不是简单意义上的相乘,例如要设置PWM的频率参考上次通用定时器中设置溢出时间的算法,例如输出100HZ频率的PWM,首先,确定TIMx的时钟,除非APB1的时钟分频数设置为1,否则通用定时器TIMx的时钟是APB1时钟的2倍,这时的TIMx时钟为72MHz,用这个TIMx时钟72MHz除以(PSC+1),得到定时器每隔多少秒涨一次,这里给PSC赋7199,计算得定时器每隔0.0001秒涨一次,即此时频率为10KHz,再把这个值乘以(ARR+1)得出PWM频率,假如ARR值为0,即0.0001*(0+1),则输出PWM频率为10KHz,再假如输出频率为100Hz的PWM,则将ARR寄存器设置为99即可。如果想调整PWM占空比精度,则只需降低PSC寄存器的值即可。

注:这里以3.5库函数与之对应

ARR的周期值对应   TIM_TimeBaseStructure.TIM_Period  的设置值

PSC的分频值对应   TIM_TimeBaseStructure.TIM_Prescaler 的设置值

所以,分频值算出的是多长时间涨一次,那么ARR的值算出的是一个周期是多少次即 PSC*(ARR+1),这其实算出的时间,即一个周期所需要的时间,PWM频率就是这个值的倒数。如:设定频率为2K,分频设为8999。则72000K/(8999+1)=8K,算出时间为0.000125S涨一次,2K对应的周期是0.0005S。所以ARR的值应设为0.0005/0.000125=4。当然这里只是预算的值,这个值不能太小,太小了,就识别不出来了。实际的测试也是发现,值不对,什么输出都没有的情况。这里要特别的注意。

总结一下:PWM频率=(72000K/(PSC+1))/ARR

TIMx_CCRx寄存器,

确定PWM的占空比。
TIMx_CCR1—TIMx_CCR4确定定时器的CH1—CH4四路PWM的占空比。直接给该寄存器赋0—65535值即可确定占空比。占空比计算方法:TIMx_CCRx的值除以ARR寄存器的值即为占空比,因为占空比在0—100%之间,所以一般TIMx_CCRx寄存器值不能超过ARR寄存器的值,否则可能会引起PWM的频率或占空比的准确性。

//占空比其实更简单,即占周期的个数

TIMx_CCRx的值即为捕获到的值

总结一下公式为:占空比值/100=设置值/ARR  设置值=(占空比值/100)*ARR

其中,设置值对应库   TIM_OCInitStructure.TIM_Pulse  的值

 


处于输出比较模式时,CCR寄存器的值为比较值。当计数器计到这个值时会发生相应的动作