Forum: Mikrocontroller und Digitale Elektronik DAC bei welchem Sample beginnen


von Robert B. (robertoneu_95)


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
von Norbert (der_norbert)


Lesenswert?

Robert B. schrieb:
> Ein Kollege meinte, der DAC sollte mit dem ersten Sample bei 0 beginnen.

Das wäre nur richtig, wenn man einen Cosinus beginnend ab 180° (1·π) 
ausgäbe.

Aber mal ernsthaft, da dein DAC keine negative Spannung ausgeben kann, 
ist deine Angabe zum Offset bei 1/2 max.LSB richtig.
von Sebastian R. (sebastian_r569)


Lesenswert?

Wenn du deinem DAC keine negativen Werte vorgeben kannst, hast du doch 
keine andere Wahl, als 0 als Tiefst- und 4095 als Höchstwert zu nehmen 
und die negative Welle in den positiven Bereich zu schieben...

Oder geht es darum, bei welchem Phasenwinkel der Sinus starten soll?
von Norbert (der_norbert)


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.
von Falk B. (falk)


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.
von Rainer W. (rawi)


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
von Cartman E. (cartmaneric)


Lesenswert?

Das ist völlig egal.

Bei einer Hammondorgel kann man sich die Phasenlage beim Spiel
ja auch nicht aussuchen. ☺

Wenn es nicht egal ist, muss man fenstern.
von Rainer W. (rawi)


Lesenswert?

Cartman E. schrieb:
> Wenn es nicht egal ist, muss man fenstern.

Eben - und zwar nicht mit einem Rechteckfenster.
von Robert B. (robertoneu_95)


Lesenswert?

Sebastian R. schrieb:
> Oder geht es darum, bei welchem Phasenwinkel der Sinus starten soll?

Ja, genau darum geht es. Also startet der Sinus bei 0° Phasenwinkel, 
aber wegen DAC-Offset bei Mitte = ca. 1.65 V.
von Robert B. (robertoneu_95)


Lesenswert?

Rainer W. schrieb:
> 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?

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


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
von Jobst M. (jobstens-de)


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
von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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).
von Ob S. (Firma: 1984now) (observer)


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.
von Robert B. (robertoneu_95)


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?
von Ove M. (Firma: ;-) gibt es auch) (hasenstall)


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
von Norbert (der_norbert)


Angehängte Dateien:

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
: Bearbeitet durch User
von Robert B. (robertoneu_95)


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?
von Robert B. (robertoneu_95)


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.
von Norbert (der_norbert)


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.
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.