Git例程源码仓库:https://github.com/ZhiliangMa/raspberry.git
使用到的硬件:
led,200Ω左右的电阻、杜邦线。
上一节使用最基本的 GPIO数字输出,led亮了,可如果想要调整led亮度怎么办?
PWM简介
PWM脉宽调制技术广泛存在于现实生活中,例如TFT显示屏的背光亮度调整,电机的速度控制,开关电源输出电压的控制。
相比于早期的线性调制,PWM具有效率高、电路简单等优点。
图中a)可以类比于灯的亮度/电机的速度/电源输出的电压,b)就对应为PWM的脉冲宽度。
如果想要灯变亮一些,就增大PWM的占空比;如果想要灯暗一些,就减小PWM的占空比。
树莓派的硬件PWM
树莓派的硬件pwm只有l路,也就是 物理引脚的12引脚,wiringPi引脚的1引脚。
树莓派内部pwm发生器的基频为19.2MHz,输出频率 freq(Hz) = 19200000 / divisor / range;
使用到的函数:
函数语句 | 函数功能 |
wiringPiSetup(); | 使用wiring编码去初始化GPIO序号 |
pinMode(int pin, int mode); | 设置GPIO电气属性 |
pwmSetRange(unsigned int range); | 设置pwm脉宽范围,range与divisor共同决定pwm输出频率 |
pwmSetClock(int divisor); | 设置pwm分频系数,range与divisor共同决定pwm输出频率 |
pwmWrite(int pin, int value); | 输出pwm值,到pwm引脚 |
delay(unsigned int howLong); | 延时 xx ms |
c代码:
Git例程源码仓库:https://github.com/ZhiliangMa/raspberry.git
wiringPi编码的1引脚,led亮度渐变。
#include <wiringPi.h>
int hpwmLed = 1; // 定义使用wiringPi编码的1引脚
int main(void)
{
int xnum = 0;
wiringPiSetup(); // 使用wiring编码去初始化GPIO序号
pinMode(hpwmLed, PWM_OUTPUT); // 设置GPIO电气属性为pwm输出
pwmSetRange(1024); // pwm脉宽范围 0~1024
pwmSetClock(75); // 250Hz,19.2MHz / 75 / 1024 = 250Hz
while(1)
{
for(xnum = 0; xnum <= 1024; xnum++)
{
pwmWrite(hpwmLed,xnum);
delay(2); // 延时2ms
}
}
return 0;
}