PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : kombinierte PWM-DACs



H.A.R.R.Y.
29.07.2009, 08:54
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.

021aet04
29.07.2009, 09:22
Hast du schon probiert die Frequenz herunterzusetzen? Wenn es funktionier liegt es an der Frequenz.

PS: Super Signatur. Speziell c :cheesy:

Besserwessi
29.07.2009, 18:00
Wenn man oer PWM eine sehr genaue Spannung erzeugen will, muß man die folgenden Punkte beachten:
1) Der Ausgangswiderstand ist nicht 100% Symetrisch, etwa in der Größenordung 30 Ohm. Der Ausgangswiderstand ist auch noch Temperaturabhängig: also den Ausgang nicht zu stark belasten.

2) Die Schaltzeiten H-L und L-H können etwas verschieden sein. Ähnlich die Effekte beim Einschwingen und ggf, eine Ladungsinjektion. Wichtig wird das vor allem wenn man einen PWM fall drin hat mit nur H oder nur L. Sonst ist der Effekt eigentlich immer gleich. Also sind bei 8 Bit PWM Werte von 0 und 256 Problematisch.

3) Groundbounce: Durch den Widerstand in der GND Leitung ist GND im Chip nicht gleich dem Externen GND. Analoges gilt für VCC. Hier kann man mit einem externen Gatter Abhilfe schaffen, denn die externen gatter brauchen oft weniger Strom, denn die sehen nur die 256 mal niedriegere PWM Frequenz.

4) Rückkopplugn auf den Quarz Takt. Es muß vermieden werden, das das PWM Signal irgendwie auch den Quarz zurückkoppelt, z.B. kapazitiv. Ein verschiebung der Periode beim umschalten um nur 50ns/250 = 200 ps wäre schon störend. Eventuell besser einen geschlossen Oszillator, statt dem Oszillator im µC.

5) Bei einem Aktiven Filter können die sehr hochfrequenten Signalanteile an den Flanken zu Fehlern führen. Also besser den Filter erst mal passiv, und erst dahinter ggf. einen OP. Auch die Entkopplungskondensatoren und EMV werden kritisch, denn HF Störungen (z.B. 60 MHz) können an einem OP im Analogteil einen DC Effekt haben.

6) Wie eigentlich immer bei gemsichen analog/digitalschaltungen ist die Masseführung nicht ganz einfach. Von daher wundert es etwas das der Tiny2313 besser funktioniert hat, denn der hat ja GND VCC gegenüber.

Eine Begrenzung beim PWM mit hoher Auflösung ist ja auch das Einschwingen des Filters. Man kann das beschleunigen, wenn man hinter dem Filter eine S&H Schaltung die syncron mit dem PWM Signal aktualisiert wird. Man bekommt so ein vielfach schnelleres Einschwingen, und könnte dann das PWM Signal z.B Aufteilen als 10 + 6 Bit, so dass bei den 6 Bit der Zustand 0% oder 100% nie vorkommt, also eigentlich 7 Bit, aber nur die mittlere Hälfte nutzen.

Es gibt mitlerweilen auch einigermaßene erschwingliche DACs, auch für 16 Bit.

H.A.R.R.Y.
30.07.2009, 09:06
@Besserwessi:
1) ja, das hatte ich schon im Kopf. Meine Schätzung war auch so in der Preislage und darauf habe ich die Teiler korrigiert (1Meg+6k8 und 3k9). Diese Teiler arbeiten dann auf 45kOhm gegen Masse. Zu hohe Last sollte das nicht sein. Um ganz sicher zu gehen, habe ich dann die Teiler etwas umgebaut, so daß jeder PWM-Kanal 3k9 gegen Masse treiben muß und daher beide Kanäle identische Lastverhältnisse finden.

2) Die Schaltzeiten konnte ich leider nicht exakt ausmessen. Der Wert Null scheint sogar noch harmlos zu sein. Der Wert 256 kommt bei mir nicht vor. Testweise habe ich den MSB-Kanal abgeschaltet (Port auf Input umgeschaltet) wenn nur die Null gegeben werden sollte. Die Sprünge treten trotzdem auf.

3) das hängt dann wohl mit 6) zusammen, wenn ich mir die unbekannte Masseführung auf dem Chip überlege. Ein Test mit 74VHC541 scheint die nächste Aktion zu sein, dafür muß ich nicht allzuviel umbauen.

4) Du hast Dir das also auch überlegt: Der MSB-Kanal muß PWM/256/256=PWM/(2^16)=OSC/256 stabil stehen. Dann bin ich da auf dem richtigen Weg.

5) Aktiv sind die nicht. Einfach dreimal 15k und drei Cs als RC-Tiepaß direkt hintereinander. Das Signal ist schon recht glatt, die Dämpfung der PWM-Frequenz liegt bei etwa 50dB bis 60dB. Der OpAmp kommt erst dahinter und arbeitet auch sehr sauber.

6) Da hätte ich den ATmega168 auch im Vorteil gesehen. Aber wahrscheinlich liegt es daran, daß der ATtiny2313 weniger komplex ist und daher bei gleicher Frequenz deutlich weniger Strom verbraucht.

Mit Einschwingverhalten des Filters meinst Du jetzt den Zeitraum vom Umschalten der PWM bis zum Einstellen des erwarteten Wertes? Der liegt bei 2,5ms bis 3ms (5tau-Wert!). Sämtliche Messungen habe ich manuell gemacht (per Terminalprogramm die PWM eingestellt und danach das Präzisions-Voltmeter abgelesen). Da sollte die Einschwingzeit lange abgelaufen sein.

Tja das mit den DACs ist so eine Sache: Bei BurrBrown/TI, AnalogDevices, Maxim und LTC habe ich so einige Kandidaten gefunden, die ersatzweise passen könnten. Aber weder Reichelt noch einer der anderen Hobbyistenversorger hat sie im Programm.

@021aet04:
Frequenz runtersetzen habe ich noch nicht getestet. Dafür müßte ich die Tiefpässe ändern. Ein Versuch scheint es wohl wert zu sein. Falls es funktioniert versuche ich dann mal ein CPLD mit 3x6-Bit PWM (eigentlich 1x4+2x6-bit PWM). Die Überlegung ist dann:
Takt gleich 20MHZ/4=5MHz, Periode=50ns*4=200ns, Unsicherheit=200ns/(2^6*2^4)=195,3125ps.
Hm, das läuft so nicht. Der MSB-Kanal muß immer die volle Präzision (2^Bitzahl) bringen. Mit hohen PWM-Frequenzen geht das schon mal nicht.

Wenn ich die Unsicherheiten in den Gatterschaltzeiten auf 5ns schätze und rückwärts rechne, dann sollte ich auf eine PWM-Frequenz kommen, mit der der kombinierte PWM-DAC immerhin den Wert sauber ausgibt:
5ns*2^16=327,68us <=> 3051,75...Hz PWM-Frequenz
5ns*256=1,28us <=> 781250Hz Oszillator-Frequenz
Okay, dann werde ich wohl mal 1MHz ausprobieren müssen. Die Einschwingzeit wird dann um ebenfalls den Faktor 20 ansteigen von etwa 3ms auf rund 60ms. Das ist zwar für die geplante Anwendung zu groß, aber zum Testen okay.

Naja, wenn es so einfach wäre, dann könnte jeder präzise DACs zum Taschengeldpreis zusammenbrauen...

H.A.R.R.Y.

H.A.R.R.Y.
20.08.2009, 07:41
Update:

Atmel hat mir freundlicherweise einen Link zu den entsprechenden IBIS-Datenfiles für den mega168 und den tiny2313 geschickt.

Demnach sind t_PHL und t_PLH unterschiedlich! Obendrein sind die Innenwiderstände und damit die Restspannungen gegen Vcc und GND auch unterschiedlich (viel ist es aber nicht).

Das alles erlaubt nicht die Verwendung gewichteter PWM-DACs um die Auflösung - bei gleichzeitig hoher PWM-Frequenz - zu erhöhen. Die Hürde ist grundsätzlich wie bereits angegeben:

Wenn ich die Unsicherheiten in den Gatterschaltzeiten auf 5ns schätze und rückwärts rechne, dann sollte ich auf eine PWM-Frequenz kommen, mit der der kombinierte PWM-DAC immerhin den Wert sauber ausgibt:
5ns*2^16=327,68us <=> 3051,75...Hz PWM-Frequenz
5ns*256=1,28us <=> 781250Hz Oszillator-Frequenz


Immerhin funktioniert die langsame PWM-Taktung mit den Einschränkungen an den oberen und unteren Bereichsenden (Vcc und GND) deutlich präziser. 16 Bit Auflösung sind wegen der unterschiedlichen - zwischen oberem Treiber (PMOS) und unterem Treiber (NMOS) - Innenwiderstände und Ein-/Ausschwingvorgänge wohl die Grenze des machbaren.

Wer auf INL und DNL Wert legt, sollte besser ein anderes Funtkionsprinzip (oder gleich ein IC) verwenden.

Gruß H.A.R.R.Y.

Felix G
20.08.2009, 08:20
Tja das mit den DACs ist so eine Sache: Bei BurrBrown/TI, AnalogDevices, Maxim und LTC habe ich so einige Kandidaten gefunden, die ersatzweise passen könnten. Aber weder Reichelt noch einer der anderen Hobbyistenversorger hat sie im Programm.In solchen Fällen lohnt es sich meist bei www.hbe-shop.de zu schauen, die haben Vieles was es bei Reichelt & Co. nicht gibt.

Willa
20.08.2009, 11:22
Sorry, Offtopic...:
@Felix: Wie kommen denn die Preise bei HBE zu Stande...?

8BIT 32K FLASH MCU,DIP40 Typ: ATMEGA32-16PU ArtikelNr. 1661729
nur 80,17 €


14BIT ADC,SMD,5500,HTQFP64 Typ:ADS5500IPAPG4 ArtikelNr. 1528501
nur 10.991,45 €

... das sind Stückpreise...?!?

Besserwessi
20.08.2009, 20:10
Eine andere Quelle für etwas ausgefallenere ICs ist TME.eu.
Ich habe aber noch nicht nach einem Ähnlichen AD gesucht.


Die Unsicherheit im Takt sollte gar nicht so groß sein. Die 5 ns wäre wohl nur richtig für den internen RC Takt, oder wenn das PWM Signal hinter dem Vergleicher nicht noch einmal mit dem takt syncronisiert wird. Die 100ps sind sonst gar nicht so unrealistisch für Taktjitter. Ein niedriegere Takt sollte da auch nicht so viel helfen, denn beim hohen Takt wird ja auch über mehrere Schaltvorgänge gemittelt. Wegen der im Vergleich zur PWM Frequenz eher niedriegen Grenzfrequenz des Filters wird ja sogar über ziehmlich viele Perioden gemittelt. Beim Takt sollte man aber schon etwas aufpassen, das der Quarzoszillotor nicht von einem anderen Signal gestört wird.
Wenn intern keine syncronisation des PWM Signals mit dem Takt mehr stattfindet, wäre eine externe Sycronisation (z.B. ein D Flipfop wie 74AHC74) sinnvoll. Dann hätte man auch gleich seperate Masse und VCC anschlüsse an einem IC mit wenig Stromverbrauch.

Die unterschiedlichen Zeiten für den Übergang H->L und L->H sind für das PWM Singal eigentlich kein Problem, denn die Flanken treten ja immer Paarweise auf. Der Unterschiedliche Widerstand ist nur ein Problem bei einer direkten Kopplung, ohne Puferverstärker.

H.A.R.R.Y.
21.08.2009, 07:37
Die unterschiedlichen Zeiten für den Übergang H->L und L->H sind für das PWM Singal eigentlich kein Problem, denn die Flanken treten ja immer Paarweise auf.

Nun, eine Differenz in der Zeitdauer L->H- bzw. H->L-Flanke spielt sehr wohl eine Rolle - beim MSB-Zweig. Zwischen zwei gleichen Flanken (z.B. L->H) wird sich höchstens der Jitter bemerkbar machen. Für PWM-DACs sind aber die H- und L-Zeiten bzw. das Verhältnis daraus essentiell. Differenzen von etwa 5ns entsprechen bei einer PWM-Periode von 12.8µs bereits 1/2560 MSB-Bitstufe. Für volle 16-Bit darf es aber höchstens 1/65536 MSB-Bitstufe sein. Dazu kommen noch die eigentlichen Anstiege und Abfälle auf den Flanken samt den Ein- und Ausschwingvorgängen.

Wie schon angedeutet, habe ich versuchsweise die Oszillatorfrequenz (und damit die PWM-Frequenz) auf 1MHz und 0.5MHz heruntergesetzt. Die RC-Tiefpässe entsprechend umdimensioniert. Die Meßergebnisse sagen mir ganz klar, daß die erreichte Genauigkeit nun deutlich näher am ideal liegt als bei 20MHz.

Sicherlich gibt es bei der hohen Frequenz noch den ein oder anderen Verkopplungseffekt (oder er ist da stärker), aber ich bin mir sicher, daß die Schaltzeiten (incl. der wichtigen Differenz) sich nicht nennenswert geändert haben.

Simuliert habe ich die Verhältnisse auch noch (PWL-Signal mit den Daten aus den Atmel-IBIS-Files) und diese Ergebnisse bestätigen meine Abschätzungen und Messungen.

Also Quintessenz:
Für gewichtete PWM-DACs zur Erhöhung der Auflösung ist die PWM-Frequenz nicht beliebig hoch. Das Schaltverhalten der PWM-Ausgänge bestimmt diese.

Der Vorschlag die PWM-Signale mittels FFs nochmals zu synchronisieren oder mittels einzelner Gatter zu puffern bringt nichts. Diese Bausteine haben grundsätzlich alle auch das Problem mit den asymmetrischen Flanken (Differenz der Rise- und Fall-Time). Zumindest für meine Anwendung konnte ich nichts finden, was mir eine Differenz von höchstens 200ps garantieren kann. Die liegen alle deutlich darüber.

H.A.R.R.Y.