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 page
La 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