树莓派进阶之路 (013) - 树莓派2/3 C语言使用PWM

我手里面的是树莓派3,系统是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、写入以下程序

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <stdint.h>
 4 #include <wiringPi.h>
 5 
 6 #define LED 1
 7 
 8 int main(void)
 9 {
10     int bright;
11     printf("Raspberry Pi wiringPi PWM test program\n");
12     if (wiringPiSetup() == -1)
13     {
14         printf("GPIO setup error!\n");
15         exit(1);
16     }
17     pinMode(LED,PWM_OUTPUT);
18     while(1)
19     {
20     for (bright = 0; bright < 1024; ++bright)
21         {
22             pwmWrite(LED,bright);
23             delay(12);
24         }
25     for (bright = 1023; bright >= 0; --bright)
26         {
27             pwmWrite(LED,bright);
28             delay(12);
29         }
30     }
31     return 0;
32 }

3、编译

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

4、运行

pi@Raspi:~ $ sudo ./hardware_pwd

现在应该可以看到你的LED有呼吸灯效果了。

二、软件模拟PWM

 1 /*
 2  ============================================================================
 3  Name        : software_pwm.c
 4  Author      : Cheetah
 5  Version     :
 6  Copyright   : Geeiot
 7  Description : PWM in C, Ansi-style
 8  ============================================================================
 9  */
10 
11 #include <stdio.h>
12 #include <stdlib.h>
13 #include <stdint.h>
14 #include <wiringPi.h>
15 #include <softPwm.h>
16 
17 #define LED 1   //同样使用1号IO口
18 
19 int main(void) 
20 {
21     int i = 0;
22     if (wiringPiSetup() == -1)  //初始化wiringpi
23     {
24         printf("Setup GPIO error!\n");
25         return -1;
26     }
27     softPwmCreate(LED, 0, 100);  //创建软PWM
28     while (1) 
29     {
30         for (i = 0; i < 100; i++) 
31         {
32             softPwmWrite(LED, i);
33             delay(10);
34         }
35         for (i = 99; i > 0; i--) 
36         {
37             softPwmWrite(LED, i);
38             delay(10);
39         }
40     }
41     return 0;
42 }

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

编译

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

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

特别注意:必须使用 wiringPiSetup()、 wiringPiSetupGpio()或者 wiringPiSetupPhys()函数来初始化 wiringPi。wiringPiSetupSys()是需要要调用底层资源,因此,必须使用 sudo 命令来运行程序。
附上wiringpi用户手册的下载:https://www.geeiot.net/forum.php ... 1121&extra=page%3D1

 

转载:https://www.geeiot.net/forum.php?mod=viewthread&tid=1122&extra=page%3D1

 

 
posted @ 2017-06-03 18:37  极客先锋  阅读(8186)  评论(0编辑  收藏  举报