Forum: Compiler & IDEs PWM Timer1 Preloader einstellen


von Jens (Gast)


Lesenswert?

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?

von Peter D. (peda)


Lesenswert?

Nimm 16Bit im nicht fast PWM-Mode und Prescaler 1.

Kommentiere Deine Programme, damit Du später noch weißt, was es machen 
soll.

von Thomas E. (thomase)


Lesenswert?

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.

von Jens (Gast)


Lesenswert?

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?

von Karl H. (kbuchegg)


Lesenswert?

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
von Thomas E. (thomase)


Lesenswert?

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
von Jens (Gast)


Lesenswert?

Super, danke genau das wollte ich wissen und brauche ich.

von Jens (Gast)


Lesenswert?

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

von Jens (Gast)


Lesenswert?

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
von Karl H. (kbuchegg)


Lesenswert?

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
von Karl H. (kbuchegg)


Angehängte Dateien:

Lesenswert?

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
von Jens (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.