www.mikrocontroller.net

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


Autor: Christian Kunath (Gast)
Datum:

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

Autor: thkaiser (Gast)
Datum:

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

Autor: Christian Kunath (Gast)
Datum:
Angehängte Dateien:

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

Autor: Rolo Tomasi (Gast)
Datum:

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

Autor: mikki merten (Gast)
Datum:

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

Autor: crazy horse (Gast)
Datum:

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

Autor: thkaiser (Gast)
Datum:

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

Autor: Zoltan (Gast)
Datum:

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

Autor: Christian Kunath (Gast)
Datum:

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

Autor: Zoltan (Gast)
Datum:

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

Autor: Peter Dannegger (peda)
Datum:

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

Autor: mikki merten (Gast)
Datum:

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

Autor: Zoltan (Gast)
Datum:

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

Autor: Christian Kunath (Gast)
Datum:
Angehängte Dateien:

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

Autor: mikki merten (Gast)
Datum:

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

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.