Forum: Mikrocontroller und Digitale Elektronik ATmega32 Fast PWM 16 bit - 25 kHz


von Torsten (Gast)


Lesenswert?

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

von Aahh (Gast)


Lesenswert?

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.

von Marco L. (lehmi)


Lesenswert?

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)

von Torsten (Gast)


Lesenswert?

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 ?

von Vlad T. (vlad_tepesch)


Lesenswert?

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

von Horst H. (horha)


Lesenswert?

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