Git例程源码仓库:https://github.com/ZhiliangMa/raspberry.git
使用到的硬件:
led,200Ω左右的电阻、杜邦线。
上一节使用硬件PWM来控制led亮度,可树莓派的硬件PWM引脚只有1路,在实际应用中,1路PWM几乎干不了什么。
庆幸的是wiringPi库提供了一个软PWM功能。可以将任意GPIO都复用为PWM,但缺点是会增加CPU负担。
树莓派的软件PWM
软件PWM默认频率是100Hz,一般的pwm范围设置为100,所以一般的pwm分辨率为0.1ms,太大会增加CPU开销。
int softPwmCreate (int pin, int initialValue, int pwmRange) ; // pin引脚,initialValue初始PWM值,pwmRange输出pwm范围
用软件PWM,实现的呼吸灯:
Git例程源码仓库:https://github.com/ZhiliangMa/raspberry.git
include <wiringPi.h>
#include <softPwm.h>
int spwmLed = 1; // 定义使用wiringPi编码的1引脚
int main(void)
{
int xnum = 0;
wiringPiSetup(); // 使用wiring编码去初始化GPIO序号
softPwmCreate (spwmLed, 0, 100); // 设置wiringPi编码的1引脚为软件PWM输出
while(1)
{
for(xnum = 0; xnum <= 100; xnum++)
{
softPwmWrite(spwmLed, xnum);
delay(15); // 延时15ms
}
for(xnum = 99; xnum > 0; xnum--)
{
softPwmWrite(spwmLed, xnum);
delay(15); // 延时15ms
}
}
return 0;
}
应用要点
由于软件PWM会很大程度上占用树莓派的CPU开销,挤压其他任务的调度。
而且性能一般般,准确性查,几KHz以上的高频PWM几乎是输出不了的。
所以建议应用电机控制的玩家,外挂一片单片机/PCA9685,使用总线通信方式去控制其他外设做PWM输出。