Forum: Mikrocontroller und Digitale Elektronik DDS simulieren mit LtSpice möglich?


von Ralf (Gast)


Lesenswert?

Hallo,

kann man mit LtSpice die Ausgangsspannung eines DDS-ICs simulieren? 
Mittels Sample-Hold-Block konnte ich quasi schon mal die Stufen eines 
DACs abbilden (nennt man das wertdiskret?).

Was mir da jetzt noch fehlt, ist quasi der Akkumulator bzw. das 
TuningWord eines DDS-ICs. Plan B ist, dass ich eine kleine DDS-Software 
schreibe und die Werte über eine PWL Datei in LtSpice ausgebe. Unschön, 
jedoch machbar. Aber ich kenne LtSpice nicht gut genug, um zu wissen, 
ob's auch anders geht.

Ralf

von c-hater (Gast)


Lesenswert?

Ralf schrieb:

> kann man mit LtSpice die Ausgangsspannung eines DDS-ICs simulieren?

Natürlich.

> Mittels Sample-Hold-Block konnte ich quasi schon mal die Stufen eines
> DACs abbilden (nennt man das wertdiskret?).

???

Sicher ein falscher Ansatz. Du hast überverkompliziert umgesetzt, was du 
von der Sache verstanden hast, nicht die Sache selbst...

von Ralf (Gast)


Lesenswert?

c-hater schrieb:
> Sicher ein falscher Ansatz. Du hast überverkompliziert umgesetzt, was du
> von der Sache verstanden hast, nicht die Sache selbst...
Dann lass mich an deinem Wissen teilhaben :)

Ralf

von Achim S. (Gast)


Angehängte Dateien:

Lesenswert?

Ralf schrieb:
> Mittels Sample-Hold-Block konnte ich quasi schon mal die Stufen eines
> DACs abbilden (nennt man das wertdiskret?).

Nö: der S&H macht bei dir wahrscheinlich zeitdiskrete Abtastungen, aber 
wertediskret wird dabei normalerweise nichts.

Geht es dir nur darum, einen zeit- und wertediskreten Sinus zu erzeugen 
(so wie er aus dem DAC eines DDS-ICs rauskommt)? Das ginge z.B. per S&H 
und behavioral volags source, siehe Anhang.

Oder willst du ein reales DDS-IC simulieren? Dann brauchst du dessen 
Modell (und keinen Sample&Hold)

Oder willst du ein Modell eines DDS-IC nachbauen, um dessen 
Funktionsweise zu illustrieren? Dazu wäre wiederum kein S&H nötig (der 
kommt im DDS-IC auch nicht vor).

von Ralf (Gast)


Lesenswert?

Hallo Achim,

danke für deine Antwort.

> Nö: der S&H macht bei dir wahrscheinlich zeitdiskrete Abtastungen, aber
> wertediskret wird dabei normalerweise nichts.
Okay, dann hab ich die Begrifflichkeiten wohl durcheinander gewirbelt. 
Das muss ich mir anschauen.

> Geht es dir nur darum, einen zeit- und wertediskreten Sinus zu erzeugen
> (so wie er aus dem DAC eines DDS-ICs rauskommt)?
Genau, der Spannungsverlauf, wie er aus einem DDS-IC rauskommt würde 
schon reichen. Im ersten Schritt reicht auch Sinus, später beliebige 
Signalformen. Mittels Sample-Hold bekomme ich wie bereits erwähnt schon 
mal den "Treppen"-Sinus, nur eben gleichmäßig. Und das ist ja bei DDS 
nicht der Fall, weil ja innerhalb der LUT quasi gesprungen wird, und das 
würde ich gern in LtSpice abbilden.

> Oder willst du ein reales DDS-IC simulieren? Dann brauchst du dessen
> Modell (und keinen Sample&Hold)
> Oder willst du ein Modell eines DDS-IC nachbauen, um dessen
> Funktionsweise zu illustrieren? Dazu wäre wiederum kein S&H nötig (der
> kommt im DDS-IC auch nicht vor).
Nein, für die Illustration der Funktionsweise würde m.E. schon das 
"übliche" Blockschaltbild reichen.

> Das ginge z.B. per S&H und behavioral volags source, siehe Anhang.
Aaah, das sieht doch gut aus - das entspricht bereits meiner 
LtSpice-Schaltung, ich habe für B1 momentan
1
V=int(V(vs0))
wobei vs0 die S&H-Ausgangsspannung ist.
Soweit war ich also wohl gar nicht weg von der Lösung, nur musste ich 
mit einer Eingangsspanung im dreistelligen Bereich arbeiten XD Also 
schon mal vielen Dank hierfür.

