Pico 上的每个 GPIO 引脚都能够进行脉宽调制,通过改变引脚打开和关闭的频率,可以改变或调制这些脉冲的宽度实现模拟输出。
树莓派 Pico 上的模拟-数字转换器只能以一种方式工作,它将模拟信号转换为微控制器可以理解的数字信号。如果你想走另一种方式,并让你的数字微控制器创建一个模拟输出,你通常需要一个数字到模拟转换器(DAC),但有一种方法来「伪造」模拟信号,使用所谓的脉宽调制或 PWM。
微控制器的数字输出只能是 0 或 1。打开和关闭数字输出被称为脉冲,通过改变引脚打开和关闭的频率,你可以改变或调制这些脉冲的宽度,因此称为「脉宽调制」。
Pico 上的每个 GPIO 引脚都能够进行脉宽调制,但是微控制器的脉宽调制块是由八个切片组成的,每个切片有两个输出。如图所示,你会看到每个 Pin 都有一个字母和一个数字。数字表示 PWM 引脚的编号,而字母表示使用的哪一个 PWM 片来输出。
如果你在引脚 GP0 上使用 PWM_A[0],在引脚 GP1 上使用 PWM_B[0],一切都正常。如果你在引脚 GP2 上添加 PWM_A[1],依然正常运行。但是如果你尝试在引脚 GP0 和引脚 GP16 上使用 PWM 通道,你会遇到问题,因为它们都连接到 PWM_A[0]。
上面按照图示搭建电路,LED 和 330Ω 限流电阻,LED 正极通过 330Ω 电阻连接 Pico 的 GP16。LED 负极连接到 Pico 的 GND 引脚。
在 Thonny 中输入以下代码:
from machine import Pin, PWM import utime #将GPIO16设引脚置为PWM led = PWM(Pin(16)) #设置频率 led.freq(1000) led_val = 0 #步进值 led_step = 5 while True: #按步进值调整 led_val += led_step if led_val >= 100: #到达最大值,设置步进为负值,逐步减小 led_val = 100 led_step = -5 elif led_val <= 0: #到达最小值,设置步进为正值,逐步增加 led_val = 0 led_step = 5 #设置PWM的值 led.duty_u16(int(led_val * 500)) utime.sleep_ms(50)
如果要通电自动运行该程序,直接保存到Pico中时将其命名为main.py
可以执行效果如下:可看到led呼吸闪烁