点亮一个LED灯是电子开发最常见的入门实验。本次实验分为三个小实验:
(1)点亮单个LED灯,并让其亮暗闪烁
(2)通过脉宽调制(PWM)点亮单个LED灯,并让其亮暗闪烁
(3)让LED灯从暗到亮缓慢变化,再从亮到暗缓慢变化,不断循环
本次实验的树莓派GPIO采用BCM编号方式。LED灯的正极与树莓派4B的13号引脚连接,实物连接中电阻的作用是作为保护电阻。
import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BCM) #引脚采用BCM编号方式
GPIO.setup(13, GPIO.OUT) #13号引脚设置为输出模式
GPIO.output(13, GPIO.LOW) #初始化,13号引脚置低电平,默认状态下LED暗
while True:
GPIO.output(13, GPIO.HIGH) #13号引脚置高电平,此时LED灯被点亮
time.sleep(0.3) #持续0.3s
GPIO.output(13, GPIO.LOW) #13号引脚置低电平,此时LED灯熄灭
time.sleep(0.3) #持续0.3s
import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BCM) #引脚采用BCM编号方式
GPIO.setup(13, GPIO.OUT) #13号引脚设置为输出模式
GPIO.output(13, GPIO.LOW) #初始化,13号引脚置低电平,默认状态下LED暗
p = GPIO.PWM(13, 1) #在13号引脚处调制频率为1Hz的脉冲
p.start(50) #占空比为50%的脉冲开始输出
time.sleep(6) #持续时间6S
p.ChangeDutyCycle(100) #把输出脉冲的占空比设置为100%
time.sleep(4) #持续时间4S
p.stop() #停止输出脉冲
GPIO.cleanup() #清理GPIO口资源
代码分析:
import time
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BCM) #引脚采用BCM编号方式
GPIO.setup(13, GPIO.OUT) #13号引脚设置为输出模式
GPIO.output(13, GPIO.LOW) #初始化,13号引脚置低电平,默认状态下LED暗
p = GPIO.PWM(13, 100) #在13号引脚处调制频率为100Hz的脉冲
p.start(0) #占空比为0的脉冲开始输出
try:
while 1:
for dc in range(0, 101, 5): #从0到100,每次循环加5
p.ChangeDutyCycle(dc) #把输出脉冲的占空比设置为dc%
time.sleep(0.1) #持续时间0.1S
for dc in range(100, -1, -5): #从100到0,每次循环减5
p.ChangeDutyCycle(dc) #把输出脉冲的占空比设置为dc%
time.sleep(0.1) #持续时间0.1S
except KeyboardInterrupt: #按键盘Ctrl+C会中止程序
pass
p.stop()
GPIO.cleanup()
为什么这部分代码的实验现象是:LED灯从暗到亮缓慢变化,再从暗到亮缓慢变化?
简单的说,PWM技术就是不停的通断电路并控制通断持续的时间片段长度来控制用电器在单位时间内实际得到的电能。这么说好像还是复杂了,再简单点说,如果你的手足够快,打开电灯开关后马上关闭,如果这个时间间隔足够短,灯丝还没有全部亮起来就暗下去了。你再次打开电灯再关闭,再打开再关闭。如果你一直保持相同的频率,那么电灯应该会保持一个固定的亮度不变。理论上,你可以通过调整开灯持续的时间长度和关灯持续的时间长度的比例就能得到不同亮度了。这个比例被称为“占空比”。
从平均电压的角度来分析,假设占空比为10%,那么这10块时间里,只有1块的时间让LED导通,剩下9块的时间里LED截止。假设PWM信号的幅值是5V,那么在导通的1块时间里LED电压的确是5V的,但是在剩下9块时间里,它的电压却是0V。也就是说从一个周期整体看来,LED的平均电压只有5*0.1+0*0.9=0.5V。PWM信号频率很高的,我们无法通过肉眼来观察到每一个周期LED灯亮灭的变化过程,所以只好通过平均电压这样一种方式来决定这个LED的亮的程度了。
所以在PWM技术中,可以通过调节占空比来控制LED灯的亮暗程度。