Jaka jest częstotliwość wyjścia PWM w Arduino

Jaką częstotliwość Arduinos używają do normalnego PWM, gdy używasz analogWrite ()?

I czy jest inaczej dla różnych modeli Arduino? Interesuje mnie szczególnie Mega 2560, ale chcę też wiedzieć, czy jest spójny między modelami.

Widziałem przelotne odniesienia do Arduino używającego 500 Hz, co wydaje się bardzo powolne.

Komentarze

  • Zależy to również od używanego kodu PIN.

Odpowiedź

Sygnał PWM jest generowany przez timery na chipach 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 pracy, 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ą swój prescaler ustawiony na 64 przez kod inicjalizacji Arduino. Aby jeszcze bardziej zmylić, istnieją dwa różne tryby PWM: szybki PWM i poprawny fazowo PWM. W szybkim PWM licznik liczy do 255, a następnie przepełnia się i zaczyna od 0 (256 różnych stanów). W poprawnym fazowo PWM licznik liczy do 255, a następnie zmienia kierunek i odlicza 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 dla funkcji millis i micros, wykorzystuje szybkie PWM, podczas gdy inne timery są skonfigurowane na poprawne fazowo PWM. Skutkuje to różnymi częstotliwościami na różnych pinach:

  • Pin 4 i 13, sterowane przez timer0:
    16 MHz / 64/256 = 976,56 Hz

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

Obliczenie jest następujące: Zegar / Liczba stanów trybu Prescaler / PWM

Sytuacja jest taka sama dla wszystkich innych płyt Arduino, które znam, z wyjątkiem tego, że mają mniej timerów, które łączą się z różnymi pinami.

Możesz zmienić Częstotliwość PWM poprzez zmianę preskalera timera. Zobacz tę stronę: http://playground.arduino.cc/Main/TimerPWMCheatsheet

Można również ustawić liczniki czasu do wartość inną niż 255. W przypadku 8-bitowych timerów stracisz pin wyjściowy, ale w przypadku 16-bitowych timerów możesz użyć Input Capture Register do zdefiniowania wartości TOP. Funkcja przechwytywania danych wejściowych jest funkcją rzadko używaną w społeczności Arduino, więc prawdopodobnie jej nie przegapisz.

Biblioteki Arduino pozwalają tylko na użycie rozdzielczości 8-bitowej, nawet w przypadku 16-bitowych timerów. chcesz mieć wyższą rozdzielczość, będziesz musiał napisać własny analogWrite lub skorzystać z biblioteki stworzonej do tego celu. Na Arduino Mega timer0 i timer2 są 8-bitowe, a reszta 16-bitowe.

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ść jaką można osiągnąć to zegar / 4, ustawiając preskaler na 1 i TOP na 3 w szybkim trybie PWM – niższa wartość nie jest dozwolona. To daje 4 MHz PWM z 2-bitową rozdzielczością. Może to być 0%, 25%, 50% lub 75% czasu. Wyższa wartość TOP zapewni wyższą rozdzielczość przy niższej częstotliwości.

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

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

Komentarze

  • Rozumiem więc, że najszybsza częstotliwość, jaką można uzyskać dla PWM to 16 Mhz / 256 (prescaler = 1) lub 62,5 Khz?
  • A ponadto, że częstotliwość PWM musi być równa 62,5 kHz? Ktoś w innym wątku chciał kontrolować prędkość wentylatora 4-pinowego komputera. Najwyraźniej chce sygnału sterującego PWM 25 kHz. 62,5 / 25 to 2,5, co nie jest wartością całkowitą.
  • Zaktualizowałem odpowiedź, aby bardziej szczegółowo omówić możliwości uzyskania określonych częstotliwości.
  • Na końcu niskich częstotliwości można przeskaluj 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ższych wartości należałoby przełączać bity na podstawie czegoś takiego jak millis (). A może wyzwolić licznik na zewnętrznym pinie wejściowym T ?.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *