古月金真
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脉冲信号 从应用的角度,我们可以简单的将PWM理解为通过改变脉冲信号的频率和高电平的持续时间(或占空比)来实现电压控控制的一种方法。图6.2显示了三个由GPIO输出的PWM信号(电压为3.3V),第一个信号是一个占空比为20%的PWM输出,即在信号周期中,20%的时间为高电平(逻辑1),其余80%的时间为低电平(逻辑0),对应的电压为满幅值的20%(0.66V)。第二、三个信号分别是占空比为50%和80%的PWM输出,对应的电压分别为1.65V和2.64V。 三个由GPIO输出的PWM信号树莓派操控PWM 在树莓派上,可以通过对GPIO的编程来实现PWM,RPi.GPIO库就提供了一个PWM功能,以下是使用RPi.GPIO库的PWM功能的方法。
2.电路
![在这里插入图片描述](https://img-blog.csdnimg.cn/20190802210602947.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDU3MjYyMg==,size_16,color_FFFFFF,t_70)
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.运行
输入频率后,点击回车即可,如下图所示。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20190802211714341.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDU3MjYyMg==,size_16,color_FFFFFF,t_70)
|