7. Pulse Width Modulation

脉宽调节(PWM)是获取数字引脚上人工模拟输出的一种方式。其通过引脚从低到高的迅速切换实现其功能。 有两个与此相关的参数:切换的频率和占空比。占空比定义为高电平的时长占单一周期的比率。 始终处于高电平时,占空比取最大值,始终处于低电平时占空比最小。

PWM可在所有输出引脚上启用。但其存在局限:须全部为同一频率,且仅有8个通道。频率须位于1Hz和78125Hz之间。

在引脚上使用PWM,您须首先创建一个引脚对象,例如:

>>> import machine
>>> p12 = machine.Pin(12)

使用以下指令创建PWM对象:

>>> pwm12 = machine.PWM(p12)

您可使用以下方法设置频率与占空比:

>>> pwm12.freq(500)
>>> pwm12.duty(512)

注意:占空比介于0至1023间,其中512为50%。若您打印PWM对象,则该对象将告知您其当前配置:

>>> pwm12
PWM(12, freq=500, duty=512)

您也可调用没有参数的freq()和duty()方法以获取其当前值。

引脚将继续保持在PWM模式,直至您使用以下指令取消此模式:

>>> pwm12.deinit()

7.1. LED亮度渐变

我们可使用PWM特性来实现LED亮度渐变。假定您的板有一个连接到引脚2的LED,我们即可使用以下指令来创建一个LED-PWM对象:

>>> led = machine.PWM(machine.Pin(2), freq=1000)

注意:可在PWM构造函数中设置频率。

接下来,我们将使用定时和数学函数,因此请输入这些模块:

>>> import time, math

然后创建一个函数以驱动LED:

>>> def pulse(l, t):
...     for i in range(20):
...         l.duty(int(math.sin(i / 10 * math.pi) * 500 + 500))
...         time.sleep_ms(t)

您可使用以下指令尝试一下此函数:

>>> pulse(led, 50)

为获得更好效果,您可连续多次驱动:

>>> for i in range(10):
...     pulse(led, 20)

请记住您可使用ctrl-C来中断代码。

7.2. 控制hobby伺服

使用PWM可控制hobby伺服电机。此种电机需要50Hz的频率以及介于40至115之间的占空比,其中77为中心值。 若您将伺服器连接到电源与接地引脚上,信号线连接到引脚12(其他引脚同样适用),您即可使用以下方法控制电机

>>> servo = machine.PWM(machine.Pin(12), freq=50)
>>> servo.duty(40)
>>> servo.duty(115)
>>> servo.duty(77)