上一节文章末尾讲了如何点亮一个LED,本节讲解如何点亮一个会呼吸的LED,也就是如图所示的呼吸灯:
PWM基础知识:
通常控制一个LED亮灭只需要控制一个引脚输出高电平或者低电平即可,是一个数字信号,只有两个值,要么是0,要么是1
但是在0到1之前还有无数的中间状态,这就是模拟信号
我们要实现呼吸灯使用数字信号来控制肯定是不行的,我们需要能够输出0和1之前的值,相当于输出一个模拟信号,但是树莓派的GPIO引脚都是数字信号的,怎么办呢?
这时候就有一种PWM的方式将数字信号转换成模拟信号输出
PWM全称Pulse Width Modulation(脉冲宽度调制),简称脉宽调制,通过控制方波一个周期内高电平的占比来模拟一个正弦波。
从高电平到低电平再到高电平叫作一个周期,而频率是周期的倒数,如果一个PWM的频率为50Hz,那么一个周期的时间为0.02s。
而这0.02s中高电平所占时间的比例就叫作占空比。
比如一个高电平电压是5V,经过75%占空比的PWM输出后,输出电压为3.75V
通过不断改变每个周期的占空比来实现输出电压的渐变。
代码示例:
Pico中直接导入PWM包即可,不用自己计算PWM
from time import sleep
from machine import Pin, PWM
pwm = PWM(Pin(25, Pin.OUT))
pwm.freq(1000)
while True:
for duty in range(65535):
pwm.duty_u16(duty)
sleep(0.0001)
for duty in range(65535, 0, -1):
pwm.duty_u16(duty)
sleep(0.0001)
这段代码将LED接到25号脚上
然后设置PWM的频率为1000Hz
第一个for循环将占空比从0%涨到100%,LED会逐渐变亮
第二个循环将占空比从100%减到0%,LED会逐渐变暗
pwm.duty_u16(duty)
这里设置的其实是0-65535中间的一个数值,这个数值除以65535才是占空比,之所以范围是0-65535是因为这个数值是uint 16位的,相当于2的16次方=65536
这只是PWM的一个简单应用,使用PWM还可以实现直流电机转速的控制
这个在以后的章节会讲到