GPIO'yu darbe genişlik modülasyonu (PWM) için kullanabilir miyim?


97

GPIO'yu darbe genişlik modülasyonu çıkışı olarak kullanabilir miyim ?

Öyleyse, bunu nasıl yapacağım ve kaç tane eş zamanlı, farklı PWM çıkışına sahip olabilirim?


Muhtemelen hangi modeli kullandığınızı belirtmeniz gerekir. Hepsi biraz farklı.
not2qubit

2
@ user1147688 Bu soru, yalnızca bir model olduğunda sorulmuştu!
berry120

Yanıtlar:


76

Alex Chamberlain tarafından önerildiği gibi , WiringPi kütüphanesi, modele bağlı olarak bir veya iki GPIO pininde donanım PWM çıkışını ve diğer GPIO pinlerinden herhangi birinde PWM yazılımını desteklemektedir . Bu arada RPIO.PWM kütüphanesi herhangi bir GPIO pimi üzerinde DMA tarafından PWM yapar . Bu, WiringPi's Software PWM [1] ile 100 µs ile karşılaştırıldığında 1 µs zamanlama çözünürlüğü sağlayan, donanım ve yazılım PWM arasındaki yarı yoldur .

Bunlardan hangisinin uygulamalarınız için uygun olduğu, kaç PWM çıkışına ihtiyacınız olduğuna ve bu çıkışlardan hangi performansta olmasını istediğinize bağlıdır.

Uygulamanız düşük zamanlama çözünürlüğüne ve yüksek titreşime toleranslıysa, bir yazılım veya DMA destekli zamanlama döngüsü kullanabilirsiniz. Daha yüksek hassasiyet / daha düşük jitter PWM istiyorsanız, donanım desteğine ihtiyacınız olabilir.

PWM yazılımı ne zaman uygun olabilir?

Yumuşak gerçek zamanlı yanıt gereklilikleri olan farklı insan görünür bölgeleri (hertz'un 10'u) ile birlikte bir grup LED'i yakmak istiyorsanız , yazılım döngüsü GPIO pinleriniz kadar çok PWM'leri kullanabilir.

Donanım PWM'si ne zaman uygun olabilir?

Gerçek zamanlı yanıt gereklilikleri olan bir servo motoru kontrol etmek istiyorsanız, donanım PWM kullanmanız gerekecektir. O zaman bile, enkoder girişini PWM çıkışına bağlayan servo döngüsü için gerçek zamanlı bir cevap sağlamada problem yaşayabilirsiniz.

Sabit bir servo döngüsünün enkoderleri düzenli bir oranda (düşük titreşimli) okuması, revize edilmiş PWM çıkış değerlerini düzenli bir oranda yazması gerekir ve bunlar arasındaki gecikme sabit olmalıdır (genel olarak düşük titreşimli). Bunu yapamazsanız, yük altında dengesiz hale gelmesini önlemek için motorunuzu zayıflatmanız (yumuşak ayar) yapmanız gerekir. Düşük seviye desteği olmayan çoklu görevli bir işletim sistemiyle yapmak zordur.

Daha fazla donanım PWM çıkışına ihtiyacım olursa ne yapmalıyım?

Donanım PWM çıkışlarına sahip olduğunuzdan daha fazla servo döngüsü çalıştırmanız gerekiyorsa, zor gerçek zamanlı performans sağlamak için Raspberry Pi'nizi yumuşak bir gerçek zamanlı süpervizör olarak atamak için muhtemelen onları başka bir cihaza boşaltmanız gerekecektir .

Bir seçenek, Adafruit 16-Kanallı 12-bit PWM / Servo Sürücü - I²C Arabirimi - PCA9685 gibi bir şey olabilir; bu, 16 PWM çıkışını I²C veri yolu için sadece birkaç pin GPIO ile kontrol etmenize izin verir. Kullanımına ilişkin bir örnek olarak, Raspberry Pi forumlarında I²C 16 Kanal PWM / Servo Breakout - Working post'a bakın.

