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 das Mega 2560, möchte aber auch wissen, ob es zwischen den Modellen konsistent ist.
Ich habe vorübergehende Verweise auf das Arduino mit 500 Hz gesehen, was sehr langsam erscheint.
Kommentare
- Das hängt auch von der verwendeten PIN ab.
Antwort
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 seinen eigenen Arbeitszyklus haben. Sie teilen sich jedoch 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: schnelle PWM und phasenkorrekte PWM. Bei schneller PWM zählt der Timer bis 255, läuft dann über und beginnt bei 0 (256 verschiedene Zustände). Bei phasenkorrektem PWM zählt der Timer bis 255, ändert dann die Richtung und zählt abwärts auf Null, ändert die Richtung usw. (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 phasenrichtiges PWM konfiguriert sind. Dies führt zu unterschiedlichen Frequenzen an unterschiedlichen Pins:
-
Pin 4 und 13, gesteuert durch 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-Karten gleich, außer dass sie weniger Timer haben, die mit verschiedenen Pins verbunden sind.
Sie können die ändern PWM-Frequenz durch Ändern des Timer-Vorteilers. Siehe diese Seite: http://playground.arduino.cc/Main/TimerPWMCheatsheet
Es ist auch möglich, die Timer auf a zählen zu lassen anderer Wert als 255. Bei den 8-Bit-Timern verlieren Sie einen Ausgangspin, bei den 16-Bit-Timern können Sie das TOP-Wert mithilfe des Input Capture Registers 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 auch bei 16-Bit-Timern nur eine 8-Bit-Auflösung verwenden Wenn Sie eine höhere Auflösung wünschen, müssen Sie Ihr eigenes analogWrite schreiben oder eine für diesen Zweck erstellte Bibliothek verwenden. Auf dem Arduino Mega sind timer0 und timer2 8 Bit, während der Rest 16 Bit ist.
Durch Ändern Im Modus der 16-Bit-Timer, um die volle Auflösung zu nutzen, können Sie in Kombination mit der Änderung des Vorteilers und des TOP-Werts einen sehr großen Bereich von PWM-Frequenzen erreichen.
Die maximale Frequenz, die Sie erreichen können ist clock / 4, indem der Prescaler im schnellen PWM-Modus auf 1 und TOP auf 3 gesetzt wird – ein niedrigerer Wert ist nicht zulässig. Dadurch erhalten Sie eine 4-MHz-PWM mit 2-Bit-Auflösung. Es kann in 0%, 25%, 50% oder 75% der Fälle sein. Ein höherer TOP-Wert führt zu einer höheren Auflösung bei einer niedrigeren Frequenz.
Für eine längere Erklärung lesen Sie diesen Artikel oder lesen Sie den Datenblatt .
Das Ändern des Vorteilers, des PWM-Modus oder des TOP-Werts für timer0 führt zu Problemen mit millis()
und micros()
.
Kommentare
- Ich erfahre also, dass die schnellste Frequenz, die Sie bekommen konnten für PWM ist 16 MHz / 256 (Vorteiler = 1) oder 62,5 kHz?
- Und außerdem muss die PWM-Frequenz ein gerader Faktor von 62,5 kHz sein? 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.
- Ich habe die Antwort aktualisiert, um mehr über die Möglichkeiten zum Erreichen bestimmter Frequenzen zu erfahren.
- Am Niederfrequenzende könnten Sie Skalieren Sie einen 16-Bit-Timer im phasenkorrekten Modus mit einem 1024-Prescaler vor, um 16e6 / 1024/2 ^ 16/2 = 0,119 Hz oder 7,1 Zyklen / Minute zu erhalten. Für niedriger als das müsste man die Bits basierend auf so etwas wie millis () umschalten. Oder lösen Sie den Zähler am externen Eingangspin T aus?