树莓派进阶之路 树莓派 C语言使用PWM (wiringPi使用)

手里面的是树莓派3B,系统是Raspbian官方操作系统,已经安装好了wiringPi。

PWM简介:

脉宽调制(PWM)是指用微处理器的数字输出来对模拟电路进行控制,是一种对模拟信号电平进行数字编码的方法。

wiringpi有两种方式产生PWM,第一种为树莓派硬件PWM,如果需要精确的PWM控制的话,最好使用硬件PWM。第二种为wiringpi软件模拟的pwm,我们一种一种的介绍。
首先是电路连接,准备做一个LED呼吸灯程序。所以电路很简单,一个LED,一个100Ω的电阻。电阻串联在LED正极,然后连接到树莓派12号引脚。LED负极接地。

一、硬件PWM

硬件PWM IO口为物理的12号端口(当然,这个也作为软件PWM使用)。如下图所示:

                  

1、使用C语言编写硬件PWM程序

pi@Raspi:~ $ sudo nano hardware_pwd.c

2、写入以下程序

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <wiringPi.h>

#define LED 1

int main(void)
{
 int bright;
 printf("Raspberry Pi wiringPi PWM test program\n");
    if (wiringPiSetup() == -1){
          printf("GPIO setup error!\n");
           exit(1);}
 pinMode(LED,PWM_OUTPUT);//pwm设定
    while(1){
         for (bright = 0; bright < 1024; ++bright){
                    pwmWrite(LED,bright);//pwm启动
                    delay(12); }
         for (bright = 1023; bright >= 0; --bright){
                    pwmWrite(LED,bright);
                    delay(12);}
                        }
   return 0;
}

3、编译

pi@Raspi:~ $ gcc -o 编译后文件名 代编译文件 -lwiringPi

注!本人测试,如果调用了math.h要在命令后面加上 -lm

4、运行

pi@Raspi:~ $ sudo ./编译后文件名

二、软件模拟PWM

wiringPi 中包含了一个软件驱劢的 PWM 处理库,可以在任意的树莓派 GPIO 上输出PWM 信号。但是软件模拟的PWM有一些限制。因为PWM的频率越高,所需要的CPU资源越多,所以在这之间有一些平衡。
步骤同上,我这里就直接贴出代码了。特别注意编译的时候会多一个-lpthread选项。

 #include <stdio.h>
 #include <stdlib.h>
 #include <stdint.h>
 #include <wiringPi.h>
 #include <softPwm.h>

 #define LED 1 //同样使用1号IO口

 int main(void){
     int i = 0;
          if (wiringPiSetup() == -1){//初始化
             printf("Setup GPIO error!\n");
             return -1;}
     softPwmCreate(LED, 0, 100); //创建软PWM
          while (1){
                for (i = 0; i < 100; i++){
                     softPwmWrite(LED, i);//软PWM启动
                     delay(10);}//防止CPU过高占用
                for (i = 99; i > 0; i--){
                     softPwmWrite(LED, i);
                     delay(10);}
                                    }
     return 0;
}

编译

pi@Raspi:~ $ gcc -o software_pwm software_pwm.c -lwiringPi -lpthread

运行之后会有同样的效果!

特别注意:必须使用 wiringPiSetup()、 wiringPiSetupGpio()或者 wiringPiSetupPhys()函数来初始化 wiringPi。wiringPiSetupSys()是丌够快的,因此,必须使用 sudo 命令来运行程序。
附上wiringpi用户手册中文版的下载:链接:http://pan.baidu.com/s/1qYQBEri 密码:06o8