Forum: Mikrocontroller und Digitale Elektronik Frequenzstabiles PWM Signal über AtMega16


von Kamui1981 (Gast)


Lesenswert?

Hallo Leute,

Ich verzweifle gerade bei dem Versuch auf meinem AtMega16 ein PWM-Signal 
auszugeben.
Es sollte 55,6kHz als stabile Frequenz am PIN PD5 (OC1A) liefern. Das 
Verhältnis von Ein- zu Ausschaltzeit möchte ich je nach Ergebnis 
verschiedener Berechnungen neu setzen können.

Im Datenblatt des AtMega16 auf S.106 habe ich den "Phase and Frequency 
Correct PWM Mode" gefunden und folgendermaßen aufgebaut:
1
int main (void)
2
{
3
   DDRD=0xff;
4
   TCCR1A = (1<<COM1A1) | (1<<WGM10)
5
   TCCR1B = (1<<WGM13)  | (1<<CS12)
6
// WGM10-WGM13 bestimmen die Waveform -> Datenblatt S. 112 Tabelle 47 Mode 9)
7
// COM1A1 und COM1A0 bestimmen den Output Mode --> S.111 Tabelle 46 --> Hier möchte ich dass der Ausgang so lange high ist, bis der "compare match" erreicht ist.
8
// Danach ist der Ausgang low, bis der Counter wieder bei BOTTOM ankommt und die nächste Periode beginnt. --> COM1A1=1 COM1A0=0.
9
// CS10-CS12 bestimmen den Prescaler --> gewünscht 256 --> CS12=1, CS11=0 und CS10 =0
10
}

Laut Tabelle 47 wird der TOP-Wert über das Register OCR1A eingestellt. 
Dieses 16bit Register ist in OCR1AH und OCR1AL unterteilt.
Wenn ich Figure 48 auf S.107 richtig verstehe, dann geht eine Periode 
immer von BOTTOM zu BOTTOM und die Frequenz steigt dadurch, dass ich den 
TOP-Wert reduziere. Um also die Frequenz einzustellen muss ich den 
TOP-Wert nach der Formel auf S.107 ausrechnen.
(TOP = Systemtaktfrequenz/2*prescaler*f_Soll= 8MHz/2*256*55,8kHz = 
0,28.)
Da TOP von 0 bis MAX insgesamt 2^16 also 65536 Schritte hat, soll es 
jetzt nur 28%, also von 0 bis 18350 zählen um die gewünschte Frequenz 
von 55,8kHz zu generieren.
Das heißt:
1
OCR1AH= 0b01000111;
2
OCR1AB= 0b10101110;
Bin ich jetzt schon komplett auf dem Holzweg oder ist das soweit 
richtig. Aber wenn es richtig ist, wo setze ich jetzt das Verhältnis von 
Ein- zu Ausschaltzeit fest?
Hoffe Ihr könnt mir helfen.

Mit freundlichen Grüßen
Kamui

P.S: Noch ein ganz dickes Lob an die ganze microcontroller.net 
Community. Ich habe Ende letzten Jahres mit dem programmieren von 
Mikrocontrollern begonnen und ohne eure Threads, Tutoriums und 
Einführungshilfen hätte ich schon längst wieder aufgegeben. Vielen Dank 
euch allen.

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.