樹莓派可以同時輸出多個PWM信號嗎?
import time. import RPI.GPIO as GPIO GPIO.setmode(GPIO,BOARD) GPIO.setup(12, GPIO.OUT)
GPIO.setup(11, GPIO.OUT) p = GPIO.PWM(12, 50) p.start(0) q = GPIO.PWM(12, 50) q.start(0) p.ChangeDutyCycle(10) q.ChangeDutyCycle(10) time.sleep(5) try: while 1: for dc in range(10, 5, -1): p.ChangeDutyCycle(dc) q.ChangeDutyCycle(dc) time.sleep(0.04) for dc in range(5, 10, -1): p.ChangeDutyCycle(dc) q.ChangeDutyCycle(dc)time.sleep(2) except KeyboardInterrupt: pass p.stop() q.stop() GPIO.cleanup()這是自己用Python寫的程序,剛開始的時候只寫了一個p,輸出的pwm信號是正常的,但是改為輸出兩個pwm信號(即現在的程序,一個p一個q)時,只有一個信號是正常的,這是為什麼?程序錯在了哪裡?樹莓派可以同時輸出兩個PWM信號嗎?
沒記錯的話只有第一個口可以輸出PWM,所以簡單的解決方案是,利用一片arduino輸出多路PWM,樹莓派跟arduino通信就好了。可以是I2C也可以是串口。
可以的。參考文章可見 RPi.GPIO Quick Reference updated for Raspberry Pi B+, A+ and Pi2B。文章里有多個版本Raspberry Pi的GPIO管腳圖。
在我的一個在B+上運行的程序里,在不同線程中同時使用了GPIO18和GPIO23(即12和16號管腳)發送PWM信號控制兩個伺服電機,使用6號管腳接地線,控制效果正常。沒有使用Arduino等其他硬體設備。
下面是我的Python代碼,每個程序實例對應著一個線程。sys.argv[1]為管腳的GPIO號,即18或者23,由父進程通過管道向這個Python子進程的stdin發送控制命令。
import RPi.GPIO as GPIO
import sys
from time import sleep
def main():
if len(sys.argv)!=3:
exit();
pin = int(sys.argv[1])
value = float(sys.argv[2])
GPIO.setmode(GPIO.BCM)
GPIO.setup(pin, GPIO.OUT)
pwm = GPIO.PWM(pin, 100)
pwm.start(5)
pwm.ChangeDutyCycle(value)
while True:
s=sys.stdin.readline().strip()
if s.startswith("set value "):
value = float(s[10:])
pwm.ChangeDutyCycle(value)
elif s.startswith("close"):
GPIO.cleanup()
break
if __name__ == "__main__":
main()
根據我查的資料,樹莓派現在一共有四個PWM口了。分別是GPIO_01 GPIO_23 GPIO_24 GPIO_26。而且用軟體控制普通的PIN也可以輕易的實現軟體PWM
樓上說的對,樹莓派只有一個硬體pwm具體的參考這裡用樹莓派實現RGB LED的顏色控制
推薦閱讀:
TAG:樹莓派RaspberryPi | PWM |