介绍

PWM(脉冲宽度调制)是一种调制技术,通过该技术改变脉冲宽度,同时保持频率恒定。

通过PWM技术,我们可以使用ON-OFF信号控制输送到负载的功率。

PWM信号可用于控制直流电机速度,改变LED强度,控制伺服电机等应用。

下面显示的GIF描述了使用PWM进行LED的强度控制。

树莓派Python继电器 树莓派pwm控制电机python_树莓派Python继电器

Raspberry Pi PWM

Raspberry Pi有两个PWM通道,即PWM0和PWM1。

40引脚P1接头上两个PWM通道的PWM引脚如下:

树莓派Python继电器 树莓派pwm控制电机python_#include_02

Raspberry Pi 40引脚P1Header上的PWM引脚如下图所示,

树莓派Python继电器 树莓派pwm控制电机python_Python_03

Raspberry Pi PWM引脚

Raspberry Pi上的PWM引脚与音频子系统共享。因此,我们可以有PWM输出或音频输出。

电路连接图

树莓派Python继电器 树莓派pwm控制电机python_树莓派Python继电器_04

在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 
#include 
#include 
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 /* include wiringPi library */
#include 
#include /* 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。

本教程所有完整程序下载:

隐藏内容,您需要满足以下条件方可查看

End