Hallo Gemeinde,

die Idee ist die PWM-Kanäle eines µC geschickt zu kombinieren um eine höhere Auflösung zu erhalten ohne die PWM-Grundfrequenz verrignern zu müssen.

Zweimal 8-Bit PWM mit Widerständen 256:1 gewichtet aufaddiert und dann integriert (RC-Tiefpässe) sollte theoretisch einen 16-Bit-PWM-DAC ergeben. Verschiedene Simulationen mit LTspice sowie andere Betrachtungen zeigen mir, daß es funktioniert.

Leider gibt es in der Praxis ein Problem. Die Ausgangsspannung springt an den Übergängen von LSByte zu MSByte (z.B. 0x00ff => 0x0100) nicht um den errechneten Betrag sondern deutlich mehr oder weniger (bis zu 8LSBs). Die Gewichtungswiderstände und RC-Zeitkonstanten kann ich als Ursache ausschließen. Als 256:1 Gewichtung nehme ich 0,1%-Widerstände, die Zeitkonstanten der RC-Tiefpässe sind nicht wichtig, da beide Pulsströme ins gleiche Filter geleitet werden. Mittlerweile habe ich sogar noch an den Widerstandsverhältnissen gespielt um die Innenwiderständen der Porttreiber mit zu berücksichtigen. Sogar die Lastbedingungen der Ports sind identisch aufgebaut. Aber es hilft alles nichts.

Verifiziert habe ich das Phänomen mit ATmega168 @ 20MHz. Bei einem ATtiny2313 @ 20MHz ist der Fehler an den Übergängen in der Größenordnung ein LSB und damit akzeptabel. Leider ist der ATtiny2313 aber nicht für die Anwendung geeignet.

Im Internet fand ich auch schon ein paar wenige Seiten, bei denen dieser Ansatz verfolgt und umgesetzt wird. Eine einzige Quelle verrät, daß ein paar SW-Kniffe erforderlich sind um die Linearität einigermaßen hinzukriegen (Aha, da ist also etwas faul im Staate). Leider gibt es absolut nirgendwo Hinweise auf mögliche Ursachen.

Meine Vermutung ist: die Ausgangstreiber der µCs sind
  • a) zu langsam (20MHz sind nur 50ns Periodendauer). Insbesondere asymetrische Umschaltzeiten (H=>L, L=>H) produzieren einen DC-Offset der proportional der zeitlichen Differenz ist.

    b) Ein- und Ausschwingvorgänge sind asymmetrisch. Das Integral über eine gedämpfte Sinusschwingung ist nicht Null. Auch in diesem Fall erzeugen die dynamischen Vorgänge einen DC-Offset.

    c) schon im DC-Fall asymmetrisch; Innenwiderstand bzw. Treiberleistung.


Abhilfe müßte dann eine Verringerung der PWM-Frequenz bringen. Die grundsätzlichen Effekte bleiben zwar, treten in der geänderten Zeitskala aber weniger stark hervor. Dummerweise brauche ich die PWM-Grundfrequenz von 78kHz.

Hat jemand von Euch bereits solche Erfahrungen gemacht? Gibt es sonst noch Ideen? Die Datenblätter von Atmel geben über die feinen Details leider gar nichts her.

Sollte ich mal versuchen Bustreiber vom Typ '541 zwischenzuschalten um die Timings besser kontrollieren zu können? (irgendwo liegt noch ein 74VHC541 rum...)

Ich bin jetzt wirklich etwas ratlos. Plan x wäre ein CPLD zu nehmen und die entsprechenden PWM-Generatoren dortrein zu packen (z.B. 3x6Bit oder 4x4Bit mit 16Bit-Datenwort)...

H.A.R.R.Y.