使用MicroPython和pyboard开发板(14):LED调光

LED调光


PWM信号除了可以控制舵机,打开和关闭LED外,还可以控制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的驱动电流和亮度之间并不一定呈线性关系。

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

原子星

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值