Unverschämt: schwankende PWM-Frequenz

Gast #19316
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.
Gast #19317
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.
Gast #19319
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.
Gast #19320
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.
Gast #19322
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.
Gast #19324
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.
Gast #19329
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.
Angehängte Dateien:

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren