DAC bei welchem Sample beginnen

OP #8044491
Lesenswert?

Hallo,

ich habe eine Frage zum DAC, genauer gesagt zu einem 12-Bit-DAC.

Ich habe meine Sinus so aufgebaut, dass das erste Sample bei 2048 beginnt. Das ist bewusst so gewählt, weil 2048 ungefähr der Mittelwert eines 12-Bit-DACs ist.

Ein idealer Sinus ist bipolar, also im Bereich -1 bis +1. Der DAC kann aber nur positive Ausgangswerte ausgeben, also bei 12 Bit nur Wert von 0 bis 4095, entsprechend ungefähr 0 bis 3.3 V. Deshalb verschiebe ich den Sinus nach oben.

Dadurch liegt der Sinus um ca. 1.65 V Mittelwert und kann symmetrisch nach oben und unten schwingen, ohne abgeschnitten zu werden.

Ein Kollege meinte, der DAC sollte mit dem ersten Sample bei 0 beginnen. Meiner Ansicht nach ist das nicht zwingend richtig. Wenn der Sinus ohne Offset erzeugt wird, würde die negative Halbwelle abgeschnitten werden, weil der DAC keine negativen Spannungen ausgeben kann.

Der DAC braucht also für einen sauberen Sinus einen Offset auf etwa die halbe Referenzspannung, solange kein bipolarer Ausgang oder keine nachfolgende AC-Kopplung verwendet wird. Wie ist eure Meinung dazu, liege ich falsch und könnte ihr mir erklären, warum?

Danke.

Gruß Robert

: Bearbeitet durch User
#8044506
Lesenswert?

Na ja, selbst wenn er bei 270° (1½·π) begänne, dann hätte der Sinus einen Wert von -1 welcher noch mit 2047 multipliziert werden müsste. Nur mit Offset 2048 bleibt die volle Schwingung im Rahmen der Möglichkeiten.

Kleines Achtung vielleicht noch: Z.B. bei STM32F4 kann, wenn der Ausgangsbuffer eingeschaltet ist, nicht die volle Höhe von 0…4095 genutzt werden. Zumindest /unten/ ist ein kleiner nicht nutzbarer Bereich vorhanden.

#8044537
Lesenswert?

Robert B. schrieb:

bis 4095, entsprechend ungefähr 0 bis 3.3 V. Deshalb verschiebe ich den Sinus nach oben.

Dadurch liegt der Sinus um ca. 1.65 V Mittelwert und kann symmetrisch nach oben und unten schwingen, ohne abgeschnitten zu werden.

Alles richtig.

Ein Kollege meinte, der DAC sollte mit dem ersten Sample bei 0 beginnen.

Ja, Null in bezug auf den Sinus. ABer nicht den unipolaren DAC.

Meiner Ansicht nach ist das nicht zwingend richtig. Wenn der Sinus ohne

Ist es auch nicht.

Der DAC braucht also für einen sauberen Sinus einen Offset auf etwa die halbe Referenzspannung, solange kein bipolarer Ausgang oder keine nachfolgende AC-Kopplung verwendet wird.

Korrekt. Macht jeder Funktionsgenerator so.

#8044556
Lesenswert?

Robert B. schrieb:

Ein Kollege meinte, der DAC sollte mit dem ersten Sample bei 0 beginnen.

Falls du keinen harten Sprung im Signal haben möchtest, lass ihn mit dem Wert anfangen, bei dem er vorher aufgehört hat.

Was ist dein eigentliches Problem, d.h. welche Kriterien gibt es von deiner Seite, um die eine oder andere Phasenlage für den Start des Sinus zu bevorzugen? Für ein sanftes Einschalten, benutzt du besser eine geeignete Hüllkurve, die die Amplitude allmählich hochfährt, also die Amplitude des Sinus nicht mit einem Rechtecksprung ändert.

: Bearbeitet durch User
#8044585
Lesenswert?

Robert B. schrieb:

