PWM Frequenz / Hex-code

Hi,
möchte meine PWM Frequen am Atmega328 anpassen.
Beziehe mich auf diesen Beitrag Varying the pwm frequency for timer 0 or timer 2? - #5 by macegr - Interfacing - Arduino Forum

Demnach schreib ich in die Void Setup () für zB Pin 5 oder 6

TCCR0B = TCCR0B & 0b11111000 | settings;

Als Wert für settings gibt es diese Tabelle:

Setting Divisor Frequency
0x01 1 62500
0x02 8 7812.5
0x03 64 976.5625
0x04 256 244.140625
0x05 1024 61.03515625

Daraus folgt also für 1Khz

TCCR0B = TCCR0B & 0b11111000 | 0x03;

Soweit habe ich das hoffentlich richtig verstanden. Zumindest wird es hier (in den letzten Minuten) so erklärt:

Jetzt meine Frage:
Wenn ich die Frequenz 1,5kHz oder 2Khz nutzen möchte - welchen "settings" Wert nehme ich da?
1,5kHz würde einem Divisor von 40 entsprechen, liegt also irgendwo zwischen 0x02 und 0x03.
Nun ist mein minimales VErständnis in dem Bereich so, dass es keinen Wert zwischen 0x02 und 0x03 gibt.
Heißt das, man kann keine beliebige Frequenz einsellen sondern nur die genannten?

VG

Das geht damit nicht. Die Timer haben nur eine begrenzte Anzahl an Einstellungen für den Prescaler, die natürlich vielfaches voneinander sind. Das ist ein ganz normaler Frequenz-Teiler mit Flip-Flops. Entsprechend teilt jeder um den Prozessor-Takt um den Faktor 2 herunter. Timer2 hat mehr Prescaler Optionen als 0 und 1, aber du bist auch auf ganze Teiler des Prozessor-Takts beschränkt.

Andere Frequenzen gehen aber wenn man die PWM Geschichte komplett per Hand macht. Standard-mäßig laufen die Timer in einem Modus mit festem TOP Register. TOP ist der Wert bis zu dem der Timer maximal läuft. Es gibt auch Modi, bei denen man das TOP Register selbst festlegen kann. Bei Timer1 z.B. entweder über IRC1 oder OCR1A. Siehe Datenblatt Seite 136 für Timer1
In den phase + frequency correct Modi gilt folgende Formel:
PWM frequency = clock speed / (2 * prescaler * TOP )
Entsprechend kann man über Prescaler und TOP einen weiteren Bereich an Frequenzen erhalten.

Wenn man Fast PWM oder Phase Correct PWM mit 9 oder 10 Bit macht, sollte man auch etwas andere Frequenzen erreichen können. Aber das geht nicht so einfach mit den Standard Arduino Mitteln.

Wenn du an Timer0 was änderst, veränderst du übrigens die Zeiten für millis() und delay()!

Hi,
ich brauch 4 PWM Kanäle. Könnte ja 3,9, 10 & 11 nutzen, da Timer0 für AUsgang 5&6 bestimmt ist. Dann hätte ich also kein millis() Problem.
Hintergrund ist eigentlich nur, dass ich gelesen habe, dass für die ANsteuerung von DC Motoren die beste Frequenz bei 1-2kHz liegt. Könnte ja als gemeinsamen Nenner von TImer1&2 3906.25 Hz nehmen. Oder ist das Quatsch und ich lasse die Motoren einfach über die Default Frequenz 490Hz laufen? Haben Timer 1&2 die selbe Defaultfrequenz? In den verlinkten Video wird für einen Timer per default 970Hz gemessen und einen anderen 490Hz.

Gruß

Die Standardfrequenz ist immer vom Prozessor-Takt abgeleitet. Dieser wird dann heruntergeteilt. Und Timer2 hat mehr Optionen für den Teiler.

Timer0 hat andere Frequenzen, weil er mit fast PWM läuft und die anderen mit phase correct PWM. Dadurch ist die Frequenz auf Timer0 doppelt so hoch. Das hängt mit dem zusammen was ich oben schon angedeutet habe. Je nach Modus gelten andere Formeln für den Frequenz.

Hier steht es auch schön:
http://playground.arduino.cc/Main/TimerPWMCheatsheet

ca. 980Hz geht auf Timer0 und Timer2

Hi,
guter Link, Danke.
Welche Frequenz würdest Du für DS Motoren empfehlen?
Gruß

Mit der Frequenz ligst du da schon richtig. Was die Effektivität/Wärmeentwicklung in den Motoren ist. Aber wenn du keine Hochdynamischen Antriebe oder extrem Große Leistungen schalten willst ist dies vernachlässigbar.
Es gibt auch Motorcontroller die arbeiten mit 30kHz und mehr.
Die Taktfrequenz ist bei DC-Motoren nicht ganz so auschlaggebend wie bei AC-Motoren.(Verluste im Motor)
Wenn es um "kleine" Sachen geht mit geringer Dynamik kannst du es so lassen (es ist in 80% der Fälle nur akustische Kosmetik).
Im Normalfall wirst du keinen unterschied feststellen ob 490Hz oder 1-2kHz.
Die Frage ist ob du es nicht mit einem Brushless Motor mit 3Phasen besser erledigt bekommst (kenne deine Anwendung nicht).
Gruß
DerDani