mikrocontroller.net

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


Autor: Torsten (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Aahh (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Marco L. (lehmi)
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: Torsten (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ?

Autor: Vlad Tepesch (vlad_tepesch)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Horst Hahn (horha)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.