|
STM32定时器单脉冲模式及其应用
2 S7 q7 U: Q- V* w* Z! q1 s1 p
5 g3 q) X" O/ cSTM32的定时器可以配置为单脉冲模式,所谓的单脉冲就是通过配置定时器使其在一个可控延时后,产生一个脉宽可控的脉冲。使用STM32CubeMX工具配置起来非常方便。
n3 B2 R% e: ]4 `, H) h/ |) G, u硬件环境:STM32F103C8T65 v* z+ n- i2 u% E% P U' h' K
软件环境:STM32CubeMX v5.5.0+ C2 ]% I. H5 j4 C, j e7 l
HAL库:STM32CubeF1 Firmware Package V1.8.0 - t6 T2 z( @8 t3 ]9 Q
6 H4 d( `5 I: n+ y9 V$ o4 D& i8 n* I+ n1 G8 R7 C4 n3 \2 s v
1.STM32CubeMX配置8 A5 ^3 X. D. e1 m
基本配置不再赘述,可参考之前的文章。直接看定时器的配置,这里以TIM1的CH2为例。3 @$ C, v9 p6 I5 s' ~: a. D( i
将TIM1的CH2配置为PWM输出模式,使能One Pulse Mode(单脉冲模式)CH Polarity选择为Low。分频系数、计数周期、输出比较值根据实际需求进行设置,用于控制延时时间和脉冲宽度。单脉冲模式的定义如下图所示。
5 O3 A2 J) S* O, v& @! C定时器启动后,TIM1开始计数,经过 tDelay时间后,输出高电平,经过tPulse时间后,输出低电平。在图中可以看到,tPulse为延时时间,即寄存器TIM_CCRx的值;tPulse为脉冲宽度,即(TIM_ARR – TIM_CCRx + 1)的值。- g3 p3 x+ j8 J0 f3 a6 g
本例中,设置定时器分频系数为71,即计数周期为1us。TIM_CCRx为50,即脉冲宽度为50us,TIM_ARR为199,则延时时间为199-50+1=150us。# T# ^ v/ g& c: A ^' S% j
& }7 m- m. b5 B) s3 R/ E2.程序编写7 o. O1 s( `/ {5 `/ m. _4 t
1 |) I7 I5 c0 B- g0 h' U* o- C& p; J$ h9 a& p- j
生成代码后,HAL库中有一个HAL_TIM_OnePulse_Start函数,但调用该函数无效。直接调用PWM函数即可产生单个脉冲。 u5 w# s7 o5 C4 D/ x6 A( G6 B* Z
- HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_2);
复制代码 调用下面函数可以设置延时时间和脉冲宽度:
* r# b T4 b1 X( [9 [' B- _HAL_TIM_SET_AUTORELOAD(&htim1,plusedelay + plusewidth - 2);//设置脉冲宽度) P3 g1 v$ l9 Z1 x' l* Y4 B
- __HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_2,plusedelay - 1); //设置脉冲延时
复制代码 3.单脉冲模式的应用! J, d5 D7 X8 A* d2 P. F5 L+ e" C
/ s7 ]' i' J f h) I
" h8 { Y$ v8 R& N; W& Y# k6 \做过可控硅控制的朋友可能已经发现了,单脉冲模式的非常适合用于可控硅控制。可控硅控制可参考之前文章《单片机控制可控硅调压》。检测到过零点后,根据需要控制的电压设置脉冲宽度和延时时间即可,完全由硬件控制,更精确也更方便。
) Z3 f+ Q, G) ~9 t假设,检测到过零点后,需要延时5ms,输出一个100us的脉冲。定义变量:. Z) {9 @9 D( F; W
- $ r9 g3 b% k2 w, B3 a
- uint16_t plusedelay = 5000;//脉冲延时4 z" Y: @% A' G( `6 O* Q$ @
- uint16_t plusewidth = 100;//脉冲宽度
复制代码 在过零检测函数中设置延时时间和脉冲宽度,并开启定时器单脉冲即可。$ q4 P/ L0 H" D2 ~7 E1 ^$ ^
- 0 } z5 ?* p& J
- __HAL_TIM_SET_AUTORELOAD(&htim1,plusedelay + plusewidth - 2);//设置脉冲宽度0 x% x3 X9 P) |7 }8 B2 O8 d6 A/ P
- __HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_2,plusedelay - 1); //设置脉冲延时
& b3 J$ S7 }: V2 A: L8 X" _ - HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_2);
复制代码 " [, d C C) v0 q3 ^2 E
# J2 H8 \: B7 l3 u$ }; c" c( m
|