Hallo,
ich beschäftige mich seit kurzem mit der GCC Programmierung für einen
Atmega16 und möchte in meinem kleinen Fast PWM Code den Preloader
einstellen.
Ich habe aber überhaupt keine Ahnung, wie man das macht und auf was ich
da alles achten muss. Hier ist ein kleiner Ausschnitt aus meinem Code,
damit Ihr seht, was ich schon habe.
Momentan läuft es im Timer 1 mit 10Bit, Quarz = 4Mhz, Prescaler 64.
So bekomme ich eine PWM-Frequenz von ca 61Hz
int main(void)
{
DDRD |= (1 << DDB4);
DDRD |= (1 << DDB5);
TCCR1A = (1<<WGM10)|(1<<WGM11)|(1<<COM1A1)|(1<<COM1B1);
TCCR1B = (1<<WGM12)|(1<<CS10)|(1<<CS11);
OCR1A = 512;
OCR1B = 512;
return 0;
}
Wenn ich jetzt zum Beispiel genau 60Hz erreichen will, kann man soweit
ich weiss mit dem Preloader einen Teil vorladen. Ich hoffe Ihr wisst was
ich meine.
Was würdet Ihr jetzt an diesem Code verändern?
Wer kan mir helfen?
Jens schrieb:> Wenn ich jetzt zum Beispiel genau 60Hz erreichen will, kann man soweit> ich weiss mit dem Preloader einen Teil vorladen. Ich hoffe Ihr wisst was> ich meine.
Genau 60Hz gehen mit 4MHz nicht und einen Preloader hat der Timer nicht.
Du kannst aber den Topwert der PWM einstellen. Statt Mode7 mit 0x3FF als
festem Topwert, nimmst du Mode 8, 10 oder 14 und setzt den Topwert im
ICR1-Register.
mfg.
Hallo, danke für die Antowrten.
Ich denke das hilft mir schon weiter.
Zu Peter: Danke für den Hinweis mit dem Kommentieren. Ich kommentiere
normalerweise immer. Ich hatte das nur heraus genommen um es für Euch
übersichtlicher zu machen. Also damit nicht so viel da drin steht.
Ach und warum 16 Bit und Prescaler 1 und nicht den Fast PWM? Ich bin
noch viel am rumprobieren, ich weiss noch nicht was so die besten und
gängigsten Methoden sind, wie man seine PWM aufbaut.
Zu Thomas: Gut zu wissen, dass 60 Hz nicht funktionieren. Den Top Wert
einstellen hört sich gut an, genauso was habe ich gesucht.
Noch eine Frage dazu:
Bedeutet das, dass ich wenn ich zum Beispiel eine PWM im 16 Bit laufen
habe, was ja 65536 Zählschritten entspricht, dass ich durch das
ICR1-Register einfach bestimmen kann, dass der nur bis z.B. 60000
Schritte zählt und dann wieder von vorne beginnt bzw. wieder
runterzählt?
Jens schrieb:> Bedeutet das, dass ich wenn ich zum Beispiel eine PWM im 16 Bit laufen> habe, was ja 65536 Zählschritten entspricht, dass ich durch das> ICR1-Register einfach bestimmen kann, dass der nur bis z.B. 60000> Schritte zählt und dann wieder von vorne beginnt bzw. wieder> runterzählt?
Genau das
FAQ: Timer
und natürlich das Datenblatt
Jens schrieb:> Ach und warum 16 Bit und Prescaler 1 und nicht den Fast PWM?
Im Fast-PWM-Mode kommst du bei 4MHz nur auf 61Hz runter. Im Phase- bzw.
Frequency-Correct Mode dagegen auf die Hälfte. Sodass du die 60Hz zwar
auch nicht exakt, aber mit grösstmöglicher Annäherung erreichst. Ich
denke, das meinte PeDa damit.
Jens schrieb:> Gut zu wissen, dass 60 Hz nicht funktionieren.
Naja, es sind 60,00060006Hz.
Mit dem nächstgelegenen Baudratenquarz von 3,6864MHz kommst du exakt auf
60Hz. Welchen Sinn das in Anbetracht der Bauteiltoleranzen macht, sei
mal dahingestellt.
Ich würde den 3,6864MHz-Quarz nehmen.
Weil ich erstens dann mit einem 8-Bit-Timer ebenfalls hinkäme und
zweitens, weil ich das Teil in der Schublade liegen habe.
mfg.
Ja mit dem Phase-Correct habe ich mich eben mal kurz etwas beschäftigt.
Das ist wirklich besser für mich als das Fast PWM.
Ich hatte mich auch die ganze Zeit immer gewundert, warum die
PWM-Frequenz auf meinem Oszilloskop immer das doppelte beträgt, was ich
mit der Formel ausrechne. Das lag wohl am Fast-PWM, was nur die Hälfte
der Zeit braucht, weil es nicht runter zählt. :) Wieder was gelernt..
Die 60Hz waren nur als Beispiel zum veranschaulichen gedacht. Ich
brauche keine 60 Hz. Ich brauche irgendwas anderes, was ich noch anhand
meinem Vorhabens bestimmen muss. Für mich ist das hier nur erst mal zum
üben und herum probieren, damit ich verstehe, wie die Controller
funktionieren.
Danke an Euch beide für die klaren Antworten.
Gruss Jens
Hallo Leute,
da bin ich nochmal.. :)
Schaut doch bitte nochmal kurz auf den folgenden Code.
Ich habe das jetzt abgeändert. Kommentare habe ich wieder raus gemacht,
weils die ganzen Zeilen hier im Forum verschiebt.
Ich habe jetzt Phase Correct PWM mit 10 Bit Prescaler auf 1 und wie
gehabt 4Mhz Quarz-Frequenz;
Die PWM-Frequenz beträgt dadurch 1,955kHz
Wie Ihr seht ist der ICR1 auf 1000 eingestellt. Also gehe ich davon aus,
dass die Periode nicht bis 1023 sondern bis 1000 laufen muss und dann
zurück läuft. Dadurch müsste doch die Frequenz sich sogar erhöhen, oder?
Es ist aber keine Veränderung da, irgendwie versteh ich das ganze nicht.
Jens schrieb:> Ich habe jetzt Phase Correct PWM mit 10 Bit
wenn du fixe 10 Bit einstellst, kannst du in ICR1 reinschreiben was
immer du willst. Das ändert genau gar nichts.
Du willst in der Modus-Tabelle auf Seite 112 im Datenblatt einen Modus
auswählen, bei dem in der Spalte 'TOP' nicht ein fixer Wert, sondern das
Register ICR1 aufgeführt ist!
> ...> Wie Ihr seht ist der ICR1 auf 1000 eingestellt. Also gehe ich davon aus,> dass die Periode nicht bis 1023 sondern bis 1000 laufen muss
Siehe Bild