Czy mogę używać GPIO do modulacji szerokości impulsu (PWM)?


97

Czy mogę używać GPIO jako wyjścia modulacji szerokości impulsu ?

Jeśli tak, jak bym to zrobił i ile mogę mieć równoległych, odrębnych wyjść PWM?


Prawdopodobnie musisz określić, którego modelu używasz. Wszystkie są nieco inne.
not2qubit

2
@ user1147688 To pytanie zostało zadane, gdy był tylko jeden model!
berry120

Odpowiedzi:


76

Jak sugeruje Alex Chamberlain , biblioteka WiringPi wydaje się obsługiwać zarówno sprzętowe wyjście PWM na jednym lub dwóch pinach GPIO, w zależności od modelu, jak i oprogramowanie PWM na dowolnym z pozostałych pinów GPIO. Tymczasem biblioteka RPIO.PWM wykonuje PWM przez DMA na dowolnym pinie GPIO. W rzeczywistości jest to połowa drogi pomiędzy sprzętem a oprogramowaniem PWM, zapewniając rozdzielczość czasową 1 µs w porównaniu do 100 µs z oprogramowaniem PWM WiringPi [1] .

To, które z nich jest odpowiednie dla twoich aplikacji, zależy od tego, ile wyjść PWM potrzebujesz i jakiej wydajności chcesz z tych wyjść.

Jeśli Twoja aplikacja toleruje niską rozdzielczość i wysokie jitter, możesz użyć oprogramowania lub pętli synchronizacji DMA. Jeśli chcesz PWM o wyższej precyzji / niższych jitterach, możesz potrzebować pomocy sprzętowej.

Kiedy oprogramowanie PWM może być odpowiednie?

Jeśli chcesz sflashować wiązkę diod LED z różnymi ludzkimi kadencjami (10 herców) z miękkimi wymaganiami w czasie rzeczywistym, wówczas pętla programowa może obsłużyć tyle PWM, ile masz pinów GPIO.

Kiedy sprzętowy PWM może być odpowiedni?

Jeśli chcesz sterować serwosilnikiem wymagającym szybkiej reakcji w czasie rzeczywistym , musisz użyć sprzętowego PWM. Nawet wtedy możesz mieć problemy z zapewnieniem odpowiedzi w czasie rzeczywistym dla pętli serwomechanizmu, która łączy wejście enkodera z wyjściem PWM.

Stabilna pętla serwo musi odczytywać enkodery ze stałą szybkością (niski jitter), zapisywać zmienione wartości wyjściowe PWM z regularną szybkością, a opóźnienie między nimi powinno być ustalone (ogólnie niski jitter). Jeśli nie możesz tego zrobić, będziesz musiał dostroić (dostroić) silnik, aby zapobiec jego niestabilności pod obciążeniem. Trudno to zrobić z wielozadaniowym systemem operacyjnym bez obsługi niskiego poziomu.

Co jeśli potrzebuję więcej sprzętowych wyjść PWM?

Jeśli potrzebujesz uruchomić więcej pętli serwomechanizmu niż masz sprzętowe wyjścia PWM, prawdopodobnie będziesz musiał przenieść je na inne urządzenie, aby zapewnić wysoką wydajność w czasie rzeczywistym, co spowoduje, że Raspberry Pi będzie miękkim nadzorcą w czasie rzeczywistym .

Jedną opcją byłoby coś w rodzaju 16-kanałowego 12-bitowego sterownika PWM / serwomechanizmu Adafruit - interfejs I²C - PCA9685, który pozwalałby kontrolować 16 wyjść PWM za pomocą zaledwie kilku pinów GPIO dla magistrali I²C. Jako przykład jego zastosowania można znaleźć 16-kanałowy kanał PWM / Servo Breakout I²C - Kanał roboczy na forach Raspberry Pi.

1. Dzięki dm76 za sugestię, jednak heather mówi, że RPIO.PWM może już nie działać w nowszych modelach pi.


