
《跟着Pico学MicroPython》系列第2篇上一篇《跟着Pico学MicroPython①点亮第一个LED——闪烁与流水灯》我们通过 GPIO 输出实现了 LED 闪烁和流水灯。本篇继续使用 LED学习 PWM 和占空比让 LED 的亮度实现从暗到亮、再从亮到暗的渐变效果。一、从LED闪烁继续学习上一篇我们学习了GPIO输出高电平灯亮GPIO输出低电平灯灭。因此 LED 只有两种主要状态亮和灭。那么问题来了能不能让 LED 只亮一点答案是可以。这就需要学习PWM二、什么是PWMPWM 的英文是Pulse Width Modulation中文叫脉宽调制PWM 可以通过快速改变信号的高、低电平持续时间改变负载获得的平均功率。对于 LED 来说就可以表现为不同的亮度。三、什么是占空比PWM 中有一个非常重要的概念占空比简单来说占空比就是一个 PWM 周期中高电平所占的比例。例如0%相当于几乎一直关闭。50%可以简单理解为一半时间打开 一半时间关闭100%则接近一直保持打开状态。四、不同占空比对应的亮度MicroPython 中可以使用pwm.duty_u16()设置 PWM 占空比。数值范围0 65535对应关系如下占空比duty_u16值LED效果0%0熄灭25%16384微亮50%32768半亮75%49152较亮100%65535附近最亮因此pwm.duty_u16(0)表示关闭 PWM 输出。而pwm.duty_u16(32768)大约对应 50% 的占空比。五、本篇需要准备什么元件数量Raspberry Pi Pico H1LED1限流电阻1面包板1杜邦线若干本篇继续使用上一篇的 LED 电路。六、呼吸灯接线使用GP15作为 PWM 输出。连接GP15 │ ▼ 限流电阻 │ ▼ LED正极 LED负极 │ ▼ GND与第一篇点亮LED接线相同。七、创建PWM对象上一篇使用ledPin(15,Pin.OUT)直接控制 GPIO。这一次改成pwmPWM(Pin(15))意思是创建一个连接到 GP15 的 PWM 对象。八、设置PWM频率pwm.freq(1000)#PWM频率 1000Hz这里建议使用较高频率减少人眼感受到的闪烁。人眼临界频率约60-100Hz,建议PWM频率设 ≥1000Hz。九、先测试不同亮度正式制作呼吸灯之前可以先运行一个测试程序。frommachineimportPin,PWMimportutime pwmPWM(Pin(15))# 设置PWM频率pwm.freq(1000)whileTrue:# 0%pwm.duty_u16(0)utime.sleep(1)# 25%pwm.duty_u16(16384)utime.sleep(1)# 50%pwm.duty_u16(32768)utime.sleep(1)# 75%pwm.duty_u16(49152)utime.sleep(1)# 100%pwm.duty_u16(65535)utime.sleep(1)观察 LED可以看到不同的亮度变化。十、呼吸灯完整代码frommachineimportPin,PWMimportutime# 创建PWM对象使用GP15pwmPWM(Pin(15))# 设置PWM频率为1000Hzpwm.freq(1000)whileTrue:# 逐渐变亮fordutyinrange(0,65536,1024):pwm.duty_u16(duty)utime.sleep_ms(10)# 逐渐变暗fordutyinrange(65535,-1,-1024):pwm.duty_u16(duty)utime.sleep_ms(10)十一、代码是如何实现呼吸效果的关键在这里range(0,65536,1024)它让duty不断增加。例如0 ↓ 1024 ↓ 2048 ↓ 3072 ↓ …… ↓ 65535附近因此PWM占空比不断增加 ↓ LED亮度不断增加最终LED逐渐变亮LED为什么又会变暗接下来程序执行range(65535,-1,-1024)这次65535 ↓ 64511 ↓ 63487 ↓ …… ↓ 0占空比不断减小。因此PWM占空比降低 ↓ LED亮度降低 ↓ LED逐渐变暗最终熄灭。整个程序实际上就是duty 0 ↓ 不断增加 ↓ duty ≈ 65535 ↓ 不断减少 ↓ duty 0 ↓ 重新开始也就是渐亮 → 渐暗 → 渐亮 → 渐暗……十二、为什么使用10ms延时代码utime.sleep_ms(10)表示等待10毫秒如果完全不等待亮度变化会非常快。加入延时以后人眼就可以明显观察到渐变过程。十三、本篇知识总结这一篇我们在上一篇GPIO 的基础上继续学习PWM ↓ PWM频率 ↓ 占空比 ↓ duty_u16() ↓ 改变占空比 ↓ 改变LED亮度 ↓ 呼吸灯十四、下一篇学习什么GPIO输入——按键控制LED届时 Pico 不再只是输出 → 控制LED还可以输入 ← 读取按键最终实现按下按键 ↓ Pico检测到输入 ↓ 控制LED敬请期待《跟着Pico学MicroPython》第3篇。