Forum: Mikrocontroller und Digitale Elektronik Unverschämt: schwankende PWM-Frequenz


von Christian Kunath (Gast)


Lesenswert?

Hallo.

Während des Betriebes von Timer 1 im PWM-Modus stellte ich eine 
Schwankung der PWM-Frequenz um ca. 3% fest!

Ich verwende einen AT90S4433 mit 4 MHz. Der Timer 1 ist auf 8bit PWM 
eingestellt, mit einem Vorteiler von 256. Das ergibt eine Grundfrequenz 
von ( 4MHz / 510 ) / 256 = 30,6 Hz.
Ich nähere einen Sinus in 70 Schritten an: Im SRAM stehen Werte für eine 
halbe Sinuswelle. Mit dem Z-Pointer(der hoch und runter läuft) werden 
bei jedem T1-Overflow neue Werte ins Compare-Register geschrieben. Das 
Tastverhältnis variiert dabei von 5% bis 95%.

Mit dem Oszi angeschaut, sah zuerst alles wunderbar aus. Das 
Tastverhältnis veränderte sich gewünscht und die angeschlossene LED 
pulsierte langsam.
Bei genauerem Hinsehen veränderte sich nicht nur das Tastverhältnis, 
sondern die ganze Schwingung schien sich periodisch auszudehnen und 
zusammenzuziehen (ganz leicht, wie ein "atmen"). Zuerst dachte ich an 
ein Triggerproblem o.ä.
Mit einem Frequenzzähler konnte ich dann folgendes messen: im 
Durchschnitt ca. 30,6 Hz (wie berechnet), allerdings schwankt die 
Frequenz zwischen 30,0 und 31,3 Hz. Es scheint ein Zusammenhang zu dem 
Tastverhältnis zu bestehen, die Frequenz ändert sich ähnlich wie das 
Pulsieren der LED.

Hat jemand schon mal ähnliches beobachtet ?
Vom Verständnis über die Funktion des µC kann ich mir das absolut nicht 
erklären, schließlich läuft der Timer1 ständig zwischen 2 konstanten 
Werten hoch und runter, unabhängig vom Compare-Wert !?!


Danke für Hinweise

Christian K.

von thkaiser (Gast)


Lesenswert?

Ich habe PWM bisher immer per Software betrieben - weil der 2313 keine 4 
PWM-Ausgänge hat ;-)
Ich kanns mir aber fast nicht vorstellen, wenn man sich die Datenblätter 
so anschaut, scheint Atmel eigentlich einen recht großen Aufwand zu 
betreiben. Poste doch mal Dein Programm, evtl. ist dieser Effekt durch 
einen Seiteneffekt verursacht.

von Christian Kunath (Gast)


Angehängte Dateien:

Lesenswert?

Hier das Programm.
werde morgen mal probieren, was mit größeren/kleineren Teilern passiert.

von Rolo Tomasi (Gast)


Lesenswert?

Was für eine Schaltung benutzt Du? Lochraster oder eine richtige 
Platine? Miß doch mal die Frequenz am Quarz, könnte evtl. sein, daß 
dieser von anderen Teilen der Schaltung beeinflußt wird. Testweise 
könntest Du versuchen, den Quarz gegen einen Quarzoszillator 
auszutauschen. Zuerst solltest Du aber sichergehen, daß dein Programm 
stimmt, ich kann leider nicht viel dazu sagen, da ich noch nicht mit 
AVRs gearbeitet habe. Wenn alles nichts hilft, dann bliebe natürlich 
noch die Möglichkeit, einen externen D/A-Wandler zu verwenden.

von mikki merten (Gast)


Lesenswert?

Die Schwankungen beim 4433 dürften 3 Ursachen haben
a) bei der AT90S läuft der Vorteiler immer frei, d.h. er ist nicht mit 
dem Timer synchronisierbar. Bei den neueren MEGA kann auch der Vorteiler 
zurückgesetzt werden.
b) die Übernahme beim Timer 1 erfolgt immer 16 Bit breit über ein TMP 
Register. Hier wird aber der MSB-Wert nicht initialisiert und kann u.U. 
irgendwelche Zufallswerte enthalten.
c) Auch arbeitet die Vergleichlogik bei aktivem Vorteiler etwas anders, 
was zu einem unsymetrischen PWM Signal führen kann, nähere Informationen 
hierzu sind im Datenblatt aber auch recht genau beschrieben.

