我手里面的是樹莓派3,系統是Raspbian官方操作系統,已經安裝好了wiringPi。
PWM簡介:脈寬調制(PWM)是指用微處理器的數字輸出來對模擬電路進行控制,是一種對模擬信號電平進行數字編碼的方法。wiringpi有兩種方式產生PWM,第一種為樹莓派硬件PWM,如果需要精確的PWM控制的話,最好使用硬件PWM。第二種為wiringpi軟件模擬的pwm,我們一種一種的介紹。
首先是電路連接,准備做一個LED呼吸燈程序。所以電路很簡單,一個LED,一個100Ω的電阻。電阻串聯在LED正極,然后連接到樹莓派12號引腳。LED負極接地。
一、硬件PWM。
硬件PWM IO口為物理的12號端口(當然,這個也作為軟件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