Festgefahrene Codes in Proben von ADC

Ich teste derzeit einen 16-Bit-DAC und einen 18-Bit-ADC. In vielen Tests habe ich festgestellt, dass der ADC an Codes "hängen bleibt", insbesondere an den Enden des Eingangsbereichs.

Sowohl der DAC als auch der ADC arbeiten im bipolaren Modus und sind mit einer analogen Schaltung verbunden, die verstärkt/dämpft und auch einen Gleichtakt-Offset und Clipping bereitstellt, um sicherzustellen, dass das Signal zu den Differenzeingängen des ADC passt. Die Datenkonverter sind mit einem Mikrocontroller mit SPI verbunden. Die Daten werden vom Mikrocontroller an einen PC mit serieller Schnittstelle übertragen.

Ich verwende den ADC, um die Ausgabe des DAC abzutasten, um Genauigkeit und Rauschen usw. zu testen. Die resultierenden Daten sollten eine gerade Linie sein, wenn der DAC als x-Werte verwendet wird, und die entsprechenden ADC-Abtastwerte auf der Y-Achse aufgetragen.

Beachten Sie, dass der volle Skalenbereich unterschiedlich ist: Der DAC gibt Spannungen zwischen -20,48 und 20,4794 aus. Der ADC liest Spannungen zwischen -16,384 und 16,3839.

Das folgende Diagramm zeigt die Samples vom ADC, wenn der DAC von 0 bis 65535 in Schritten von 1 LSB eingestellt ist. Die Gesamtzahl der Proben beträgt 65536.

Diagramm aller Proben

Zoomt man in die Mitte des vollen Skalenbereichs (x-Span: 1000, y-Span: 5000), sieht der Plot so aus (etwas verrauscht, aber ansonsten OK):

Proben zentrieren

Wenn Sie jedoch in den unteren Teil des gesamten Skalenbereichs hineinzoomen, sind festsitzende Codes deutlich sichtbar:

Niedrigere Proben

Dasselbe gilt für die oberen Proben:

Obere Proben

Beachten Sie, dass alle drei Diagramme im gleichen Maßstab, aber in unterschiedlichen Bereichen sind.

Es ist interessant, sich ein Segment der Daten anzusehen (denken Sie daran, dass die analogen Schnittstellen einige Verstärkungs- und Offset-Fehler einführen):

Einige Proben am oberen Ende des vollen Skalenbereichs

Man kann deutlich sehen, dass der ADC hängen bleibt, obwohl die Auflösung des 18-Bit-ADC besser ist als die des 16-Bit-DAC.

Noch interessanter ist, dass der Unterschied zwischen zwei festgefahrenen Codes, wie 255648-255712 = -64 und 255712-255808 = -96, ein Vielfaches von 32 zu sein scheint. Das schließt Probleme mit der analogen Schnittstelle aus, denke ich.

Um das Problem besser darzustellen, habe ich den Unterschied zwischen einem Sample und dem nächsten Sample über den gesamten Skalenbereich grafisch dargestellt:

Festgefahrene Codes

Das Diagramm zeigt deutlich, dass hängengebliebene Codes nicht in der Mitte des Vollbereichs auftreten. In Richtung der Enden des Bereichs werden festsitzende Samples immer deutlicher.

Um das Problem zu lösen, habe ich versucht, die SPI-Kommunikation zu verlangsamen und auch mit niedrigeren Geschwindigkeiten zu sampeln. Dies machte keinen Unterschied. Ich frage mich auch, ob das Problem die Umwandlung des 18-Bit-ADC-Ausgangs von Two's Complement in Offset Binary sein könnte. Ich verwende diesen Code, um die Konvertierung durchzuführen, die ich für richtig halte:

uint32_t y = (131072 ^ Y >> 6) & 0x3FFFF; // Y is 18-bit Two's Complement

Also, was könnte dieses Problem verursachen? Ich habe auch die Spannungsreferenz, die Entkopplung und andere analoge Probleme überprüft, die das Problem verursachen könnten. Immer noch sind die feststeckenden Codes Vielfache von 32, es sieht für mich so aus, als ob das Problem eher digital als analog ist.

Jede Hilfe oder Idee ist willkommen! Vielen Dank im Voraus :-)

