7. 脉宽调制¶
脉宽调制 (PWM) 是一种在数字引脚上获得人工模拟输出的方法。它通过将引脚从低电平快速切换到高电平来实现这一点。有两个与此相关的参数:切换频率和占空比。占空比定义为与单个周期(低加高时间)的长度相比,引脚处于高电平的时间。最大占空比是引脚始终处于高电平时,最小占空比是始终处于低电平时。
在 ESP8266 上,引脚 0、2、4、5、12、13、14 和 15 都支持 PWM。限制是它们必须都在相同的频率上,并且频率必须在 1Hz 和 1kHz 之间。
要在引脚上使用 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。假设您的电路板有一个 LED 连接到引脚 2(ESP-12 模块),我们可以使用以下方法创建 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. 控制爱好伺服¶
可以使用 PWM 控制业余伺服电机。它们需要 50Hz 的频率,然后是大约 40 到 115 之间的占空比,其中 77 是中心值。如果将伺服器连接到电源和接地引脚,然后将信号线连接到引脚 12(其他引脚也可以正常工作),则可以使用以下方法控制电机:
>>> servo = machine.PWM(machine.Pin(12), freq=50)
>>> servo.duty(40)
>>> servo.duty(115)
>>> servo.duty(77)