Jaka jest częstotliwość wyjściowa PWM na Arduino

22

Jakiej częstotliwości używają Arduinos dla normalnego PWM, gdy używasz analogWrite ()?

Czy różni się to w zależności od modelu Arduino? Interesuje mnie szczególnie Mega 2560, ale chcę również wiedzieć, czy jest on spójny między modelami.

Widziałem przelotne odniesienia do Arduino przy częstotliwości 500 Hz, co wydaje się bardzo wolne.

Duncan C.
źródło
To zależy również od używanego pinu.
Gerben

Odpowiedzi:

31

Sygnał PWM jest generowany przez timery na układach AVR. Każdy zegar może generować sygnał PWM na dwóch lub trzech różnych pinach. Każdy pin może mieć swój własny cykl roboczy, ale mają wspólną częstotliwość PWM. Możesz zmienić częstotliwość PWM, zmieniając źródło zegara dla timerów. Domyślnie używają zegara procesora podzielonego przez 64, tj. mają ustawiony na prescaler 64 kod inicjujący Arduino. Aby bardziej pomylić rzeczy, istnieją dwa różne tryby PWM: szybki PWM i PWM z poprawną fazą. W szybkim PWM licznik czasu liczy do 255, a następnie przelewa się i zaczyna od zera (256 różnych stanów). W prawidłowej fazie PWM zegar zlicza do 255, następnie zmienia kierunek i zlicza w dół do zera, zmienia kierunek i tak dalej (510 różnych stanów).

Arduino Mega ma 5 timerów, timer0 - timer4. Ponieważ timer0 jest również używany do funkcji millis i micros, wykorzystuje szybki PWM, podczas gdy inne timery są skonfigurowane do PWM z poprawną fazą. Powoduje to różne częstotliwości na różnych pinach:

  • Styki 4 i 13, sterowane zegarem 0:
    16 MHz / 64/256 = 976,56 Hz

  • Inne piny PWM, sterowane zegarem 1-4:
    16 MHz / 64/510 = 490,20 Hz

Obliczenia są następujące: liczba stanów w trybie Zegar / Prescaler / PWM

Sytuacja jest taka sama dla wszystkich innych kart Arduino, o których wiem, z tym wyjątkiem, że mają mniej timerów, które łączą się z różnymi pinami.

Możesz zmienić częstotliwość PWM, zmieniając prescaler timera. Zobacz tę stronę: http://playground.arduino.cc/Main/TimerPWMCheatsheet

Możliwe jest również, aby liczniki liczące miały inną wartość niż 255. Na 8-bitowych licznikach stracisz pin wyjściowy, ale na 16-bitowych licznikach możesz użyć Wejściowego Rejestru Przechwytującego, aby zdefiniować NAJWYŻSZĄ wartość. Funkcja przechwytywania danych wejściowych jest funkcją rzadko używaną w społeczności Arduino, więc prawdopodobnie jej nie przegapisz.

Biblioteki Arduino pozwalają na użycie rozdzielczości 8-bitowej, nawet na 16-bitowych zegarach. Jeśli chcesz wyższej rozdzielczości, będziesz musiał napisać własny analogWrite lub użyć biblioteki stworzonej do tego celu. Na Arduino Mega timer0 i timer2 mają 8 bitów, a pozostałe 16 bitów.

Zmieniając tryb 16-bitowych timerów w celu wykorzystania pełnej rozdzielczości, w połączeniu ze zmianą preskalera i wartości TOP, można osiągnąć bardzo szeroki zakres częstotliwości PWM.

Maksymalna częstotliwość, którą można osiągnąć, to zegar / 4, ustawiając preskaler na 1, a TOP na 3 w trybie szybkiego PWM - niższa wartość nie jest dozwolona. Otrzymasz 4 MHz PWM z rozdzielczością 2 bitów. Może to być 0%, 25%, 50% lub 75% czasu. Wyższa wartość TOP daje wyższą rozdzielczość przy niższej częstotliwości.

Aby uzyskać dłuższe wyjaśnienie, przeczytaj ten artykuł lub zapoznaj się z arkuszem danych .

Zmiana preskalera, trybu PWM lub wartości TOP dla timera0 spowoduje bałagan z millis()i micros().

użytkownik2973
źródło
1
Rozumiem zatem, że najszybszą częstotliwością, jaką można uzyskać dla PWM, jest 16 MHz / 256 (prescaler = 1), czy 62,5 Khz?
Duncan C
A ponadto, że częstotliwość PWM musi być równym współczynnikiem 62,5 kHz? Ktoś z innego wątku chciał kontrolować prędkość wentylatora 4-pinowego wentylatora PC. Najwyraźniej chce sygnału sterującego PWM o częstotliwości 25 kHz. 62,5 / 25 to 2,5, co nie jest liczbą całkowitą.
Duncan C
Zaktualizowałem odpowiedź, aby bardziej szczegółowo
omówić
Po stronie niskiej częstotliwości można wstępnie przeskalować 16-bitowy zegar w trybie korekcji fazy za pomocą 1024 preskalera, aby uzyskać 16e6 / 1024/2 ^ 16/2 = 0,119 Hz lub 7,1 cykli / minutę. W przypadku niższej wartości należałoby przełączyć bity w oparciu o coś takiego jak millis (). A może uruchomić licznik na zewnętrznym styku wejściowym T ?.
Dave X