Używam sprzętowego wyjścia PWM z wiringpi. Zapewnia funkcję pwmSetClock, która powinna umożliwić zmianę częstotliwości. ( https://projects.drogon.net/raspberry-pi/wiringpi/functions/ ). Uważam, że ponieważ domyślnie jest to 200 MHz ustawienie dzielnika na 200000000 powinno sprawić, że dioda LED podłączy się do wyjściowej lampy błyskowej w widoczny sposób, ale tak nie jest.
Czy można to zmienić?
pwmWrite()
. Nie spodziewałbym się, że to się wydarzyOdpowiedzi:
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:
Reszta odpowiedzi zakłada, że jesteśmy w trybie znaczników.
Przeprowadziłem również eksperymenty z dopuszczalnym zakresem wartości dla
pwmSetClock()
ipwmSetRange()
. Jak zauważono w jednej z pozostałych odpowiedzi, prawidłowy zakrespwmSetClock()
wydaje się wynosić od 2 do 4095, podczas gdy prawidłowy zakrespwmSetRange()
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:
Jeśli użyjesz maksymalnych dopuszczalnych wartości dla
pwmSetClock()
ipwmSetRange()
, 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.źródło
Zgodnie z tą formułą:
Możemy ustawić
pwmClock=1920
ipwmRange=200
uzyskaćpwmFrequency=50Hz
:Testuję to na alarmpi:
Uwaga: Moje serwo oczekuje sygnału 50 Hz .
źródło
To jest kod, którego używam. Próbuję zobaczyć, co się zmieni, gdy zmienię ustawienia.
Z tego, co przetestowałem, wydaje się, że dzielnik przechodzi z 2 do pewnej liczby mniejszej niż 5000. Sądzę, że ma to coś wspólnego z binarną reprezentacją liczb, które są bezpośrednio ustawione w rejestrze. Gdy binarna reprezentacja liczb ma więcej bitów, niż rejestr może przyjąć, bierze tylko pierwsze bity i interpretuje liczby w ten sposób. Właśnie dlatego dziwne zachowanie pojawia się przy przejściu z 4000 do 5000.
źródło