0°

(六)树莓派基础:使用Python和C生成树莓派Raspberry Pi PWM

介绍

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

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

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

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

(六)树莓派基础:使用Python和C生成Raspberry Pi PWM

Raspberry Pi PWM

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

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

(六)树莓派基础:使用Python和C生成Raspberry Pi PWM

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

(六)树莓派基础:使用Python和C生成Raspberry Pi PWM

Raspberry Pi PWM引脚

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

电路连接图

(六)树莓派基础:使用Python和C生成Raspberry Pi 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_BALPWM_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。

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

「点点赞赏,手留余香」

    还没有人赞赏,快来当第一个赞赏的人吧!
0 条回复 A 作者 M 管理员
    所有的伟大,都源于一个勇敢的开始!
欢迎您,新朋友,感谢参与互动!欢迎您 {{author}},您在本站有{{commentsCount}}条评论