PWM输出测试:使用示波器测试输出或者实现一个呼吸灯,如果要用比较直观的省事的方法,肯定是采用呼吸灯的方式,看到明显的阶梯式的变化。呼吸灯的效果还是很吸引人的,那么什么是呼吸灯?又要如何实现呢?
. d9 P% t" |0 B0 o: j' o PWM技术驱动LED呼吸灯的核心原理,巧妙融合了LED对电流的敏锐响应与人眼的视觉暂留特性。简而言之,PWM通过精细调控LED的导通时段——即高电平所占据的时间窗口,来灵活掌控其亮度表现。若高电平时段精简,LED则呈微光;反之,若时段延长,光芒随即璀璨。由此,通过无缝衔接地调整这一时段长度,我们得以实现对LED亮度的流畅调控,进而催生出迷人的呼吸灯效应。人类的视觉系统,在面对快速更迭的光影时,展现出了独特的“视觉暂留”奇观。当光线以迅雷不及掩耳之势闪烁,我们的双眼非但不会即刻捕捉到这瞬息万变,反而会将一连串短促的光影信号,在脑海中巧妙融合,形成一个稳定的亮度感知。正是得益于LED的极速响应与人眼这一奇妙的生理机制,当PWM信号的占空比——高电平占比整个周期的比例——微妙变迁时,尽管LED实则在亮与灭间疾速穿梭,但在我们眼中,却幻化为一抹恒定的光辉。 ^# c* R! g! w2 {5 Z9 I. J* a
本阶段测试通过实现呼吸灯的方式体验开发板的的PWM功能,PWM功能属于定时器的高级功能之一。同时要实现明暗之间的变化也要用到精准定时的功能,所以使用呼吸灯测试可以比较好的学习了解定时器的应用。定时器(Timer)最基本的功能就是定时, 如果把定时器与 GPIO 引脚结合起来使用的话可以实现更加丰富的功能, 可以对输入信号进行计数,可以测量输入信号的脉冲宽度,可以输出单个脉冲、PWM 等波形,等等。 通过定时器生成 PWM 波形信号来控制电机状态是工业控制的普遍方法,这方面知识非常值得深入了解。7 _- b, m% F; _9 t" U3 x2 R
这时候我们还是要看一下两个LED对应的引脚: V4 W1 C" l7 _# m+ y' ]0 \% S
- ]' B X1 V' D( e& v+ S, v* n 3 N+ k9 G: K0 C0 R/ q+ M
LED1可以连接到定时器1和定时器2;
7 F1 A8 w# x0 l' r
& Q5 H& W- N. \: c
6 W' L! `' `3 \ LED2可以连接到定时器和定时器3,所以我们本次采用定时器1作为PWM输出的主要控制定时器,然后在找一个定时器作为精准定时。
M% K3 m V r* j8 G9 |$ K6 O 定时器1配置为PWM输出,使用了两个通道:
! m2 p9 L/ ?5 @! I' P1 j# z
3 a- r9 M E6 n8 `/ x/ q , Q( \0 E8 {& e+ x' d8 C; \8 T2 f
定时器14作为普通定时器配置如下:
2 @/ n1 I" v" F# S2 D: B! c, T. k
B6 t0 S9 I6 Q7 Q+ Z z
N) A* n' J- v. w 注意定时器需要开启中断;, o9 O. k# O1 J! [$ k
定时器的使用并不会直接开始定时器,我们在使用的时候需要在初始化阶段开启相应的定时器和中断:
/ a+ ~1 g, V) e1 \- HAL_TIM_Base_Start_IT(&htim14);
" L" s5 e+ c# \3 F I -
0 g m0 F% v9 N7 s0 f. s | - HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_1);
2 R6 e# y5 B+ W8 p2 y - HAL_TIMEx_PWMN_Start(&htim1, TIM_CHANNEL_1);& ^/ K v& \0 X" w4 Q
- __HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_1,500);
u9 i! h- F, H# s - / _; U* k4 l M ~ \$ F; J- J
- HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_2);: C; h: n1 L) j) I7 \" c
- HAL_TIMEx_PWMN_Start(&htim1, TIM_CHANNEL_2);. [' a+ s( i6 m7 s
- __HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_2,500);
复制代码 然后就可以在定时器中断的回调函数中进行呼吸效果的修改了:8 ^. u% M$ e* _/ X0 T* T* J' p4 a
- void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)% k9 P$ X {3 S2 Z0 h: q, m
- {4 H0 w3 e3 Y0 c7 F+ v/ F
- if (htim->Instance == TIM14) {4 F6 Z4 m' x, K
- HAL_IncTick();" V8 v4 |( K% s# b8 \. _
- Tim_cnt++;! G/ z6 P7 `+ z
- if(Tim_cnt <= 100){5 n; J! |* ]. O
- __HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_1,Tim_cnt*10);
& P$ k4 U9 P. O0 Z - __HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_2,Tim_cnt*10);4 o. s N! V2 x! @! N" S) v
- * f6 u3 U* G- p) W5 t
- }
7 m6 B/ `+ p7 p* u - else if(Tim_cnt > 100 && Tim_cnt <= 200){9 X5 p- P% l7 o- a
- __HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_1,(200-Tim_cnt)*10);
, c- c! L! e3 f$ \, ]3 u4 A - __HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_2,(200-Tim_cnt)*10);
& s9 F* ?6 T. ^4 ]( M. [ - } 8 W4 i6 J' P4 k+ h6 s8 X4 q
- else if(Tim_cnt>=200)
/ B0 ^% V {, L( B - Tim_cnt = 0;" w: t, P5 }8 H& x9 y. {: m0 [
- }/ ?, H ?$ i# G# c2 d6 F. u# Z' c
- }
复制代码 由于两个LED的控制方式不同,同频的控制实现了交替呼吸的效果:7 c% Q9 g6 B/ A7 K, f0 y+ Y) X
) w: {5 W) ?! X8 n, X
- m" N8 f, X" C6 H1 ]5 G
# B- q: Y3 q( O5 A* b
' U* p6 H( ~7 Z: C) S& J q$ h! t6 ^5 k
' Z: _. R; w$ x. _' }, `4 M
0 n- z8 T2 E* [ t R6 I" J. j7 l7 ^" K6 F
n& F3 M4 F7 w* L; p. Q |