Zweieinhalb Fragen habe ich dazu:
1) Die Auflösung des "DACs" stellt man in deiner Variante
1
V=round(V(Zeitdiskret)/50m)*50m
über "50m" ein, habe ich das richtig verstanden? Wenn ich also 
beispielsweise einen 10-Bit DAC simulieren möchte, dann wäre es teilen 
bzw. multiplizieren mit 1024?
2) Das Ausgangssignal von B1 sieht auf deinem Bild "gleichmäßig" aus. 
Der Verlauf ist zwar nicht für jede Periode identisch, aber die 
"Treppen" sind bei jeder zweiten Halbwelle identisch. Das ist dem 
Umstand geschuldet, dass sich die 800kHz des Eingangssignals exakt durch 
die Samplefrequenz teilen lassen, ist das korrekt?
2,5) Ich habe bei meiner Suche nach dem korrekten Ansatz für LtSpice 
gesehen, dass nahezu alle Schaltungen für die Samplefrequenz ein 
unsymmetrisches Signal verwenden. Du verwendest 1% DutyCycle. Gibt es 
hierfür einen speziellen Grund? Soweit ich S&H verstanden habe, ist der 
Clock-Eingang flankengesteuert, während der S/H-Eingang pegelgesteuert 
ist - hier würde ich einen möglichst kleinen DutyCycle für diese 
Anwendung verstehen.

Ralf

von Achim S. (Gast)


Lesenswert?

Ralf schrieb:
> 1) Die Auflösung des "DACs" stellt man in deiner
> VarianteV=round(V(Zeitdiskret)/50m)*50müber "50m" ein, habe ich das
> richtig verstanden?

Ja

Ralf schrieb:
> Wenn ich also
> beispielsweise einen 10-Bit DAC simulieren möchte, dann wäre es teilen
> bzw. multiplizieren mit 1024?

Nein: du musst durch die Größe des Quantisierungsintervals teilen. Wenn 
dein 10 Bit DAC einen Spannungsbereich von 2V hat, dann musst du durch 
(2V/1024)=1,95mV teilen.

Ralf schrieb:
> 2) Das Ausgangssignal von B1 sieht auf deinem Bild "gleichmäßig" aus.

Meinst du gleichmäßig bezogen auf die Zeitpunkte? Oder auf die 
Spannungswerte? Das sind halt die Werte, die bei 800kHz Sinus und 10MHz 
Abtastung rauskommen.

Ralf schrieb:
> Du verwendest 1% DutyCycle. Gibt es
> hierfür einen speziellen Grund?

Eher 10% als 1%. Aber der Grund ist einfach, dass ich auf diese Weise 
die Abtastperiode (in dem Fall 100ns) problemlos größer oder kleiner 
machen kann ohne dass der Puls schon länger wird als die gesamte 
Periodendauer.

von Achim S. (Gast)


Lesenswert?

Ralf schrieb:
> Das ist dem
> Umstand geschuldet, dass sich die 800kHz des Eingangssignals exakt durch
> die Samplefrequenz teilen lassen, ist das korrekt?

Ach, jetzt verstehe ich, was du meinst.

Die Frequenz des Sinus ist 800kHz, die Periodendauer 1250ns. Das wird 
mit 10MHz (100ns) abgetastet. 1250/100 ergibt keine ganze Zahl, aber 
nach zwei Perioden passt die Abtastrate exakt in die doppelte 
Periodendauer rein (genau 25 Samples)

von Ralf (Gast)


Lesenswert?

> Nein: du musst durch die Größe des Quantisierungsintervals teilen. Wenn
> dein 10 Bit DAC einen Spannungsbereich von 2V hat, dann musst du durch
> (2V/1024)=1,95mV teilen.
Danke, schon ausprobiert :)

> Meinst du gleichmäßig bezogen auf die Zeitpunkte? Oder auf die
> Spannungswerte? Das sind halt die Werte, die bei 800kHz Sinus und 10MHz
> Abtastung rauskommen.
Bezogen auf die Spannungswerte. Hab mit den Frequenzen gespielt, je 
höher die Eingangsfrequenz, desto mehr Varianz in den Spannungswerten 
einer Halbwelle, passt.

