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

stm32L053的PWM

[复制链接]
强仔00001 发布时间:2015-1-7 01:24
本帖最后由 强仔00001 于 2015-1-13 18:44 编辑 / Q+ Q! s% J( w2 l0 @7 E

, ^" [8 k& l8 U, W6 Q+ ~  K
学到单片机,肯定会弄到PWM这个功能,其实PWM说白了也就是定时器产生的,PWM的应用很广泛,如电机和电源等方面。STM32L053系列64pin只有3个定时器,如下图:
QQ截图20141202013522.png
定时器2有4个通道,而定时器21和定时器22各有两个通道。所以最多只能输出8路PWM。
对于我们一般的应用足以了。定时器2是挂在APB1桥的,而定时器21和定时器22挂在APB2桥的,这个大家要注意。
! p" ?7 H2 f  [$ e- t: Q
现在我的例程是打开定时器2的CH1和CH2,然后输出PWM。首先我们先决定哪个脚作为PWM输出口,我这里就选择了PA0和PA1作为PWM输出口。如下图的管脚功能分布图:
QQ截图20141202014319.png
打开管脚复用的初始化使用以下函数:
QQ截图20141202014454.png
PWM参数的初始化代码如下:
  1. void Config_PWM(int PULSE1_VALUE, int PULSE2_VALUE)! t0 U, e$ @9 S7 a! [' [; x. O6 h2 B) M
  2. {
    8 B- z# V+ B8 T& ]7 O
  3.         TIM_OC_InitTypeDef sConfig;
    4 Z. U$ K, e$ q
  4.   TIM_HandleTypeDef    TimHandle;5 G* C0 B7 H2 u. i6 ~, @& h
  5.         : g% S$ t( f$ N- R' H8 \2 j
  6.         TimHandle.Instance = TIM2;8 y( Z. T+ @. }, @8 M5 @: Y+ l
  7.   
    - {' o4 J5 H0 V# Q- ]" A
  8.   TimHandle.Init.Prescaler     = 1;
    - T5 s- c" Z$ w& Q
  9.   TimHandle.Init.Period        = 1599;
    8 X9 A+ c3 y9 x1 F$ i
  10.   TimHandle.Init.ClockDivision = 0;3 O  e8 D; {& {
  11.   TimHandle.Init.CounterMode   = TIM_COUNTERMODE_UP;, H/ I7 f+ W" `% k7 d
  12.   if(HAL_TIM_PWM_Init(&TimHandle) != HAL_OK)
    + i2 \& t) f0 f& q8 h8 r% p' ~
  13.   {8 F: ^8 f( i: M3 f% |
  14.     /* Initialization Error */
    / x7 ~2 C! g3 C6 S: U, k. f# }, D" r# L
  15.     Error_Handler();* T' h8 r# V, h2 g
  16.   }& d/ H" K' H& p% p# h
  17.         
    , z" e- `9 g8 x$ b
  18.         ; G6 W3 a& R7 k) c( b! ^' z0 W
  19.         
    ) A9 O8 Q& P) a) D
  20.   sConfig.OCMode     = TIM_OCMODE_PWM1;% P1 k' ^" w. z3 Z) f
  21.   sConfig.OCPolarity = TIM_OCPOLARITY_HIGH;
    3 c+ U1 R" r; N! G6 b
  22.   sConfig.OCFastMode = TIM_OCFAST_DISABLE;$ _/ \* \4 P) I! A3 k! y5 J! Q+ W: U

  23. , J; }) s! {& K% X% w
  24.   /* Set the pulse value for channel 1 */6 E( X* s& R/ n0 g' X1 l
  25.   sConfig.Pulse = PULSE1_VALUE;  
    ) W! C3 ~) u# k) p8 i) H: E+ W
  26.   if(HAL_TIM_PWM_ConfigChannel(&TimHandle, &sConfig, TIM_CHANNEL_1) != HAL_OK): v% [: R$ U3 v/ P) A, U
  27.   {
    9 W8 G5 U7 g# G4 ^; |+ e- D# T
  28.     /* Configuration Error */' G% o2 H( N- `3 }( a$ ^
  29.      Error_Handler();
    6 }+ z! ~/ }; n
  30.   }# r; g% D/ b! U; s& Y
  31.   
    . S0 b' W. B! _* Y" j0 ?* {6 H
  32.   /* Set the pulse value for channel 2 */" T3 j5 `$ c8 Q' ~+ [
  33.   sConfig.Pulse = PULSE2_VALUE;
    * f) |/ p" A( U; g  a  U2 O
  34.   if(HAL_TIM_PWM_ConfigChannel(&TimHandle, &sConfig, TIM_CHANNEL_2) != HAL_OK)7 A! x8 r8 r* M( G
  35.   {
    4 c, r+ s" d+ {9 \# H# S# Z
  36.     /* Configuration Error */
      \. U$ u  I& L# D# p9 O8 Q  x
  37.     Error_Handler();
    0 d4 W; F+ I! u( e1 S, ?, Y
  38.   }; q: |! ~& Z- G2 F/ \
  39.         - m3 N2 V1 r8 P9 I8 ~$ X
  40.         
    4 y% k" F6 \3 H! r) S
  41.   
    / f6 N3 Y) A: t( i. {/ l
  42.         / z3 K: j, W' _1 r0 d
  43.          if(HAL_TIM_PWM_Start(&TimHandle, TIM_CHANNEL_1) != HAL_OK)
    ' ]6 F1 z+ A, [/ X
  44.   {: ~; `; @1 ?+ A, `4 r
  45.     /* Starting Error */
    8 V" @9 j  Y3 }( H
  46.     Error_Handler();# h4 A* |: k9 F
  47.   }. ?- V! r* C/ C6 Y' t
  48.   /* Start channel 2 */
    ; v$ m. `( k# e2 L. j
  49.   if(HAL_TIM_PWM_Start(&TimHandle, TIM_CHANNEL_2) != HAL_OK)
    9 e! T5 z' r, }/ X
  50.   {+ a) M! n" T# }+ ~0 a5 ]
  51.     /* Starting Error */
    6 l, A9 n' A9 ]
  52.     Error_Handler();
    " P/ W* h/ i& I9 }8 w
  53.   }, E: R/ w4 B( s4 ]0 A
  54. 3 J; \$ A' }2 C
  55. - }$ k4 h. Q2 Z
  56. }, J4 K9 C0 J6 N. C4 Q6 Y
复制代码
频率计算时:F = SYSCLK/(( Prescaler + 1)*( Period + 1));最大占空比为 Period+ 1。
我这里设置了10K的PWM频率,我的SYSCLK是32M。
主函数很简单,就是把CH1和CH2的占空比设为25%和50%。如果一切无误,可以板上的led会亮,提示初始化成功,否则程序或者硬件有问题,导致初始化失败。

# O& y& @; i. ~
下面贴上我我的测试图:
IMG_20141202_012748.jpg
源代码:
PWM_TEST.zip (682.92 KB, 下载次数: 235)
赞 收藏 2 评论13 发布时间:2015-1-7 01:24

举报

13个回答
jp-425638 回答时间:2015-1-7 08:02:46
好贴子,看看不错,收藏了
iwqt1983 回答时间:2015-1-7 08:11:54
如果有支持PS级别的PWM就好了。
shaoziyang 回答时间:2015-1-7 13:57:55
赞一个。
boyubeiyu 回答时间:2015-1-7 14:04:12
好贴,有干货,支持
强仔00001 回答时间:2015-1-7 15:11:55
jp-425638 发表于 2015-1-7 08:029 H3 m& l" U; d( o7 P! q
好贴子,看看不错,收藏了

7 T+ }" Y0 ^% }/ u1 g  J, |0 R' E谢谢支持
强仔00001 回答时间:2015-1-7 15:12:17
iwqt1983 发表于 2015-1-7 08:11
7 n. S' W& A( Y* S9 R如果有支持PS级别的PWM就好了。

# o+ N8 I2 C3 R% H% {$ l2 ~PS是啥???求科普
强仔00001 回答时间:2015-1-7 15:13:48
shaoziyang 发表于 2015-1-7 13:57" H4 r( Q0 x5 O4 L" ?) D2 U
赞一个。
/ Y! u- V4 F; w/ `( y
谢谢支持
强仔00001 回答时间:2015-1-7 15:15:40
boyubeiyu 发表于 2015-1-7 14:04* H9 G5 W! |& M" h
好贴,有干货,支持
. z  d2 ]1 b+ ^
必须的,谢谢支持
沐紫 回答时间:2015-1-7 16:07:07
谢谢
强仔00001 回答时间:2015-1-7 16:52:08
沐紫 发表于 2015-1-7 16:07" \  \- v1 ?: x1 O
谢谢
0 \- m2 j& [: I' ~1 H; K8 u2 U
谢谢管理员的支持
晓枫VS枯叶 回答时间:2015-1-8 12:17:34
楼主可以写本中文手册了....
强仔00001 回答时间:2015-1-8 12:22:07
晓枫VS枯叶 发表于 2015-1-8 12:17$ m! A, G2 e+ L' g% x* S
楼主可以写本中文手册了....

# ?; K# c3 b' B我英语比较渣
我是老罗 回答时间:2015-11-14 20:18:51
2 @4 k- G7 U$ ?4 x+ O( J8 ~7 K
赞一个。
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版