Der erste Punkt ist, dass Sie möglicherweise (noch) nicht wissen, ob der ADC oder der DAC schuld ist. Ich würde vorschlagen, den DAC um seine Mitte herum zu betreiben und 15 V (nahe der vollen V) hinzuzufügen, damit Sie wissen, dass der DAC gut funktioniert. verbessert sich die ADC-Leistung? Dito lassen Sie den DAC nahe der vollen Skala von -ve laufen und fügen Sie Spannung hinzu, sodass sich der ADC nahe der Mitte seines Bereichs befindet.
Danke für deine brillante Idee :-) Ich werde später mit den Ergebnissen zurückkommen.
Da die ADC-Codes schöne runde Zahlen sind, ist es wahrscheinlich, dass der ADC das Problem ist, aber es lohnt sich, sicherzugehen.
Die Verwendung eines DAC mit höherer Auflösung zur Messung von DNL und INL eines ADC ist Standardpraxis. Ganz einfach, weil es viel einfacher ist, einen DAC mit höherer Präzision herzustellen als einen ADC. Sie müssen nur sicherstellen, dass Ihr DAC in Ordnung ist. Ich stimme Brian zu, das ist wahrscheinlich der ADC.
Welchen ADC (und DAC) verwendest du? Was Sie sehen, könnte innerhalb der Spezifikationen liegen. Zum Beispiel hat ein Freescale-Chip, den ich kürzlich überprüft habe, einen 16-Bit-ADC (wie auf der ersten Seite des Datenblatts stolz angegeben wird), aber der Abschnitt mit den Spezifikationen gibt die minimale effektive Anzahl von Bits bei 11,4 an, wenn 4 Samples gemittelt werden. Das sind viel weniger als 16.
Ich habe gerade den Test gemacht, den Brian Drummond vorgeschlagen hat. Das Hinzufügen eines Offsets von +15 V und -15 V zum DAC-Ausgang erzeugt immer noch hängende Codes an den Enden des ADC-Bereichs. Ich habe auch versucht, den Offset im DAC zu subtrahieren, damit der Spannungseingang zum ADC in der Mitte des ADC-Bereichs liegt. Keine Probleme hier. Ich glaube also immer noch, dass das Problem digital ist und der DAC so funktioniert, wie er sollte.
Der DAC, den ich verwende, ist DAC8831 von Texas Instruments (16-Bit, R2R-Leiter-basiert). Der ADC ist AD7691 von Analog Devices (18-Bit, SAR). Laut Datenblatt für AD7691 fehlen keine Codes. Für mich ist es seltsam, dass die feststeckenden Codes nicht in der Mitte des Bereichs auftreten und die Codes "schöne runde Zahlen" mit etwa 32, 64, 96 LSBs dazwischen sind. Sieht so aus, als ob die letzten 4-5 Bits des 18-Bit-Wortes alle Nullen sind ... da bin ich mir nicht ganz sicher, aber immer noch seltsam. Wenn dieses Problem SPI-bedingt ist, wie kommt es dann, dass das Problem nicht über den gesamten Skalenbereich vorhanden ist?
Welches Modell ist dein DAC? Und wie hoch ist deine Schrittfrequenz?
Ich taste "gepulste" Gleichspannungen ab. Das bedeutet, dass ich für jede Messung eine Spannung an den DAC anlege, ihn für mindestens das 100-fache seiner Einschwingzeit einschwingen lasse, dann dem ADC sage, dass er konvertieren soll - und wenn die Konvertierung beendet ist, stelle ich den DAC wieder auf 0 V zurück. Ich habe mit verschiedenen Sample-Intervallen und Timings herumgespielt, von sehr langsam bis sehr schnell. Unabhängig von der Geschwindigkeit erscheinen die hängengebliebenen Codes immer noch – aber nicht in der Mitte des ADC-Vollbereichs.
Wie steuerst du den ADC-Eingang? AD7691 Datenblatt Abbildung 29 zeigt, was AD empfiehlt ... (Übrigens ist ihr 160 Ohm/2,7 nF Kompensationsnetzwerk nicht einfach ein Anti-Aliasing-Filter, es kompensiert auch den SAR-Abtast-Einschaltstrom. Viel Entwicklungsarbeit fließt in die Entwicklung und Feinabstimmung. Tuning des Evaluierungskits für einen hochauflösenden ADC wie diesen.)
DAC8831 ist eine R2R-Leiter mit ungepuffertem Spannungsausgang. Der SAR-ADC lädt während des Tracking-Intervalls ein internes Kondensatorarray auf. Sie müssen diesen DAC puffern, um diesen ADC-Typ anzutreiben!
Danke für die Kommentare, MarkU. Der Ausgang des DAC wird gepuffert, ebenso der Eingang des ADC. Ich verwende eine 4,096-V-Referenz, daher ist natürlich viel Pufferung und Verstärkung/Dämpfung erforderlich, um mir die differenziellen Vollskalenbereiche zu geben, die ich für den ADC und den DAC benötige. Laut Bild 29 im Datenblatt AD7691 soll das Eingangsfilter/Kompensationsnetzwerk mit 15 Ohm und 2,7 nF aufgebaut werden - nicht 1600 Ohm? Ich kenne diesen Filter und verwende ihn bereits in meiner Schaltung mit 15-Ohm-Widerständen. Ich kann es auch mit 1600 Ohm versuchen, aber im Datenblatt steht 15 Ohm?
Heute habe ich verschiedene Eingangsfilter ausprobiert. Bei einer langsameren Einschwingzeit (18 Bit entspricht 12,48 Zeitkonstanten) betragen die im Datenblatt vorgeschlagenen 10 Ohm/27 nF etwa 0,4 Mikrosekunden. Ich habe zwei verschiedene Filter ausprobiert, beide mit einer Einschwingzeit von etwa 10 Mikrosekunden. Der erste war 270 Ohm und 2,7 nF. Der zweite war 80 Ohm und 10 nF. Bei beiden Filtern habe ich die gleichen Messungen gemacht und das Ergebnis sind fast die gleichen "Stuck-Werte" wie bei 10 Ohm und 2,7 nF. Daraus schließe ich, dass sich dieses Problem bei unterschiedlichen Eingangsfiltern nicht ändert. Die Codes stecken also immer noch fest und ich auch :-(
Ich hatte gerade mit einem ähnlichen Problem zu tun - viel mehr hängende Codes bei den oberen 25% der Skala. Das Problem liegt im Gleichtaktbereichsparameter im Datenblatt für echte differentielle Bipolarwandler - Vcm = Vref/2 + -0,1 V. Dies bedeutet, dass ein echter bipolarer ADC mit echten bipolaren Signalen gespeist werden muss, die zentriert und symmetrisch mit entgegengesetzter Polarität um Vref/2 sind. Hoffe es hilft Kevarek

Antworten (3)

Interessant. Ich glaube, ich habe diese Anomalie noch nie zuvor gesehen.

Es ist oft praktisch, sich einen SAR-ADC so vorzustellen, als würde er die analoge Eingangsspannung zu einem bestimmten Zeitpunkt abtasten. In der Praxis gibt es ein enges Zeitfenster, in dem Änderungen der analogen Eingangsspannung – oder Rauschen auf der analogen Spannungsreferenz oder Rauschen auf GND oder anderen Stromanschlüssen des ADC – den digitalen Ausgangswert beeinflussen können.

Wenn die Eingangsspannung während dieses Fensters langsam ansteigt, sind die niederwertigen Bits des SAR-Ausgangssignals nur Einsen.

Wenn die Eingangsspannung während dieses Fensters langsam abfällt, sind die niederwertigen Bits des SAR-Ausgangssignals nur Nullen.

Einen ähnlichen Effekt kann ein sehr schmaler Rauschpuls zum „falschen“ Zeitpunkt bei der Wandlung haben.

Im Moment ist meine beste Vermutung, dass Sie eine Art analoger Schalter oder Operationsverstärker verwenden, die in der Nähe der Hoch- und Niederspannungsschienen nicht ganz so gut funktionieren (höherer Widerstand oder so etwas) wie in der Nähe der mittleren Skala, irgendwie lassen in einer der oben genannten Arten von Rauschen, was dazu führt, dass die weniger signifikanten Bits nur Einsen oder Nullen sind.

Ich habe einige Sigma-Delta-ADCs und Sigma-Delta-DACs gesehen, die eine gute Auflösung im mittleren Bereich, aber eine schlechtere Auflösung in der Nähe der Schienen haben - aber der Effekt sieht anders aus als das, was Sie zeigen.

Faszinierend ist der „Plot der Differenz zwischen einer Probe und der nächsten Probe über den gesamten Skalenbereich“.

Wenn ich Sie wäre, würde ich ein ähnliches Diagramm erstellen, bei dem der X-Wert nicht die Differenz zwischen einem Sample und dem nächsten darstellt, sondern den X-Wert zu den niederwertigsten 6 Bits des rohen ADC-Ausgangs-Samples macht. Das würde schnell zeigen, ob die "steckengebliebenen" Werte meistens viele 1s in den niedrigstwertigen Bits sind (vielleicht steigt die Eingabe langsam an?) Oder viele 0s in den niedrigstwertigen Bits (vielleicht fällt die Eingabe langsam?).

Ich taste "gepulste" Gleichspannungen ab. Das bedeutet, dass ich für jede Messung eine Spannung an den DAC anlege, ihn für mindestens das 100-fache seiner Einschwingzeit einschwingen lasse, dann dem ADC sage, dass er konvertieren soll - und wenn die Konvertierung beendet ist, stelle ich den DAC wieder auf 0 V.

Mein Verständnis ist, dass, wenn ADC-Hersteller "keine fehlenden Codes" sagen, der von ihnen verwendete Test mehrere Kondensatoren umfasst, die sich zu einer riesigen Kapazität summieren, die direkt mit dem ADC-Eingang verbunden ist, und ein System einen großen Widerstand antreibt, der mit dieser Kapazität verbunden ist, die sich sehr langsam auflädt oder entladen Sie diesen Kondensator langsam genug, dass erwartet wird, dass der ADC für mehrere Umwandlungszyklen genau "dieselbe" Spannung (innerhalb von 1/2 LSB) sieht, bevor er "die nächste" Spannung sieht (um 1 erhöht, nach oben, um 1 verringert, nach unten). ).

