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

STM32互补PWM输出使能控制

[复制链接]
STMCU小助手 发布时间:2023-1-6 16:29
STM32的高级定时器TIM1可以产生互补的PWM,并且可以通过相关寄存器的设置使能或关闭PWM的输出。在编写BLDC的驱动程序时,本人利用TIM1的channel1,2,3三个通道生成了三路互补的PWM波形,定时器驱动程序如下:
. f$ G3 c6 \6 `/ `9 G
  1. void TIM1_Init(u16 arr, u16 psc)
    2 K& S9 Y6 s  m2 q. U
  2. {
    ' J1 u3 I( S4 w6 `" `+ X8 Q) v% v
  3. GPIO_InitTypeDef         GPIO_InitStructure;+ o3 d) ~- Y7 M, I
  4. TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
    5 }1 }4 {$ `8 ^( K; U" c
  5. TIM_OCInitTypeDef       TIM_OCInitStructure;! Y9 k0 m- O3 T+ O) \. S
  6. TIM_BDTRInitTypeDef      TIM_BDTRInitStructure;/ O) d; `) o% N! n

  7. % i5 v1 Q2 u% f2 w- D
  8. RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1 | RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB,ENABLE);  
    * `- A+ h' I8 _% i
  9. ( L5 o! e. O$ P& Q" n
  10. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10;3 w0 I; S/ ^' s5 n1 l( X* v
  11. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  $ u( D0 h: P$ U8 @$ K
  12. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    ! j0 I) {2 t7 _( @$ Y
  13. GPIO_Init(GPIOA,&GPIO_InitStructure);
    : L2 O$ T- g0 o5 Z/ D* i( R- \

  14. . R  d% ~! x3 k3 J/ m
  15. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;1 K; O" u& W0 C+ E( a2 S
  16. GPIO_Init(GPIOB,&GPIO_InitStructure);* P* v0 o5 ^" Y, c* c

  17. 1 K  T' m0 D! I' G& H; M# C
  18. TIM_DeInit(TIM1);) [* s, J0 s; I3 a: E
  19. TIM_TimeBaseInitStructure.TIM_Period = arr;     / g5 n6 `& w9 E( Z
  20. TIM_TimeBaseInitStructure.TIM_Prescaler = psc;  9 A: s1 B& o* p, d" O' L; ?' X
  21. TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;   
    ' p9 G/ `2 J6 ~
  22. TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
    3 X8 I6 `0 A: `. v; c
  23. TIM_TimeBaseInit(TIM1,&TIM_TimeBaseInitStructure);
    9 I8 d/ |5 H  p- _
  24.   l2 [/ l2 O  e+ ~6 _( C2 \
  25. TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;0 q) m: C5 w3 P' b$ l
  26. TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
    . N) n# Y& z6 O$ k
  27. TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;, j& G$ B. }! I& Q5 K; Z
  28. TIM_OCInitStructure.TIM_Pulse = 0;% g7 G/ A, F% M; e8 w/ k0 I
  29. TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;& l8 \9 D/ P2 V1 W
  30. TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;
    & a. D0 Q3 p7 S0 f. {
  31. TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset;     9 r/ I$ V+ O6 g/ n
  32. TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset;
    0 P: l8 n% _7 s6 W
  33. - K4 {' h6 z: t; g+ J- }, N
  34. TIM_OC1Init(TIM1, &TIM_OCInitStructure);
    , Y0 M# Y$ Y" i, W! u% X! [
  35. TIM_OC2Init(TIM1, &TIM_OCInitStructure);
    : @* J6 a0 U* w, b$ k' k
  36. TIM_OC3Init(TIM1, &TIM_OCInitStructure);9 o, t$ ?5 S- Y  @) j

  37. ' x& p9 B. d' K1 R' E+ _# X: R
  38. TIM_OC1PreloadConfig(TIM1,TIM_OCPreload_Enable);
    4 S- A* _1 c3 M) d% `% [- _# T
  39. TIM_OC2PreloadConfig(TIM1,TIM_OCPreload_Enable);* p* x" E( ?/ B
  40. TIM_OC3PreloadConfig(TIM1,TIM_OCPreload_Enable);% ^4 ~/ A. X! r( @' |
  41. % }! I" Q/ p( J/ l( D( R
  42. TIM_BDTRInitStructure.TIM_OSSRState = TIM_OSSRState_Enable;
    5 e+ q9 o) J, V' d! {% P
  43. TIM_BDTRInitStructure.TIM_OSSIState = TIM_OSSIState_Enable;  x7 f) G/ D  T1 H8 @7 x0 a* C
  44. TIM_BDTRInitStructure.TIM_LOCKLevel = TIM_LOCKLevel_OFF;. p% C5 T# R$ c5 l2 |* f
  45. TIM_BDTRInitStructure.TIM_DeadTime = 0;3 S* n7 h5 W- x& o8 \
  46. TIM_BDTRInitStructure.TIM_Break = TIM_Break_Disable;               
    6 ?! m+ M" F! N5 s
  47. TIM_BDTRInitStructure.TIM_BreakPolarity = TIM_BreakPolarity_Low;  V% ^  H9 ?) Q; i' h
  48. TIM_BDTRInitStructure.TIM_AutomaticOutput = TIM_AutomaticOutput_Disable;
    " v2 U- D9 @/ E8 A
  49. TIM_BDTRConfig(TIM1, &TIM_BDTRInitStructure);6 u( o) @6 z, b6 H& u
  50. , o- j/ s( O$ @0 M* P( s
  51. TIM_Cmd(TIM1, ENABLE);) y; @: q, _7 c! K
  52. TIM_CCPreloadControl(TIM1,ENABLE);
    : s7 r& t6 i+ K  u: W; F
  53. TIM_CtrlPWMOutputs(TIM1, ENABLE);' e3 w' X. y5 ]" m( J7 r7 @. N4 t
  54. }
    * l5 I2 r4 Z+ S# W1 K0 d
复制代码
9 E/ K2 _  Y0 D# V
该函数配置了PWM的GPIO,定时器以及死区控制等。产生的波形如图1所示
/ k) K* `) Z. w# _% n6 A) V" ]$ \9 K
20170104200150086.jpg / i" j5 b3 }* \+ R
7 l  a8 o+ B& l7 v6 D5 L' g( j
当我想要控制某些通道的输出(比如使能通道1的输出CH1,但是关闭其互补输出CH1N),利用下面两个函数发现TIM1依旧输出两路互补的PWM。这个函数最终操作的寄存器是捕获/比较使能寄存器TIMx->CCER。
; e3 m- m3 a0 e  F- ]TIM_CCxCmd(TIM1, TIM_Channel_1, TIM_CCx_Enable);. U% m' R' g6 a# [
TIM_CCxNCmd(TIM1, TIM_Channel_1, TIM_CCxN_Disable);
) o# M8 ?# E( w5 u2 e9 B
3 X! N0 |( s$ F1 J  C8 v
经过调试发现在定时器初始化函数中一个函数的调用:TIM_CCPreloadControl(TIM1,ENABLE);( l& P" z2 t8 }4 a* M" i
注释掉这句之后,或者将ENABLE改为DISABLE,才能实现关闭通道1的互补输出,如图2所示:5 k  D# A2 \! w) c4 s+ L

# i6 Y  r) O; @) |. @ 20170104201137481.jpg ( L+ i, w8 V4 n- X4 Y, b
) W6 R- ^# \/ D# ~& L  s. W# v
此时通道1CH1输出PWM波形,其互补通道CH1N输出低电平。/ m. ^6 r' E: M+ p3 L

, J+ o6 M! d& D; I分析发现,TIM_CCPreloadControl()函数最终操作的是控制寄存器 2(TIMx_CR2)的第0位CCPC。查阅STM32的数据手册,描述如下:
4 i8 {; J- T1 l) q- R- NCCPC:捕获/比较预装载控制位 (Capture/compare preloaded control)
+ T# _2 W9 _. Q4 h& _7 [0: CCxE, CCxNE和OCxM位不是预装载的;/ Q- r8 A. i$ A) X; f- q5 K( Y
1: CCxE, CCxNE和OCxM位是预装载的;设置该位后,它们只在设置了COM位后被更新。
1 a+ x. M5 |; L! ^4 J$ b- ]注:该位只对具有互补输出的通道起作用。$ V: R1 M3 H" u  x

# b  g. g3 i+ R* H1 T1 m也就是说如果使能了预装载,只有在COM事件发生后值才能写入影子寄存器(影子寄存器才是真正起作用的寄存器),产生作用。同时该位只对互补输出起作用,因此对于普通定时器来说,无论该位是否被设置,都有可以通过TIM_CCxCmd()函数使能或者关闭PWM的输出。6 C5 p. l: o* B( F4 [! q$ A
' d  |( [- Y) Y. ?& K9 K/ X1 a
想要让定时器的PWM输出低电平(高电平),也可以将相对的 寄存器TIMx->CCR1置零(大于arr),但是此时互补通道只能为高电平(低电平)。而通过关闭PWM的输出,可以让两个互补的通道输出更多的电压组合。
. s* F/ m1 v+ K7 S) {————————————————
; f' K( [0 Q; r1 d5 S版权声明:GroupHuang2 r$ n7 z1 ~4 ^- \, X) v

& |2 J# P7 ~; P! _( w- F
. ?4 V3 X& i9 z+ {1 n8 _
赞 收藏 评论0 发布时间:2023-1-6 16:29

举报

0个回答

所属标签

相似技术帖

官网相关资源

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