Dlaczego niektóre piny mają inną częstotliwość PWM?

Odpowiedzi:

23

To nie jedyne częstotliwości dostępne dla sygnałów PWM. Są to jednak częstotliwości określone przez zastosowany preskaler (który można łatwo zmienić, jak opisano poniżej).

Każda z 3 par styków PWM jest powiązana z jednym zegarem, z których każdy ma swoją własną częstotliwość podstawową, jak następuje:

  • Piny 5 i 6 są sparowane z zegarem 0, z częstotliwością podstawową 62500 Hz
  • Piny 9 i 10 są sparowane z zegarem 1, z częstotliwością podstawową 31250 Hz
  • Piny 3 i 11 są sparowane z zegarem 2, z częstotliwością podstawową 31250 Hz

Następnie każdy zestaw pinów ma pewną liczbę wartości preskalera, które można wybrać, które podzielą częstotliwość podstawową tej pary pinów. Dostępne wartości preskalera to:

  • Kołki 5 i 6 mają wartości preskalera 1, 8, 64, 256 i 1024
  • Piny 9 i 10 mają wartości preskalera 1, 8, 64, 256 i 1024
  • Piny 3 i 11 mają wartości preskalera 1, 8, 32, 64, 128, 256 i 1024

Różne kombinacje dają różne częstotliwości w danym pinie PWM. Zauważ, że zegar 2 (związany z pinami 3 i 11) ma więcej dostępnych wartości preskalera, co skutkuje większą liczbą dostępnych częstotliwości.

Dlaczego zegar 2 jest inny, to osobne pytanie.

Edycja: Oto lista możliwych częstotliwości PWM na pin (z tego artykułu ):

Dla styków 6 i 5 (OC0A i OC0B):

  • Jeśli TCCR0B = xxxxx001, częstotliwość wynosi 64 kHz
  • Jeżeli TCCR0B = xxxxx010, częstotliwość wynosi 8 kHz
  • Jeśli TCCR0B = xxxxx011, częstotliwość wynosi 1 kHz (jest to wartość domyślna z programu ładującego Diecimila)
  • Jeśli TCCR0B = xxxxx100, częstotliwość wynosi 250 Hz
  • Jeśli TCCR0B = xxxxx101, częstotliwość wynosi 62,5 Hz

Dla styków 9, 10, 11 i 3 (OC1A, OC1B, OC2A, OC2B):

  • Jeśli TCCRnB = xxxxx001, częstotliwość wynosi 32 kHz
  • Jeżeli TCCRnB = xxxxx010, częstotliwość wynosi 4 kHz
  • Jeśli TCCRnB = xxxxx011, częstotliwość wynosi 500 Hz (jest to wartość domyślna z programu ładującego Diecimila)
  • Jeśli TCCRnB = xxxxx100, częstotliwość wynosi 125 Hz
  • Jeżeli TCCRnB = xxxxx101, częstotliwość wynosi 31,25 Hz

TCCRnBto miejsce, w którym ustawiasz bity preskalera dla timera n, zastępując nje 0, 1 lub 2, w zależności od timera, który chcesz ustawić. Jeśli nadal nie masz pewności co do operacji bitowych, przeczytaj ten samouczek matematyki bitowej .

Moje źródła:

Zauważ, że wydaje się, że w tych źródłach istnieje rozbieżność co do tego, czy piny 9 i 10 zachowują się tak samo jak 5 i 6 lub 3 i 11, ale i tak rozumiesz. Czytam dane, aby dowiedzieć się, co jest poprawne, czy też jest to różnica między tablicami.

Ricardo
źródło
1
Do jakiego ATmega odnosi się ta odpowiedź? Nie czekałem, ale założę się, że nieco różni się w zależności od kontrolera.
jippie
@jippie Dobra uwaga! Źródła odnoszą się do ATmega168 i 328.
Ricardo
@jippie Aby wyjaśnić, w mojej odpowiedzi, numery pinów odnoszą się do tego, jak są przypisane na płycie Uno (pin 1 oznacza na przykład Cyfrowy Pin 1 lub D1), a nie układ scalony (ATmega328 pin 1 jest resetowany).
Ricardo
1
Wierzę, że te szczegóły również się zmieniają wraz z tablicami, Uno, Duemilanove, Mega, ...
jippie
@jippie Zdecydowanie tak.
Ricardo
8

Nie jestem świadomy rozważań projektowych, ale jeśli sprawdzisz arkusz danych mikrokontrolera w swoim Arduino, zauważysz, że piny PWM są zgrupowane razem i dla każdej grupy podłączonej do timera. Szybkość zwiększania tego czasu zależy od skonfigurowanego preskalera. Jeśli zmienisz preskaler dla określonego timera, zmienisz częstotliwość PWM dla odpowiednich styków PWM. Uważam, że niektóre timery podwajają się w innych celach, takich jak millis();funkcja. Jeśli zmienisz preskaler dla tego timera, wartości zwrócone przez millis()będą wyłączone o ten sam współczynnik.

Możesz obliczyć ustawienie dla preskalera w następujący sposób:

$$ \ text {prescaler} = \ dfrac {f_ {CPU}} {PWMresolution × f_ {PWM}} = \ dfrac {16 \ text {MHz}} {256 × 490} \ ok. 128 $$

prescaler = f [CPU] / (PWM Resolution × f [PWM]) = 16000000 / (256 × 490) = około 128.

Sprawdź arkusz danych, a przekonasz się, że 128 jest rzeczywiście jedną z wartości preskalera, którą możesz wybrać.

jippie
źródło
2
Chłopcze, tęsknimy za MathJaxem czy co? Mam nadzieję, że włączymy to po wersji beta.
Ricardo
1
@ Ricardo Mam przycisk MathJax w mojej przeglądarce; o) meta.arduino.stackexchange.com/questions/13/...
jippie