ATmega32 Fast PWM 16 bit - 25 kHz

Gast #1504902
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
#1504935
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)
Gast #1505321
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 ?
#1505430
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren