近期想用樹莓派控制航模的電調,於是研究了下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()