Saltar a contenido

ngspice

Introducción

Ngspice es un programa de código abierto para la simulación de circuitos electrónicos. Es un simulador SPICE basado en el código desarrollado por la Universidad de California en Berkeley en la década de los setenta/ochenta.

En este tutorial me voy a centrar en el uso de ngspice en batch mode, que quiere decir que los circuitos y el tipo de análisis están definidos en un fichero que ngspice procesa desde la terminal.

La forma más sencilla de ejecutar un circuito es la siguiente:

ngspice -b mycircuit.cir

Aunque estoy usando .cir, a ngspice le da igual la extensión del fichero. Para redirigir el output del programa a un fichero simplemente usa la opción -o:

ngspice -b mycircuit.cir -o results.out

Formato del circuito

Los circuitos se definen usando el concepto de netlist. Una netlist consiste en una lista de componentes o elementos que especifican a qué nodos están unidos cada terminal del componente. Un nodo es una serie de cables ideales que se encuentran al mismo voltaje. ngspice sigue el convenio de usar el 0 para definir la tierra (ground), pero por lo demás hay mucha flexibilidad a la hora de nombrar nodos. Un ejemplo sencillo de netlist es el siguiente circuito describiendo un divisor de tensión o voltaje:

Vin 2 0 1V
R1 div 0 10
R2 2 div 5

En este circuito, el voltaje del nodo div es proporcional al voltaje del nodo 2. Vin es una fuente de voltaje, mientras que R1 y R2 son dos resistencias.

Una particularidad de spice es que el nombre the cada elemento tiene que comenzar con una letra que represente el tipo de elemento. R para resistencias, V para fuentes de voltaje, M para transistores, etc. La documentación de ngspice contiene una lista completa de todos los tipos de componentes.

Tipos de análisis

ngspice permite principalmente tres tipos de análisis: continuos (DC), análisis de frequencia (AC), y evolución en función del tiempo.

Análisis DC

Un ejemplo sencillo de un programa que analiza el divisor de voltaje es el siguiente:

Divisor de voltaje

Vin 2 0 DC 1V
R1 div 0 10
R2 2 div 5

.control
op
print v(div)
.endc

.end

Este programa establece varias reglas importantes en ngspice:

  • ngspice ignora la primera línea de un programa y asume que es el título
  • el programa termina con la instrucción .end.
  • Las instrucciones están contenidas entre .control y .endc
  • En este ejemplo tenemos dos instrucciones:
    • op calcula el estado estacionario (operation point) del circuito.
    • print v(div) imprime el voltaje del nodo div

El resultado de correr:

ngspice -b mycircuit.cir

Es el siguiente:

Note: No compatibility mode selected!

Circuit: divisor de voltaje

Doing analysis at TEMP = 27.000000 and TNOM = 27.000000

Using SPARSE 1.3 as Direct Linear Solver

No. of Data Rows : 1
v(div) = 6.666667e-01
Note: Simulation executed from .control section

Un análisis más interesante es estudiar la evolución del voltaje del nodo div en función del valor en la fuente de voltaje. Para ello, usamos la instrucción dc. Consideremos el ejemplo siguiente:

Divisor de voltaje

Vin 2 0 DC 1V
R1 div 0 10
R2 2 div 5

.control
dc Vin 0V 5V 1V
print v(div)
.endc

.end

El circuito es esencialmente el mismo, pero ahora la instrucción de control dc hace un barrido desde 0 a 5 voltios a incrementos de un voltio. El resultado es el siguiente:

Note: No compatibility mode selected!


Circuit: divisor de voltaje

Doing analysis at TEMP = 27.000000 and TNOM = 27.000000

Using SPARSE 1.3 as Direct Linear Solver

No. of Data Rows : 6
                            divisor de voltaje
                            DC transfer characteristic  Wed Jun 10 23:13:07  2026
--------------------------------------------------------------------------------
Index   v-sweep         v(div)          
--------------------------------------------------------------------------------
0   0.000000e+00    0.000000e+00    
1   1.000000e+00    6.666667e-01    
2   2.000000e+00    1.333333e+00    
3   3.000000e+00    2.000000e+00    
4   4.000000e+00    2.666667e+00    
5   5.000000e+00    3.333333e+00    
Note: Simulation executed from .control section

Cada instrucción print puede contener hasta ocho columnas. No hay limitaciones en el número de instrucciones que se pueden incluir en un solo script.

También se pueden medir corrientes a través de fuentes de voltaje:

Divisor de voltaje

Vin 2 0 DC 1V
R1 div 0 10
R2 2 div 5

.control
dc Vin 0V 5V 0.1V
print v(2) div
print I(Vin)
.endc

.end

La expresión I(Vin) mide la corriente a través de la fuente de voltaje Vin. Para medir la corriente en una posición de un circuito cualquiera hay que crear una fuente de voltaje virtual con zero voltios de diferencia.

Divisor de voltaje

Vin 2 0 DC 1V
R1 div vv 10
Vm vv 0 0
R2 2 div 5

.control
dc Vin 0V 5V 1V
print v(2) div
print I(Vin) I(Vm)
.endc

.end

Con el resultado:

Note: No compatibility mode selected!


Circuit: divisor de voltaje

Doing analysis at TEMP = 27.000000 and TNOM = 27.000000

Using SPARSE 1.3 as Direct Linear Solver

No. of Data Rows : 6
                            divisor de voltaje
                            DC transfer characteristic  Tue Jun 16 01:42:07  2026
--------------------------------------------------------------------------------
Index   v-sweep         v(2)            div             
--------------------------------------------------------------------------------
0   0.000000e+00    0.000000e+00    0.000000e+00    
1   1.000000e+00    1.000000e+00    6.666667e-01    
2   2.000000e+00    2.000000e+00    1.333333e+00    
3   3.000000e+00    3.000000e+00    2.000000e+00    
4   4.000000e+00    4.000000e+00    2.666667e+00    
5   5.000000e+00    5.000000e+00    3.333333e+00    
                            divisor de voltaje
                            DC transfer characteristic  Tue Jun 16 01:42:07  2026
--------------------------------------------------------------------------------
Index   v-sweep         i(vin)          i(vm)           
--------------------------------------------------------------------------------
0   0.000000e+00    0.000000e+00    0.000000e+00    
1   1.000000e+00    -6.66667e-02    6.666667e-02    
2   2.000000e+00    -1.33333e-01    1.333333e-01    
3   3.000000e+00    -2.00000e-01    2.000000e-01    
4   4.000000e+00    -2.66667e-01    2.666667e-01    
5   5.000000e+00    -3.33333e-01    3.333333e-01

Una característica de ngspice es que cuando se mide la corriente a través de una fuente de voltaje el signo de la corriente es el contrario al del circuito. Así, la corriente en el circuito viene determinada por la polaridad de Vin, y fluye desde el polo positivo al negativo. La fuente de voltaje virtual Vm está definida con la polaridad opuesta, el primer nodo es vv que es el de mayor voltaje. Por tanto la corriente fluye desde el negativo al positivo, y su signo es el contraro al medido por I(V1).