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

【经验分享】利用STM32F103的高级定时器产生三路互补PWM波形,占空比可调,带死区

[复制链接]
STMCU小助手 发布时间:2022-4-21 21:00
- S! N# C4 ?! g- \0 b5 a3 e9 ?: a
  1. void timer_init(void)
    1 _# r, L/ k& s8 l
  2. {+ g' i0 X% ^8 S) L
  3.         GPIO_InitTypeDef  GPIO_InitStructure;
    7 K; S3 l( K) g6 @, I9 D
  4.         TIM_TimeBaseInitTypeDef TIM_BaseInitStructure;. h0 g0 t" A* n9 t% i4 n
  5.         TIM_OCInitTypeDef TIM_OCInitStructure;. x. _& c! }8 d# P. o, U
  6.         TIM_BDTRInitTypeDef TIM_BDTRInitStructure;; m/ H4 S3 h5 f
  7.         
    ! \3 m' D5 ~3 D- p4 G
  8.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOD,ENABLE);( M) h5 V' m& q* b* q! i
  9.         - W" F7 w+ d  n# C4 s
  10.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);0 ^8 q* ]" I/ _5 ?2 e
  11.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);( R7 \+ W- ~# p6 k3 M& B
  12.         . C5 p0 O/ c9 M
  13.         
    & S# a3 I- n8 V+ h
  14.         GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10;' t# C: t+ |; [, M2 a6 S
  15.         GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
    , @$ u, `3 M" o3 [4 \5 l5 C
  16.         GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
    & `9 `/ w8 b' g+ E+ l. K
  17.         GPIO_Init(GPIOA,&GPIO_InitStructure);' i, g- ^2 u8 C1 x
  18.         
    " Y! K+ q2 r7 `8 M+ d* W
  19.         4 h! @+ j5 m% \4 J* h
  20.         GPIO_InitStructure.GPIO_Pin=GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;1 c. S6 M$ B. X. S8 ~
  21.         GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;( u2 E( U+ f4 G- T9 n! q1 t+ {
  22.         GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
    ) n' U; T5 d# ]; `: V
  23.         GPIO_Init(GPIOB,&GPIO_InitStructure);
    1 j) N9 C8 c% q1 w+ O
  24.         
    1 E! I( d9 }) l& a3 O2 h$ }4 z
  25.         TIM_BaseInitStructure.TIM_Period=1000-1;8 b4 s/ Q8 t4 H1 c& [0 ?
  26.         TIM_BaseInitStructure.TIM_Prescaler=72-1;
    + _- Z9 ^2 R  g( y
  27.         TIM_BaseInitStructure.TIM_ClockDivision=0;( n- o; a' q. u0 B' B
  28.         TIM_BaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;  C+ ]1 ~6 d3 M! }# r8 T& L9 h: ~/ `
  29.         TIM_BaseInitStructure.TIM_RepetitionCounter=0;4 v  x4 t* d0 T1 p6 K0 S: X! H2 C
  30.         TIM_TimeBaseInit(TIM1,&TIM_BaseInitStructure);//启用ARR的影子寄存器(直到产生更新事件才更改设置) TIM_ARRPreloadConfig(TIM1,?ENABLE);
    $ s, A7 [8 b# D4 T5 I
  31.         3 ^& L( o8 X7 y# k# ~1 t
  32.         //TIM1_OC1模块设置(设置1通道占空比)( _' X' L' L! Y6 G2 d1 `
  33.         TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
    : V* W: o" y! J. e+ ?  o
  34.         TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;+ H: Z/ t6 _1 U' l8 ^/ I
  35.         TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;
    7 U: J$ p) G$ W; U5 V8 r$ e
  36.         TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;, X) _- U. w8 l% d1 |
  37.         TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;
    1 \& P7 z& Z4 P) d
  38.         TIM_OCInitStructure.TIM_Pulse = 120;//TIM1_Pulse设置了待装入捕获比较寄存器的脉冲值  
    8 c$ a1 I6 q9 s+ j! j7 \9 t# F
  39.         
    2 \" v5 t! h& I) x4 L
  40.         TIM_OC1Init(TIM1,&TIM_OCInitStructure);  //启用CCR1寄存器的影子寄存器(直到产生更新事件才更改设置)
    , B3 D: e) N- N7 A: F
  41.         TIM_OC1PreloadConfig(TIM1,TIM_OCPreload_Enable);5 b* `% A0 z: U

  42. 6 B% q% z" g; `; o! o7 W9 x

  43. % Y+ b9 L. W) V3 N
  44.         //TIM1_OC2模块设置(设置2通道占空比)& K/ C: ~2 s4 R

  45. 8 n4 `& S' c3 Y" _: }
  46.         TIM_OC2Init(TIM1, &TIM_OCInitStructure); //启用CCR2寄存器的影子寄存器(直到产生更新事件才更改设置)
    . V( |3 F3 s8 p. m) a# S& j
  47.         TIM_OC2PreloadConfig(TIM1, TIM_OCPreload_Enable); 7 A: L, ~) F# U" b! m9 v5 W! ?7 ~

  48. . o7 f  z& t1 J0 ~2 Q! ?
  49.         //TIM1_OC3模块设置(设置3通道占空比)* e. G8 A6 a% U7 P* L9 [6 r/ Q' Y
  50. 3 v4 [2 i: ]( n! L' s# q6 D* g
  51.         TIM_OC3Init(TIM1, &TIM_OCInitStructure); //启用CCR2寄存器的影子寄存器(直到产生更新事件才更改设置)& m7 b/ D1 }7 f! M
  52.         TIM_OC3PreloadConfig(TIM1, TIM_OCPreload_Enable); ) J* E  X7 @  W
  53.         //死区设置
    7 I% i( D, N. M9 z: V" y2 G0 a
  54.         TIM_BDTRInitStructure.TIM_OSSRState = TIM_OSSRState_Enable;9 f0 _" w  s$ k8 I
  55.         TIM_BDTRInitStructure.TIM_OSSIState = TIM_OSSIState_Enable;
    - n' }2 Y$ q# E. d) [% g4 K
  56.         TIM_BDTRInitStructure.TIM_LOCKLevel = TIM_LOCKLevel_OFF;
    / A: J1 a6 W! a
  57.         TIM_BDTRInitStructure.TIM_DeadTime = 0x90; //这里调整死区大小0-0xff0 h$ z, V* j6 }" P- b8 j& I
  58.         TIM_BDTRInitStructure.TIM_Break = TIM_Break_Disable;( j4 d9 a1 a/ n
  59.         TIM_BDTRInitStructure.TIM_BreakPolarity = TIM_BreakPolarity_High;
    * S) P$ ]0 _! N
  60.         TIM_BDTRInitStructure.TIM_AutomaticOutput = TIM_AutomaticOutput_Enable;
    + Q, I4 H' Z! I/ I0 S. F; N6 E
  61.         TIM_BDTRConfig(TIM1, &TIM_BDTRInitStructure); $ _$ m( F3 k3 {
  62.         
    9 H6 a9 \+ v# o9 U
  63.         //TIM1开启7 |3 ?; `( Z1 ]* R
  64.         TIM_Cmd(TIM1, ENABLE);. E: o0 e/ M3 K; Q- L! l) b3 N! g
  65.         //TIM1_OC通道输出PWM(一定要加)0 y1 f3 ^5 w2 Q
  66.         TIM_CtrlPWMOutputs(TIM1, ENABLE);- p, A- ?( l5 y- n0 _
  67.         3 Q. d0 _: }6 p
  68.         
    1 Z) y( l9 i1 M- R: e" I! O
  69. }
    ! D2 k, }+ R9 b5 h9 b( ?6 m/ f

  70. 3 y; O8 N2 `0 X$ k

  71. . P! t) K3 b. |5 C' V" x$ Y; \

  72. ' X1 b9 Y( O' J+ U! P% s8 |% w) \1 o" b
复制代码
0 w0 l, F4 N, ]) {
赞 收藏 评论0 发布时间:2022-4-21 21:00

举报

0个回答

所属标签

相似技术帖

官网相关资源

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