Simulador de circuits: ngspice, gschem, xcircuit

De wikijoan
(dif) ← Versió més antiga | Versió actual (dif) | Versió més nova → (dif)
Salta a la navegació Salta a la cerca

Introducció

Hi, anyone know about a free circuit analysis tool similar to National Instruments Multisim software? -> és el software de simulació online que es fa servir en el curs del MIT 6002X

I know one, It's different to NI but, in my opinion is even better. Is the ngspice. You have to "write" the circuit, it no use graphical interface, althoug there are program, like Xcircuit that help you.

Try it, however it can be a little difficult for beginners.

$ sudo apt-get install ngspice
$ sudo apt-get install xcircuit
$ ngspice
******
** ngspice-20 : Circuit level simulation program
** The U. C. Berkeley CAD Group
** Copyright 1985-1994, Regents of the University of California.
** Please submit bug-reports to: ngspice-bugs@lists.sourceforge.net
** Creation Date: Wed Jan  6 00:57:26 UTC 2010
******
ngspice 1 ->
$ xcircuit

Instal.lació de la última versió estable

Descarreguem la última versió estable: (ngspice-24.tar.gz)

i el manual (ngspice24-manual.pdf.gz)

Instal.lació.

previ:

$ sudo apt-get install libxaw7-dev
 $ mkdir release
 $ cd release
 $ ../configure  --with-x --with-readline=yes --disable-debug
 $ make
 $ sudo make install

i ja tinc instal.lada la versió 2.4:

$ ngspice
******
** ngspice-24 : Circuit level simulation program
** The U. C. Berkeley CAD Group
** Copyright 1985-1994, Regents of the University of California.
** Please get your ngspice manual from http://ngspice.sourceforge.net/docs.html
** Please file your bug-reports at http://ngspice.sourceforge.net/bugrep.html
** Creation Date: Fri Mar 30 00:33:00 CEST 2012
******
ngspice 1 ->

Primers passos

Chapter 20. Example Circuits. pag 335

The first example uses the simple one-transistor amplifier circuit illustrated in Figure 20.1. This circuit is constructed entirely with ngspice compatible devices and is used to introduce basic concepts, including:

  • Invoking the simulator:
  • Running simulations in different analysis modes
  • Printing and plotting analog results
  • Examining status, including execution time and memory usage
  • Exiting the simulator

El primer exemple és un típic circuit amb transistor bipolar, on el guany és -(Rc/Re) = -(3.9K/1K) = -3.9. Hauria d'estar a examples/xspice/xspice_c1.cir, però no hi és:

a berkeley spice3 compatible circuit
*
* This circuit contains only Berkeley SPICE3 components.
*
* The circuit is an AC coupled transistor amplifier with
* a sine wave input at node "1", a gain of approximately -3.9,
* and output node "coll".
*
.tran 1e-5 2e-3
*
vcc vcc 0 12.0
vin 1 0 0.0 ac 1.0 sin( 0 1 1k)
ccouple 1 base 10uF
rbias1 vcc base 100k
rbias2 base 0 24k
q1 coll base emit generic
rcollector vcc coll 3.9k
remitter emit 0 1k
*
.model generic npn
*
.end

I aleshores simulem amb run, mirem els recursos que ha consumit la simulació amb rusage, i podem printar el circuit amb plot:

$ ngspice xspice_c1.cir
******
** ngspice-24 : Circuit level simulation program
** The U. C. Berkeley CAD Group
** Copyright 1985-1994, Regents of the University of California.
** Please get your ngspice manual from http://ngspice.sourceforge.net/docs.html
** Please file your bug-reports at http://ngspice.sourceforge.net/bugrep.html
** Creation Date: Fri Mar 30 00:33:00 CEST 2012
******

Circuit: a berkeley spice3 compatible circuit

ngspice 7 -> plot v(1) base
Error: no such vector v(1)
ngspice 8 -> run
Doing analysis at TEMP = 27.000000 and TNOM = 27.000000


Initial Transient Solution
--------------------------

Node                                   Voltage
----                                   -------
vcc                                         12
1                                            0
base                                   2.07461
coll                                   7.00346
emit                                   1.29397
vin#branch                                   0
vcc#branch                         -0.00138042



No. of Data Rows : 208
ngspice 9 -> plot v(1) base
ngspice 10 -> exit
ngspice-24 done
joan@joanillo:~$ ngspice xspice_c1.cir
******
** ngspice-24 : Circuit level simulation program
** The U. C. Berkeley CAD Group
** Copyright 1985-1994, Regents of the University of California.
** Please get your ngspice manual from http://ngspice.sourceforge.net/docs.html
** Please file your bug-reports at http://ngspice.sourceforge.net/bugrep.html
** Creation Date: Fri Mar 30 00:33:00 CEST 2012
******

Circuit: a berkeley spice3 compatible circuit

