深色模式
第 9 章:看懂 PWM 调光代码
本章任务
看懂"呼吸灯"的代码——对应第一册第 9 章的 PWM 实验:LED 从熄灭慢慢变亮,再慢慢变暗。
接线回顾
| 元件 | Pico 引脚 | 说明 |
|---|---|---|
| LED 长脚(正极) | GP0 | PWM 信号 |
| LED 短脚(负极) | 经 100Ω 电阻接 GND | 限流 |
Pico 的每个 GPIO 都能输出 PWM,所以引脚不用刻意挑。
Mind+ 生成的典型代码
python
from machine import Pin, PWM # 拿出 Pin 和 PWM 两个工具
import time # 拿出时间工具
pwm = PWM(Pin(0)) # 在 GP0 上开启 PWM 功能
pwm.freq(1000) # 频率设为 1000Hz:每秒闪 1000 次
# 闪得这么快,人眼只感觉到"亮度"
while True: # 一直重复(呼吸不停)
# 第一段循环:占空比从 0 慢慢加到 65535 → 灯从灭变到最亮(吸气)
for duty in range(0, 65536, 1024): # duty 依次取 0, 1024, 2048……65535
pwm.duty_u16(duty) # 把当前占空比输出到灯上
time.sleep_ms(5) # 每档停 5 毫秒,变化才平滑
# 第二段循环:占空比从 65535 慢慢减到 0 → 灯从最亮变灭(呼气)
for duty in range(65535, -1, -1024): # duty 依次取 65535, 64511……0
pwm.duty_u16(duty)
time.sleep_ms(5)代码讲解
看懂这段代码只需抓住两个概念(第一册 9.1 讲过原理):
- 频率
freq(1000):灯每秒闪 1000 次。闪得太慢会看到一闪一闪,1000 次/秒时人眼完全感觉不到 - 占空比
duty_u16(duty):每次闪的时候,"亮"占多大比例。范围 0~65535:- 0 = 一直不亮 = 灭
- 32768 = 一半时间亮 = 半亮
- 65535 = 一直亮 = 最亮
两个 for 循环就是让占空比像台阶一样一级级升上去、再一级级降下来——亮度就平滑变化了。range(0, 65536, 1024) 里的 1024 是"步长":每次升 1024,共分 64 级。
运行效果
LED 像呼吸一样,缓慢变亮再变暗,循环往复。
常见坑
duty_u16最大是 65535,如果看到代码里写了超过这个值的数,是错误的- 灯在一闪一闪而不是渐变:频率设太低了,正常是 1000
- 低亮度变化明显、高亮度变化不明显——这是人眼的特性,不是代码错了
想一想
代码里两处
1024如果改成256,呼吸会变得更快还是更慢、更粗还是更细?💡 查看答案
步长从 1024 改成 256,从 0 到 65535 要走的档数变成原来的 4 倍:每档延时不变的话,一次呼吸更慢(约 4 倍时间)、但更细腻——亮度过渡更平滑,看不出一档一档的感觉。
两个
time.sleep_ms(5)改成sleep_ms(20),一次完整呼吸会花更久还是更短?💡 查看答案
更久。每一档停留时间变成 4 倍,档数没变,所以完整一次呼吸大约也花 4 倍的时间。想调呼吸节奏,改"步长"和"每档延时"都可以,效果相反的方向要分清。
