樹莓派進階之路 (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

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM