Forum: Analoge Elektronik und Schaltungstechnik DAC macht seltsame Stufen.


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Gustl B. (-gb-)


Angehängte Dateien:

Lesenswert?

Hallo, ich habe eine Hardware gebaut um etwas mit einem schnellen DAC zu 
spielen. Der DAC ist ein AD9747 
https://www.analog.com/media/en/technical-documentation/data-sheets/AD9743_9745_9746_9747.pdf 
also 16 Bit und maximal 250 MHz. Der hängt an einem FPGA und wird mit 
Daten beliefert. Am Ausgang hängt jeweils ein THS3215.
Den Takt bekommt der DAC schön aus einem Taktteiler, einem AD9508 
https://www.analog.com/media/en/technical-documentation/data-sheets/AD9508.pdf 
. Der DAC liefert dann selber einen Takt DCO an den FPGA und mit diesem 
Takt werden Samplewerte aus einer großen Sinustabelle herausgetaktet.

Das ist also eine große Tabelle mit 1024 16 Bit Werten und einem Index. 
Bei jedem Takt wird der Index 1 hochgezählt und der Tabelleneintrag von 
diesem Index an den Ausgang und somit den DAC angelegt.
Ich verwende Unsigned Werte und habe das über SPI auch so im DAC 
eingestellt. Ich sehe am Oszi auch den Sinus, Frequenz passt, Amplitude 
ist gut, wenn ich die Spannung je Kästchen klein genug wähle und die 
Zeit passend einstelle kann ich sogar die einzelnen Stufen sehen. Über 
den PATHSELECT Eingang am THS3215 kann ich einstellen ob das Signal 
durch einen externen Tiefpassfilter gehen soll oder nicht und auch das 
funktioniert, mit Filter sind die LSB Stufen fast nichtmehr erkennbar.

So, was ist das Problem?
Weil alle Werte in der Tabelle schön nacheinander durchlaufen werden 
sollte das auch ein schöner Sinus sein. Klar mit Stufen, aber eben ohne 
Sprünge. In der Simulation ist das auch so, aber in der Realität leider 
nicht. Im Bild ist schön zu sehen, dass da manche Werte nicht passen. 
Ich habe schon lange gesucht aber keinen Fehler gefunden.
Wenn ich einen konstanten Wert anlege ist das Signal frei von Stufen. 
Wenn ich den Takt langsamer mache im AD9508 bleiben die Stufen, werden 
aber eben auch länger. Daraus folgere ich, dass es kein Timingproblem 
ist. Ich habe auch schon überprüft ob ich irgendwelche Bits verwechselt 
habe, also falsch am FPGA angeschlossen habe, aber das passt alles.
Habt Ideen was das sein könnte?

Vielen Dank!

von ysfg (Gast)


Lesenswert?

Hallo Gustl,

könntest Du bitte noch den Schaltplan bzw. den relevanten 
Schaltplanausschnitt posten?

Danke.

von Gustl B. (-gb-)


Angehängte Dateien:

Lesenswert?

Klar, ist im Anhang.

von ysfg (Gast)


Lesenswert?

Treten diese Sprünge an allen vier OUTs (single) des DAC ebenfalls auf?
Ist der Fehler auch im Differenzsignal pro OUT-Pärchen messbar?

von Dergute W. (derguteweka)


Lesenswert?

Moin,

Vielleicht hilfts zur Fehlersuche, wenn du in die Tabelle mal keinen 
Sinus, sondern einen Saegezahn reinbaust. Dann sollten evtl. 
Bitfehler/tauscher regelmaessiger im Ausgang erscheinen.

Gruss
WK

von Achim S. (Gast)


Lesenswert?

Gustl B. schrieb:
> Wenn ich den Takt langsamer mache im AD9508 bleiben die Stufen, werden
> aber eben auch länger. Daraus folgere ich, dass es kein Timingproblem
> ist.

In welchen Bereich läuft denn die Taktung bei deiner Scope-Aufnahme. 
Sind es die 25MHz der Stufung? Oder deckt bei dieser Messung eine Stufe 
gleich mehrere Takte ab?

Wenn es wirklich die 25MHz sind, dann könnte ich mir bei deiner 
Betriebsart (DCO des DAC taktet FPGA) tatsächlich keine Setup-Hold 
Probleme erklären.

Hast du im FPGA verschiedene Taktdomänen? Sind die Übergänge sauber 
synchronisiert? Gab es diesbezüglich keine Timingwarnungen (und auch 
keine in der Art wie "ungünstiger CLK-Eingang gewählt")?

Kann es vielleicht Signalintegritätsprobleme bezüglich DCO geben? Ändern 
sich die Sprünge, wenn du DCO am FPGA-Eingang mit einem passiven 
Oszi-Tastkopf belastest (~20pF)?

von Gustl B. (-gb-)


Lesenswert?

An den einzelnen Ausgängen ist der Spannungshub echt klein laut Oszi, 
ja, die Sprünge sind da, gehen aber fast im Rauschen unter.

ysfg schrieb:
> Ist der Fehler auch im Differenzsignal pro OUT-Pärchen messbar?
Was meinst Du damit? Ich habe leider keinen Differenztastkopf.

Aber es gibt noch ein seltsames Verhalten.
Ich verwende den DAC im Singe-Port Mode. Der ist im Datenblatt 
https://www.analog.com/media/en/technical-documentation/data-sheets/AD9743_9745_9746_9747.pdf 
auf Seite 25 rechts beschrieben.
Jetzt lege ich das Signal IQSEL im FPGA fest auf eine '1' oder '0'. Aber 
ich beobachte, dass ich den Sinus auf beiden Ausgängen gleichzeitig 
sehen kann. Und zwar auch mit voller Amplitude, also nicht nur irgendwie 
eingekoppelt. So wie ich das verstehe dürfte der aber jeweils nur auf 
einem der Ausgänge zu sehen sein wenn ich IQSEL statisch mit '1' oder 
'0' belege.

von Gustl B. (-gb-)


Angehängte Dateien:

Lesenswert?

Achim S. schrieb:
> Wenn es wirklich die 25MHz sind, dann könnte ich mir bei deiner
> Betriebsart (DCO des DAC taktet FPGA) tatsächlich keine Setup-Hold
> Probleme erklären.

Moin!
Also ich habe extern einen echt genauen 250 MHz Oszillator, der geht an 
den Taktteiler und daraus geht es dann an den DAC. Im Bildchen hatte ich 
das so geteilt, dass da 25 MHz zum DAC gingen. Aber die Stufenfehler 
sind bei jeder Frequenz da.

Achim S. schrieb:
> Hast du im FPGA verschiedene Taktdomänen?
Ja, habe ich, aber an dieser Stelle ohne Übergänge. Ich nehme die 
Platine gerade in Betrieb und habe da nur die Tabelle und dann einen 
VHDL Process der mit DCO getaktet wird und die Daten ausgibt.

Achim S. schrieb:
> Kann es vielleicht Signalintegritätsprobleme bezüglich DCO geben? Ändern
> sich die Sprünge, wenn du DCO am FPGA-Eingang mit einem passiven
> Oszi-Tastkopf belastest (~20pF)?
Nein.
Im Anhang zwei Bildchen, einmal DCO und einmal das Bit0. Das ist auf der 
Platine direkt daneben geroutet (vielleicht etwas ungünstig, sehen aber 
beide OK aus).

von Helmut S. (helmuts)


Lesenswert?

Dass die Signale schön aussehen ist nur die halbe Miete.
Wie liegen die Taktflanken bezogen auf die Datenflanken. Es geht da um 
Setup und Hold Zeit.

von Martin O. (ossi-2)


Lesenswert?

Leg doch mal 22pF von einer Datenleitung nach Masse. Ändert sich dann 
was? Sind manche Datenleitungen empfindlich?

von Gustl B. (-gb-)


Lesenswert?

Die Daten ändern sich schön mittig. Aber vielleicht habe ich zumindest 
einen Fehler gefunden:
Im Single-Port Modus wechselt IQSEL dauernd zwischen high und low. 
Vielleicht darf man das einfach nicht statisch belassen.
Der Plan:
Ich liefere aus dem Taktteiler den doppelten Takt an das FPGA und 
verwende den um IQSEL zu toggeln und Daten anzulegen. Das Schöne ist 
hier auch, dass ich den Takt schön phasenverschieben kann mit dem 
Taktteiler. Das ist also phasenstarr (sagt man das so?) weil aus dem 
gleichen Oszillator aber eben frei verschiebbar. Dann brauche ich den 
DCO nicht, den kann ich nämlich nur im FPGA mit einer PLL verschieben. 
Das macht wenig Spaß, dem Taktteiler kann man einfach per SPI neue Werte 
schicken und schon ist der neue Takt da.

von Achim S. (Gast)


Lesenswert?

Helmut S. schrieb:
> Wie liegen die Taktflanken bezogen auf die Datenflanken. Es geht da um
> Setup und Hold Zeit.

Auf die hätte ich auch zuerst getippt. Aber mit seiner speziellen 
Taktkette
- DAC wird extern von AD9508 getaktet und speichert die Daten mit diesem 
Takt,
- DAC erzeugt ~2ns verzögert einen Taktausgang DCO,
- dieser DCO schaltet FPGA weiter
ist er eigentlich auf der sicheren Seite. Zumindest wenn die 
Schaltzeiten von DCO-in auf Data-Out seines FPGAs nicht in den Bereich 
>30ns kommen.


