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