根據 Alex Chamberlain的建議, WiringPi庫似乎支持一個或兩個GPIO引腳(取決於型號)上的硬件PWM輸出,以及軟件PWM在其他任何GPIO引腳上。同時, RPIO.PWM庫通過任意GPIO引腳上的 DMA執行PWM。實際上,這是硬件和軟件PWM之間的過渡,提供了1µs的定時分辨率,而WiringPi的Software PWM [1] sup>則為100µs。
其中哪些適合您的應用取決於您需要多少個PWM輸出以及這些輸出中想要的性能。
如果您的應用容許低時序分辨率和較高的抖動,則可以使用軟件或DMA輔助時序循環。如果您想要更高的精度/更低的抖動PWM,則可能需要硬件幫助。
如果您要使一群可見光不同的LED閃爍節奏(10赫茲)滿足軟件實時響應要求,那麼軟件循環可以處理與GPIO引腳數量一樣多的PWM。
如果要以硬實時響應要求控制伺服電機,則需要使用硬件PWM。即使這樣,您仍然可能無法確保將編碼器輸入與PWM輸出相關聯的伺服環路的實時響應。
穩定的伺服環路需要以固定速率讀取編碼器(低抖動),以規則的速率寫出修改後的PWM輸出值,並且它們之間的等待時間應固定(總體低抖動)。如果您不能這樣做,則必須對電機進行微調(軟調),以防止其在負載下變得不穩定。沒有低級別支持的多任務操作系統很難做到這一點。
如果您需要運行的伺服環路多於硬件PWM輸出,那麼您可能需要將它們轉移到另一台設備上以確保硬實時性能,從而使Raspberry Pi成為軟實時系統。 supervisor 。
一個選項類似於 Adafruit 16通道12位PWM /伺服驅動器-I²C接口-PCA9685您只需使用I²C總線的GPIO的幾個引腳即可控制16個PWM輸出。有關其用法的示例,請查看Raspberry Pi論壇上的I²C16通道PWM /伺服突破-工作帖子。
是的,Raspberry Pi上有一個硬件PWM輸出,連接到P1-12(GPIO18)。此外,可以使用I²C或 SPI接口添加PWM輸出。有些人已經成功完成了此操作(論壇帖子)。
您可以使用 WiringPi庫進行控制PWM引腳;您可以看一下代碼來避免包含整個庫。
最近的Pis有兩個硬件PWM通道。另外,硬件定時PWM脈衝可以在連接到40引腳擴展接頭的所有GPIO上獨立生成。
在實踐中,這意味著有兩個高精度PWM通道,而所有其他GPIO可能具有Arduino風格的PWM (800 Hz,0關閉-255完全打開)。
例如 servoblaster和我的 pigpio等。
這不是一個實時操作系統,但是Raspberry Pi的 RISC OS是協作式多任務處理,因此您可以輕鬆地運行具有100%CPU的應用程序,從而可以更好地管理時序。只是不要指望除了您自己的代碼以外還能做其他任何事情。
我發現這個庫( pi-blaster)自稱“效率極高:不使用CPU,並提供非常穩定的脈衝。”
我已經尚未測試,但會盡快更新(可能是今天)