Gustl B. schrieb:
> Im Anhang zwei Bildchen, einmal DCO und einmal das Bit0. Das ist auf der
> Platine direkt daneben geroutet (vielleicht etwas ungünstig, sehen aber
> beide OK aus).

Wenn es ein Problem mit doppelten Flanken aufgrund von Reflektionen sein 
sollte, würdest du das mit dem 70MHz-Oszi ggf. nicht erkennen können 
(das FPGA ist da wesentlich schneller als dein Oszi).

Mit etwas Fantasie könnte die Störung grob alle 8 Stufen 
wahrscheinlicher werden. Schau dir vielleicht mal D3 statt D0 an ob es 
da Auffälligkeiten gibt.

Kannst du den Vorschlag von Der gute W umsetzen? Also eine lineare Rampe 
in den Kurvenspeicher setzen, die bei jedem Takt genau einen Schritt 
weiter zählt? Dann würden die einzelnen Bits sehr regelmäßig schalten 
und Fehler in der Bitfolge würden direkt ins Auge springen.

Gustl B. schrieb:
> Jetzt lege ich das Signal IQSEL im FPGA fest auf eine '1' oder '0'. Aber
> ich beobachte, dass ich den Sinus auf beiden Ausgängen gleichzeitig
> sehen kann. Und zwar auch mit voller Amplitude, also nicht nur irgendwie
> eingekoppelt. So wie ich das verstehe dürfte der aber jeweils nur auf
> einem der Ausgänge zu sehen sein wenn ich IQSEL statisch mit '1' oder
> '0' belege.

Sehe ich ebenso. Sehr seltsam.

Gustl B. schrieb:
> Im Single-Port Modus wechselt IQSEL dauernd zwischen high und low.
> Vielleicht darf man das einfach nicht statisch belassen.

Zumindest wurde in diesem AD-Forum mal behauptet, man dürfe es:
https://ez.analog.com/data_converters/high-speed_dacs/f/q-a/22877/dac-part-ad9747-unused-channel-pin-configuration

Aber die toggelnde Version mal auszprobieren ist trotzdem sinnvoll.

von Gustl B. (-gb-)


Lesenswert?

ARGH!!!!

Die Bits 7 und 10 sehen nicht gut aus. Deren Rechteck ist jeweils mit dm 
des Anderen moduliert und ja die liegen genau nebeneinander unter dem 
FPGA. Tja ... mal gucken ob das jetzt mit reflow was wird.

von Joe F. (easylife)


Lesenswert?

Du hast vermutlich auch keine Serienterminierung in den Signalen...?
Wenn dein FPGA es kann: spiele mal mit der Drive-Strength der Ports 
herum.
Weniger ist oft mehr...

von Gustl B. (-gb-)


Lesenswert?

Ne, habe ich nicht. Das sind unter 2 cm Leiterbahnlänge.

Also das Problem ist gelöst, ich habe den FPGA runtergenommen und einen 
neuen draufgesetzt. Jetzt ohne Kurzschluss drunter. Zumindest ist dieser 
Kurzschluss weg, vielleicht gibt es ja neue.

Wegen der Heißluft musste ich auch die USB-C Buchse wechseln und ... das 
Zeug ist Müll. Das ist jetzt die 3. Buchse vom gleichen Hersteller und 
alle haben krass viel Spiel und zwar so viel, dass die USB-Verbindung 
wegbricht. Aber gut, das ist die einige USB-C Buchse, die ich mit den 
Design Rules von Beta Layout verwenden konnte. Alle besseren Buchsen 
fordern kleinere Bohrungen.

von Gustl B. (-gb-)


Angehängte Dateien:

Lesenswert?

So, fertig. Jetzt funktionieren beide Kanäle des DACs getrennt wie man 
es sich wünscht. Ich teile die 250 MHz Clock durch zwei und füttere sie 
dem DAC. Das FPGA bekommt die vollen 250 MHz und gibt dem DAC dann die 
Werte. Mit der hohen Samplerate sind auch die Stufen so ziemlich 
komplett weg.

Das Gesamtprojekt (wieder nur was privat zum Spielen) werde ich die Tage 
hochladen wenn ich den ADC in den Griff bekommen habe. Der ist ziemlich 
sehr verrauscht ...

Ein weiteres Problem ist die Abwärme. Das wird zwar über USB versorgt 
und braucht keinen wirklich großen Strom, aber die Platine ist eher sehr 
klein und wird nach wenigen Minuten so warm, dass Anfassen schmerzt.

von Mani W. (e-doc)


Lesenswert?

Gustl B. schrieb:
> dass Anfassen schmerzt.

Ab 60 Grad wird es unwohl, aber nicht gefährlich...

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.