近期想用樹莓派控制航模的電調,於是研究了下PWM。貌似控制電調比較麻煩,由於電調須要發送幾個特定的信號啓動,然後才幹進入控制模式。今天先弄明確PWM,慢慢折騰。以下的程序親測可用,我用的樹莓派model B。12GPIO口是外面第6個針。
      脈寬調製(PWM)是指用微處理器的數字輸出來對模擬電路進行控制,是一種對模擬信號電平進行數字編碼的方法。在樹莓派上,能夠通過對GPIO的編程來實現PWM。

創建一個 PWM 實例:


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 每兩秒鐘閃爍一次的演示樣例:


importRPi.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(11, GPIO.OUT)
GPIO.setup(12, GPIO.OUT)

p = GPIO.PWM(12, 50)
p11 = GPIO.PWM(11, 38)

p.start(0)
p11.start(0)

try:
    while 1:
        for dc in range(0, 101, 5):
            p.ChangeDutyCycle(dc)
            p11.ChangeDutyCycle(dc)
            time.sleep(0.1)
        for dc in range(100, -1, -5):
            p.ChangeDutyCycle(dc)
            p11.ChangeDutyCycle(dc)
            time.sleep(0.1)
except KeyboardInterrupt:
    pass

p11.stop()
GPIO.cleanup()