LED调光
PWM信号除了可以控制舵机,打开和关闭LED外,还可以控制LED的亮度,让LED的亮度淡入淡出,如下图所示。这也是一种从数字引脚获取可变输出的常用方法:
物料元件
要完成这个实验,需要准备以下物料:
- 5mm或3mm的LED,1个
- 100欧姆的电阻,1个
- 导线,若干
- 面包板(可选,连接电路更方便)
将元件连接起来
在本例中,使用pyboard的X1引脚,可以输出PWM信号的引脚,将电阻器的一端连接到X1,另一端连接到LED的正极,即较长的一端,将LED的负极接地。
代码
通过pyboard的快速参考,可以知道pyboard的X1连接到定时器5的通道1(TIM5 CH1),因此,首先为定时器5创建一个定时器对象,然后为通道1创建一个定时器通道对象:
from pyb import Timer
from time import sleep
# 创建频率为100赫兹定时器5
tim = pyb.Timer(5, freq=100)
tchannel = tim.channel(1, Timer.PWM, pin=pyb.Pin.board.X1, pulse_width=0)
PWM 中 LED 的亮度是通过控制脉宽来控制的,即 LED 每个周期的亮灯时间。定时器频率为 100 Hz 时,每个周期为 0.01 秒,即 10 毫秒。
为了实现本教程开头所示的渐变效果,我们需要将脉宽设置为一个较小的值,然后缓慢增加脉宽以增亮 LED,当达到某个最大亮度时再重新开始:
# 最大和最小脉冲宽度分别对应最大和最小亮度
max_width = 200000
min_width = 20000
# 每一步脉冲宽度的变化量
wstep = 1500
cur_width = min_width
while True:
tchannel.pulse_width(cur_width)
#这决定了改变脉冲宽度的频率,类似于每秒帧数
sleep(0.01)
cur_width += wstep
if cur_width > max_width:
cur_width = min_width
呼吸效果
要实现呼吸效果,即LED从暗到亮再从亮到暗,只需在达到最大亮度时将wstep
的符号反转,并在最小亮度时再次反转即可,为此,可将while
循环修改为:
while True:
tchannel.pulse_width(cur_width)
sleep(0.01)
cur_width += wstep
if cur_width > max_width:
cur_width = max_width
wstep *= -1
elif cur_width < min_width:
cur_width = min_width
wstep *= -1
高级练习
上面的代码运行时,可以观察到LED的亮度似乎减弱得很慢,但却增加得很快。这是因为眼睛对亮度的理解是对数的(韦伯定律),而LED的亮度是线性变化的,即每次变化的量相同。可以进一步考虑如何解决这个问题?(提示:对数函数的反函数是什么?)
补充
除了PWM之外,还可以使用数模转换器 (DAC) 来达到同样的效果。PWM方法的优点是每次驱动LED的电流相同,但时间长短不同,这样可以更好地控制亮度,因为LED的驱动电流和亮度之间并不一定呈线性关系。