Forum: Mikrocontroller und Digitale Elektronik ATMega Timer PWM Frequenz


von Chris (Gast)


Lesenswert?

Hi zusammen,

ich wollte gerne einen ATMega als Sinusgenerator per PWM ausprobieren. 
Jetzt verstehe ich das Datenblatt so, dass die PWM Frequenz 32kHz 
beträgt. Bei einer Auflösung von 8 Bit komme ich damit auf eine maximale 
Frequenz des Ausgangssignals von ca. 125 Hz (32 kHz/255).

Ich habe das vermutlich falsch gelesen, oder? Ich würde relativ ungern 
die PWM per Software impelementieren, weil dann das Timing doch recht 
komplex wird, wenn noch mehr gemacht werden soll, als nur die PWM.

Gruß,
Chris

von Carsten R. (kaffeetante)


Lesenswert?

Die PWM-Frequenz ist einstellbar. Dazu gibt es verschieden 
Taktteileroptionen. Die Frequenz beträgt bei 8 Bit (256 Werte/Klicks) 
Auflösung maximal CPU-Takt/256. Das sind bei den ca 8 MHz in der 
Standardeinstellung des internen Oszillators in der Tat maximal ca 32 
kHz. Bei 16 MHz bzw 20 MHz sind es 64 kHz bzw 80 kHz. Es kann aber auch 
weniger sein, dank höherem Vorteiler.

Chris schrieb:
> Bei einer Auflösung von 8 Bit komme ich damit auf eine maximale
> Frequenz des Ausgangssignals von ca. 125 Hz (32 kHz/255).

Wenn du das PWM Signal zum Glätten durch einen Filter schickst um daraus 
etwas Sinusähnliches zu formen, so hast du bei 125 Hz des zu 
modellierenden Sinus bei 32 kHz PWM 256 PWM-Pulse/Stützstellen. Die 
Anzahl der Stützstellen bestimmt die Genauigkeit so wie die maximale 
Frequenz. Diese 256 Stützstellen haben aber nichts mit den 8 Bit es 
Timers zu tun. Die maximale Anzahl der Stützstellen ist gegeben durch 
das Verhältnis von zu modellierender Sinusfrequenz zu vorhandener 
PWM-Frequenz. Du kannst auch bei 80 kHz PWM einen Sinus mit einem kHz 
und 80 Stützstellen bauen.

Chris schrieb:
> Ich würde relativ ungern
> die PWM per Software impelementieren, weil dann das Timing doch recht
> komplex wird, wenn noch mehr gemacht werden soll, als nur die PWM.

Die PWM selbst braucht nicht per Software gemacht werden, denn dafür ist 
der Timer ja da. Aber der Timer erzeugt nur ein Rechtecksignal, keinen 
Sinus. Etwas mehr ist also doch zu tun, aber nicht soooo viel mehr. Man 
braucht ein Array mit den Stützstellen die dann, je nach geforderter 
Genauigkeit nach und nach ins Timerregister geladen wird. Wenn nur der 
Effektivwert zählt war es das auch schon. Wenn es glatter werden soll, 
muß dann noch eine Filterschaltung dahinter, welche das Rechtecksignal 
auf den Effektivwert glättet.

von Chris (Gast)


Lesenswert?

Hmm...mir ist das Prinzip der PWM schon bekannt, was mich stutzig 
gemacht hat, ist folgender Satz im Datenblatt:

"ATmega48A/PA/88A/PA/168A/PA/328/P uses the same crystal oscillator for 
Low-frequency Oscillator and Timer/Counter Oscillator."

Und weiter hinten im Datenblatt steht beim Timer/Counter2:
"The CPU main clock frequency must be more than four times the 
Oscillator frequency"

Für mich liest sich das eben so, dass standardmäßig die PWM Frequenz ca. 
32kHz ist und mit einem externen Takt max 16MHz/(255*4)=16kHz.

Habe ich etwas übersehen?

von Spess53 (Gast)


Lesenswert?

Hi

>ich wollte gerne einen ATMega als Sinusgenerator per PWM ausprobieren.

Darf es auch ein ATTiny261/461/861 sein? Die haben eine PLL für den 
Timer mit der du auf 64MHz kommst.

MfG Spess

von Chris (Gast)


Lesenswert?

Ja ich denke so werde ich es auch machen. Megas hätte ich ein paar im 
Keller liegen gehabt, deshalb wärs praktischer gewesen.

von holger (Gast)


Lesenswert?

>Jetzt verstehe ich das Datenblatt so, dass die PWM Frequenz 32kHz
>beträgt. Bei einer Auflösung von 8 Bit komme ich damit auf eine maximale
>Frequenz des Ausgangssignals von ca. 125 Hz (32 kHz/255).

Falsch. Wenn das so wäre könnte ich keine Audiodaten über z.B.
Timer2 abspielen.

Bei 8MHz Takt und Prescaler 1 kannst du bis zu 32kHz PWM Frequenzen
erzeugen. Da ist deine 8 Bit PWM schon drin! Du musst nicht noch mal
durch 256 teilen.

von Chris (Gast)


Lesenswert?

