Skip to content

第 9 章:看懂 PWM 调光代码

本章任务

看懂"呼吸灯"的代码——对应第一册第 9 章的 PWM 实验:LED 从熄灭慢慢变亮,再慢慢变暗。

接线回顾

元件Pico 引脚说明
LED 长脚(正极)GP0PWM 信号
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
  • 低亮度变化明显、高亮度变化不明显——这是人眼的特性,不是代码错了

想一想

  1. 代码里两处 1024 如果改成 256,呼吸会变得更快还是更慢、更粗还是更细?

    💡 查看答案

    步长从 1024 改成 256,从 0 到 65535 要走的档数变成原来的 4 倍:每档延时不变的话,一次呼吸更慢(约 4 倍时间)、但更细腻——亮度过渡更平滑,看不出一档一档的感觉。

  2. 两个 time.sleep_ms(5) 改成 sleep_ms(20),一次完整呼吸会花更久还是更短?

    💡 查看答案

    更久。每一档停留时间变成 4 倍,档数没变,所以完整一次呼吸大约也花 4 倍的时间。想调呼吸节奏,改"步长"和"每档延时"都可以,效果相反的方向要分清。

不积跬步,无以至千里;万里之行,始于当下。