Table des matières Python

Simulation SPICE des amplificateurs opérationnels

1. Introduction

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.

2. Modèle d'amplificateur

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 :

modelesAO.cir
* 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 :

0.5x+0.5y

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 :

4.715E6x-5E6y+5E6z+5E6u-5E6v

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))

3. Exemple : amplificateur

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 :

ampli-1.cir
.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()
            
plotA.svgFigure 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.

ampli-2.cir
.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()
            
plotB.svgFigure pleine page
Creative Commons LicenseTextes et figures sont mis à disposition sous contrat Creative Commons.