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()
.