跳转到主要内容

STM32 PWM CCR配置解析

cathy 提交于

在原子哥的PWM输出例程中,感觉对捕获/比较寄存器(CCR)的设置不太合理。

原子哥的主函数如下,

<center><img src="http://mcu.eetrend.com/files/2022-01/博客/100556988-239515-1.png&quot; alt=“STM32 PWM CCR配置解析"></center>

TIM_SetCompare函数设置CCR2的值,从而改变PWM的占空比,但是在上面PWM_Init函数中,最后一段代码是

<pre style="overflow-x:auto; background-color:#e9e9e9;"></center>TIM_Cmd(TIM3, ENABLE);</pre>

所以执行完PWM_Init函数后,定时器已经开始工作,但是此时的CCR2寄存器的值我们并没有设置过,所以应该是默认值0,即前面若干个PWM周期的占空比不是我们想要得到的。只有函数执行到上图红色方框中的TIM_SetCompare2函数后,才会设置目标CCR2的值,从而得到目标占空比。

下面是STM32 固件库中TIM_OC2Init函数的源码(截取),可以看到,在初始化TIM_OCInitTypeDef结构体的时候,通过TIM_Pulse成员变量设置了CCR2 的值,但是在原子哥的例程中并没有该结构体变量的初始化。并且在TIM_OC2Init函数之前调用TIM_SetCompare函数设置CCR2的值是无效的,因为TIM_OC2Init函数中会以默认值重新赋给CCR2寄存器。

<pre style="overflow-x:auto; background-color:#e9e9e9;"> /* Write to TIMx CR2 */
TIMx->CR2 = tmpcr2;

/* Write to TIMx CCMR1 */
TIMx->CCMR1 = tmpccmrx;

/* Set the Capture Compare Register value */
TIMx->CCR2 = TIM_OCInitStruct->TIM_Pulse;

/* Write to TIMx CCER */
TIMx->CCER = tmpccer;</pre>

如果想要精准地控制PWM输出,需要注意以下两点:

1、CCRx寄存器的初始化时间。

2、定时器的开启时间。

————————————————

版权声明:本文为CSDN博主「菁华如风」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_37253168/article/details/117439766
免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。