von crazy horse (Gast)


Lesenswert?

Punkt a kannst du in dem Fall vergessen, da der Timer und Vorteiler 
durchläuft.
b dürfte der Knackpunkt sein, ich verwende immer 16bit-Zugriffe, auch 
bei 8bit PWM und habe noch nie Probleme gehabt.
c keine Ahnung, glaube ich aber nicht.

von thkaiser (Gast)


Lesenswert?

b) fällt auch aus, ich denke mal, daß der Atmel bei 8-Bit PWM das MSB 
garnicht nutzt - und selbst wenn, dann wäre es nach einem Durchlauf 
(einmal hoch und einmal runter) doch initialisiert, oder? Wenn das MSB 
nicht auf $00 wäre, würde auch der Timer-Interrupt nicht funktionieren - 
laut Datenblatt wird er bei PWM-Betrieb bei Timer-Wert $0000 ausgelöst.

von Zoltan (Gast)


Lesenswert?

Ich habe auch das gleiche Problem, wie Christian. Ich erzeuge mit 
Timer1 einen Puls der ständig, wie oben beschrieben ,"atmet". Ich 
benutze einen Quarzoszillator. Mehr dazu hier: 
http://www.mikrocontroller.net/forum/read-1-16014.html

von Christian Kunath (Gast)


Lesenswert?

Der Quarz ist es definitiv nicht. Ich habe heute nachgemessen - er läuft 
sehr stabil auf einer Frequenz von ca. 4 MHz (ein Counter sagt 3,9998 
MHz, ein anderer 4,00044 - toll was die moderne Technik alles kann :-)
Meine Schaltung ist auf Lochraster aufgebaut. Gegen Störungen von außen 
spricht aber die Regelmäßigkeit des Phänomens. Bleibt nur übrig, das der 
µC sich selbst stört.

von Zoltan (Gast)


Lesenswert?

Dass der Quarz nicht stabil genug läft, daran habe ich garnicht gedacht. 
Es könnte eher an den Störungen liegen, die der Quarzoszillator 
aussendet, denke ich. Deshalb werde ich mal normale Quarze mit 
Kondensatoren ausprobieren. Mal sehn...

von Peter D. (peda)


Lesenswert?

Wenn ich das richtig verstanden habe dauert eine PWM mindestens 2 
Timerüberläufe.
Du solltest also besser erst jeden 2. oder 4. Überlauf einen neuen Wert 
laden. Dann müßte es stabil laufen.


Peter

von mikki merten (Gast)


Lesenswert?

Also unter Berücksichtigung der Sonderfälle und Taktsynchronisation wie 
auch im Datenblatt beschrieben (Seite 40/41 bei 4433) läuft die PWM 
absolut stabil.

von Zoltan (Gast)


Lesenswert?

Bei mir habe ich den Fehler gefunden: 
http://www.mikrocontroller.net/forum/read-1-16014.html
Jetzt schwankt nichts mehr.

von Christian Kunath (Gast)


Angehängte Dateien:

Lesenswert?

Ich habe mein Programm abgeändert:
1. exakter 16bit zugriff auf compare register, d.h. zuerst wird OCR1H 
mit 0x00 und dann OCR1L mit neuem Wert geladen.
2. neuer Wert wird erst nach ablauf von 12 Zyklen ins Compare Register 
geschrieben. (Tip von Peter)

Das Problem besteht weiterhin.
Als Anhang habe ich ein AVI-Video (DivX 4.0) mit einer Aufnahme vom 
Oszi.

von mikki merten (Gast)


Lesenswert?

Da du mit Vorteiler arbeitest versuch's mal mit $FE als Maximalwert als 
Endwert anstelle von $FF.

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.