关注  | 分享:

PWM调节LED-树莓派

Mr.D 2018-07-27

基础教程

我们提供的以下步骤是用于说明LED如何在PWM工作模式下的调光实验。实验步骤展示了如何以均匀的速率调暗LED灯。

项目详情

项目创意灵感
需要物料和工具:
Raspberry Pi(我使用的是较旧的Pi,我的Pi-3正在使用中,但任何Pi都可以使用。)
面包板
红色LED
330Ω电阻(不重要220-560Ω可以工作。)
连接线不是必需的,用它会使连线更简洁。这里有买:https://www.adafruit.com/?q=cobbler

WiringPi是一组用于在C中编程Raspberry Pi的库。有关下载,安装和使用的说明,
http://wiringpi.com/download-and-install/
要获得wiringPi引脚编号列表,请在命令行输入gpio readall。当然,在较新版本的Raspian中,默认安装了wiringPi。
设计特色创新
PWM
系统原理功能
脉冲宽度调制(PWM调节占空比)
无论亮度如何,LED始终以相同的电压运行。亮度由方波振荡器决定,电压高的时间决定亮度。这称为脉冲宽度调制(PWM)。这由wiringPi pwmWrite(pin,n)函数控制,其中n的值为0到255.如果n = 2,LED的亮度将是n = 1的两倍。当n加倍时,亮度总是加倍。所以n = 255将是n = 128的两倍亮。

n的值通常表示为称为占空比的百分比。图片显示了25%,50%和75%占空比的示波器轨迹。
完成情况概述
LED和电阻的焊接
这不是必需的,但有一些方便可以使面包板更容易。将电阻焊接到LED的短引线。可使用220-560欧姆电阻。

第1步:不匀速的变暗
像图中那样搭建好电路。点亮LED。它使用wiringPi引脚1,因为您需要使用PWM使能引脚。编译程序并运行它。您会注意到LED变暗的速度会越来越快。随着它接近最暗,它将变得非常快。

【fade1.c 代码可下载】
/******************************************************************
* Compile: gcc -o fade1 -Wall -I/usr/local/include -L/usr/local/lib
* fade1.c -lwiringPi
*
* Execute: sudo ./fade1
*
* All pin numbers are wiringPi numbers unless otherwise specified.
******************************************************************/

#include

int main()
{
wiringPiSetup(); // Setup required by wiringPi
pinMode (1, PWM_OUTPUT); //
pwmSetMode(PWM_MODE_MS); // Mark/Space mode

int i;

while(1)
{
for (i = 255; i > -1; i--)
{
pwmWrite(1, i);
delay(10);
}

for (i = 0; i < 256; i++)
{
pwmWrite(1, i);
delay(10);
}
}
}


第2步:均匀速率变暗
现在我们改变一下。为了使LED以恒定速率变暗,delay()必须以指数速率增加,因为占空比的一半将始终产生亮度的一半。

基于这个:int d =(16-i / 16)^ 2;
基于这个计算公式。重新编译并运行该程序,您将看到LED将以恒定速率淡入和淡出。

【fade2.c 代码可下载】
/******************************************************************
* Compile: gcc -o fade1 -Wall -I/usr/local/include -L/usr/local/lib
* fade2.c -lwiringPi
*
* Execute: sudo ./fade2
*
* All pin numbers are wiringPi numbers unless otherwise specified.
******************************************************************/
#include

int main()
{
wiringPiSetup(); // Setup required by wiringPi
pinMode (1, PWM_OUTPUT); //
pwmSetMode(PWM_MODE_MS); // Mark/Space mode

while(1)
{
int i;
int x = 1;
for (i = 0; i > -1; i = i + x)
{
int d = (16-i/16)^2; // calc inverse square of index
pwmWrite(1, i);
delay(d);
if (i == 255) x = -1; // switch direction at peak
}
}
}

项目采用平台:

同学讨论

苏ICP备2021055573号-1 © 2023 云行学堂(江苏)科技有限公司