1. Öneri için dm76 sayesinde , ancak heather RPIO.PWM'nin daha yeni pi modelleri için çalışmayabileceğini söylüyor.


DC motorları çalıştırmak için PWM yazılımını kullanabilir miyim?
gideon

@gideon - Evet, kullandığım motor güç amplifikatörlerinin tümü girişleri olarak PWM aldı.
Mark Booth,

2
Bilginize, RPI kütüphanesi ( pythonhosted.org/RPIO/pwm_py.html ), 100us çözünürlüğe sahip WiringPi ile karşılaştırıldığında çok daha iyi bir çözünürlüğe sahip görünüyor (1us)
dm76

@MarkBooth - Prob yok. Kütüphane gerçekten iyi yazılmış ve RPI.GPIO'nun yerine geçmesi için kullanılabiliyor ve daha sonra PWM sinyallerine ihtiyaç duyulan bir projeye başladığınızda çok kullanışlı olan ...
dm76

RPIO.PWM artık yeni pi modelleri için çalışmayabilir, sanırım.
heather

39

Donanım PWM

Evet, Raspberry Pi'de P1-12'ye (GPIO18) bağlı bir donanım PWM çıkışı var. Ayrıca, PWM çıkışları bir I²C veya SPI arayüzü kullanılarak eklenebilir ; bazı insanlar bu konuda başarılı olmuşlardır ( forum mesajı ).

Örnek kod

PWM pinini kontrol etmek için WiringPi kütüphanesini kullanabilirsiniz ; kütüphanenin tamamını dahil etmekten kaçınmak için koda bakabilirsiniz.

Yazılım PWM

Raspberry Pi, Linux gerçek zamanlı bir işletim sistemi olmadığı için herhangi bir ciddi yazılım PWM için uygun değildir.


1
Soru, ciddi yazılım PWM'nin tanımı veya örneği nedir? Ve "gerçek zamanlı işletim sistemleri" nedir ve bir
Pi'den

@AnthonyBlake Eh, muhtemelen PWM yazılımı kullanarak bir ışığın parlaklığını kontrol edebilirsiniz, ancak bir motorun duracağından şüpheleniyorum. PWM yazılımını yapmanıza gerek yok, donanım daha basit ve daha etkili. Gerçek zamanlı işletim sistemleri Google tarafından daha iyi açıklanacaktır; Yazılımın ne kadar süre ve sık çalıştırıldığı konusunda bazı şeyler garanti ederler.
Alex Chamberlain

2
@AnthonyBlake Bir "Gerçek Zamanlı İşletim Sistemi" (RTOS), yürütmenin üst zaman sınırı konusunda size garanti veren bir işletim sistemidir. “Evet, adım motorunuza istediği zaman tam zamanında bir sinyal vermek için bu GPIO pimi ucunu çevirmek için 33ms'de (2ms toleransı verin veya 2ms tolerans alın) bir uygulama zamanınız olacak. Bu konuda!" Dışarıda bir RT Linux var. RPI'ye taşındı mı bilmiyorum (henüz).
orithena

Üzgünüm Alex, cevabınızın başka bir bölümünü bilerek çalmadım, ancak farklı forumlar aracılığıyla aynı forum gönderisine geldiğimizi fark ettim.
Mark Booth,

2
40 pinli yeni modellerde GPIO19'a bağlı ikinci bir donanım PWM'si bulunur (pin 35).
Kevin,

12

Son Pis'in iki donanım PWM kanalı var. Ek olarak, donanım zamanlamalı PWM darbeleri, 40 pinli genişletme başlığına bağlı tüm GPIO'larda bağımsız olarak üretilebilir.

Uygulamada bu, iki tane yüksek hassasiyetli PWM kanalı olduğu ve diğer tüm GPIO'ların Arduino stili PWM'ye sahip olabileceği anlamına gelir (800 Hz, 0 kapalı - 255 tamamen açık).

