1. 程式人生 > >脈寬調製功能(PWM)

脈寬調製功能(PWM)

名詞解釋

PWM 是 Pulse Width Modulation 的縮寫,它的中文名字是脈衝寬度調製,它利用微處理器的數字輸出來對類比電路進行控制,其實就是使用數字訊號達到一個模擬訊號的效果。

首先從它的名字來看,脈衝寬度調製,就是改變脈衝寬度來實現不同的效果。我們先來看三組不同的脈衝訊號,如圖 10-1 所示。
PWM
圖片來源於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()