ngspice 10 -> run
Doing analysis at TEMP = 27.000000 and TNOM = 27.000000


Initial Transient Solution
--------------------------

Node                                   Voltage
----                                   -------
vcc                                         12
1                                            0
base                                   2.07461
coll                                   7.00346
emit                                   1.29397
vin#branch                                   0
vcc#branch                         -0.00138042



No. of Data Rows : 208
ngspice 11 -> rusage
elapsed time since last call: 11.527 seconds.

Total elapsed time: 11.527 seconds.

Total DRAM available = 3826.078125 MB.
DRAM currently available = 899.691406 MB.
Total ngspice program size = 17.186523 MB.
Resident set size = 1.023438 MB.
Shared ngspice pages = 780.000 kB.
Text (code) pages = 1.198242 MB.
Stack = 0 bytes.
Library pages = 6.038086 MB.
ngspice 12 -> plot v(1) base
ngspice 13 -> 

i veiem com el senyal de la base és el mateix que el d'entrada, però polaritzat a l'entorn de 2V.

plot vcc coll emit

Veiem com el senyal de sortida està amplificat i invertit respecte l'entrada.

Ara puc fer un anàlidi DC, per buscar el punt de polarització (op: operating point)

ngspice 22 -> op
Doing analysis at TEMP = 27.000000 and TNOM = 27.000000

No. of Data Rows : 1
ngspice 23 -> print emit base coll
emit = 1.293975e+00
base = 2.074614e+00
coll = 7.003464e+00

El més lògic hagués sigut tornar a editar el fitxer i canviar la línia de l'anàlisi de transient (.tran 1e-5 2e-3) per op, i tornar a fer la simulació.

ngspice 5 -> print emit base coll
...
emit = 1.293993e+00 base = 2.074610e+00 coll = 7.003393e+00

Es poden fer altres anàlisi. Per exemple, un anàlisi AC de petita senyal:

ngspice 6 -> ac dec 10 0.01 100

fa un escombrat logarítmic (dec 10: 10 punts per dècada) entre 0.01 i 100 Hz. Per mirar la corba de resposta en el node coll:

ngspice 7 -> plot coll

Podem fer escales logarítmiques: (diagrames de Bode)

ngspice 8 -> plot db(coll) ph(coll)

També podem fer un escombrat DC de la tensió de la font:

ngspice 9 -> dc vcc 0 15 0.1 (entre 0 i 15V amb increments de 0.1V)

ngspice 10 -> plot emit base coll

Caracterització MOSFET

Mosfet ids vds.jpg

mosfet.cir

MOS OUTPUT CHARACTERISTICS
.OPTIONS NODE NOPAGE
VDS 3 0
VGS 2 0
M1 1 2 0 0 MOD1 L=1U W=40U AD=10P AS=10P
* VIDS MEASURES ID , WE COULD HAVE USED VDS, BUT ID WOULD BE NEGATIVE
VIDS 3 1
.MODEL MOD1 NMOS VTO=0.5 NSUB= 1.0E15 UO=550
.DC VDS 0 10 .5 VGS 0 5 1
.END

per fer la representació gràfica:

$ ngspice mosfet.cir

ngspice 42 -> run
Doing analysis at TEMP = 27.000000 and TNOM = 27.000000

Warning: vids: has no value, DC 0 assumed
Warning: vgs: has no value, DC 0 assumed
Warning: vds: has no value, DC 0 assumed


No. of Data Rows : 126

ngspice 44 -> plot VIDS#branch

i és la típica caracterśitica IDS-VDS dels transistors MOSFET per a diferents valors de VGS. La pujada lineal és per al mode triode, en què VGS>VT i preval el model SR (el canal es comporta com una resistència lineal, i per això la pujada és lineal). Però a partir del punt VDS=VGS-VT entrem en saturació, i el MOSFET es comporta com una font de corrent (i el valor només depèn de VGS, és una VCCS, voltage controlled current source):

IDS = K/2 * (VGS-VT)^2

important. Com podem saber gràficament quin és el punt en què passem de mode triode a mode saturació? Amb el plot aparentment quan marco em moc amb el cursor no queda marcada la posició X,Y. Mentida, només cal marcar (arrossegar) el ratolí entre dos punts i a la consola apareix:

x0 = 8.02247, y0 = 8e-05    x1 = 3.97753, y1 = 4e-05
dx = -4.04494, dy = -4e-05
dy/dx = 9.88889e-06    dx/dy = 101124

Per tant, el gràfic em serveix per fer els meus càlculs i calcular pendents i punts principals.

Device Model

(Mirar el manual de ngspice, capítol 2.3 Device Model, pàg 48)

General form:
. model mname type ( pname1= pval1 pname2= pval2 ... )
Examples:
. model MOD1 npn ( bf=50 is=1e−13 vbf=50 )

