Hallo! Es gibt unzählige Themen zu PWM, ich habe Google benutzt, das Datenblatt, schlussendlich alle mir zur Verfügung stehenden grauen Zellen... genug der Verteidigung, hier meine Frage: ToDo: PWM mit ~25 kHz zur Ansteuerung einer H-Brücke mit dem ATmega32 Annahmen: 16MHz Systemtakt, Prescaler 1, 16bit PWM Frage: Habe ich richtig gerechnet ? aus Datanblatt: Berechnung von TOP im FAST-PWM-Modus f_soll = f_clk / (N*(1+TOP) || f_soll = 25*10^3, f_clk = 16*10^6, N=1 => TOP = 726,27 Also muss der Zähler nur bis 726 zählen, sprich irgendwo zwischen 8-bit und 9-bit-Modus , richtig ? Weiterhin: Resolution = log(TOP + 1) / log(2) -> für TOP den Dezimalwert einsetzen? -> kommt ~9 raus, was sagt mir eine Auflösung von " 9 " ? Sonst noch irgendwelche "bösen" Denkfehler ? Teilweise kam es mir beim Lesen so vor als ob ich nur feste Frequenzen über den Prescaler einstellen kann, aber geht doch auch über TOP , oder ? MfG Torsten
Ja. eine 16bit PWM mit 16MHz wird schwierig. Ich hab das jeweils so gemacht. 8bit PWM mit 64kHz, und dann jeweils den Zaehler so neu laden, dass man nochmals 8 bit bekommt.
Mit dem Prescaler stellst du ein, wie schnell der Timer zählt. Mit dem TOP Wert deine Periodendauer, hattest du ja auch schon mit f_soll = f_clk / (N*(1+TOP) berechnet. TOP kann aber nur bestimmte Werte annehmen: "In fast PWM mode the counter is incremented until the counter value matches either one of thefixed values 0x00FF, 0x01FF, or 0x03FF (WGM13:0 = 5, 6, or 7), the value in ICR1 (WGM13:0 =14), or the value in OCR1A (WGM13:0 = 15)". Wenn die fixed Values für deine gewünschte Frequenz zu ungenau sind, dann einfach TOP über ICR1 definieren und mit dem Wert in OCR1x deinen Duty-Cycle einstellen. Die Auflösung von 9 bit sagt dir, wie genau sich der Duty-cycle einstellen läßt: kleinster Duty-cycle = 1/(2^9-1)
Ok, werd also folgendes probieren: TOP auf 726 in ICR1 schreiben, in OCR1A schreib ich dann meinen Vergleichswert welcher mir dann das Tastverhältnis gibt, sprich bei 363 hätte ich dann 50 % und varriieren kann ich das Ganze in 1/2^9-1 - Schritten ? Soweit richtig ?
Torsten schrieb: > => TOP = 726,27 > Also muss der Zähler nur bis 726 zählen, sprich irgendwo zwischen 8-bit > und 9-bit-Modus , richtig ? > wohl eher zwischen 9 und 10bit
Hallo, f_soll = f_clk / (N*(1+TOP)) || f_soll = 25*10^3, f_clk = 16*10^6, N=1 N*(1+TOP) = f_clk / f_soll TOP = 640 - 1 = 639 und nicht sowas krummes wie 726,27 Nach 640 clk-ticks wird also wieder von 0 gezählt. 640 > 512 = 2^9 also etwas mehr als 9 Bit Auflösung des PWM Signals. Das könnte man ja etwas verschlimmbessern, indem man den Wert in OCR1A+0/+1 in einem bestimmten Takt flattern lässt, eine Art überlagerte PWM. Dazu addiert man beständig einen Wert, entsprechend dem Tastverhältnis und bei einem Überschriten einer Grenze wird RechenWert_OCR1A+1 genutz sonst RechenWert_OCR1A. Sei die Grenze 128 und das Tastverhältnis 50% dann addiert man immer 64 und bei Überlauf passt man OCR1A an <c> // ala Bresenham-Gerade Grenze = 128 delta = int(Grenze * 0.50) summe = delta / 2 ; Jetzt im IRC1 Interrupt: summe += delta; if (summe>Grenze) {OCR1A mit RechenWert_OCR1A+1 belegen; summe -= Grenze;} else {OCR1A mit RechenWert_OCR1A;}</c> So könnte man über 128 ICR1 Überläufe gerechnet die PWM Auflösung um den Faktor 128= 2^7 erhöhen. Dann erreicht man eine gepfuschte 640*128=81920==16.322 Bit Auflösung mit einer Frequenz von 25000/128 = 195,3125 Hz. Gruß Horst
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.