Änderungen

ArduinoVariablePWMFrequenz

1.794 Byte hinzugefügt, 20:28, 2. Nov. 2017
[[Datei:Period_DutyCycle_Flank.PNG]] [[Datei:Periods_1Second.PNG]]
 
Wir gehen von einem Arduino mit 16 Mhz aus. Jede Sekunde besteht aus 16.000.000 Takten.
 
Ein 16-bit Timer kann in seinem Register TCNTn bis zu 65.536 Takte in einer Periode hochzählen. Das ist seine maximale Auflösung die bestimmt wie fein der Duty Cycle eingestellt werden kann. Üblicherweise hat ein PWM-Ausgang 256 Möglichkeiten den Duty Cycle einzustellen.
 
Teilen wir diese Auflösung durch die Takte der MCU pro Sekunde, haben wir eine Frequenz von 244.14 Hz. Die Periodendauer ist 1s / 244.14 Hz = 4.1 ms.
Wollen wir aber nur eine Auflösung von 265 Schritten pro Periode haben, ergibt sich eine Frequenz von 60.377,36 Hz mit einer Periodendauer von 16.5 ns..
Es gibt also eine Abhängigkeit zwischen der Auflösung und der Frequenz der PWM, die sich in folgender Formel beschreiben lässt:
<pre> Hz = clk/resolution </pre>
 
Jetzt schauen wir uns an, wie wir das Ganze anhand des Datenblattes umsetzen können.
Als Aufgabe stellen wir uns, eine Frequenz von 20 KHz zu erzeugen. Sie soll das nervige Fiepen der Standard-PWM-Frequenz von 490 Hz vermeiden um einen DC-Motor geräuschlos betreiben zu können.
 
Timer haben verschiedene Modi.
[[Datei:WaveformGenerationModeBitDescription.PNG]]
Wir entscheiden uns für den Modus 14 Fast PWM mit ICRn als TOP.
 
Eingestellt wird er über die Bits WGMn0:3 die sich über die Register TCCRnA und TCCRnB verteilen.
[[Datei:TCCR1A.PNG]] [[Datei:TCCR1B.PNG]]
Da können wir uns auch gleich den Rest des Registers TCCR1A anschauen.
Die bits COM1A0:1, COM1B0:1 und COM1C0:1 kontrollieren das Verhalten der Output Compare Pins OCnA, OCnB und OCnC (Stehen in den Pinoutdiagrammen) .
Stehen die bits auf 0, arbeitet der Port normal und unsere anderen Einstellungen haben keinen Effekt. Wir wählen hier 1 0 für inverting. Alles weitere später.
688
Bearbeitungen