第6章 树莓派与脉冲宽度调制(PWM)

   上一章我們介紹瞭如何用樹莓派點亮和熄滅一個LED,但如何控制LED燈的亮度呢?脈衝寬度調製(Pulse Width Modulation, PWM)能很好的解決這個問題。脈衝寬度調製是一種簡單、高效、應用廣泛的控制方式,還可以用於控制直流電機的轉速、舵機的轉角角度等,本章將介紹樹莓派與脈衝寬度調製(PWM)的相關知識,主要內容如下。

  • 脈衝寬度調製(PWM)的基本概念和基本原理。
  • 樹莓派RPi.GPIO庫產生和控制PWM的方法。
  • 在樹莓派上使用LED演示和驗證使用PWM。

6.1 脈衝寬度調製(PWM)

   脈衝寬度調製(PWM)是一種高效的數字電壓控制技術,它利用微處理器的數字輸出來對模擬電路進行控制,通過控制固定電壓的直流電源開關頻率,改變負載兩端的電壓,進而達到控制要求的一種電壓調整方法。爲更好的理解和使用PWM,我們首先需要了解以下兩個概念。

  • 頻率,以Hz爲單位,一個脈衝信號時間週期的倒數。如果PWM的輸出頻率比較低,例如只有5Hz,那麼在控制一個LED時候,LED就會一閃一閃的,較高的頻率可以讓運行更爲平滑,但PWM的輸出頻率並不能無限的高,而且在高頻情況下,測定的PWM頻率會與作爲樹莓派參數提供的頻率略有出入。因此,在使用PWM時,應該選擇一個合適的頻率,對於控制一個LED亮度來說,一般100Hz就足夠了。
  • 佔空比,就是輸出的PWM脈衝信號中,高電平保持的時間與該PWM的時鐘週期的時間之比。如圖6.1所示,假設PWM脈衝的頻率爲1000Hz,那麼它的時鐘週期T就是1ms(即1000us),如果高電平持續時間t1爲200us,低電平的時間t2爲800us,那麼佔空比就是200:1000(即1:5)。

   從應用的角度,我們可以簡單的將PWM理解爲通過改變脈衝信號的頻率和高電平的持續時間(或佔空比)來實現電壓控控制的一種方法。圖6.2顯示了三個由GPIO輸出的PWM信號(電壓爲3.3V),第一個信號是一個佔空比爲20%的PWM輸出,即在信號週期中,20%的時間爲高電平(邏輯1),其餘80%的時間爲低電平(邏輯0),對應的電壓爲滿幅值的20%(0.66V)。第二、三個信號分別是佔空比爲50%和80%的PWM輸出,對應的電壓分別爲1.65V和2.64V。

6.2 樹莓派操控PWM

   在樹莓派上,可以通過對GPIO的編程來實現PWM,RPi.GPIO庫就提供了一個PWM功能,以下是使用RPi.GPIO庫的PWM功能的方法。

  • 創建一個PWM實例
pwm = GPIO.PWM(channel, frequency)  

channel:指定要輸出PWM信號的GPIO引腳;
frequency:指定PWM信號的初始頻率,單位爲Hz,其值應大於0.0。

  • 啓用PWM
pwm.start(dc)  

dc:指定PWM信號的初始佔空比,取值範圍爲0.0 ≤ dc ≤ 100.0。

  • 更改PWM頻率
pwm.ChangeFrequency(freq)  

freq:指定PWM的新頻率,單位爲Hz,其值應大於0.0。

  • 更改PWM佔空比
pwm.ChangeDutyCycle(dc)  

dc:指定PWM的新佔空比,取值範圍爲0.0 ≤ dc ≤ 100.0。

  • 停止PWM
pwm.stop()  

6.3 PWM驗證實驗

   接下來,我們將用一個具體的例子來演示樹莓派是如何使用PWM的。在這個實驗裏,您將可以手動改變LED的亮度,一方面我們將儘可能用上RPi.GPIO庫中PWM的相關函數,讓您更好了解這些函數的使用,另一方面讓您更爲直觀的理解PWM的基本原理。

6.3.1 實驗電路

   本實驗的電路及所用到的材料與第五章“點亮LED燈”實驗完全一樣,我們不需要做任何變動。

6.3.2 程序思路

   與第五章“點亮LED燈”實驗相比,本實驗最大的不同在於程序代碼,以下是本實驗的基本思路。

BEGIN  
    引入GPIO庫  
    將GPIO19設置爲輸出模式  
    
    創建PWM對象,並指定初始頻率  
    啓動PWM,並指定初始佔空比  

    等待輸入新PWM頻率  
    將PWM的頻率修改爲新頻率  
    
    DO FOREVER  
        等待輸入新LED亮度(PWM佔空比)  
        改變LED亮度(PWM佔空比)  
    ENDO  
    停止PWM  
    清理釋放GPIO資源  
END  

6.3.2 程序代碼

   按照第4章介紹的方法新建一個項目,然後按照第五章的方法輸入運行以下代碼,程序的詳細說明見註釋。

import RPi.GPIO as GPIO                 # 引入GPIO模塊

if __name__ == '__main__':
    LedPin = 19
    freq = 100                          # 存放PWM頻率變量,這裏初始值爲100,可以根據實際需要修改
    dc = 0                              # 存放PWM佔空比變量,這裏初始值爲0,可以根據實際需要修改

    GPIO.setmode(GPIO.BCM)              # 使用BCM編號方式
    GPIO.setup(LedPin, GPIO.OUT)        # 將GPIO19設置爲輸出模式

    pwm = GPIO.PWM(LedPin, freq)        # 創建PWM對象,並指定初始頻率
    pwm.start(dc)                       # 啓動PWM,並指定初始佔空比

    try:
        freq = int(input("Please input the frequency of PWM(1-2000Hz): "))  # 等待輸入新PWM頻率
        pwm.ChangeFrequency(freq)       # 改變PWM頻率
        while True:
            dc = int(input("Please input the duty cycle(0-100): "))         # 等待輸入新PWM佔空比
            pwm.ChangeDutyCycle(dc)     # 改變PWM佔空比
    finally:
        pwm.stop()                      # 停止PWM
        GPIO.cleanup()                  # 清理釋放GPIO資源,將GPIO復位

   程序運行後,首先會要求您輸入PWM頻率(建議輸入的值在1到2000之間),然後您可以通過不斷的輸入新的PWM佔空比來改變LED的狀態。例如,當您輸入的PWM頻率爲100時,然後分別輸入10、30、50、80、100的PWM佔空比,您將看到LED會一次比一次亮;當您輸入的PWM頻率爲5時,LED會不斷的閃爍,輸入不同的佔空比只會改變LED點亮的時間長度,而亮度基本不變,當佔空比爲100時,LED長亮。

6.4 本章小結

   本章首先介紹了脈衝寬度調製(PWM)的基本概念和基本原理,其次介紹樹莓派產生和控制PWM的方法,最後通過一個PWM實驗演示如何使用樹莓派操作PWM,以更爲直觀的方式體驗PWM。

Leave a Reply

Your email address will not be published. Required fields are marked *