第6章 樹莓派與脈沖寬度調(diào)制(PWM)

?  上一章我們介紹了如何用樹莓派點亮和熄滅一個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 三個由GPIO輸出的PWM信號

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言蛇。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末僻他,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子猜极,更是在濱河造成了極大的恐慌中姜,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,682評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件跟伏,死亡現(xiàn)場離奇詭異丢胚,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)受扳,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評論 3 395
  • 文/潘曉璐 我一進(jìn)店門携龟,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人勘高,你說我怎么就攤上這事峡蟋。” “怎么了华望?”我有些...
    開封第一講書人閱讀 165,083評論 0 355
  • 文/不壞的土叔 我叫張陵蕊蝗,是天一觀的道長。 經(jīng)常有香客問我赖舟,道長蓬戚,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,763評論 1 295
  • 正文 為了忘掉前任宾抓,我火速辦了婚禮子漩,結(jié)果婚禮上豫喧,老公的妹妹穿的比我還像新娘。我一直安慰自己幢泼,他們只是感情好紧显,可當(dāng)我...
    茶點故事閱讀 67,785評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著缕棵,像睡著了一般孵班。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上招驴,一...
    開封第一講書人閱讀 51,624評論 1 305
  • 那天重父,我揣著相機(jī)與錄音,去河邊找鬼忽匈。 笑死房午,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的丹允。 我是一名探鬼主播郭厌,決...
    沈念sama閱讀 40,358評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼雕蔽!你這毒婦竟也來了折柠?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,261評論 0 276
  • 序言:老撾萬榮一對情侶失蹤批狐,失蹤者是張志新(化名)和其女友劉穎扇售,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體嚣艇,經(jīng)...
    沈念sama閱讀 45,722評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡承冰,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了食零。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片困乒。...
    茶點故事閱讀 40,030評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖贰谣,靈堂內(nèi)的尸體忽然破棺而出娜搂,到底是詐尸還是另有隱情,我是刑警寧澤吱抚,帶...
    沈念sama閱讀 35,737評論 5 346
  • 正文 年R本政府宣布百宇,位于F島的核電站,受9級特大地震影響秘豹,放射性物質(zhì)發(fā)生泄漏携御。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,360評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望因痛。 院中可真熱鬧,春花似錦岸更、人聲如沸鸵膏。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽谭企。三九已至,卻和暖如春评肆,著一層夾襖步出監(jiān)牢的瞬間债查,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評論 1 270
  • 我被黑心中介騙來泰國打工瓜挽, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留盹廷,地道東北人。 一個月前我還...
    沈念sama閱讀 48,237評論 3 371
  • 正文 我出身青樓久橙,卻偏偏與公主長得像俄占,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子淆衷,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,976評論 2 355

推薦閱讀更多精彩內(nèi)容