你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】STM32 PWM CCR配置解析

[复制链接]
STMCU小助手 发布时间:2022-5-2 09:09
在的PWM输出例程中,感觉对捕获/比较寄存器(CCR)的设置不太合理。
# o$ o3 I2 {$ x/ N9 D8 w! o$ G5 t8 k1 r
原子哥的主函数如下,9 Z$ D% x! E; H) X
% G/ [! q" c& F
T3GOGAYIQB)8~BR7Z)`6`KY.png 8 m% e! E3 D% s

7 C; r# b+ e  h  W2 OTIM_SetCompare函数设置CCR2的值,从而改变PWM的占空比,但是在上面PWM_Init函数中,最后一段代码是
5 L/ v- Z3 S0 P  c7 U, I) R: P& O
  1. TIM_Cmd(TIM3, ENABLE);
复制代码

& F: b5 G( f1 V  S* G所以执行完PWM_Init函数后,定时器已经开始工作,但是此时的CCR2寄存器的值我们并没有设置过,所以应该是默认值0,即前面若干个PWM周期的占空比不是我们想要得到的。只有函数执行到上图红色方框中的TIM_SetCompare2函数后,才会设置目标CCR2的值,从而得到目标占空比。
* e: [/ c% a+ {8 x6 I
$ B; ~) d) B* A. Z下面是STM32 固件库中TIM_OC2Init函数的源码(截取),可以看到,在初始化TIM_OCInitTypeDef结构体的时候,通过TIM_Pulse成员变量设置了CCR2 的值,但是在原子哥的例程中并没有该结构体变量的初始化。并且在TIM_OC2Init函数之前调用TIM_SetCompare函数设置CCR2的值是无效的,因为TIM_OC2Init函数中会以默认值重新赋给CCR2寄存器。4 b6 d' I- D+ k4 s) v- p% V' e5 ]
- B& J5 {- a# w' U! k+ m
  1.   /* Write to TIMx CR2 */9 L6 C9 X) c% Y" C( }
  2.   TIMx->CR2 = tmpcr2;
      R& P4 `0 T+ E

  3. % l0 v2 P, @0 X& {: v* d, @* E
  4.   /* Write to TIMx CCMR1 */
    % e7 {) h, u5 s/ X- S
  5.   TIMx->CCMR1 = tmpccmrx;
    : r3 c6 U2 @' u: c+ L/ N- c
  6. # v! z9 ?  M( G: V
  7.   /* Set the Capture Compare Register value */" c! S" J) D( R
  8.   TIMx->CCR2 = TIM_OCInitStruct->TIM_Pulse;7 g+ W8 d  P1 b' m, V& e: f& f
  9. ; }) p! u4 A  S% h4 |) P4 p
  10.   /* Write to TIMx CCER */) `" L6 M9 _* N6 r* {5 ~
  11.   TIMx->CCER = tmpccer;
复制代码
! O  g- z9 R, J: L* M' ~
如果想要精准地控制PWM输出,需要注意以下两点:
% h/ K$ u" U  z( N  ~
, l. O: `2 `+ G$ Y% H  U1、CCRx寄存器的初始化时间" V6 F7 x* \1 u  ^% `( r) w
. v- G7 X7 O8 S+ H( T
2、定时器的开启时间7 l  l, {: n1 E

% P& I! {( }) z; d. C0 S) I1 f# W: e+ k; D, U

- F, w2 |: q* y* V, f9 e
赞 收藏 评论0 发布时间:2022-5-2 09:09

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版