PWM 呼吸灯实验
大约 2 分钟ESP32Python
之前我们使用的 LED 做过流水灯的实验,这节课,我们学习制作呼吸灯,通过 LED 灯的亮度变化来验证 PWM 不同电压的输出。呼吸灯是指灯光在单片机的控制之下完成由亮到暗的逐渐变化,感觉好像是人在呼吸。
实验原理
脉冲宽度调制(PWM),是英文 Pulse Width Modulation
的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用在测量、通信到功率控制与变换的许多领域中。
PWM 通过调节输出不同频率(频率是指 1 秒钟内信号从高电平到低电平再回到高电平的次数(一个周期))、占空比(一个周期内高电平出现时间占总时间比例)的方波。以实现固定频率或平均电压输出。频率固定,改变占空比可改变输出电压,如下所示:
硬件电路设计
物料清单(BOM 表):
材料名称 | 数量 |
---|---|
直插式 LED | 1 |
1kΩ 电阻 | 1 |
杜邦线(跳线) | 若干 |
面包板 | 1 |
LED 的正极接开发板的 D12 引脚,并串联一个电阻,负极接 GND,如下图:
注意
一定要接电阻,不然会由于电流过大,烧坏 LED。
软件程序设计
PWM 可以通过 ESP32 所有 GPIO 引脚输出。所有通道都有 1 个特定的频率,从 1 到 40M 之间(单位是 Hz)。占空比的值为 0 至 1023 之间。
PWM 在 machine 的 PWM 模块中,我们也是只需要了解其构造对象函数和使用方法:
构造函数 machine.PWM(dest, freq, duty, duty_u16, duty_ns)
,使用以下参数构造并返回一个新的 PWM 对象:
dest
是输出 PWM 的实体,通常是 machine.Pin 对象;freq
应该是一个整数,用于设置 PWM 周期的频率(以 Hz 为单位);duty
占空比,范围是 0 - 1023;duty_u16
占空比,范围是 0 - 65535,2 的 16 次方;duty_ns
以纳秒为单位设置脉冲宽度,范围是 0 - 50000。
使用方法:
from machine import Pin, PWM
# 从1个引脚中创建PWM对象
led = PWM(Pin(12), freq=20000, duty=512)
# 获取当前频率
led.freq()
# 设置频率
led.freq(1000)
# 获取当前占空比
led.duty()
# 设置占空比
led.duty(200)
# 使用 duty_u16 方法
led.duty_u16(12345)
# 使用 duty_ns 方法
led.duty_ns()
# 关闭引脚的 PWM
led.deinit()
因此,我们的代码可以这么写:
import time
from machine import Pin, PWM
# 创建 LED 控制对象
led = PWM(Pin(12), freq=1000)
while True:
# 渐亮
for i in range(0, 1024):
led.duty(i)
time.sleep_ms(1)
# 渐暗
for i in range(1023, 0, -1):
led.duty(i)
time.sleep_ms(1)