目录
介绍
PWM(脉冲宽度调制)是一种调制技术,通过该技术改变脉冲宽度,同时保持频率恒定。
通过PWM技术,我们可以使用ON-OFF信号控制输送到负载的功率。
PWM信号可用于控制直流电机速度,改变LED强度,控制伺服电机等应用。
下面显示的GIF描述了使用PWM进行LED的强度控制。
Raspberry Pi PWM
Raspberry Pi有两个PWM通道,即PWM0和PWM1。
40引脚P1接头上两个PWM通道的PWM引脚如下:
Raspberry Pi 40引脚P1Header上的PWM引脚如下图所示,
Raspberry Pi PWM引脚
Raspberry Pi上的PWM引脚与音频子系统共享。因此,我们可以有PWM输出或音频输出。
电路连接图
在Raspberry Pi上使用PWM控制LED亮度
例
在这里,我们将在Raspberry Pi上生成PWM。该PWM输出连接到LED,LED将显示亮度变化。
让我们用C和Python语言生成PWM。
使用Python生成PWM
Python在Raspberry Pi上生成的PWM是软件PWM。该PWM的定时分辨率为1 us,优于使用C(WiringPi库)生成的软件PWM。
Python程序
'''
Control the Brightness of LED using PWM on Raspberry Pi
https://www.qutaojiao.com
'''
import RPi.GPIO as GPIO
from time import sleep
ledpin = 12 # PWM pin connected to LED
GPIO.setwarnings(False) #disable warnings
GPIO.setmode(GPIO.BOARD) #set pin numbering system
GPIO.setup(ledpin,GPIO.OUT)
pi_pwm = GPIO.PWM(ledpin,1000) #create PWM instance with frequency
pi_pwm.start(0) #start PWM of required Duty Cycle
while True:
for duty in range(0,101,1):
pi_pwm.ChangeDutyCycle(duty) #provide duty cycle in the range 0-100
sleep(0.01)
sleep(0.5)for duty in range(100,-1,-1):
pi_pwm.ChangeDutyCycle(duty)
sleep(0.01)
sleep(0.5)
Python中的PWM函数
创建PWM对象
创建一个类PWM对象,它是RPi.GPIO库的一部分。在这里,我们创建了名为pi_pwm的 Object 。我们可以为Object提供任何名称。
例如
pi_pwm = GPIO.PWM (Pin no., frequency)
解释:
Pin no – PWM引脚否将产生PWM。
Frequency – PWM的频率
现在,我们可以使用PWM对象调用RPi.GPIO库的PWM函数。
注意:此处生成的PWM是软件PWM,可以在任何GPIO引脚上生成。
start (Duty Cycle)
它用于启动指定占空比的PWM生成。
ChangeDutyCycle(Duty Cycle)
该功能用于改变信号的占空比。我们必须提供0-100范围内的占空比。
ChangeFrequency(frequency)
该功能用于改变PWM的频率(Hz)。我们在上面的程序中没有使用过这个功能。但是,我们可以用它来改变频率。
stop()
该功能用于停止PWM生成。
使用C生成PWM
硬件PWM
我们还可以使用C编写的程序在Raspberry Pi上生成PWM。这里,我们使用的是使用WirePi库在Raspberry Pi上使用C生成PWM。它提供了对Raspberry Pi的硬件PWM的访问。
C程序
/*
Change the Intensity of LED using PWM on Raspberry Pi
https://www.qutaojiao.com
*/
#include <wiringPi.h>
#include <stdio.h>
#include <stdlib.h>
const int PWM_pin = 1; /* GPIO 1 as per WiringPi, GPIO18 as per BCM */
int main (void)
{int intensity ;
if (wiringPiSetup () == -1)
exit (1) ;
pinMode (PWM_pin, PWM_OUTPUT) ; /* set PWM pin as output */
while (1)
{
for (intensity = 0 ; intensity < 1024 ; ++intensity)
{
pwmWrite (PWM_pin, intensity) ; /* provide PWM value for duty cycle */
delay (1) ;
}
delay(1);
for (intensity = 1023 ; intensity >= 0 ; --intensity)
{
pwmWrite (PWM_pin, intensity) ;
delay (1) ;
}
delay(1);
}
}
C中的PWM功能(WiringPi)
pwmWrite (PWM pin, PWM value)
解释:
PWM pin– 片内PWM引脚号,在哪个PWM上生成。
PWM value – 写入PWM寄存器的值,用于PWM生成。该值的范围为0-1023。
我们可以使用像Arduino函数这样的analogWrite()函数在Raspberry Pi上生成PWM。但要使用此功能,我们必须包含一些额外的函数:
pwmSetClock (divisor)
该功能用于设置PWM时钟的除数。
pwmSetMode (mode)
mode – PWM生成可以在两种模式下完成,即平衡和标记:空间模式。我们可以提供选择上述模式的参数,PWM_MODE_BAL或PWM_MODE_MS。Raspberry Pi上的默认PWM模式是Balanced模式。
pwmSetRange (range)
该功能用于设置PWM发生器寄存器中PWM生成的范围。默认范围是1024。
使用C的软件PWM
我们可以使用wiringPi的软件PWM库在Raspberry Pi的每个GPIO引脚上生成PWM。
在这里,我们将使用Raspberry Pi上的软件PWM改变LED的强度。
程序
/*
Control Intensity of LED using PWM on Raspberry pi
https://www.qutaojiao.com
*/
#include <wiringPi.h> /* include wiringPi library */
#include <stdio.h>
#include <softPwm.h> /* include header file for software PWM */
int main(){
int PWM_pin = 1; /* GPIO1 as per WiringPi,GPIO18 as per BCM */
int intensity;
wiringPiSetup(); /* initialize wiringPi setup */
pinMode(PWM_pin,OUTPUT); /* set GPIO as output */
softPwmCreate(PWM_pin,1,100); /* set PWM channel along with range*/
while (1)
{
for (intensity = 0; intensity < 101; intensity++)
{
softPwmWrite (PWM_pin, intensity); /* change the value of PWM */
delay (10) ;
}
delay(1);
for (intensity = 100; intensity >= 0; intensity--)
{
softPwmWrite (PWM_pin, intensity);
delay (10);
}
delay(1);
}
}
使用的功能
要使用wiringPi库生成软件PWM,我们必须包含softPwm.h头文件。
softPwmCreate (Pin no., initial value, PWM Range)
该功能用于创建软件控制的PWM。我们可以在任何GPIO引脚上产生PWM。
参数:
Pin no – 我们想要生成PWM的GPIO引脚。
initial value – 指定介于PWM范围之间的任何初始值。
PWM Range -我们可以为PWM提供范围即频率范围。使用100表示PWM范围,然后该值可以是0到100之间的任何值。这些值对于生成各种占空比的PWM非常有用。
注意:最小脉冲宽度为100 us,以保持较低的CPU使用率。对于此最小脉冲宽度,建议的PWM范围为100,其频率为100 Hz。如果我们降低PWM范围的值,那么我们将以更低的分辨率获得更高的频率。或者我们可以增加PWM范围的值,然后以更好的分辨率获得更低的频率。
softPwmWrite(Pin no., value)
该功能用于改变PWM引脚上的PWM值。
Pin no. – 我们想要生成PWM的GPIO引脚。
value – 值是PWM值。
软件PWM或硬件PWM
当我们必须生成更多数量的PWM并且我们的应用程序容忍低时序分辨率时,我们可以使用软件PWM。
但如果我们的应用需要更高的定时分辨率PWM,那么我们需要使用硬件PWM。
本教程所有完整程序下载: