树莓派制作呼吸灯(PWM应用)

古月金真

1. 脉冲宽度调制(PWM)

脉冲宽度调制(PWM)是一种高效的数字电压控制技术,它利用微处理器的数字输出来对模拟电路进行控制,通过控制固定电压的直流电源开关频率,改变负载两端的电压,进而达到控制要求的一种电压调整方法。为更好的理解和使用PWM,我们首先需要了解以下两个概念。

  • 频率:以Hz为单位,一个脉冲信号时间周期的倒数。如果PWM的输出频率比较低,例如只有5Hz,那么在控制一个LED时候,LED就会一闪一闪的,较高的频率可以让运行更为平滑,但PWM的输出频率并不能无限的高,而且在高频情况下,测定的PWM频率会与作为树莓派参数提供的频率略有出入。因此,在使用PWM时,应该选择一个合适的频率,对于控制一个LED亮度来说,一般100Hz就足够了。
  • 占空比:输出的PWM脉冲信号中,高电平保持的时间与该PWM的时钟周期的时间之比,如图6.1所示,占空比=t1/T=t1/(t1+t2)。假设PWM脉冲的频率为1000Hz,那么它的时钟周期T就是1ms(即1000us),如果高电平持续时间t1为200us,低电平的时间t2为800us,那么占空比就是200:1000(即1:5)。
    树莓派制作呼吸灯(PWM应用)_第1张图片
    PWM脉冲信号
    从应用的角度,我们可以简单的将PWM理解为通过改变脉冲信号的频率和高电平的持续时间(或占空比)来实现电压控控制的一种方法。图6.2显示了三个由GPIO输出的PWM信号(电压为3.3V),第一个信号是一个占空比为20%的PWM输出,即在信号周期中,20%的时间为高电平(逻辑1),其余80%的时间为低电平(逻辑0),对应的电压为满幅值的20%(0.66V)。第二、三个信号分别是占空比为50%和80%的PWM输出,对应的电压分别为1.65V和2.64V。
    树莓派制作呼吸灯(PWM应用)_第2张图片
    三个由GPIO输出的PWM信号
  • 树莓派操控PWM
    在树莓派上,可以通过对GPIO的编程来实现PWM,RPi.GPIO库就提供了一个PWM功能,以下是使用RPi.GPIO库的PWM功能的方法。

2.电路

树莓派制作呼吸灯(PWM应用)_第3张图片

3.程序

import RPi.GPIO as GPIO        # 引入GPIO模块      
from time import sleep              # 引入time模块
      
LedPin = 19    # 引脚定义 (后面用)
freq =100        # 存放PWM频率变量,这里初始值为100,可以根据实际需要修改                
dc = 0              # 存放PWM占空比变量,这里初始值为0,可以根据实际需要修改              

GPIO.setmode(GPIO.BCM)            # 使用BCM编号方式        
GPIO.setup(LedPin, GPIO.OUT)    # 将GPIO19设置为输出模式    

pwm = GPIO.PWM(LedPin, freq)     # 创建PWM对象,并指定初始频率
pwm.start(dc)                                   # 启动PWM,并指定初始占空比

freq = int(input("Please input the frequency of PWM(1-2000Hz): "))   # 等待输入新PWM频率
pwm.ChangeFrequency(freq)        # 改变PWM频率
while True:                                    # 循环
     if dc ==0:                               #如果占空比为0时
         while 1:
                dc = dc+1                   #占空比自加
                sleep(0.01)                #占空比一0.01s的速度自加
                pwm.ChangeDutyCycle(dc)  #灯现实逐渐变亮
                if dc ==100:
                     break                 如果占空比加到一百时跳出循环体
     if dc == 100:      #与上面相反
         while 1:
                dc = dc-1
                sleep(0.01)
                pwm.ChangeDutyCycle(dc) 
                if dc == 0:
                     break
                     
input()                    
GPIO.cleanup()    # 清理释放GPIO资源,将GPIO复位
  • 注意:占空比最大设置为100。

4.运行

输入频率后,点击回车即可,如下图所示。
树莓派制作呼吸灯(PWM应用)_第4张图片

你可能感兴趣的:(树莓派)