python的应用领域树莓派_(六)树莓派基础:使用Python和C生成树莓派Raspberry Pi PWM...

介绍

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

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

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

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

7db22-ec17b-dcad8-1ae25c533b5bfc.gif

Raspberry Pi PWM

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

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

835a6-190a8-f261a-163c22cb395e46.jpg

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

a16a5-ae0e2-a599c-1f05ce336ceadb.jpg

Raspberry Pi PWM引脚

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

电路连接图

3be48-81851-8b633-1ed387cd45cbec.jpg

在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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值