Wenn ich Sie wäre, würde ich sehen, ob ein solcher Test mit "kontinuierlicher Steigung" die gleichen seltsamen Symptome eines "hängengebliebenen Codes" ergibt wie der "gepulste Test". Vielleicht würde das mehr Hinweise darauf geben, welche Komponente(n) genau dieses Problem verursachen.

Bitte teilen Sie uns mit, wenn Sie jemals herausgefunden haben, was diese Symptome verursacht hat.

Überprüfen Sie als zusätzlichen Test Ihren ADC auf „fehlende Codes“ mit einer einwandfreien Quelle, einem großen Kondensator, der von einem Widerstand überbrückt wird, der direkt mit dem ADC-Eingang verbunden ist. Aufladen, auslaufen lassen. Keine Masseschleifen, kein von Netzteilen injiziertes Rauschen, niedrige Impedanz, geringes/kein Rauschen, garantiert durch Design und Einfachheit, dass alle Spannungen der Reihe nach zwischen dem Start und dem Ende des Testlaufs durchlaufen werden. Wählen Sie eine Entladungsrate, um theoretisch mehrere Zählungen bei jedem Code zu erhalten. Es ist nicht linear, aber deshalb ist es ein zusätzlicher, nicht der einzige Test.

Als ich das letzte Mal ein DAQ-System gebaut habe, das diese Art von Verhalten hatte (und es mit dem gerade vorgeschlagenen RC getestet hatte), hatte es ein Übersprechen von den digitalen Ausgängen zurück zum analogen Eingang.

