2. 褪色的 LED¶
除了打开和关闭 LED 之外,还可以使用脉宽调制 (PWM)来控制 LED 的亮度,这是一种从数字引脚获得可变输出的常用技术。这使我们可以淡化 LED:
2.2. 连接事物¶
在本教程中,我们将使用X1
引脚。将电阻的一端连接到 X1
,另一端连接到LED的 阳极,这是较长的腿。将LED的阴极接地。
2.3. 代码¶
通过检查 pyboard的快速参考,我们看到它 X1
已连接到计时器 5 ( ) 的通道 1 。因此,我们将首先为计时器 5 创建一个对象,然后为通道 1创建一个对象:TIM5 CH1
). Therefore we will first create a Timer
TimerChannel
from pyb import Timer
from time import sleep
# timer 5 will be created with a frequency of 100 Hz
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 变亮,并在达到某个最大亮度时重新开始:
# maximum and minimum pulse-width, which corresponds to maximum
# and minimum brightness
max_width = 200000
min_width = 20000
# how much to change the pulse-width by each step
wstep = 1500
cur_width = min_width
while True:
tchannel.pulse_width(cur_width)
# this determines how often we change the pulse-width. It is
# analogous to frames-per-second
sleep(0.01)
cur_width += wstep
if cur_width > max_width:
cur_width = min_width
2.4. 呼吸效果¶
如果我们想要呼吸效果,即 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
2.5. 进阶练习¶
您可能已经注意到 LED 亮度似乎逐渐减弱,但增加得很快。这是因为我们的眼睛以对数方式(韦伯定律 )来解释亮度,而 LED 的亮度是线性变化的,每次变化的量都相同。你怎么解决这个问题?(提示:对数函数的反义词是什么?)
2.6. 附录¶
我们也可以使用数模转换器 (DAC) 来实现相同的效果。PWM 方法的优点是每次都以相同的电流驱动 LED,但时间长度不同。这允许更好地控制亮度,因为 LED 不一定表现出驱动电流和亮度之间的线性关系。