|
STM32定时器单脉冲模式及其应用
% ]) h2 b9 t6 k1 G
& r: c# P9 z* Q0 DSTM32的定时器可以配置为单脉冲模式,所谓的单脉冲就是通过配置定时器使其在一个可控延时后,产生一个脉宽可控的脉冲。使用STM32CubeMX工具配置起来非常方便。+ }# t/ Q9 f% x. z7 O4 |3 G; y
硬件环境:STM32F103C8T6$ j; ]8 |9 I2 B2 P5 ~, K
软件环境:STM32CubeMX v5.5.05 |; {$ J" \5 i. q& d
HAL库:STM32CubeF1 Firmware Package V1.8.0
" ]; q8 ^3 |; e( e. t# @3 b6 r# s. {3 i$ n" U2 _" L2 S
( q+ u2 ]7 I( {
1.STM32CubeMX配置
7 ^2 _1 _& Z- M2 M6 D& C1 I! @2 w基本配置不再赘述,可参考之前的文章。直接看定时器的配置,这里以TIM1的CH2为例。
' d% R1 l6 g' v& {7 A7 ^4 P! U# H 将TIM1的CH2配置为PWM输出模式,使能One Pulse Mode(单脉冲模式)CH Polarity选择为Low。分频系数、计数周期、输出比较值根据实际需求进行设置,用于控制延时时间和脉冲宽度。单脉冲模式的定义如下图所示。( @6 o5 {6 p5 ]8 S2 p& j/ M
定时器启动后,TIM1开始计数,经过 tDelay时间后,输出高电平,经过tPulse时间后,输出低电平。在图中可以看到,tPulse为延时时间,即寄存器TIM_CCRx的值;tPulse为脉冲宽度,即(TIM_ARR – TIM_CCRx + 1)的值。
, Q6 a9 @7 G+ C9 k- N本例中,设置定时器分频系数为71,即计数周期为1us。TIM_CCRx为50,即脉冲宽度为50us,TIM_ARR为199,则延时时间为199-50+1=150us。
! f' E) {* y5 W6 c' k8 A1 d
3 P" V! [9 @. I6 m% a0 a0 Q2.程序编写6 N x) Q' c! }5 Y F' t" d) I+ x( F
) H, o/ S! e' U+ E7 E4 W% D
4 X- G: @ q% E8 b. a" @$ g生成代码后,HAL库中有一个HAL_TIM_OnePulse_Start函数,但调用该函数无效。直接调用PWM函数即可产生单个脉冲。3 y! W2 l! X5 R0 u
- HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_2);
复制代码 调用下面函数可以设置延时时间和脉冲宽度:) c/ i& \9 A* j' U; k' J8 R9 F
- _HAL_TIM_SET_AUTORELOAD(&htim1,plusedelay + plusewidth - 2);//设置脉冲宽度1 L1 `( F9 N9 I3 r, h V
- __HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_2,plusedelay - 1); //设置脉冲延时
复制代码 3.单脉冲模式的应用
4 {& M$ M' f3 J. w; O6 F5 l
5 m x7 o2 {3 T- B) @) }
' o( J4 ]9 \1 ]5 K7 Z6 }做过可控硅控制的朋友可能已经发现了,单脉冲模式的非常适合用于可控硅控制。可控硅控制可参考之前文章《单片机控制可控硅调压》。检测到过零点后,根据需要控制的电压设置脉冲宽度和延时时间即可,完全由硬件控制,更精确也更方便。
5 r5 R6 \$ h0 X假设,检测到过零点后,需要延时5ms,输出一个100us的脉冲。定义变量:: h( X T. D* {! J
- 9 |3 |$ }* i! b, F" f
- uint16_t plusedelay = 5000;//脉冲延时
4 B4 D& R- v/ _* { - uint16_t plusewidth = 100;//脉冲宽度
复制代码 在过零检测函数中设置延时时间和脉冲宽度,并开启定时器单脉冲即可。
! X; M: B5 b% n1 Y" X* @- K' K. ?4 X$ E! R& d. D
- __HAL_TIM_SET_AUTORELOAD(&htim1,plusedelay + plusewidth - 2);//设置脉冲宽度6 N; T: p; T6 u" j( Q0 G
- __HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_2,plusedelay - 1); //设置脉冲延时6 K! h2 q9 I; y' V
- HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_2);
复制代码 * r u, m! w8 }7 \
: U" _) E" x Q! r9 m
|