Ce document montre comment utiliser un transistor JFET 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.
La déclaration d'un transistor JFET se fait avec la syntaxe suivante :
Jxxx ND NG NS MODELE
Le nom du transistor doit commencer par Q. ND, NG et NS sont les nœuds du drain, de la grille et de la source. MODELE est le nom du modèle.
Les transistors JFET sont représentés dans SPICE par un modèle à 14 paramètres. Voir bwrcs.eecs.berkeley.edu/Classes/IcBook/SPICE/ pour la définition de ces paramètres. Si aucun nom de modèle n'est précisé, les paramètres par défaut s'appliquent. Il est préférable d'utiliser un jeu de paramètres correspondant précisément au transistor que l'on veut simuler. Les fabriquants de composants fournissent des modèles SPICE pour les composants les plus utilisés. Une liste de liens est consultable sur www.youspice.com.
Voici par exemple un modèle pour le JFET canal N 2N3819 :
.MODEL 2N3819 NJF VTO=-2.9985 BETA=1.3046M LAMBDA=2.2507M RD=1 RS=1 + CGD=1.5964P CGS=2.4199P PB=500M IS=33.582F KF=0 AF=1
La caractéristique statique (DC) d'un transistor JFET est obtenue avec le circuit suivant :
Figure pleine pageVoici la définition SPICE de ce circuit :
.INCLUDE modeles.cir Vgs 1 0 DC 0 Vds 2 0 DC 0 J 2 1 0 2N3819
La commande .INCLUDE permet d'inclure le fichier dans lequel se trouve la définition du modèle 2N3819.
La jonction grille-source doit être polarisée en inverse, donc Vgs doit être négatif. On commence par tracer la courbe donnant le courant de drain (égal au courant de source) en fonction de la tension drain-source, pour différentes valeurs de Vgs.
La commande .DC permet de faire varier à la fois la tension grille-source et la tension drain-source.
.INCLUDE modeles.cir Vgs 1 0 DC 0 Vds 2 0 DC 0 J 2 1 0 2N3819 .control DC Vds 0 10 0.1 Vgs 0 -4 -0.5 PRINT I(Vds) > export-1.txt .endc .end
ngspice -b transistor-1.cir
Le tableau de valeurs exportées comporte toutes les tensions Vds et les courants id correspondants. La tension grille-source n'apparait pas explicitement dans le tableau. La tension nommée v-sweep est la première qui est balayée par la commande DC, c.a.d. Vds. Comme on connait le nombre de points par courbe, on peut séparer les différentes courbes après l'importation du tableau :
from lectureSpicePrint import lectureSpicePrint from matplotlib.pyplot import * import numpy as np data = lectureSpicePrint("export-1.txt") npts = 101 figure(figsize=(10,5)) i=0 for k in range(9): Vgs = -0.5*k Vds = data["v-sweep"][i:i+npts] id = -data["i(vds)"][i:i+npts]*1e3 plot(Vds,id,label="Vgs = %f V"%Vgs) i += npts xlabel("Vds (V)") ylabel("id (mA)") axis([0,20,-5,20]) legend(loc="upper right") grid()Figure pleine page
Dans la région active, pour Vds>2 V, le courant de drain est contrôlé par la tension grille-source. Lorsque Vgs<-3 V, le courant de drain est nul : le transistor est bloqué.
Lorsque la tension drain-source est fixée dans la zone active, le transistor se comporte comme une source de courant commandée en tension. On doit donc tracer le courant de drain en fonction de la tension grille-source (caractéristique de transconductance) :
.INCLUDE modeles.cir Vgs 1 0 DC 0 Vds 2 0 DC 5 J 2 1 0 2N3819 .control DC Vgs 0 -4 -0.04 PRINT I(Vds) > export-2.txt .endc .end
ngspice -b transistor-2.cir
data = lectureSpicePrint("export-2.txt") Vgs = data["v-sweep"] Id = -data["i(vds)"]*1e3 figure(figsize=(5,5)) plot(Vgs,Id) plot(Vgs[25],Id[25],'r.') xlabel("Vgs (V)") ylabel("Id (mA)") grid()Figure pleine page
On a placé sur la courbe un point de fonctionnement à Vgs=-1 V. Si on ajoute à cet tension une petite tension alternative, le courant de drain varie aussi autour de sa valeur moyenne (environ 5 mA). Le rapport de l'amplitude de variation du courant de drain sur l'amplitude de variation de la tension grille-source est la transconductance dynamique :
C'est la pente de la courbe précédente, que l'on obtient de la manière suivante :
n = Vgs.size g = np.zeros(n-1) for k in range(n-1): g[k] = (Id[k+1]-Id[k])/(Vgs[k+1]-Vgs[k]) figure(figsize=(5,5)) plot(Vgs[0:n-1],g) plot(Vgs[25],g[25],"r.") xlabel("Vgs (V)") ylabel("g (mS)") grid()Figure pleine page
Pour le point de fonctionnement donné en exemple, la transconductance dynamique est d'environ 5 mS. On remarque que la transconductance varie linéairement. L'équation est :
où Vgsb est la tension grille-source de blocage (ici -3 volts). Cela signifie que la courbe Id=f(Vgs) est une parabole.