Ngspice kombinieren Plots

Ich habe folgende Schaltung. Ich versuche, einen Weg zu finden, alle Plots zu einem einzigen zu kombinieren (wie die .step-Karte von ltspice). Leider konnte ich das Beispiel aus dem Handbuch von ngspice nicht zum Laufen bringen.

Ich wäre dankbar, wenn mir jemand helfen könnte, die Logik hinter dem, was ich zu erreichen versuche, zu verstehen. Ich denke, ich muss erzwingen, dass meine Vektoren in einem einzigen Diagramm gespeichert werden, aber bei meinen Recherchen habe ich mehr als eine Möglichkeit gefunden, dies zu tun (ich kann die Logik dieser Beispiele einfach nicht verstehen, daher konnte ich sie nicht für meine Schaltung anpassen).

Ich verwende ngspice35

.TITLE AC test

.INCLUDE ../../lib/lm393.sub

x1 in 0 1 0 out lm393

c1 in 0 100n
r1 1 in 100k
c2 out 0 100n
r2 1 out 4.7k

vsup 1 0 DC 5
vin in 0 AC 1

.CONTROL
*foreach x 1n 10n 50n 100n
*    alter c1 = $x
*    ac dec 100 1 100k
*end

alter c2 = 10n
ac dec 100 1 1Meg
alter c2 = 100n
ac dec 100 1 1Meg
alter c2 = 1u
ac dec 100 1 1Meg
alter c2 = 10u
ac dec 100 1 1Meg

plot db(ac1.out) db(ac2.out) db(ac3.out) db(ac4.out)
.ENDC
Sehen Sie, ob diese Diskussion aus ihren Foren hilft.

Antworten (2)

Ich habe einen Weg gefunden, mein Problem zu lösen

set curplot = new                  *We create a new plot to store our vectors
set acplot = $curplot              *We "store" our plot in a variable for further use

foreach x 1n 10n 50n 100n          *Loop through our desired value
    alter c2 = $x
    ac dec 100 1 1Meg

    foreach y 1k 10k 50k 100k      *Loop through our desired value
        alter r2 = $y
        ac dec 100 1 1Meg
        set aux = $curplot         *Each analysis will create its own plot
                                   *We need to remember every analysis each time to retrieve our data
        set curplot = $acplot      *Now we set the plot we want to store data into
                                   *In our case the plot created previously
        let 'db out c2: $x r2: $y' *Using let we will create a new vector with a user defined name 
        + = db({$aux}.out)         *Now we use the use the plot "stored" in aux to get our data
                                   *The + sign is used the instruction continues on another line, not to append
                                   *The {} is used to "delimit" the variable to $aux, without {} it would be seen as $aux.out
    end
end

set curplot = $acplot              *Set current plot as the plot generated by us
plot all vs ac1.frequency          *User created plot are of type 'unknown' so it will not know to plot frequency as xaxis by default.
                                   *Furthermore we have not stored the frequency vector inside our plot so I used any ac analysis to get the data

Ich hoffe, dass diese Lösung anderen hilft, und wenn jemand andere Lösungen kennt oder eine Verbesserung in Bezug auf meine hat, würde ich es gerne wissen

Sie können dieses Skript von ngspice aus ausführen? Hübsch. Es ist schwer, viele fortgeschrittene Beispiele oder Literatur zur Verwendung von ngspice und seinen Grenzen zu finden.
Sie können Ihre eigene Antwort akzeptieren (das grüne Häkchen). Das wird anderen Menschen, die in Zukunft nach ähnlichen Problemen suchen, sagen, dass dieses eine akzeptierte Lösung hat.

Wenn Sie gut in Octave oder Python zeichnen können, können Sie das tun, was ich tue, nämlich Ihre Daten aus ngspice speichern und dann die Daten in Octave oder Python einlesen und von dort aus beliebig plotten. Es gibt ein paar Bibliotheken, aber die, die ich zum Lesen der Daten verwende, wurden beide von Werner Hoch geschrieben, sie heißen spice_read.py für Python und spice_readfile.m für Octave (oder Matlab). Ein wenig googeln sollte die neusten Versionen finden. Sie führen Ihre Simulation zuerst aus mit:

ngspice -b -rmy_output_filename myspicefile.cir

und dann laden Sie den "my_output_filename" in Ihr Python- oder Octave-Programm. Wenn Sie nicht viel über Python oder Oktave wissen, wird es eine Lernkurve geben, aber es gibt viele Belohnungen, wenn Sie eine solche wissenschaftliche Programmierumgebung lernen. Über das Plotten hinaus können Sie Ihre Analyse filtern, verarbeiten und automatisieren.