本帖最后由 强仔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个定时器,如下图: 定时器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输出口。如下图的管脚功能分布图: 打开管脚复用的初始化使用以下函数: PWM参数的初始化代码如下: - void Config_PWM(int PULSE1_VALUE, int PULSE2_VALUE)! t0 U, e$ @9 S7 a! [' [; x. O6 h2 B) M
- {
8 B- z# V+ B8 T& ]7 O - TIM_OC_InitTypeDef sConfig;
4 Z. U$ K, e$ q - TIM_HandleTypeDef TimHandle;5 G* C0 B7 H2 u. i6 ~, @& h
- : g% S$ t( f$ N- R' H8 \2 j
- TimHandle.Instance = TIM2;8 y( Z. T+ @. }, @8 M5 @: Y+ l
-
- {' o4 J5 H0 V# Q- ]" A - TimHandle.Init.Prescaler = 1;
- T5 s- c" Z$ w& Q - TimHandle.Init.Period = 1599;
8 X9 A+ c3 y9 x1 F$ i - TimHandle.Init.ClockDivision = 0;3 O e8 D; {& {
- TimHandle.Init.CounterMode = TIM_COUNTERMODE_UP;, H/ I7 f+ W" `% k7 d
- if(HAL_TIM_PWM_Init(&TimHandle) != HAL_OK)
+ i2 \& t) f0 f& q8 h8 r% p' ~ - {8 F: ^8 f( i: M3 f% |
- /* Initialization Error */
/ x7 ~2 C! g3 C6 S: U, k. f# }, D" r# L - Error_Handler();* T' h8 r# V, h2 g
- }& d/ H" K' H& p% p# h
-
, z" e- `9 g8 x$ b - ; G6 W3 a& R7 k) c( b! ^' z0 W
-
) A9 O8 Q& P) a) D - sConfig.OCMode = TIM_OCMODE_PWM1;% P1 k' ^" w. z3 Z) f
- sConfig.OCPolarity = TIM_OCPOLARITY_HIGH;
3 c+ U1 R" r; N! G6 b - sConfig.OCFastMode = TIM_OCFAST_DISABLE;$ _/ \* \4 P) I! A3 k! y5 J! Q+ W: U
, J; }) s! {& K% X% w- /* Set the pulse value for channel 1 */6 E( X* s& R/ n0 g' X1 l
- sConfig.Pulse = PULSE1_VALUE;
) W! C3 ~) u# k) p8 i) H: E+ W - if(HAL_TIM_PWM_ConfigChannel(&TimHandle, &sConfig, TIM_CHANNEL_1) != HAL_OK): v% [: R$ U3 v/ P) A, U
- {
9 W8 G5 U7 g# G4 ^; |+ e- D# T - /* Configuration Error */' G% o2 H( N- `3 }( a$ ^
- Error_Handler();
6 }+ z! ~/ }; n - }# r; g% D/ b! U; s& Y
-
. S0 b' W. B! _* Y" j0 ?* {6 H - /* Set the pulse value for channel 2 */" T3 j5 `$ c8 Q' ~+ [
- sConfig.Pulse = PULSE2_VALUE;
* f) |/ p" A( U; g a U2 O - if(HAL_TIM_PWM_ConfigChannel(&TimHandle, &sConfig, TIM_CHANNEL_2) != HAL_OK)7 A! x8 r8 r* M( G
- {
4 c, r+ s" d+ {9 \# H# S# Z - /* Configuration Error */
\. U$ u I& L# D# p9 O8 Q x - Error_Handler();
0 d4 W; F+ I! u( e1 S, ?, Y - }; q: |! ~& Z- G2 F/ \
- - m3 N2 V1 r8 P9 I8 ~$ X
-
4 y% k" F6 \3 H! r) S -
/ f6 N3 Y) A: t( i. {/ l - / z3 K: j, W' _1 r0 d
- if(HAL_TIM_PWM_Start(&TimHandle, TIM_CHANNEL_1) != HAL_OK)
' ]6 F1 z+ A, [/ X - {: ~; `; @1 ?+ A, `4 r
- /* Starting Error */
8 V" @9 j Y3 }( H - Error_Handler();# h4 A* |: k9 F
- }. ?- V! r* C/ C6 Y' t
- /* Start channel 2 */
; v$ m. `( k# e2 L. j - if(HAL_TIM_PWM_Start(&TimHandle, TIM_CHANNEL_2) != HAL_OK)
9 e! T5 z' r, }/ X - {+ a) M! n" T# }+ ~0 a5 ]
- /* Starting Error */
6 l, A9 n' A9 ] - Error_Handler();
" P/ W* h/ i& I9 }8 w - }, E: R/ w4 B( s4 ]0 A
- 3 J; \$ A' }2 C
- - }$ k4 h. Q2 Z
- }, 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. ~下面贴上我我的测试图: 源代码: |
谢谢支持
PS是啥???求科普
谢谢支持
必须的,谢谢支持
谢谢管理员的支持
赞一个。