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?
Nimm 16Bit im nicht fast PWM-Mode und Prescaler 1. Kommentiere Deine Programme, damit Du später noch weißt, was es machen soll.
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
:
Bearbeitet durch User
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.
:
Bearbeitet durch User
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
1 | int main(void) |
2 | {
|
3 | |
4 | DDRD |= (1 << DDB4); |
5 | DDRD |= (1 << DDB5); |
6 | |
7 | TCCR1A = (1<<WGM10)|(1<<WGM11)|(1<<COM1A1)|(1<<COM1B1); |
8 | |
9 | TCCR1B = (1<<CS10); |
10 | |
11 | ICR1 = 1000; |
12 | |
13 | |
14 | OCR1A = 512; |
15 | OCR1B = 512; |
16 | |
17 | return 0; |
18 | }
|
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.
:
Bearbeitet durch User
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!
:
Bearbeitet durch User
Jens schrieb: >
1 | > TCCR1A = (1<<WGM10)|(1<<WGM11)|(1<<COM1A1)|(1<<COM1B1); |
2 | >
|
> ... > 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
:
Bearbeitet durch User
Ok, nochmal danke für die ausführliche Erklärung. Ich werde das dann mal so probieren.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.