Per al meu MOSFET li assigno el nom MOD1 i li assigno el tipus NMOS

.MODEL MOD1 NMOS VTO=0.5 NSUB= 1.0E15 UO=550

El tipus és un dels següents:

R		Semiconductor resistor model
C		Semiconductor capacitor model
L		Inductor model
SW		Voltage controlled switch
CSW	Current controlled switch
URC	Uniform distributed RC model
LTRA	Lossy transmission line model
D		Diode model
NPN	NPN BJT model
PNP	PNP BJT model
NJF	N-channel JFET model
PJF	P-channel JFET model
NMOS	N-channel MOSFET model
PMOS	P-channel MOSFET model
NMF	N-channel MESFET model
PMF	P-channel MESFET model

Cada model té uns paràmetres amb uns valors per defecte.

L'explicació dels MOSFET en el manual està en el capítol 11.

General form:
MXXXXXXX nd ng ns nb mname <m=val> <l=val> <w=val>
+ <ad=val> <as=val> <pd=val> <ps=val> <nrd=val>
+ <nrs=val> <off> <ic=vds,vgs,vbs> <temp=t>
Examples:
M1 24 2 0 20 TYPE1
M31 2 17 6 10 MODM L=5U W=2U
M1 2 9 3 0 MOD1 L=10U W=5U AD=100P AS=100P PD=40U PS=40U

A més dels models bàsics (amb tots els paràmetres que comporten, són models complets), hi ha altres models complementaris que podem veure en el fitxer DEVICES i en la carpeta src/spicelib/devices. Són per exemple el MOS1 (level 1), MOS2 (level 2), etc, explicats en el capítol 11.2.

11. MOS devices

 11.1 MOS1 - Level 1 MOS model
             
      Ver:    N/A
      Class:  M
      Level:  1
      Dir:    devices/mos1
      Status:

      This is the so-called Schichman-Hodges model.

      Enhancements over the original model:
      - Parallel multiplier
      - Temperature difference from circuit temperature

i aquí ens diu que hem de buscar el fitxe devices/mos1:

i això ho podem trobar a ngspice-24/src/spicelib/devices/mos1

...
IFparm MOS1mPTable[] = { /* model parameters */
 OP("type",   MOS1_MOD_TYPE,  IF_STRING, "N-channel or P-channel MOS"),
 IOP("vto",   MOS1_MOD_VTO,   IF_REAL   ,"Threshold voltage"),
 IOPR("vt0",  MOS1_MOD_VTO,   IF_REAL   ,"Threshold voltage"),
...

Per veure tota la llista de paràmetres que es poden utilitzar, en els apèndix:

capítol 30: Model and Device Parameters
30.5 MOSFETs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 500
30.5.1 MOS1 - Level 1 MOSFET model with Meyer capacitance model . . . . 500

hi ha tota la llista de paràmetres que es poden utilitzar per al model bàsic de MOSFET

Si vull utiltizar aquests models extres s'ha d'utiltizar el paràmetre level. Per exemple, level=1 fa referència al model MOS1:

.MODEL MOD1 NMOS VTO=0.5 NSUB= 1.0E15 UO=550 level=1

Aquesta idea del paràmetre level es pot utilitzar per models alternatius i complementaris d'altres dispositius (BJT,...). En el fitxer DEVICES es veu el levell que s'ha de fer servir, i informació del model està a la documentació i en el codi font (ngspice-24/src/spicelib/devices/)

Transferència Vo-Vi

Mosfet vo vi.jpg

fitxer mosfet2.cir:

MOS OUTPUT CHARACTERISTICS
.OPTIONS NODE NOPAGE
VCC 3 0 5.0
VGS 2 0
RL 3 1 30K
M1 1 2 0 0 MOD1 L=1U W=40U AD=10P AS=10P
* VIDS MEASURES ID , WE COULD HAVE USED VDS, BUT ID WOULD BE NEGATIVE
.MODEL MOD1 NMOS VTO=0.5 NSUB= 1.0E15 UO=550
.DC VGS 0 5 .1
.END
ngspice 44 -> plot v(1)

He canviat els paràmetres W=40 i L=1, i VT=0.5 per tal que la gràfica de sortida sigui igual que la que trobem a Lab 5A: Mosfet Amplifier (del curs 6002X), encara que allà al curs W/L=100.

És la corba típica en què veiem com el MOSFET funciona com a switch. He posat una RL=30K.

Circuits d'exemple

pàg 335 del tutorial

  • 20.1 AC coupled transistor amplifier
  • 20.2 Differential Pair
  • 20.3 MOSFET Characterization
  • 20.4 RTL Inverter
  • 20.5 Four-Bit Binary Adder (Bipolar)
  • 20.6 Four-Bit Binary Adder (MOS)
  • 20.7 Transmission-Line Inverter

Anàlisis

Tipus d'anàlisi que es poden fer: pag 226 del manual

  • .AC: Small-Signal AC Analysis
  • .DC: DC Transfer Function
  • .DISTO: Distortion Analysis
  • .NOISE: Noise Analysis
  • .OP: Operating Point Analysis
  • .PZ: Pole-Zero Analysis
  • .SENS: DC or Small-Signal AC Sensitivity Analysis
  • .TF: Transfer Function Analysis
  • .TRAN: Transient Analysis
  • Transient noise analysis (at low frequency)
  • .PSS: Periodic Steady State Analysis

Utilitzar un amplificador operacional

Integració amb CAD Soft per fer esquemàtics

Fins ara he editat els fitxers .cir on directament fico una llista de nodes i dispositius entre els nodes (el netlist).

Es tracta d'utilitzar un software per dibuixar el circuit, i que produeixi una netlist que pugui utiltizar amb ngspice per fer la simulació.

Integració amb xcircuit: pag 324

CYGWIN and especially LINUX users may find XCircuit valuable to establish a development flow including schematic capture and circuit simulation.

La idea és que amb xcircuit puc dibuixar l'esquemàtic, obtenir una netlist, i aquesta netlist es pot simular amb el ngspice. Veure un cas concret i simple (càrrega d'un condensador) a:

