Parcelas combinadas de Ngspice

Tengo el siguiente circuito. Trato de encontrar una manera de combinar todas las parcelas en una sola (como la tarjeta .step de ltspice). Desafortunadamente, no pude obtener el ejemplo del trabajo manual de ngspice.

Estaría agradecido si alguien pudiera ayudarme a entender la lógica detrás de lo que estoy tratando de lograr. Creo que necesito forzar que mis vectores se almacenen en una sola trama, pero a partir de mi investigación encontré más de una forma de hacerlo (simplemente no puedo entender la lógica de esos ejemplos, así que no pude adaptarlos para mi circuito)

yo uso ngspice 35

.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
A ver si esta discusión , de sus foros, ayuda.

Respuestas (2)

Encontré una manera de resolver mi problema.

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

Espero que esta solución ayude a otros y si alguien conoce otras soluciones o tiene alguna mejora con respecto a la mía, me gustaría saber

¿Puedes ejecutar este script desde ngspice? lindo. Es difícil encontrar muchos ejemplos avanzados o literatura sobre cómo usar ngspice y sus límites.
Puede aceptar su propia respuesta (la marca de verificación verde). Eso le dirá a otras personas, en el futuro, en busca de problemas similares, que este tiene una solución aceptada.

Si eres bueno para trazar dentro de Octave o Python, entonces puedes hacer lo que yo hago, que es guardar tus datos de ngspice y luego leer los datos en Octave o Python y trazarlos desde allí de la forma que quieras. Hay algunas bibliotecas, pero las que uso para leer los datos están escritas por Werner Hoch, llamadas spice_read.py para python y spice_readfile.m para Octave (o Matlab). Un poco de google debería encontrar las últimas versiones. Primero ejecuta su simulación con:

ngspice -b -rmy_output_filename myspicefile.cir

y luego carga "my_output_filename" en su programa python u octave. Si no sabe mucho sobre python u octave, habrá una curva de aprendizaje, pero hay muchas recompensas al aprender un entorno de programación tan científico. Más allá del trazado, puede filtrar, procesar y automatizar su análisis.