PWM 简介
PWM 的全称为 Pulse Width Modulation, 翻译成中文是 脉冲宽度调节, 是把模拟信号调制成脉波的技术. 数字信号只有低电平 0 和高电平 1 两种. 通过以快速切换高低电平来控制传感器引脚上的电压(和电流)的平均值.
举个 LED 灯的例子: 控制LED, 亮 1s 灭 1s 往复循环, 肉眼可见 LED 在不断闪烁. 然后把间隔时间缩短为: 亮 100ms 灭 100ms 往复循环就可以看到 LED 在快速闪烁. 把这个变换的持续缩小, 小于肉眼的视觉暂留时间, 人眼就会分辨不出来 LED 在闪烁, 而此时 LED 的亮度处在灭与亮之间,这时候 LED 就达到了正常的 1/2 亮度.

当然亮的时间和暗的时间是可以不相等的, 这个比例是可以调节的. 通过这个比例的调节可以实现控制 LED 亮度的目的. 这个比例就是占空比(duty), 占空比的完整定义: 在一个周期内, 高电平时间占总体周期的比例. 例如假设 PWM的控制周期为 10ms, 其中 8ms 为高电平, 2ms 为低电平, 则占空比就是 8/10 = 80%
在多数单片机中, 占空比并不是百分比. ESP32 的占空比取值范围为 0 <= duty <= 1023. 其本质就是把工作电压 0-3.3v 划分为 1024 个离散值.PWM 的第二个属性就是频率. 根据常识,频率为控制周期T的倒数. 假设 10ms 就是控制周期,那频率就是 1 / 0.1 = 10HZ. 频率的取值范围也是由由硬件决定的, ESP32 的 PWM 频率范围为 0 < freq < 78126.
MicroPython-PWM
MicroPython 提供了专门针对 PWM 的模块.
PWM 定义
首先是使用相应的引脚创建对应的对象, 然后调用对象的 init 方法传入频率和占空比初始化对象:
1 | from machine import Pin,PWM |
也可以在新建 PWM 对象的时候直接传入频率和占空比:
1 | from machine import Pin,PWM |
单独设置频率和占空比
除了定义的时候申明外, PWM 类还提供了单独设置频率和占空比的方法:
1 | led.freq(1000) # 设置频率 |
关闭 PWM
使用完了 PWM 需要关闭对象:
1 | led.deinit() |
示例: PWM调节LED亮度
1 | from machine import Pin,PWM |
结合 MQTT 就可以写出一个可以通过网络控制的 LED 灯节点:
1 | from machine import Pin,PWM |