Czy mogę używać oprogramowania PWM do uruchamiania silników prądu stałego?
gideon

@gideon - Tak, wszystkie wzmacniacze mocy, z których korzystałem, wzięły PWM za swoje wejście.
Mark Booth

2
Do Twojej wiadomości, biblioteka RPI ( pythonhosted.org/RPIO/pwm_py.html ) wydaje się mieć znacznie lepszą rozdzielczość (1us) w porównaniu do WiringPi z rozdzielczością
100us

@MarkBooth - Brak prób. Biblioteka jest naprawdę dobrze napisana i może być używana jako zamiennik RPi.GPIO, co jest bardzo przydatne, jeśli zacząłeś projekt z tym ostatnim i później uświadomiłeś sobie, że potrzebne były sygnały PWM ...
dm76

Myślę, że RPIO.PWM może już nie działać w nowszych modelach pi.
wrzos

39

Sprzęt PWM

Tak, jest jedno wyjście sprzętowe PWM na Raspberry Pi, podłączone do P1-12 (GPIO18). Ponadto wyjścia PWM można dodawać przy użyciu interfejsu I²C lub SPI ; niektórym udało się to osiągnąć ( post na forum ).

Przykładowy kod

Możesz użyć biblioteki WiringPi do sterowania stykiem PWM; możesz spojrzeć na kod, aby uniknąć włączenia całej biblioteki.

Oprogramowanie PWM

Raspberry Pi nie nadaje się do żadnego poważnego oprogramowania PWM, ponieważ Linux nie jest systemem operacyjnym czasu rzeczywistego.


1
Pytanie, jaka jest definicja lub przykład poważnego oprogramowania PWM? Co to są „systemy operacyjne czasu rzeczywistego” i czy kiedykolwiek istnieje szansa, że ​​dostanie się na komputer Pi
AnthonyBlake

@AnthonyBlake Cóż, prawdopodobnie możesz kontrolować jasność światła za pomocą oprogramowania PWM, ale podejrzewam, że silnik zgaśnie. Nie trzeba jednak robić oprogramowania PWM, sprzęt jest prostszy i bardziej wydajny. Systemy operacyjne w czasie rzeczywistym zostaną lepiej wyjaśnione przez Google; gwarantują pewne rzeczy dotyczące tego, jak długo i jak często oprogramowanie jest uruchomione.
Alex Chamberlain,

2
@AnthonyBlake „Real-Time OS” (RTOS) to system operacyjny, który daje gwarancję na górny limit czasu wykonania. Jak powiedzenie do programu „Tak, będziesz miał trochę czasu na wykonanie w 33 ms (daj lub weź 2 ms tolerancję), aby przerzucić ten bit pin GPIO, aby dać Twojemu silnikowi krokowemu sygnał w dokładnym oknie czasowym, kiedy tego potrzebuje. I możesz polegać Na tym!" Tam jest RT Linux. Nie wiem, czy został przeniesiony do RPi (jeszcze).
orithena

Przepraszam Alex, nie celowo ukradłem innej części twojej odpowiedzi, ale właśnie zauważyłem, że do tego samego posta na forum dotarliśmy różnymi drogami.
Mark Booth

2
Nowsze modele z 40 pinami mają drugi sprzętowy PWM podłączony do GPIO19 (pin 35).
Kevin,

12

Najnowsze Pis mają dwa sprzętowe kanały PWM. Ponadto sprzętowo synchronizowane PWM impulsy mogą być generowane niezależnie na wszystkich GPIO podłączonych do 40-pinowego złącza rozszerzającego.

W praktyce oznacza to, że istnieją dwa bardzo dokładne kanały PWM, a wszystkie pozostałe GPIO mogą mieć PWM w stylu Arduino (800 Hz, 0 wyłączone - 255 całkowicie włączone).

Np. Servoblaster i mój pigpio itp.