Mein eigentliches Kriterium ist nicht, eine bestimmte Phasenlage schöner zu finden, sondern ein sauberes und reproduzierbares DAC-Signal zu erzeugen.

Der DAC macht im Rahmen sein Möglichkeiten, das was du ihm sagst, auch reproduzierbar. Bei einem Einschaltsprung ist ein Sinus, spektral betrachtet, nie sauber. Es kommt also darauf an, was du damit anstellen willst. Wie sieht dein Schaltplan aus, insbesondere das Rekonstruktionsfilter?

: Bearbeitet durch User
#8044661
Lesenswert?

Robert B. schrieb:

Ich habe meine Sinus so aufgebaut, dass das erste Sample bei 2048 beginnt. Das ist bewusst so gewählt, weil 2048 ungefähr der Mittelwert eines 12-Bit-DACs ist.

Das ist dann vermutlich bei Deinem DAC (den wir nicht kennen) so, aber nicht unbedingt bei allen. Es gibt auch vorzeichenbehaftete DACs, die am Ende aber nicht mehr machen, als das MSB zu invertieren und einen bipolaren Ausgang besitzen.

Natürlich muss sich die 0-Linie Deines Signals am Ende in der Mitte des Wertebereichs des DACs befinden und Deine Elektronik muss das ausgegebene Signal für diesen Wert auf 0V bringen. Und dann kann der Sinus bei 0° mit 0V beginnen.

Wenn Du für Deinen DAC das MSB schon in den Samples invertieren musst, dann kannst Du das machen und da ist auch nichts falsch dran.

Wollt Ihr nur Bursts erzeugen? Sonst wäre es tatsächlich auch egal, wo der Sinus beginnt.

Gruß Jobst

Moderator (Firma: Titel) Persönliche Seite #8044693
Lesenswert?

Robert B. schrieb:

ein sauberes und reproduzierbares DAC-Signal zu erzeugen.

Definiere "sauber und reproduzierbar". Dann hast du die Antwort auf deine Frage.

Eine für mich plausible Möglichkeit wäre zB auch, mit der Amplitude 0 zu beginnen und dann die Amplitude über mehrere Vollwellen auf 100% hochzufahren (Stichwort: Hüllkurve).

(Firma: 1984now) #8044771
Lesenswert?

Lothar M. schrieb:

Robert B. schrieb:

ein sauberes und reproduzierbares DAC-Signal zu erzeugen.

Definiere "sauber und reproduzierbar". Dann hast du die Antwort auf deine Frage.

Eine für mich plausible Möglichkeit wäre zB auch, mit der Amplitude 0 zu beginnen und dann die Amplitude über mehrere Vollwellen auf 100% hochzufahren (Stichwort: Hüllkurve).

Also das finde ich überhaupt nicht plausibel, weil das Hauptproblem (der DC-Offset) dadurch nicht behandelt wird.

Die richtige Lösung ist, diesen Offset von vornherein auf den Ausgang zu geben, notfalls mittels Hardware. Wenn man dann den Sinus bei 0° beginnen läßt, sieht das schon recht gut aus, weil er dann effektiv ja eben bei exakt dem Wert des Offsets beginnt.

Aber natürlich entsteht trotzdem noch ein Sprung, denn in der Vergangenheit gab es diesen Sinus ja nicht. Erst wenn dieser Sprung stört, dann kommt dein Vorschlag zum Zuge. Das Blöde bei dieser Sache ist halt nur: Um den Sprung vollständig zu eleminieren, müsste das "Einblenden" leider unendlich lange dauern. Das ist natürlich in der Praxis nicht sinnvoll umsetzbar, ein Kompromiß zwischen sinnvollem und mathematisch wünschenswertem ist also, wie so oft in der Signalverarbeitung, unausweichlich nötig.

OP #8048399
Lesenswert?

Hallo zusammen,

ich habe aktuell ein Anliegen bezüglich meines Sinussignals.