> Eher 10% als 1%.
Bist du sicher? Soweit ich sehen kann, sind die beiden letzten Werte 
T(on) und T(period), und das gibt bei 1n und 100n 1%.

> Aber der Grund ist einfach, dass ich auf diese Weise die Abtastperiode (in
> dem Fall 100ns) problemlos größer oder kleiner machen kann ohne dass der
> Puls schon länger wird als die gesamte Periodendauer.
Ah, jetzt verstehe ich, dann muss man nur einen Wert ändern.

Eine Frage ist doch noch aufgetaucht:
Nach allem was ich über DDS gelesen habe, soll die Anzahl der 
LUT-Einträge (mindestens) das doppelte der DAC-Auflösung betragen. Also 
bspw. bei einem 10-Bit DAC 2048 Einträge.
Spielt das bei dieser Simulation überhaupt eine Rolle? Als 
Simulationsneuling würde ich jetzt nein sagen, weil ein zeit- und 
wertkontinuierliches(*) Eingangssignal vorliegt. Oder doch nicht?

(*) Wer übrigens wie ich die Begrifflichkeiten durcheinander würfelt, 
hier ein schönes Schaubild zu zeit-/wert-kontinuierlich/-diskret:
https://www.eit.hs-karlsruhe.de/mesysto/teil-a-zeitkontinuierliche-signale-und-systeme/zeitkontinuierliche-signale/klassen-von-signalen/kontinuierliche-und-diskrete-signale.html

Ralf

von Achim S. (Gast)


Lesenswert?

Ralf schrieb:
> Bist du sicher? Soweit ich sehen kann, sind die beiden letzten Werte
> T(on) und T(period), und das gibt bei 1n und 100n 1%.

Ne bin ich nicht. Ich hab tatsächlich die Werte für t_on und t_fall 
vertauscht eingegeben.

Macht aber nix: t_fall trägt ja auch zur Pulsdauer bei. Wenn ich die 
Pulsbreite bei halber Höhe betrachte, dann ist die Pulsdauer 
1/2*(t_rise+t_fall)+t_on = 6,5 ns. Also ein Tastgrad von 6,5% ;-)

Ralf schrieb:
> Ah, jetzt verstehe ich, dann muss man nur einen Wert ändern.

richtig. Wenn du das ernsthaft einsetzen willst, kannst du die Angabe 
auch parametrisieren. Also z.B. t_on auf {TP/2} und T_Period auf {TP} 
setzen und dann mit einem .param tp=... auf den gewünschten Wert setzen.

Ralf schrieb:
> Spielt das bei dieser Simulation überhaupt eine Rolle?

Ist für eine echte DDS sinnvoll, damit man die Auflösung des DAC 
überhaupt ausnutzen kann. Aber bei dieser Simu spielt es tatsächlich 
keine Rolle.

von Ralf (Gast)


Lesenswert?

> Ne bin ich nicht. Ich hab tatsächlich die Werte für t_on und t_fall
> vertauscht eingegeben.
Dann freut's mich, dass ich drauf aufmerksam machen konnte und somit 
wenigstens ein kleines bisschen von deiner großen Hilfe erwidern konnte 
:)

> Wenn du das ernsthaft einsetzen willst, kannst du die Angabe auch
> parametrisieren.
Das hatte ich schon so gemacht, passt. Deswegen ist mir dann auch die 
Frage nach dem Tastgrad aufgekommen.

> Ist für eine echte DDS sinnvoll, damit man die Auflösung des DAC
> überhaupt ausnutzen kann. Aber bei dieser Simu spielt es tatsächlich
> keine Rolle.
Okay. Dann kann ich jetzt mal ein bisschen Richtung 
Rekonstruktionsfilter gehen. Das mit den behavioral sources ist nun auch 
noch ein bisschen klarer geworden, vielleicht werde ich es mal 
versuchen, auf diese Weise andere Signalformen zu generieren (im Notfall 
doch PWL Dateien).

Nochmals vielen Dank für deine Hilfe, das hat mir sehr geholfen.

Ralf

von Helmut S. (helmuts)


Angehängte Dateien:

Lesenswert?

Hier mal ein Beispiel für eine DDS-Simulation basierend auf einem 
älteren Beispiel aus der LTspice-Yahoo-Group.

Richtige Schreibweise: LTspice

Die aktuelle Version ist LTspiceXVII.

von Michel M. (elec-deniel)


Lesenswert?

Danke, super Simulation :-)

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.