Simulador de circuits: ngspice, gschem, xcircuit
Contingut
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.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
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
- http://www.gedasymbols.org/user/john_doty/models/opamp/index.html
- https://wiki.ubuntu.com/Intro_to_opamps_with_ngspice-gEDA
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)
$ sudo apt-get install geda-gschem geda-gnetlist
- http://ftp.sunet.se/geda/docs/current/tutorials/gsch2pcb/gschem-warmup.html
- http://ftp.sunet.se/geda/docs/current/tutorials/gsch2pcb/tutorial.html
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