Der Sinus startet inzwischen bei 0, da ich die Phasenlage angepasst habe. Allerdings entsteht beim Start des Signals noch ein kurzer sichtbarer Sprung bzw. Impuls, bevor das eigentliche Signal sauber läuft. Das Problem tritt hauptsächlich bei der höheren Frequenz auf, teilweise aber auch bei der niedrigeren Frequenz.

Die Ursache wurde bereits Schritt für Schritt untersucht und verschiedene mögliche Fehlerquellen konnten ausgeschlossen werden.

Bisherige Maßnahmen:

  • Das PWM-Signal wurde überprüft. Dabei wurde festgestellt, dass trotz deaktiviertem Zustand noch kurze unerwünschte Impulse erzeugt wurden. Dieser Fehler wurde inzwischen behoben.

  • Die Start- und Stop-Reihenfolge des Signals wurde überarbeitet, damit beim Ein- und Ausschalten keine undefinierten Zustände entstehen.

  • Es wurde geprüft, ob der externe Verstärker bzw. das Enable-Signal die Ursache ist. Das konnte ausgeschlossen werden, da der Sprung auch ohne aktivierten Verstärker weiterhin vorhanden war.

  • Anschließend wurde getestet, ob der Fehler direkt durch den eigentlichen Startmechanismus entsteht. Dafür wurde testweise ein Signal verwendet, das nur aus Nullen besteht. In diesem Fall trat der Sprung praktisch nicht mehr auf.

Dadurch konnte die Ursache weiter eingegrenzt werden:

Der Sprung entsteht sehr wahrscheinlich durch die erste schnelle Amplitudenänderung des eigentlichen Sinussignals beim Start des Bursts.

Danach wurde testweise ein weicherer Signalstart verwendet. Damit wurde der Sprung deutlich kleiner. Allerdings wurde dadurch das eigentliche Sinussignal dauerhaft verzerrt, weshalb diese Lösung nicht verwendet werden kann.

Außerdem wurde eine Fade-In-Lösung getestet, bei der zuerst ein weicher Start und danach das normale Signal ausgegeben wird. Diese Lösung hat jedoch neue Störungen erzeugt und wurde deshalb wieder verworfen.

Aktueller Stand:

  • Das System läuft stabil.
  • Die unerwünschten PWM-Impulse wurden behoben.
  • Das Timing-Verhalten bleibt korrekt.
  • Der ursprüngliche Sprung wurde bereits reduziert.
  • Ein kleiner Rest-Sprung beim Start des Sinussignals ist jedoch weiterhin vorhanden.

Aktuelle Hauptvermutung:

Der verbleibende Sprung entsteht durch den sehr schnellen Übergang vom Startwert auf die ersten echten Signalwerte des Sinussignals.

Nächster geplanter Ansatz:

Eine Lösung für einen weicheren Signalstart finden, ohne dabei das eigentliche Signal dauerhaft zu verändern oder das Timing-Verhalten zu beeinflussen.

Hat vielleicht jemand eine Idee oder bereits ähnliche Erfahrungen mit so einem Verhalten gemacht?

(Firma: ;-) gibt es auch) #8048419
Lesenswert?

Schau, welchen Spannungswert dein DAC hat, nachdem er quasi initalisiert wurde (Wenn seine Betriebsspannung anliegt und er noch keine Digitalwerte empfangen hat). Dann suchst du den Digitalwert, den du benötigst um damit im “normalen” Zustand einen entsprechenden Spannungswert abzubilden. Dann startest du deine Ausgabe, wenn dein Sinus diesen Wert erreicht hat. Das sollte klappen.

Viele Grüsse Ove

#8048436
Lesenswert?

Robert B. schrieb:

Bisherige Maßnahmen:

  • Das PWM-Signal wurde überprüft.

Wo kommt das denn plötzlich her? Und was hat PWM mit einem DAC zu tun?

Robert B. schrieb:

Der Sinus startet inzwischen bei 0, da ich die Phasenlage angepasst habe.

