2. PWM来控制LED的亮度¶
PWM 脉冲宽度调制技术,就是在给定的一段频率方波上调节其占空比来控制负载的一种技术,你会发现板子有很多PWM功能的引脚,咱们就来使用它们.
2.2. 连接起来¶
在本教程中,我们将使用 X1
引脚。将电阻的一端连接到 X1
上,另一端连接到LED的**阳极**上,较长的引脚是阳极。将LED的**阴极**连接到GND公共地.
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并不一定表现出驱动电流和亮度之间的线性关系.