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
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.
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?
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
>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.
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."
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.
>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.
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.
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.
>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.
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.