Robert B. schrieb:

Der Sprung entsteht sehr wahrscheinlich durch die erste schnelle Amplitudenänderung des eigentlichen Sinussignals

Das ist doch in der genannten Kombination Unsinn!

Wenn das Signal bei -cos(0) anfängt dann entspricht es per Definition einer 0 am DAC. Des weiteren zeigt die erste Ableitung an dieser Stelle keinerlei Änderung what-so-ever. Und schon gar keine schnelle Amplitudenänderung.

1
set xtics pi/3
2
set ytics 64
3
set yrange [0:4096]
4
set grid
5
plot [0:2*pi] -cos(x)*2047+2047 w l lw 2
Angehängte Dateien:
: Bearbeitet durch User
OP #8048563
Lesenswert?

Ove M. schrieb:

Schau, welchen Spannungswert dein DAC hat, nachdem er quasi initalisiert wurde (Wenn seine Betriebsspannung anliegt und er noch keine Digitalwerte empfangen hat). Dann suchst du den Digitalwert, den du benötigst um damit im “normalen” Zustand einen entsprechenden Spannungswert abzubilden. Dann startest du deine Ausgabe, wenn dein Sinus diesen Wert erreicht hat. Das sollte klappen.

Viele Grüsse Ove

Meinst du im Prinzip:

  • DAC-Idle-Spannung messen/kennen
  • passenden DAC-Code dazu bestimmen
  • Sinus-LUT nicht zwingend bei Index 0 starten
  • Sondern bei dem LUT-Punkt starten, der ungefähr zur Idle-Spannung passt?
OP #8048570
Lesenswert?

Norbert schrieb:

Wenn das Signal bei -cos(0) anfängt dann entspricht es per Definition einer 0 am DAC. Des weiteren zeigt die erste Ableitung an dieser Stelle keinerlei Änderung what-so-ever. Und schon gar keine schnelle Amplitudenänderung.

1
> set xtics pi/3
2
> set ytics 64
3
> set yrange [0:4096]
4
> set grid
5
> plot [0:2*pi] -cos(x)*2047+2047 w l lw 2
6
>

Wenn der DAC an einem Punkt startet, an dem die Kurve flach ist, dann sollte mit deinem vorgeschlagenem Ansatz der Startsprung kleiner werden, richtig?

Kurz gesagt, verstehe ich deine Aussage als:

  • Nicht nur Startwert wichtig, sondern auch Steigung am Startpunkt möglichst 0.
  • Und damit diese flache Stelle digital erhalten bleibt, muss die LUT feiner aufgelöst werden.
#8048661
Lesenswert?

Robert B. schrieb:

Kurz gesagt, verstehe ich deine Aussage als:

  • Nicht nur Startwert wichtig, sondern auch Steigung am Startpunkt möglichst 0.
  • Und damit diese flache Stelle digital erhalten bleibt, muss die LUT feiner aufgelöst werden.

Wenn die Außenbeschaltung derart gestaltet ist, dass der Ruhewert bei DAC 0, also 0 Volt liegt, dann ja. Dann gibt es nur genau diese eine Methode. Wichtig: Nach Ausgabe eines -cos(x) Kurvenzugs muss natürlich der letzte Wert wieder bei 0 liegen. Anders ausgedrückt, nur ganzzahlige Vielfache einer -cos(x) Wellenform ausgeben.

Wenn die Außenbeschaltung derart gestaltet ist, dass der Ruhewert bei DAC 2047 (oder 2048), also 1/2 Vref liegt und kapazitiv abgekoppelt ist, dann darf man problemlos getrost einen Sinus ab 0 Grad ausgeben. Also sin(x)*2047+2047. Hier spielt die Steigung, welche am Nullpunkt sogar maximal ist, dann keine Rolle. Aber auch hier dürfen dann nur ganzzahlige Vielfache einer sin(x) Wellenform ausgeben werden um zum Ende wieder bei DAC 2047 zu liegen.

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