Was ist die Frequenz der PWM-Ausgabe auf Arduino

22

Welche Frequenz verwenden Arduinos für normales PWM, wenn Sie analogWrite () verwenden?

Und ist es für verschiedene Arduino-Modelle unterschiedlich? Ich interessiere mich speziell für den Mega 2560, möchte aber auch wissen, ob er zwischen den Modellen konsistent ist.

Ich habe vorübergehende Verweise auf das Arduino mit 500 Hz gesehen, was sehr langsam zu sein scheint.

Duncan C
quelle
Das hängt auch vom verwendeten Pin ab.
Gerben

Antworten:

31

Das PWM-Signal wird von Timern auf den AVR-Chips erzeugt. Jeder Timer kann ein PWM-Signal an zwei oder drei verschiedenen Pins erzeugen. Jeder Pin kann einen eigenen Arbeitszyklus haben, aber er teilt sich die PWM-Frequenz. Sie können die Frequenz der PWM ändern, indem Sie die Taktquelle für die Timer ändern. Standardmäßig verwenden sie den CPU-Takt geteilt durch 64, dh. Der Prescaler wird durch den Arduino-Initialisierungscode auf 64 gesetzt. Um die Dinge noch mehr zu verwirren, gibt es zwei verschiedene PWM-Modi: schnelles PWM und phasenrichtiges PWM. Bei schnellem PWM zählt der Timer bis 255, läuft dann über und beginnt wieder bei 0 (256 verschiedene Zustände). Bei phasenkorrekter PWM zählt der Timer bis 255, ändert dann die Richtung und zählt abwärts bis Null, ändert die Richtung und so weiter (510 verschiedene Zustände).

Der Arduino Mega verfügt über 5 Timer, timer0 - timer4. Da timer0 auch für die Millis und Mikros-Funktionen verwendet wird, wird schnelles PWM verwendet, während die anderen Timer für phasenkorrektes PWM konfiguriert sind. Dies führt zu unterschiedlichen Frequenzen an unterschiedlichen Pins:

  • Pin 4 und 13, gesteuert von timer0:
    16 Mhz / 64/256 = 976,56 Hz

  • Andere PWM-Pins, gesteuert von timer1-4:
    16 Mhz / 64/510 = 490,20 Hz

Die Berechnung lautet: Clock / Prescaler / PWM-Modus Anzahl der Zustände

Die Situation ist für alle anderen mir bekannten Arduino-Boards gleich, außer dass sie weniger Timer haben, die mit verschiedenen Pins verbunden sind.

Sie können die PWM-Frequenz durch Ändern des Timervorskalierers ändern. Siehe diese Seite: http://playground.arduino.cc/Main/TimerPWMCheatsheet

Es ist auch möglich, die Timer auf einen anderen Wert als 255 zu setzen. Bei den 8-Bit-Timern verlieren Sie einen Ausgangspin, bei den 16-Bit-Timern können Sie jedoch das Input Capture Register verwenden, um einen TOP-Wert zu definieren. Die Eingabeerfassungsfunktion wird in der Arduino-Community nur selten verwendet, sodass Sie sie wahrscheinlich nicht verpassen werden.

In den Arduino-Bibliotheken können Sie selbst bei 16-Bit-Timern nur eine Auflösung von 8 Bit verwenden. Wenn Sie die höhere Auflösung wünschen, müssen Sie Ihr eigenes analogWrite schreiben oder eine Bibliothek verwenden, die zu diesem Zweck erstellt wurde. Auf dem Arduino Mega sind timer0 und timer2 8 Bit, während der Rest 16 Bit sind.

Durch Ändern des Modus der 16-Bit-Timer, um die volle Auflösung zu nutzen, in Kombination mit dem Ändern des Vorteilers und des TOP-Werts können Sie einen sehr großen Bereich von PWM-Frequenzen erreichen.

Die maximale Frequenz, die Sie erreichen können, ist Clock / 4, indem Sie im schnellen PWM-Modus den Prescaler auf 1 und TOP auf 3 einstellen - ein niedrigerer Wert ist nicht zulässig. Dadurch erhalten Sie eine 4-MHz-PWM mit 2-Bit-Auflösung. Sie kann in 0%, 25%, 50% oder 75% der Fälle liegen. Ein höherer TOP-Wert ergibt eine höhere Auflösung bei einer niedrigeren Frequenz.

Für eine längere Erklärung lesen Sie diesen Artikel oder beziehen Sie sich auf das Datenblatt .

Das Ändern des Prescaler-, PWM-Modus- oder TOP-Werts für timer0 führt zu millis()und micros().

user2973
quelle
1
Ich nehme also an, dass die schnellste Frequenz, die Sie für PWM erhalten könnten, 16 MHz / 256 (Prescaler = 1) oder 62,5 kHz ist.
Duncan C
Und weiter, dass die PWM-Frequenz ein gerader Faktor von 62,5 kHz sein muss? Jemand in einem anderen Thread wollte die Lüftergeschwindigkeit eines 4-poligen PC-Lüfters steuern. Anscheinend will es ein PWM-Steuersignal von 25KHz. 62,5 / 25 ist 2,5, was kein ganzzahliger Wert ist.
Duncan C
Ich habe die Antwort aktualisiert, um mehr über die Möglichkeiten des Erreichens bestimmter Frequenzen zu
erfahren.
Am Niederfrequenzende können Sie einen 16-Bit-Timer im phasenkorrekten Modus mit einem 1024-Prescaler vorskalieren, um 16e6 / 1024/2 ^ 16/2 = 0,119 Hz oder 7,1 Zyklen / Minute zu erhalten. Für einen niedrigeren Wert müsste man die Bits basierend auf so etwas wie millis () umschalten. Oder triggern Sie den Zähler am externen Eingang Pin T ?.
Dave X