PWM输出测试:使用示波器测试输出或者实现一个呼吸灯,如果要用比较直观的省事的方法,肯定是采用呼吸灯的方式,看到明显的阶梯式的变化。呼吸灯的效果还是很吸引人的,那么什么是呼吸灯?又要如何实现呢?
* N6 e- A) i3 @2 Y/ H+ R PWM技术驱动LED呼吸灯的核心原理,巧妙融合了LED对电流的敏锐响应与人眼的视觉暂留特性。简而言之,PWM通过精细调控LED的导通时段——即高电平所占据的时间窗口,来灵活掌控其亮度表现。若高电平时段精简,LED则呈微光;反之,若时段延长,光芒随即璀璨。由此,通过无缝衔接地调整这一时段长度,我们得以实现对LED亮度的流畅调控,进而催生出迷人的呼吸灯效应。人类的视觉系统,在面对快速更迭的光影时,展现出了独特的“视觉暂留”奇观。当光线以迅雷不及掩耳之势闪烁,我们的双眼非但不会即刻捕捉到这瞬息万变,反而会将一连串短促的光影信号,在脑海中巧妙融合,形成一个稳定的亮度感知。正是得益于LED的极速响应与人眼这一奇妙的生理机制,当PWM信号的占空比——高电平占比整个周期的比例——微妙变迁时,尽管LED实则在亮与灭间疾速穿梭,但在我们眼中,却幻化为一抹恒定的光辉。
& N* V* X0 B' Z2 c& H0 v 本阶段测试通过实现呼吸灯的方式体验开发板的的PWM功能,PWM功能属于定时器的高级功能之一。同时要实现明暗之间的变化也要用到精准定时的功能,所以使用呼吸灯测试可以比较好的学习了解定时器的应用。定时器(Timer)最基本的功能就是定时, 如果把定时器与 GPIO 引脚结合起来使用的话可以实现更加丰富的功能, 可以对输入信号进行计数,可以测量输入信号的脉冲宽度,可以输出单个脉冲、PWM 等波形,等等。 通过定时器生成 PWM 波形信号来控制电机状态是工业控制的普遍方法,这方面知识非常值得深入了解。
3 L g! l! Y# W* o" U 这时候我们还是要看一下两个LED对应的引脚:* N6 u0 i2 B9 @" a2 V1 R2 M9 r; w
* c* ]6 [5 {, ?: f4 ^/ B r
( T9 B: e" ] L+ W0 J! x* G. W LED1可以连接到定时器1和定时器2;) n" N% j5 V$ H2 P" x6 C
! w5 `7 n1 O2 ~+ A0 c6 z
: o4 A! h9 B o8 X0 g# T" F LED2可以连接到定时器和定时器3,所以我们本次采用定时器1作为PWM输出的主要控制定时器,然后在找一个定时器作为精准定时。& M5 c4 f/ Y2 W, d2 H' W
定时器1配置为PWM输出,使用了两个通道:9 q8 M2 ?. c7 I* N$ S
3 X1 M, S6 i9 {0 d
8 Q/ `0 X1 p+ l1 d
定时器14作为普通定时器配置如下:
2 h+ @) I5 k2 r* @! y7 {, e
+ ?# p& H: t4 d : E6 P* k# t( L: ]. C
注意定时器需要开启中断;
7 Q, F: b& z3 ]% Z: t 定时器的使用并不会直接开始定时器,我们在使用的时候需要在初始化阶段开启相应的定时器和中断:
; ]- n6 ?' @' p) x3 y/ }5 i- HAL_TIM_Base_Start_IT(&htim14);
! `0 u& H, S5 m -
+ n4 v; D; a0 t( B& f8 ~ - HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_1);
/ O1 w1 s6 x( O0 v3 {* u% N - HAL_TIMEx_PWMN_Start(&htim1, TIM_CHANNEL_1);
`& w t9 z2 o6 Z6 z9 y0 t5 t. d- E - __HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_1,500);
# c* L, v3 ]! w# T+ U2 I3 R5 N' g - / g* I% v2 {, L+ i0 d8 k
- HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_2);
6 ^8 S& {. e8 k) L- E* B - HAL_TIMEx_PWMN_Start(&htim1, TIM_CHANNEL_2);6 |2 F% @( W6 ?4 z/ ~5 j
- __HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_2,500);
复制代码 然后就可以在定时器中断的回调函数中进行呼吸效果的修改了:2 {2 K2 O9 Y% C1 R8 l) w
- void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
4 H/ j! D+ N1 |+ o8 l) N - {8 v) C: m3 Q& N9 @
- if (htim->Instance == TIM14) {
8 K& ~$ [1 B% K* s - HAL_IncTick();. p4 k- E1 n8 T- W* T
- Tim_cnt++;
- o% L# T; z$ Z3 S: J2 p9 { - if(Tim_cnt <= 100){
/ Y0 F6 f, _/ C2 C' h8 B$ ?2 O, j - __HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_1,Tim_cnt*10);2 i) L8 c7 Z+ j. K" n; t% `
- __HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_2,Tim_cnt*10);7 \' s( L7 g; l; S
-
) |) p3 q% m9 D- f& T9 H. Y - }
2 q* D- N: q8 D$ G1 g% y, V - else if(Tim_cnt > 100 && Tim_cnt <= 200){5 L) ? ` u, S2 j( f
- __HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_1,(200-Tim_cnt)*10);/ U- e* E7 e& p- c& `
- __HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_2,(200-Tim_cnt)*10);
! O7 ~5 X$ J) a: `- R7 U - }
: a X" X: E9 J K# d8 r' b) F - else if(Tim_cnt>=200)4 U* Q( b( O+ q/ K+ x3 Y
- Tim_cnt = 0;& Z, D- [0 ?# h, ~9 t. O5 T$ [
- }
, v( @' D! ?2 g6 a4 G% v* J1 U - }
复制代码 由于两个LED的控制方式不同,同频的控制实现了交替呼吸的效果:
1 ~8 [4 ^2 H$ ]
$ x& B! \- P4 d2 I0 B3 I- J; ]
0 G# Y9 H+ n, |2 @8 g7 g
8 T3 o4 N0 |/ k' J
- _9 F1 N' F, D/ R- W- B
, v' [2 k! z0 D' l+ e. v6 v
) J/ n& b: t2 A+ f, c6 ~- {' F1 W$ G# A9 W: C/ S$ M
6 @2 g) b6 u; y# f i
( ^( g+ L! `5 Z3 G" n |