holger schrieb:
> Bei 8MHz Takt und Prescaler 1 kannst du bis zu 32kHz PWM Frequenzen
> erzeugen. Da ist deine 8 Bit PWM schon drin! Du musst nicht noch mal
> durch 256 teilen

Hast du einen externen Taktgeber für die IO? Falls nicht, darf ich 
fragen wie du die entsprechenden Register gesetzt hast. Mich mach eben 
dieser Satz aus dem Datenblatt stutzig: 
"ATmega48A/PA/88A/PA/168A/PA/328/P uses the same crystal oscillator for 
Low-frequency Oscillator and Timer/Counter Oscillator."

von Carsten R. (kaffeetante)


Lesenswert?

Der Timer2 ist auch was besonderes. Er kann besondere Sachen. Er kann 
asynchron zum restlichen Chip laufen. Daß der Haupttakt vier mal höher 
sein muß, gilt für diesen asynchronen Modus. Das ist dann interessant 
wenn man den Timer2 beispielsweise mit einem externen Uhrenquarz als Uhr 
betreibt. Die Uhrenquarze haben für gewöhnlich 32,768 kHz.

Die PWM läuft dann aber bei 256 Bit Auflösung mit ca 128 Hz. Damit 
bekommst Du aber keinen Sinus mit 125 Hz hin. Du benötigst mehrere 
PWM-Pulse um einen Sinus auch nur annäherungsweise zu formen. Daher 
benutzt man für so etwas auch den Mainclock, so daß Der Timer mit 
einigen MHz läuft, so daß die resultierende PWM-Frequent im 
zweistelligen kHz Bereich liegt um damit einen noch langsameren Sinus zu 
modellieren.

von Amateur (Gast)


Lesenswert?

>Die haben eine PLL für den
>Timer mit der du auf 64MHz kommst.

Beachte aber das Kleingedruckte:

Um einen Sinus mit hoher Frequenz ausgeben zu können, musst Du auch die 
PWM-Stufe, entsprechend schnell, mit Daten füttern.

- Dann ist nichts mehr mit nebenbei noch Händchen halten mit der 
Freundin -
  das ist ein Full-Time-Job.
- Da du die Werte auch nicht so schnell, wie sie gebraucht werden,
  berechnen kannst, müssen sie vorher berechnet und wahrscheinlich im
  RAM, wenn variabel, abgelegt werden. Das braucht Platz. Liegen sie,
  weil konstant im FLASH, ist der Zugriff etwas langsamer.

Also nicht nur Sonnenschein, sondern ein paar Bremsklötze.

von Carsten R. (kaffeetante)


Lesenswert?

Man muß aufpassen daß man den Timertakt nicht mit der daraus 
resultierenden PWM-Frequenz verwechselt. Das ist ein häufiges 
Mißverständnis, und so sieht es auch im ersten Post aus. Das sind zwei 
verschiedene Sachen. Und das zu modellierende Signal hat auch wieder 
eine andere Frequenz und muß nicht 1/256 der PWM-Frequenz betragen.

von Chris (Gast)


Lesenswert?

Carsten R. schrieb:
> Man muß aufpassen daß man den Timertakt nicht mit der daraus
> resultierenden PWM-Frequenz verwechselt. Das ist ein häufiges
> Mißverständnis, und so sieht es auch im ersten Post aus. Das sind zwei
> verschiedene Sachen. Und das zu modellierende Signal hat auch wieder
> eine andere Frequenz und muß nicht 1/256 der PWM-Frequenz betragen.


Tu ich nicht...Hoffe ich zumindest.:-) Ich habe das Datenblatt nur so 
verstanden, dass ich nur zwischen einem Timertakt von 32kHz und einem 
externen Takt wählen kann.

Ich probiers morgen einfach aus, vielleicht habe ich es ja nur falsch 
verstanden.

von holger (Gast)


Lesenswert?

>Beachte aber das Kleingedruckte:
>
>Um einen Sinus mit hoher Frequenz ausgeben zu können, musst Du auch die
>PWM-Stufe, entsprechend schnell, mit Daten füttern.

Und einen passenden Tiefpassfilter hinter die PWM hängen.
Ohne diesen wird das PWM Signal halt ein Recktecksignal bleiben.

von Carsten R. (kaffeetante)


Lesenswert?

Chris schrieb:
> Jetzt verstehe ich das Datenblatt so, dass die PWM Frequenz 32kHz
> beträgt.

Chris schrieb:
> Ich habe das Datenblatt nur so
> verstanden, dass ich nur zwischen einem Timertakt von 32kHz und einem
> externen Takt wählen kann.

Das paßt nicht zusammen oder du hast da nur eine falsche Vokabel 
benutzt. Die Konstellation daß PWM-Frequenz und Timertakt gleich sind 
geht nur wenn der Timer mit jedem Takt einen neuen Zyklus startet. Dann 
kann er aber nicht sehr weit zählen, schon gar nicht von 0 bis 255. ;-)

Du kannst wählen zwischen dem CPU-Takt bzw einem exteren Takt oder 
Uhrenquarz (ca 32 kHz) und auf den jeweiligen Takt diverse Taktteiler 
anwenden. Das gilt nur für Timer2! Die anderen Timer können ihren Takt 
nur vom Mainclock ableiten und auf diesen dann einen Taktteiler 
anwenden.

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.