脈寬調製功能(PWM)
名詞解釋
PWM 是 Pulse Width Modulation 的縮寫,它的中文名字是脈衝寬度調製,它利用微處理器的數字輸出來對類比電路進行控制,其實就是使用數字訊號達到一個模擬訊號的效果。
首先從它的名字來看,脈衝寬度調製,就是改變脈衝寬度來實現不同的效果。我們先來看三組不同的脈衝訊號,如圖 10-1 所示。
圖片來源於c語言中文網
這是一個週期是 10ms,即頻率是 100Hz 的波形,但是每個週期內,高低電平脈衝寬度各不相同,這就是 PWM 的本質。在這裡大家要記住一個概念,叫做“佔空比”。佔空比是指高電平的時間佔整個週期的比例。比如第一部分波形的佔空比是 40%,第二部分波形佔空比是 60%,第三部分波形佔空比是 80%,這就是 PWM 的解釋。
如果我們把這個間隔不斷的減小,減小到我們的肉眼分辨不出來,也就是 100Hz 以上的頻率,這個時候小燈表現出來的現象就是既保持亮的狀態,但亮度又沒有 LED = 0;時的亮度高。那我們不斷改變時間引數,讓 LED = 0;的時間大於或者小於 LED = 1;的時間,會發現亮度都不一樣,這就是類比電路的感覺了,不再是純粹的 0 和 1,還有亮度不斷變化。
函式解釋
1.使用 RPI.GPIO 模組的脈寬調製(PWM)功能
建立一個 PWM 例項:
p = GPIO.PWM(channel, frequency)
啟用 PWM:
p.start(dc) # dc 代表佔空比(範圍:0.0 <= dc >= 100.0)
更改頻率:
p.ChangeFrequency(freq) # freq 為設定的新頻率,單位為 Hz
更改佔空比:
p.ChangeDutyCycle(dc) # 範圍:0.0 <= dc >= 100.0
停止 PWM:
p.stop()
注意,如果例項中的變數“p”超出範圍,也會導致 PWM 停止。
程式碼示例
以下為使 LED 每兩秒鐘閃爍一次的示例:
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BOARD)
GPIO.setup(12, GPIO.OUT)
p = GPIO.PWM(12 , 0.5)
p.start(1)
input('點選回車停止:') # 在 Python 2 中需要使用 raw_input
p.stop()
GPIO.cleanup()
以下為使 LED 在亮/暗之間切換的示例:
import time
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BOARD)
GPIO.setup(12, GPIO.OUT)
p = GPIO.PWM(12, 50) # 通道為 12 頻率為 50Hz
p.start(0)
try:
while 1:
for dc in range(0, 101, 5):
p.ChangeDutyCycle(dc)
time.sleep(0.1)
for dc in range(100, -1, -5):
p.ChangeDutyCycle(dc)
time.sleep(0.1)
except KeyboardInterrupt:
pass
p.stop()
GPIO.cleanup()