STM32 PWM CCR配置解析

博客指出原子哥的STM32 PWM输出例程中,对捕获/比较寄存器(CCR)的设置存在不合理之处。执行PWM_Init函数后定时器开始工作,但CCR2寄存器为默认值0,前面若干个PWM周期占空比非预期。还提到TIM_OC2Init函数会影响CCR2赋值,精准控制PWM输出需注意CCRx初始化时间和定时器开启时间。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

原子哥的主函数如下,

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

TIM_Cmd(TIM3, ENABLE);

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

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

  /* 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;

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

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

2、定时器的开启时间

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值