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.
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.
Hier das Programm. werde morgen mal probieren, was mit größeren/kleineren Teilern passiert.
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.
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.
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.
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.
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
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.
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...
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
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.
Bei mir habe ich den Fehler gefunden: http://www.mikrocontroller.net/forum/read-1-16014.html Jetzt schwankt nichts mehr.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.