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