Niedawno miałem jakiś powód, aby sam zacząć eksperymentować z PWM i odkryłem, że (jak wskazano w jednym z komentarzy) częstotliwość wydaje się zmieniać w zależności od cyklu pracy - bizzare, prawda? Okazuje się, że Broadcom wdrożył „zrównoważony” PWM, aby impulsy PWM były jak najbardziej równomiernie rozłożone. Podają opis algorytmu i trochę więcej dyskusji na stronie 139 swojego arkusza danych:
http://www.element14.com/community/servlet/JiveServlet/downloadBody/43016-102-1-231518/Broadcom.Datasheet.pdf
Więc tak naprawdę chcesz przełączyć PWM w tryb znaczników, co da ci tradycyjny (i łatwo przewidywalny) PWM, którego szukasz:
pwmSetMode(PWM_MODE_MS);
Reszta odpowiedzi zakłada, że jesteśmy w trybie znaczników.
Przeprowadziłem również eksperymenty z dopuszczalnym zakresem wartości dla pwmSetClock()
i pwmSetRange()
. Jak zauważono w jednej z pozostałych odpowiedzi, prawidłowy zakres pwmSetClock()
wydaje się wynosić od 2 do 4095, podczas gdy prawidłowy zakres pwmSetRange()
wynosi do 4096 (nie próbowałem znaleźć dolnej granicy).
Zasięg i zegar (lepsza nazwa to prawdopodobnie dzielnik) wpływają na częstotliwość. Zakres wpływa również na rozdzielczość, więc chociaż możliwe jest użycie bardzo niskich wartości, istnieje praktyczny limit tego, jak nisko prawdopodobnie będziesz chciał zejść. Na przykład, jeśli użyłeś zakresu 4, możesz osiągnąć wyższe częstotliwości, ale będziesz mógł ustawić cykl pracy tylko na 0/4, 1/4, 2/4, 3/4 lub 4/4.
Zegar Raspberry Pi PWM ma częstotliwość podstawową 19,2 MHz. Ta częstotliwość, podzielona przez argument to pwmSetClock()
, jest częstotliwością, przy której licznik PWM jest zwiększany. Kiedy licznik osiągnie wartość równą podanemu zakresowi, resetuje się do zera. Podczas gdy licznik jest krótszy niż określony cykl pracy, wydajność jest wysoka, w przeciwnym razie wydajność jest niska.
Oznacza to, że jeśli chcesz ustawić PWM na określoną częstotliwość, możesz użyć następującej zależności:
pwmFrequency in Hz = 19.2e6 Hz / pwmClock / pwmRange.
Jeśli użyjesz maksymalnych dopuszczalnych wartości dla pwmSetClock()
i pwmSetRange()
, uzyskasz minimalną możliwą do osiągnięcia częstotliwość sprzętową PWM ~ 1,14 Hz. To z pewnością spowoduje widoczne migotanie (naprawdę błysk), naprawdę diody LED. Potwierdziłem powyższe równanie za pomocą oscyloskopu i wydaje się, że tak jest. Na górną granicę częstotliwości wpłynie potrzebna rozdzielczość, jak opisano powyżej.
pwmWrite()
. Nie spodziewałbym się, że to się wydarzy