在PWM模式2中,CNT<CCR时输出无效电平,CNT>CCR时输出有效电平。
A% Y5 k9 K) m' {$ N7 V
5 a" D( g. R* M# cPWM的有效输出电平在TIMx_CCER寄存器设置。
& ~ a; ~: q, B: `2 i4 O, i% s( _) t. B V k4 j8 H N* B
5 {4 V( }' X' M
; l- C/ u, |) }2 q5 @) ?' n; NTIMx_CCER.1为0,OC1高电平有效;TIMx_CCER.1为1,OC1低电平有效。其他通道同理。$ \* H) [/ B) k) K Y5 ~" e
% b$ Z3 ~. `6 |& e6 u7 V! C8 G
在PWM初始化函数中,通过TIM_OCInitStructure.TIM_OCPolarity设置输出极性,- }5 T# j" [: @9 p3 V) f! m
$ X7 Y o# u# M8 M5 @# |1 C. \) J
- //配置PWM模式(TIMx_CCMR)
6 u$ g" t" T$ Z( K - TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
1 B/ f7 Y8 \3 m0 _" b - //配置输出使能(TIMx_CCER) 0:禁止输出 1:输出到对应引脚
" _+ v4 y8 i4 Q( K% D - TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;! p4 j7 m$ i, ~& I/ f
- //配置输出极性(TIMx_CCER) 0:OCx高电平有效 1:OCx低电平有效" n; s, `# o- [. W
- TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;+ W( J6 Q5 U" }7 i Z
- //配置CCR寄存器(TIMx_CCRx) 16位宽+ ?4 z; I5 i I+ @& O7 W, F% M
- TIM_OCInitStructure.TIM_Pulse = 64;
2 J6 [, H% h, t* C& E! X - TIM_OC2Init(TIM3, &TIM_OCInitStructure);
复制代码
* l" X: g! ^) C& v3 W! V如下代码摘自库函数TIM_OC2Init,说明在PWM初始化过程中确实是通过配置CCER寄存器对应位设置PWM的输出极性。
7 d7 V& [& E! c a3 `8 e
; a0 L2 w ?2 I9 S, n- tmpccer |= (uint16_t)(TIM_OCInitStruct->TIM_OCPolarity << 4);
复制代码
: ]' X0 B2 T7 d# j) U$ c下面通过示波器实验PWM的输出极性控制,
% b8 ? x) Q" D& |
) B7 P& X# V+ D; `) H! Q2 ~& I- //配置PWM模式(TIMx_CCMR). i$ A* @( N5 V9 k/ {0 G
- TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;3 Q3 A( `8 D3 S' p3 S
- //配置输出使能(TIMx_CCER) 0:禁止输出 1:输出到对应引脚( W. X4 R# F) B8 _" b; j R& h
- TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
' B b; B! ^$ f. B - //配置输出极性(TIMx_CCER) 0:OCx高电平有效 1:OCx低电平有效9 q& C- r6 \; g6 \6 a& c: m
- TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;
/ |( m' t% i( y( v. a, H. `* D4 k' P - //配置CCR寄存器(TIMx_CCRx) 16位宽
* E9 ^& V; @8 D9 Z* H - TIM_OCInitStructure.TIM_Pulse = 64;! K- J( T$ O! g
- TIM_OC2Init(TIM3, &TIM_OCInitStructure);
( e' X. `/ s7 d
' a$ m! {! K* R- I9 r- //使能OC2的预装载寄存器(TIMx_CCMR.11)$ Z9 A2 g) I3 j) s
- TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);
6 R; {7 w A% E8 l- } -
- a, }8 U1 S5 A9 {) A - //TIM_Cmd(TIM3, ENABLE);
复制代码
% d0 u- F8 B4 |2 E, K) K4 N* A如上代码设置,初始化TIM_OC2Init后,PWM输出即刻接到对应引脚PA7,此时CCR2寄存器内的值64与定时器计数值比较,因为我们没有打开定时器,所以此时CNT寄存器为0,有CNT < CCR2,在PWM Mode2下,输出无效电平,如上代码设置有效电平为低电平(即无效电平为高电平),因此此时应该输出高电平,8 U# Q1 u( `8 L
6 D% M* K5 b+ B9 ^3 G1 j$ g
5 f5 x8 F! w- R
修改上述代码,将有效电平修改为高电平,4 P5 n: I( _! F" q$ y; O
& O ~& u5 K& G3 G7 _* r8 G5 N5 X
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;/ ^4 j) ?& E. ^1 s* ~
( t0 a6 }; W4 w此时示波器的输出如下,
: f1 B$ l8 E& h+ P
- w% _7 i" `' i
2 |% Z+ i1 A8 E3 k
& H) g, [2 d2 p6 z1 r7 I1 z, \( i
0 b4 l; e) ]% K' s1 S& f) _
/ x' t5 F% v( p' K- B( u. P% z$ Y( l
; |2 S B3 h/ _1 G3 e+ P: r$ x' `5 r, B, F) ~) `' w
|