Welche Technologie wird in diesen Konvertern verwendet (Typ)? Was ist die Abtastrate? Versuchen Sie, die verwendete Frequenz zu verlangsamen, um Probleme mit der ADC-Eingangsimpedanzkopplung zu beseitigen. Das Verknüpfen eines DAC mit einem ADC hat bei der Bewertung der Leistung aufgrund der zunehmenden Probleme mit Quantisierungsfehlern (auch Unterschieden) eine begrenzte Relevanz. Versuchen Sie, ein Diagramm wie das obige zu erstellen, aber erhöhen Sie den Eingang mit einer linearen Spannung, anstatt mit einem DAC-Ausgang - zum Vergleich. Denken Sie daran, dass das Rauschen von Operationsverstärkern ebenfalls stört (da Sie eine hohe Auflösung verwenden). Außerdem weist ADC „ fehlende Codes “ auf. Das Datenblatt besagt so etwas wie "... keine fehlenden Codes für n Bits ..." (wobei n < ADC-Auflösung in Bits).

Wie ich gerade oben kommentiert habe, ist der DAC der DAC8831 von Texas Instruments (R2R-Leiter) und der ADC der AD7691 von Analog Devices (SAR). Das Datenblatt gibt für alle 18 Bit "keine fehlenden Codes" an. Ich habe das Rauschen des ADC einschließlich der analogen Schnittstelle gemessen (Verbinden der analogen Eingangsschaltung, die den DAC mit Masse speist und 65536 Samples nimmt). Das RMS-Rauschen in LSBs (Standardabweichung) beträgt 2,80 und das Histogramm sieht ziemlich nach einer Standardverteilung aus. Wenn Rauschen das Problem ist, erklärt das nicht die "digitalen Schritte" zwischen hängenden Codes, wie 32, 64, 96 usw. Sehr langsames Abtasten macht keinen Unterschied