2. 褪色的 LED

除了打开和关闭 LED 之外,还可以使用脉宽调制 (PWM)来控制 LED 的亮度,这是一种从数字引脚获得可变输出的常用技术。这使我们可以淡化 LED:

http://upload.wikimedia.org/wikipedia/commons/a/a9/Fade.gif

2.1. 成分

你会需要:

  • 标准 5 或 3 毫米 LED

  • 100 欧姆电阻

  • 电线

  • 面包板可选,但使事情更容易)

2.2. 连接事物

在本教程中,我们将使用X1 引脚。将电阻的一端连接到 X1,另一端连接到LED的 阳极,这是较长的腿。将LED的阴极接地。

../../_images/fading_leds_breadboard_fritzing.png

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 不一定表现出驱动电流和亮度之间的线性关系。