呼吸灯


项目介绍

在第二课我们学习了如何让LED闪烁。但是LED的玩法远不仅如此。在日常生活中你有没有遇到过灯光慢慢变亮或者慢慢变暗呢?这叫呼吸灯。所谓呼吸灯,就是控制LED逐渐变亮,然后逐渐变暗,循环交替。上一课我们学会了直接用高电平点亮LED,低电平熄灭LED。如果要让LED不那么亮但又不完全熄灭,介于中间状态,只需控制流过LED的电流就可以实现。电流减小LED变暗,电流增大LED变亮。所以只需要调节LED两端的电压减小或增大(电流也会随之减小或增大)就能控制LED的亮暗程度了。

数字端口电压输出只有LOW与HIGH两个开关,对应的就是0V与3.3V(或5V)的电压输出。可以把LOW定义为0,HIGH定义为1,1秒内让单片机输出500个0或者1的信号。如果这500个信号全部为1,那就是完整的3.3V;如果全部为0,那就是0V。如果010101010101这样输出,刚好一半,端口输出的平均电压就为1.65V了。这和放映电影是一个道理。我们所看的电影并不是完全连续的,它其实是每秒输出25张图片,人的肉眼分辨不出来,看上去就是连续的了,PWM也是同样的道理。如果想要不同的电压,就控制0与1的输出比例就可以了。当然这和真实的连续输出还是有差别的,单位时间内输出的0,1信号越多,控制的就越精确。

那么什么是PWM呢?PWM简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。

PWM原理图

PWM的频率是指在1秒钟内,信号从高电平到低电平再回到高电平的次数,也就是说一秒钟PWM有多少个周期,单位Hz。

PWM的周期,T=1/f,T是周期,f是频率。如果频率为50Hz ,也就是说一个周期是20ms,那么一秒钟就有 50次PWM周期。

占空比,是一个脉冲周期内,高电平的时间与整个周期时间的比例,单位是% (0%-100%) 一个周期的长度。如下图所示。

PWM占空比图

这一课学习使用PWM来控制0与1的输出比例实现控制电压。

模块参数

工作电压DC 3.3 ~ 5V
工作温度-10°C ~ +50°C
控制信号数字信号
尺寸32 x 23.8 x 12 mm
定位孔大小直径为 4.8 mm
接口间距为2.54 mm 3pin防反接口

模块原理图

LED模块原理图

前面实验二我们就学习了如何控制一个LED,由原理图可以得知,控制时,模块上GND VCC供电后,信号端S为高电平时,模块上LED亮起。

实验组件

ESP32 Plus主板
ESP32 Plus主板 x1
Keyes 紫色LED模块
Keyes 紫色LED模块 x1
XH2.54-3P 转杜邦线母单线
XH2.54-3P 转杜邦线母单线 x1
USB线
USB线 x1

模块接线图

LED模块接线图

代码

import time
from machine import Pin, PWM

# ESP32 PWM引脚输出的方式与传统控制器不同
# 在初始化阶段通过配置PWM的参数,可以改变频率和占空比
# 定义GPIO 5的输出频率为10000Hz,占空比为0,分配给PWM
pwm = PWM(Pin(5, Pin.OUT), 10000)

try:
    while True:
        # 占空比范围为0-1023,因此我们使用第一个for环来控制PWM以改变占空比
        # 周期值,使PWM输出0% -100%;使用第二个for环路使PWM输出100%-0%
        for i in range(0, 1023):
            pwm.duty(i)
            time.sleep_ms(1)
        for i in range(0, 1023):
            pwm.duty(1023-i)
            time.sleep_ms(1)
except:
    # 每次使用PWM时,硬件定时器将打开以配合它。因此,每次使用PWM后
    # 需要调用deinit()来关闭计时器。否则会导致下次PWM工作失败
    pwm.deinit()

实验结果

按照接线图正确接好模块,用USB线连接到计算机上电,单击 运行按钮 来执行程序代码。代码开始执行,能看到模块上的紫色LED从暗逐渐变亮,再从亮逐渐变暗,就像呼吸一样。

单击 停止按钮 或Ctrl+C退出程序

代码说明

代码说明
pwm.deinit()每次使用PWM时,硬件定时器将打开以配合它。因此,每次使用PWM后,需要调用deinit()来关闭计时器。否则会导致下次PWM工作失败。