2017-09-03 97 views
7

複雜信號I在的GIPO的輸出需要的信號大致這種形狀。(在脈衝子脈衝)enter image description here調製在所有GPIO

這又如何使用關於PI PWM執行?我試圖用RPIO來做,但他的古老的GPIO引腳可能不適合我的Rpi 3 b +。

from RPIO import PWM 
servo = PWM.Servo() 
servo.set_servo(12, 10000) 
PWM.add_channel_pulse(0, 12, start=200, width=2000) 

不在引腳上的信號。 enter image description here 我很困惑,想嘗試使用內置函數庫來處理PWM,但是我沒有發現子循環的可能性。除此之外,我還可以如何從不同的GPIO輸出這種形式的信號?

+0

Errm,在您的代碼中,gpio引腳每隔2ms切換一次,以便生成500Hz-ish信號,絕對不會產生1000Hz。我說500Hz-ish,因爲time.sleep只能保證最小的延遲,而不是最大的 - 因爲Linux不是一個實時操作系統,期望毫秒級的睡眠準確度非常樂觀。哦,你的代碼'time.sleep(0.1)'將關閉500Hz-ish信號0.1s,而不是0.01s,正如你的文本所述。 – barny

+0

對!謝謝!固定! – Dmitrii

+0

順便說一句。如果你想要任何類型的頻率精度,你可能需要使用[PWM](http://pythonhosted.org/RPIO/pwm_py.html)進行研究,而不是'time.sleep()'。 – SiHa

回答

1

看來,你應該使用這樣的代碼。不幸的是,我沒有機會測試它,因爲我沒有頻率計或示波器。

import time 
import pigpio 

GPIO=12 

pulse = [] 

#       ON  OFF MICROS 
pulse.append(pigpio.pulse(1<<GPIO, 0,  5)) 
pulse.append(pigpio.pulse(0,  1<<GPIO, 5)) 
pulse.append(pigpio.pulse(1<<GPIO, 0,  5)) 
pulse.append(pigpio.pulse(0,  1<<GPIO, 1e7)) 

pi = pigpio.pi() # connect to local Pi 

pi.set_mode(GPIO, pigpio.OUTPUT) 

pi.wave_add_generic(pulse) 

wid = pi.wave_create() 

if wid >= 0:  
    pi.wave_send_repeat(wid) 
    time.sleep(60) # or another condition for stop processing 
    pi.wave_tx_stop() 
    pi.wave_delete(wid) 

pi.stop() 
2

documentation建議僅僅將通道列表作爲第一個參數傳遞給GPIO.setup和GPIO.output就可以實現你所要求的。

chan_list = [11,12] # add as many channels as you want! 
         # you can tuples instead i.e.: 
         # chan_list = (11,12) 
GPIO.setup(chan_list, GPIO.OUT) 
GPIO.output(chan_list, GPIO.LOW)    # sets all to GPIO.LOW 
+0

謝謝你的回答。但獨立!多線程或協同編程 – Dmitrii

1

與RPi.GPIO相比,我對pigpio有更好的PWM體驗。 Wiringpi也不錯,但pigpio的PWM支持要好得多。

的文檔具有任意引腳上產生PWM幾個功能:

http://abyz.co.uk/rpi/pigpio/python.html#set_servo_pulsewidth http://abyz.co.uk/rpi/pigpio/python.html#set_PWM_dutycycle

*已*使用RPi.GPIO?我明白這不是一個確切的答案,但我希望它至少能指引你朝着正確的方向前進。

+0

請爲此波形添加python代碼 - 5 Khz,每隔10 ms關閉一次(100 Hz),每隔10秒關閉一次(0,1Hz)。我知道這個庫,但不明白這個波形怎麼做。 – Dmitrii