Niezła odpowiedź! Jak mogę korzystać z tych dwóch PWM PWW? Muszę kontrolować 2 serwomechanizmy, wiem, że mówisz, że serwoblaster i pigpio są w porządku, ale zastanawiam się nad HW PWM, ponieważ nie mogę nic o nich znaleźć ... czy są tam jakieś dokumenty? Mam do testów RPi 2 V1.1.
Kozuch


2
Duże obciążenie procesora nie powinno mieć znaczenia. Duże obciążenie sieci może mieć znaczenie dla gpioServo, szczególnie jeśli próbkowanie odbywa się z częstotliwością 1 MHz, a nie domyślną częstotliwością 200 kHz. Częstotliwość wynosi 50 (Hz), zakres cykli roboczych będzie wynosił 0 - 1000000 (odwzorowany na prawdziwą wartość bazową 0 - 5000000). 1 ms to 1 ms w 20 ms, więc cykl roboczy wynosi 5%, więc 50000, 1,5 ms -> 7,5% -> 75000, 2 ms -> 10% -> 100000.
joan

1
Strona 102 urządzenia peryferyjnego ARM BCM2835 pokazuje różne tryby, do których można przypisać GPIO. Spójrz online, dla którego GPIO są prowadzone do różnych nagłówków rozszerzeń modeli Pi.
joan

1
@ user1147688 PLLD (500 MHz) jest wykorzystywany jako rdzeń zegara PWM. Ze względu na sposób działania „to” częstotliwość rdzenia PWM wynosi 250 MHz. Aby móc włączać i wyłączać (dość istotne dla PWM), maksymalna wynosi 125 MHz. Można podwoić liczby, używając PLLC (1000 MHz), ale ten PLL zmienia się w zależności od częstotliwości taktowania rdzenia.
joan

2

Nie jest to system operacyjny działający w czasie rzeczywistym, ale system operacyjny RISC dla Raspberry Pi to wielozadaniowość kooperacyjna, dzięki czemu można łatwo uruchomić aplikację, która ma 100% procesora, dzięki czemu można znacznie lepiej zarządzać taktowaniem. Po prostu nie oczekuj, że zrobisz coś innego niż własny kod.


Czytałem gdzieś, że istnieje także ograniczenie sprzętowe częstotliwości przełączania pinów wyjściowych. Myślę, że było to około 20 MHz. Więc nie oczekuj, że będziesz w stanie pobierać PWM 300 MHz lub cokolwiek innego, nawet przy 100% zużyciu procesora.
Ponkadoodle,

@Wallacoloo: Jakie aplikacje wymagają PWM 300 MHz?
Peter Mortensen,

2
@PeterMortensen: Cóż, nie wiem, w jaki sposób nadajniki radiowe i takie generują swoje sygnały, ale niektórzy mogą to zrobić za pomocą PWM. PiFM robi to przy 100 MHz. Wydaje się to jednak zaprzeczać mojemu komentarzowi, więc zastanawiam się, czy może pinowi nadal można sterować przy tej częstotliwości, ale po prostu pojemność pinu tłumi takie sygnały, tak że fala prostokątna 100 MHz może faktycznie oscylować np. (1,0 V , 2,3 V) zamiast pełnego zakresu (0 V, 3,3 V).
Ponkadoodle,

2

Znalazłem tę bibliotekę ( pi-blaster ), która twierdzi, że jest „wyjątkowo wydajna: nie używa procesora i daje bardzo stabilne impulsy”.

Jeszcze go nie testowałem, ale zaktualizuję go tak szybko, jak to zrobię (prawdopodobnie dzisiaj)


Próbowałem tego, ale jak dotąd nie miałem szczęścia. O ile mogę stwierdzić, że tak naprawdę nie zmienia sprzętu?
MrMowgli

1
Po prostu chcę to podnieść. Pi-blaster pracował dla mnie tam, gdzie inne odpowiedzi nie.
Seph Reed,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.