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)