2. PWM来控制LED的亮度

PWM 脉冲宽度调制技术,就是在给定的一段频率方波上调节其占空比来控制负载的一种技术,你会发现板子有很多PWM功能的引脚,咱们就来使用它们.

2.1. Components硬件准备工作

You will need你需要准备:

  • 一个直径5mm或3mmLED直插灯
  • 100欧直插电阻
  • 针对针连接线
  • 面包板 (没有有的话可以直接连接)

2.2. 连接起来

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

../../_images/fading_leds_breadboard_fritzing2.png

2.3. 代码

通过参考:ref:Pyboard快速入门,我们看到 X1 连接到定时器5的通道1 上( TIM5 CH1)。因此,我们将首先为Timer 5创建一个 ``Timer``对象,然后为channel 1创建一个 ``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在每个周期中的时间量。定时器频率为100hz,每个周期需要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. 补充

我们也可以使用数模转换器(DAC)来达到同样的效果。PWM方法的优点是每次驱动的电流相同,但时间长短不同。这可以更好地控制亮度,因为led并不一定表现出驱动电流和亮度之间的线性关系.