El problema és que la interfície gràfica de xcircuit deixa bastant que desitjar, tot i que no ha de ser difícil. Però és important llegir-se un manual del funcionament. El millor és llegir el tutorial 1: The XCircuit Tutorial Part 1: Drawing with XCircuit.

Integració amb Eagle CAD Soft

I poden treballar junts Eagle CAD Soft i ngspice? You can export a SPICE netlist from Eagle...

Integració amb gschem (mètode a utilitzar)

Pols RC.jpg
$ sudo apt-get install geda-gschem geda-gnetlist

A part de llegir el gschem-warmup, cosetes a tenir en compte a l'hora de disbuixar un circuit:

  • quan edito les propietats d'un component com ara una resistència, no vull que aparegui refdes=R1 o bé value=15K (vull que aparegui R1 i 15K). Això es fa desmarcant N en la propietat (i automàticament marcant V) (hi ha tres columnes: vis?, N i V). La primera és si vull la propietat visible o no (sí que la vull visible).

I ara que ja tenim dibuixat l'esquema he d'exportar la netlist per tal de poder simular despreś.

>   How do you dump a gschem schematic to a netlist?  I do not see an
>   export in the menu list.

Several ways, all using other programs. For pcb (the program) flows there are gsch2pcb and xgsch2pcb. For
others, there's gnetlist.

He d'instal.lar geda-utils si encara no ho tenia fet:

$ sudo apt-get install geda-utils

Tutorial curt i clar per a fer la integració:

Però una cosa tan senzilla com la càrrega d'un condensador (circuit RC) en resposta a un puls no ha sigut fàcil. Anem a veure quins eren els origens d'error.

  • Si no fico res en el gschem els nets es diuen 1,2,3,... Però en el ngspice np puc fer plot 1, perquè no ho interpreta com una net. He de fer plot "1", o bé en el gschem posar valors per a les nets, com ara n1, n2, etc.
  • no ficar una coma com a punt decimal. per exemple, no ficar 0,047uF, sinó 0.047uF. Al gschem li és igual, però no al ngspice.
  • no n'hi ha prou a definir la font amb el value=5V. El correcte és fer un PULSE. El value ha de ser del tipus: PULSE(0 5 0 50ms), que vol dir un pols de 0-5 V, que comenci a 0seg i amb una pujada que trigui 50ms.

El procediment serà dibuixar l'esquema amb gschem, i generar la netlist:

$ gnetlist -g spice -o RC1.net RC1.sch
Command line passed = gnetlist -g spice -o RC1.net RC1.sch 
Loading schematic [/home/joan/RC1.sch]

El fitxer RC1.net que s'ha generat és la netlist:

* Spice netlister for gnetlist
Vcc n1 0 PULSE(0 5 0 50ms)
C1 n2 0 15u
R1 n1 n2 15K
.END

Volem simular la càrrega del condensador quan posem un pols a l'entrada. Arrenquem ngspice

$ ngspice

Carreguem la netlist:

ngspice 6 -> source RC1.net

La constant RC del circuit és de 15KOhm*15uF=0.225 s. Faré una simulació de 0 a 1000ms

ngspice 9 -> tran 0.01ms 1000ms

The first parameter to tran determines the step to use, the second parameter is the end value. If no third parameter is given, the start time is 0, otherwise the start time is given by this third parameter.

Ara ja puc printar:

ngspice 307 -> plot n1 n2

El primer exemple concret que he fet és el Sidetone oscillator with 23904/3906.


creat per Joan Quintana Compte, març 2012