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.