Table des matières Python

Simulation SPICE des transistors à effet de champ JFET

1. Introduction

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.

2. Définition ds paramètres du modèle

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 :

modeles.cir
.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
             

3. Caractéristique statique

La caractéristique statique (DC) d'un transistor JFET est obtenue avec le circuit suivant :

figureA.svgFigure pleine page

Voici 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.

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

transistor-2.cir
.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()
            
plotB.svgFigure 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 :

g=ΔIdΔVgs(1)

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()
            
plotC.svgFigure 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 :

g=gmax(1-VgsVgsb)(2)

Vgsb est la tension grille-source de blocage (ici -3 volts). Cela signifie que la courbe Id=f(Vgs) est une parabole.

Creative Commons LicenseTextes et figures sont mis à disposition sous contrat Creative Commons.