Ce document montre comment utiliser un amplificateur opérationnel dans une simulation SPICE. On utilise ngspice. Les données produites sont importées dans python avec la fonction décrite dans Lecture des sorties SPICE avec Python.
Pour introduire un amplificateur opérationnel (AO) dans un circuit, il faut tout d'abord définir un sous-circuit qui représente cet amplificateur. Les fabricants de circuits intégrés fournissent des modèles SPICES pour les AO les plus courants. Par exemple, voici le modèle PSPICE fourni par Texas Instrument pour le TL081, un AO à JFET bien connu :
* TL081 OPERATIONAL AMPLIFIER "MACROMODEL" SUBCIRCUIT
* CREATED USING PARTS RELEASE 4.01 ON 06/16/89 AT 13:08
* (REV N/A) SUPPLY VOLTAGE: +/-15V
* CONNECTIONS: NON-INVERTING INPUT
* | INVERTING INPUT
* | | POSITIVE POWER SUPPLY
* | | | NEGATIVE POWER SUPPLY
* | | | | OUTPUT
* | | | | |
.SUBCKT TL081 1 2 3 4 5
*
C1 11 12 3.498E-12
C2 6 7 15.00E-12
DC 5 53 DX
DE 54 5 DX
DLP 90 91 DX
DLN 92 90 DX
DP 4 3 DX
EGND 99 0 POLY(2) (3,0) (4,0) 0 .5 .5
FB 7 99 POLY(5) VB VC VE VLP VLN 0 4.715E6 -5E6 5E6 5E6 -5E6
GA 6 0 11 12 282.8E-6
GCM 0 6 10 99 8.942E-9
ISS 3 10 DC 195.0E-6
HLIM 90 0 VLIM 1K
J1 11 2 10 JX
J2 12 1 10 JX
R2 6 9 100.0E3
RD1 4 11 3.536E3
RD2 4 12 3.536E3
RO1 8 5 150
RO2 7 99 150
RP 3 4 2.143E3
RSS 10 99 1.026E6
VB 9 0 DC 0
VC 3 53 DC 2.200
VE 54 4 DC 2.200
VLIM 7 8 DC 0
VLP 91 0 DC 25
VLN 0 92 DC 25
.MODEL DX D(IS=800.0E-18)
.MODEL JX PJF(IS=15.00E-12 BETA=270.1E-6 VTO=-1)
.ENDS
Le sous-circuit est commencé par la commande .SUBCKT et terminé par la command .ENDS. La syntaxe est :
.SUBCTK nom N1 N2 ...
où N1, N2, etc, sont les numéros des nœuds du sous-circuits, tels qu'ils sont définis dans le sous-circuit. Ces nœuds sont des variables locales au sous-circuit. Seul le nœud 0 (la masse) est une variable globale pouvant être utilisée aussi dans le sous-circuit.
Ce modèle du TL081A contient des sources de tension fixes, des diodes, des sources commandées et des transistors JFET. Il s'agit d'un circuit qui modélise le comportement du TL081A et non de son schéma réel.
L'élément EGND est une source polynomiale de tension commandée par une ou plusieurs tensions. La fonction est un polynôme de dimension 2 dont les coefficients sont 0 0.5 et 0.5, c'est-à-dire :
Les tensions de commande x et y sont respectivement les différences de potentiels (3,0) et (4,0).
Avec NGSPICE et l'extension XSPICE, on peut le remplacer par l'élément suivant :
BGND 99 0 V=0.5*(v(3)+v(4))
L'élément FB est une source de courant commandée en courant. Les 5 courants de commande sont les courants qui traversent les sources de tension VB, VC, VE, VLP et VLN définis à la fin du circuit. Le polynôme comporte 6 coefficients rangés par ordre croissant :
Avec NGSPICE et l'extension XSPICE,on peut remplacer cet élément par le suivant :
BB 7 99 I=4.715E6*i(VB)+5E6*(i(VE)-i(VC))+5E6*(i(VLP)-i(VLN))
Le montage suivant est un amplificateur inverseur. L'AO est alimenté avec deux sources DC symétriques (alimentation double), ce qui permet d'amplifier des signaux alternant autour de la masse.
On commence par obtenir la réponse fréquentielle en régime sinusoïdal :
.INCLUDE modelesAO.cir
Ve 1 0 DC 0 AC 1
R1 1 2 10K
R2 2 5 100K
X1 0 2 3 4 5 TL081
VP 3 0 DC 15V
VM 4 0 DC -15V
.control
AC DEC 10 100 10MEG
PRINT vdb(5) vp(5) > export-1.txt
.endc
.end
ngspice -b ampli-1.cir
from lectureSpicePrint import lectureSpicePrint
from matplotlib.pyplot import *
data = lectureSpicePrint("export-1.txt")
freq = data["frequency"]
gdb = data["vdb(5)"]
phi = data["vp(5)"]
figure(figsize=(10,10))
subplot("211")
plot(freq,gdb)
xscale('symlog')
xlabel('f (Hz)')
ylabel('GdB')
grid()
subplot("212")
plot(freq,phi)
xscale('symlog')
xlabel('f (Hz)')
ylabel('phi (rad)')
grid()
Figure pleine pageLa fréquence de coupure de ce montage est d'environ 100 kHz.
La simulation suivante calcule une réponse transitoire avec une source sinusoïdale de fréquence fixe, dont l'amplitude est choisie assez élevée pour observer une saturation en sortie.
.INCLUDE modelesAO.cir
Ve 1 0 SIN(0 2 1K 0 0)
R1 1 2 10K
R2 2 5 100K
X1 0 2 3 4 5 TL081
VP 3 0 DC 15V
VM 4 0 DC -15V
.control
TRAN 10U 5M
PRINT v(5) > export-2.txt
.endc
.end
ngspice -b ampli-2.cir
data = lectureSpicePrint("export-2.txt")
time = data["time"]*1e3
v5 = data["v(5)"]
figure(figsize=(10,5))
plot(time,v5)
xlabel("t (ms)")
ylabel("Vs (V)")
axis([0,5,-15,15])
grid()
Figure pleine page