PWM功能的核心实现依托于machine模块,通过精确配置PWM的频率(即每秒内高电平脉冲的数量)与占空比(定义为一个周期内高电平所占时间的比例),实现对特定电子设备的精细控制。以LED灯亮度调节为例,操作流程首先需对PWM对象进行初始化,并明确设定所需的频率与占空比参数。其中,频率参数对PWM信号的扫描速率具有直接影响,而占空比则通过调整高电平脉冲的持续时间,进而有效调控LED灯的亮度表现。
本节课目标:
实现ESP32的脉冲宽度调制(PWM)功能,用以控制LED灯实现从暗至亮,再由亮至暗的循环变化过程。该过程将周期性地重复进行。
本节课内容:
- PWM 脉宽调制技术简介
- machine.PWM类
- 硬件设计
- 软件设计
- 下载验证
一、PWM 脉宽调制技术简介
PWM,即脉冲宽度调制,是一种通过对一系列脉冲宽度的调整来等效生成所需波形的技术,用于对模拟信号电平进行数字编码。这一过程涉及通过调节占空比的变化来调控信号、能量等编码。占空比,具体指的是在一个周期内,信号处于高电平的时间所占整个信号周期的百分比比例,例如方波的占空比可为50%。
PWM的占空比受到频率与占空比本身两个因素的共同作用。以PWM控制周期为100ms为例,其中25ms为高电平时间,75ms为低电平时间,此时占空比即计算为25/100=25%。值得特别注意的是,在MicroPython环境中,针对ESP32设备的占空比(duty)设置并非采用百分比形式,而是采用一种分辨率机制,其取值范围界定在0至1023之间。
二、machine.PWM类
machine.PWM
类是 machine
模块中的一个核心硬件类,它旨在为用户提供一个接口以配置和控制 PWM 设备。通过此类,用户可以执行对 PWM 设备的一系列操作,以满足特定的硬件控制需求。PWM,即脉冲宽度调制,是一种广泛应用的数字信号技术,用于模拟信号电平的编码与控制。
在具体操作中,PWM 设备通过调整一个周期内有效电平(通常为高电平或低电平之一)所占的时间比例来实现对设备的控制。这种控制方式使得 PWM 设备能够在不直接改变电压或电流幅值的情况下,模拟出不同的电压或电流水平,从而实现更为灵活和精确的设备调控。
在 PWM 设备的配置中,有两个至关重要的参数需要用户设定:
- 频率(freq):该参数定义了 PWM 信号从一个上升沿(或下降沿)到下一个上升沿(或下降沿)所经历的时间周期,其单位为赫兹(Hz)。频率的高低将直接影响 PWM 信号的变化速度和稳定性。
- 占空比(duty):该参数描述了在一个完整的 PWM 信号周期内,有效电平(用户所指定的电平)所占的时间比例。占空比的变化将直接反映在 PWM 信号的平均电压或电流水平上,进而实现对被控设备的精细调节。
通过合理配置 PWM 设备的频率和占空比参数,用户可以实现对各种类型硬件设备的精确控制,包括但不限于电机转速调节、LED 亮度调整以及音频信号的模拟等。
下面是MicroPython库的machine.PWM类链接。
PWM 类 – 脉宽调制 — MicroPython latest documentation
1. machine.PWM类的构造对象
构造对象方法如下:
class machine.PWM(dest, *, freq, duty_u16, duty_ns, invert)
使用示例:pwm = machine.PWM( Pin(2), freq=1000 )
构造函数的参数描述如下:
参数 | 描述 |
dest |
|
freq | freq 应该是一个整数,用于设置 PWM 周期 |
duty_u16 | duty_u16 将占空比设置为比率 。 |
duty_ns | duty_ns 设置脉冲宽度(以纳秒为单位) |
invert | 如果值为 True,则 invert 反转相应的输出 |
返回值:PWM
类对象
2. machine.PWM类的方法
(1)对象初始化
方法原型如下:
PWM.init(freq, duty)
方法的参数描述如下:
参数 | 描述 |
freq | freq 应该是一个整数,用于设置 PWM 周期 |
duty | 占空比(0~1023) |
(2)关闭PWM设备
方法原型如下:
PWM.deinit()
禁用PWM输出。
获取或设置PWM输出频率
方法原型如下:
PWM.freq(value[])
方法的参数描述如下:
参数 | 描述 |
value | 获取或设置 PWM 输出的当前频率。
|
获取或设置PWM占空比
方法原型如下:
PWM.duty(value[])
方法的参数描述如下:
参数 | 描述 |
value | 获取或设置 PWM 输出的占空比。
|
三、硬件设计
1. 例程功能
实现ESP32的脉冲宽度调制(PWM)功能,用以控制LED灯实现从暗至亮,再由亮至暗的循环变化过程。该过程将周期性地重复进行。
2. 硬件资源
- LED 灯:GPIO2 --> LED 【高电平:亮; 低电平:灭】
3. 原理图
四、软件设计
1. 程序流程图
2. 程序
from machine import PWM, Pin
import time
# pwm 实例化
pwm = PWM(Pin(2))
# 初始化PWM, 1000HZ
pwm.init(freq=1000, duty=0)
while True:
# 循环调节 PWM 占空比
for i in range(0, 1024):
# PWM 占空比 增加
pwm.duty(i)
time.sleep_ms(1)
for i in range(1023, -1, -1):
# PWM 占空比 减少
pwm.duty(i)
time.sleep_ms(1)
五、下载验证
开发板载的LED灯的亮度会以一个平稳的速度从最暗变到最亮,然后再从最亮变到最暗。