Örneğin servoblaster ve domuzcuklarım vb.


Güzel cevap! Bu iki HW PWM'yi nasıl kullanabilirim? 2 servo kontrol etmem gerekiyor, servoblaster ve pigpio'nun bunun için uygun olduğunu söylediğini biliyorum, ama sadece HW PWM'yi merak ediyorum, çünkü onlar hakkında hiçbir şey bulamadım ... orada bazı doktorlar var mı? Testler için bir RPi 2 V1.1 var.
Kozuch


2
Ağır CPU yükü bir fark yaratmamalı. Ağır ağ yükü, özellikle varsayılan 200kHz yerine 1MHz'de örnekleme yapıyorsanız, gpioServo için bir fark yaratabilir. Frekans 50 (Hz), görev çevrimleri aralığı 0 - 1000000 (0 - 5000000 değerinin gerçek altında eşlenir) olacaktır. 1 ms, 20 ms'de 1 ms'dir, yani% 5'lik bir görev döngüsü yani 50000, 1.5ms->% 7.5 -> 75000, 2ms->% 10 -> 100000'dir.
joan

1
Sayfa 102 BCM2835 ARM Çevre Birimleri GPIO atanabilir çeşitli modları gösterir. GPIO'nun çeşitli Pi model genişletme başlıklarına yönlendirildiği çevrimiçi bakın.
joan

1
PLLD (500MHz) çekirdek PWM saati olarak kullanılır. "Çalışır" nedeniyle PWM çekirdek frekansı 250 MHz'dir. Açmak ve kapatmak için (PWM için oldukça önemlidir) maksimum 125 MHz'dir. Rakamları PLLC (1000 MHz) kullanarak iki katına çıkarabilirsiniz, ancak PLL'nin çekirdek saat hızına göre değiştiği görülür.
joan

2

Tam olarak gerçek zamanlı bir işletim sistemi değil, ancak Raspberry Pi için RISC işletim sistemi işbirlikçi çoklu görevlerdir, böylece zamanlamalarınızı daha iyi yönetebilmeniz için% 100 CPU'ya sahip bir uygulamayı kolayca çalıştırabilirsiniz. Sadece kendi kodunuz dışında başka bir şey yapmayı beklemeyin.


Bir yerde, bir çıkış piminin anahtarlama frekansıyla ilgili bir donanım sınırı olduğunu da okudum. 20 MHz civarında olduğunu düşünüyorum. Öyleyse,% 100 CPU kullanımında bile, 300 MHz PWM veya bu tür herhangi bir şeyi çekmeyi beklemeyin.
Ponkadoodle

@Wallacoloo: Hangi uygulamalar 300 MHz PWM gerektiriyor?
Peter Mortensen

2
@PeterMortensen: Radyo vericilerin ve bu tür sinyalleri nasıl ürettiklerini bilmiyorum, ancak bazıları bunu PWM ile yapabilir. PiFM bunu 100 MHz'de yapar. Bu benim yorumumla çelişiyor gibi görünüyor, bu yüzden pimin hala bu frekansta komut verilip verilemeyeceğini merak ediyorum, ancak sadece pin kapasitansının bu tür sinyalleri hafiflettiği, yani 100 MHz'lik bir kare-dalga aslında salınabileceği gibi (1.0 V , Dolu (0 V, 3,3 V) aralığının yerine 2,3 V).
Ponkadoodle

2

"Son derece verimli: CPU'yu kullanmıyor ve çok kararlı darbeler veriyor" diyen bu kitaplığı ( pi-blaster ) buldum .

Henüz test etmedim, ancak en kısa sürede güncellenecektir (muhtemelen bugün)


Bunu denedim ama şimdiye kadar şans yok. Söyleyebileceğim kadarıyla aslında donanımı değiştirmiyor mu?
MrMowgli

1
Sadece bunu çarpmak istiyorum. Pi-blaster bu diğer cevapların olmadığı yerlerde benim için çalıştı.
Seph Reed,
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.