? 上一章我們介紹了如何用樹莓派點亮和熄滅一個LED承璃,但如何控制LED燈的亮度呢蚤蔓?脈沖寬度調(diào)制(Pulse Width Modulation, PWM)能很好的解決這個問題淑廊。脈沖寬度調(diào)制是一種簡單、高效葱跋、應(yīng)用廣泛的控制方式澳化,還可以用于控制直流電機(jī)的轉(zhuǎn)速、舵機(jī)的轉(zhuǎn)角角度等稳吮,本章將介紹樹莓派與脈沖寬度調(diào)制(PWM)的相關(guān)知識缎谷,主要內(nèi)容如下。
- 脈沖寬度調(diào)制(PWM)的基本概念和基本原理灶似。
- 樹莓派RPi.GPIO庫產(chǎn)生和控制PWM的方法列林。
- 在樹莓派上使用LED演示和驗證使用PWM。
6.1 脈沖寬度調(diào)制(PWM)
? 脈沖寬度調(diào)制(PWM)是一種高效的數(shù)字電壓控制技術(shù)酪惭,它利用微處理器的數(shù)字輸出來對模擬電路進(jìn)行控制希痴,通過控制固定電壓的直流電源開關(guān)頻率,改變負(fù)載兩端的電壓春感,進(jìn)而達(dá)到控制要求的一種電壓調(diào)整方法砌创。為更好的理解和使用PWM虏缸,我們首先需要了解以下兩個概念。
-
頻率
? 頻率以Hz為單位嫩实,一個脈沖信號時間周期的倒數(shù)刽辙。如果PWM的輸出頻率比較低,例如只有5Hz甲献,那么在控制一個LED時候宰缤,LED就會一閃一閃的,較高的頻率可以讓運行更為平滑晃洒,但PWM的輸出頻率并不能無限的高慨灭,而且在高頻情況下,測定的PWM頻率會與作為樹莓派參數(shù)提供的頻率略有出入球及。因此氧骤,在使用PWM時,應(yīng)該選擇一個合適的頻率桶略,對于控制一個LED亮度來說语淘,一般100Hz就足夠了。 -
占空比
? 占空比就是輸出的PWM脈沖信號中际歼,高電平保持的時間與該PWM的時鐘周期的時間之比惶翻,如圖6.1所示,占空比=t1/T=t1/(t1+t2)鹅心。假設(shè)PWM脈沖的頻率為1000Hz吕粗,那么它的時鐘周期T就是1ms(即1000us),如果高電平持續(xù)時間t1為200us旭愧,低電平的時間t2為800us颅筋,那么占空比就是200:1000(即1:5)。
圖 6.1 PWM脈沖信號
? 從應(yīng)用的角度输枯,我們可以簡單的將PWM理解為通過改變脈沖信號的頻率和高電平的持續(xù)時間(或占空比)來實現(xiàn)電壓控控制的一種方法议泵。圖6.2顯示了三個由GPIO輸出的PWM信號(電壓為3.3V),第一個信號是一個占空比為20%的PWM輸出桃熄,即在信號周期中先口,20%的時間為高電平(邏輯1),其余80%的時間為低電平(邏輯0)瞳收,對應(yīng)的電壓為滿幅值的20%(0.66V)碉京。第二、三個信號分別是占空比為50%和80%的PWM輸出螟深,對應(yīng)的電壓分別為1.65V和2.64V谐宙。
6.2 樹莓派操控PWM
? 在樹莓派上,可以通過對GPIO的編程來實現(xiàn)PWM界弧,RPi.GPIO庫就提供了一個PWM功能凡蜻,以下是使用RPi.GPIO庫的PWM功能的方法搭综。
- 創(chuàng)建一個PWM實例
pwm = GPIO.PWM(channel, frequency)
channel:指定要輸出PWM信號的GPIO引腳;
frequency:指定PWM信號的初始頻率咽瓷,單位為Hz设凹,其值應(yīng)大于0.0。
- 啟用PWM
pwm.start(dc)
dc:指定PWM信號的初始占空比茅姜,取值范圍為0.0 ≤ dc ≤ 100.0闪朱。
- 更改PWM頻率
pwm.ChangeFrequency(freq)
freq:指定PWM的新頻率,單位為Hz钻洒,其值應(yīng)大于0.0奋姿。
- 更改PWM占空比
pwm.ChangeDutyCycle(dc)
dc:指定PWM的新占空比,取值范圍為0.0 ≤ dc ≤ 100.0素标。
- 停止PWM
pwm.stop()
6.3 PWM驗證實驗
? 接下來称诗,我們將用一個具體的例子來演示樹莓派是如何使用PWM的。在這個實驗里头遭,您將可以手動改變LED的亮度寓免,一方面我們將盡可能用上RPi.GPIO庫中PWM的相關(guān)函數(shù),讓您更好了解這些函數(shù)的使用计维,另一方面讓您更為直觀的理解PWM的基本原理袜香。
6.3.1 實驗電路
? 本實驗的電路及所用到的材料與第5章“點亮LED燈”實驗完全一樣,我們不需要做任何變動鲫惶。
6.3.2 程序思路
? 與第5章“點亮LED燈”實驗相比蜈首,本實驗最大的不同在于程序代碼,以下是本實驗的基本思路欠母。
BEGIN
引入GPIO庫
將GPIO19設(shè)置為輸出模式
創(chuàng)建PWM對象欢策,并指定初始頻率
啟動PWM,并指定初始占空比
等待輸入新PWM頻率
將PWM的頻率修改為新頻率
DO FOREVER
等待輸入新LED亮度(PWM占空比)
改變LED亮度(PWM占空比)
ENDO
停止PWM
清理釋放GPIO資源
END
6.3.3 程序代碼
? 按照第4章介紹的方法新建一個項目赏淌,然后按照第5章的方法輸入運行以下代碼踩寇,程序的詳細(xì)說明見注釋。
import RPi.GPIO as GPIO # 引入GPIO模塊
if __name__ == '__main__':
LedPin = 19
freq = 100 # 存放PWM頻率變量六水,這里初始值為100俺孙,可以根據(jù)實際需要修改
dc = 0 # 存放PWM占空比變量,這里初始值為0缩擂,可以根據(jù)實際需要修改
GPIO.setmode(GPIO.BCM) # 使用BCM編號方式
GPIO.setup(LedPin, GPIO.OUT) # 將GPIO19設(shè)置為輸出模式
pwm = GPIO.PWM(LedPin, freq) # 創(chuàng)建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復(fù)位
? 程序運行后,首先會要求您輸入PWM頻率(建議輸入的值在1到2000之間)计露,然后您可以通過不斷的輸入新的PWM占空比來改變LED的狀態(tài)博脑。例如憎乙,您可以輸入一個100Hz的PWM頻率,然后分別輸入10叉趣、30泞边、50、80疗杉、100的PWM占空比阵谚,您將看到LED會一次比一次亮;當(dāng)您輸入的PWM頻率為5時烟具,LED會不斷的閃爍梢什,輸入不同的占空比只會改變LED點亮的時間長度,而亮度基本不變朝聋,當(dāng)占空比為100時嗡午,LED長亮。
6.4 本章小結(jié)
? 本章首先介紹了脈沖寬度調(diào)制(PWM)的基本概念和基本原理冀痕,其次介紹樹莓派產(chǎn)生和控制PWM的方法荔睹,最后通過一個PWM實驗演示如何使用樹莓派操作PWM,以更為直觀的方式體驗PWM言蛇。