Ce document explique le fonctionnement d'un amplificateur à transistor à émetteur commun. La démarche suivie est tirée de [1]. Après une analyse simplifiée du fonctionnement, une simulation SPICE est effectuée.
On considère le circuit suivant :
Figure pleine pageLa figure suivante montre le courant de collecteur en fonction de la tension collecteur-émetteur, pour différents courants de base. Elle a été obtenue par simulation SPICE pour un transistor 2N2222.
Figure pleine pageDans la zone active qui nous intéresse ici, le courant de collecteur est beaucoup plus grand que le courant de base (facteur 200 environ). Le courant de collecteur est donc pratiquement égal au courant d'émetteur.
La tension collecteur-émetteur étant fixée (au dessus de 0.5 volts), on s'intéresse à la variation du courant d'émetteur en fonction de la tension base-émetteur. La simulation SPICE ci-dessous calcule cette courbe. Le paramètre que l'on fait varier est le courant de base.
Le modèle de transistor :
La description SPICE du circuit, avec une source de tension nulle ajoutée pour mesurer le courant d'émetteur :
.INCLUDE modeles.cir Ib 0 1 DC 0 Vce 2 0 DC 5 Vie 3 0 DC 0 Q 2 1 3 2n2222a .control DC Ib 0 30U 0.1U PRINT V(1) I(Vie) > export-1.txt .endc .end
ngspice -b transistor-1.cir
from lectureSpicePrint import lectureSpicePrint from matplotlib.pyplot import * import numpy as np data = lectureSpicePrint("export-1.txt") Vbe = data["v(1)"] Ie = data["i(vie)"] figure(figsize=(5,5)) plot(Vbe,Ie*1000) plot(Vbe[80],Ie[80]*1000,"r.") xlabel("Vbe (V)") ylabel("Ie (mA)") axis([0,1,0,5]) grid()Figure pleine page
On a fixé Vce=5 V mais la courbe obtenue dépend très peu de cette tension, tant qu'on reste dans le domaine linéaire. Un point de fonctionnement a aussi été placé sur la courbe, à environ Ie=1 mA. On s'intéresse à présent à une petite oscillation de la tension Vce autour de ce point de fonctionnement, qui induit une oscillation du courant d'émetteur. Le rapport de la variation de tension sur la variation de courant est la résistance en alternatif d'émetteur :
Il s'agit de l'inverse de la pente de la courbe, que l'on obtient comme suit :
n = Vbe.size re = np.zeros(n-1) for k in range(n-1): re[k] = (Vbe[k+1]-Vbe[k])/(Ie[k+1]-Ie[k]) figure(figsize=(5,5)) plot(Ie[0:n-1]*1000,re) plot(Ie[80]*1000,re[80],"r.") xlabel("Ie (mA)") ylabel("re (Ohm)") axis([0,5,0,50]) grid()
print(re[50]) --> 64.247926550392549Figure pleine page
Pour le point de fonctionnement placé plus haut, cette résistance est d'environ re=30 Ω. Elle augmente lorsque le courant d'émetteur décroît.
On s'intéresse tout d'abord au point de fonctionnement du transistor. On suppose que le courant de base est négligeable devant le courant traversant R1 et R2. Ces deux résistances agissent donc comme un pont diviseur et on a :
La tension base-émetteur est environ Vbe=0.7 V (à plus ou moins 0.1 volts). On en déduit V4=V2-Vbe et le courant d'émetteur :
Le courant d'émetteur du point de fonctionnement est donc contrôlé par la résistance RE. Ce courant est grand devant le courant de base; il est donc pratiquement égal au courant de collecteur. On en déduit la tension du nœud 5 :
Soient par exemple R1=10 kΩ, R2=1.2 kΩ, RE=1 kΩ et RC=10 kΩ avec une alimentation Vcc=15 V. Les tensions et courants sont alors V2=1.6 V, V4=0.9 V, IE=0.9 mA et V5=6 V. La tension collecteur-émetteur est Vce=V5-V4=5.1 V. le point de fonctionnement est donc très proche du point marqué plus haut et la résistance d'émetteur en alternatif est environ re=30 Ω (un peu plus).
On s'intéresse à présent au fonctionnement en régime alternatif. Un petit signal sinusoïdal est appliqué par la source Vi (input). On suppose que les impédances des capacités à la fréquence du signal sont négligeables; elles sont donc équivalentes à des court-circuits pour l'alternatif. On a donc d'une part v5(t)=V5+ui(t) (on note u les tensions variables). D'autre part, l'émetteur est à la masse pour l'alternatif donc la tension alternative ui(t) voit une résistance re vers la masse. Si on note ie(t)=Ie+je(t) le courant d'émetteur, on a donc
Comme ce courant traverse RC, la tension de sortie Vo(t)=V5+uo(t) (output) oscille autour de V5 avec
Le signe moins indique une opposition de phase entre la sortie et l'entrée. Le gain en alternatif est finalement :
Bien sûr, ce résultat ne tient pas compte des effets capacitifs dans le transistor à très haute fréquence. Avec les valeurs calculées plus haut, on obtient H=-330. Pour éviter une distorsion en sortie, l'amplitude de variation du courant émetteur ne doit pas dépasser 0.1 mA, donc l'amplitude des oscillations en entrée ne doit pas dépasser 3 mV. L'amplitude en sortie est au maximum de 1 V environ.
Cet amplificateur a l'inconvénient d'avoir un gain qui dépend de la résistance d'émetteur en alternatif re, laquelle peut varier d'un transistor à l'autre (du même modèle) et surtout varie avec la température. Le gain de ce montage n'est donc pas très stable. Une solution pour stabiliser le gain consiste à ajouter une résistance d'émetteur de la manière suivante :
Figure pleine pageLa tension alternative appliquée sur l'émetteur voit une résistance vers la masse re+RE1. Le gain devient donc :
Si la résistance rE1 est assez grande devant re, elle masque les variations de cette dernière et donc le gain est plus stable. La contrepartie est une baisse du gain. Avec par exemple RE1=180 Ω et RE2=820 Ω (somme égale à RE), le gain devient H=-48, soit en décibel 33.6 dB.
Voir la page Lecture des sorties SPICE avec Python pour l'utilisation de ngspice avec python.
On commence par faire une analyse transitoire avec une entrée sinusoïdale à 1 kHz et d'amplitude 10 mV. Les capacités sont 10 μF.
.INCLUDE modeles.cir Vi 1 0 SIN(0 10M 1K 0 0) Vcc 3 0 15 Ci 1 2 10U R1 2 3 10K R2 2 0 1.2K Q1 5 2 4 2n2222a RC 3 5 10K RE1 4 6 180 RE2 6 0 820 CE 6 0 10U .control TRAN 10U 10M PRINT V(2) V(5) I(Vi) > export-2.txt .endc .end
ngspice -b ampli-1.cir
data = lectureSpicePrint("export-2.txt") t = data["time"]*1e3 v2 = data["v(2)"] v5 = data["v(5)"] figure(figsize=(10,4)) plot(t,v2) xlabel("t (ms)") ylabel("V2 (V)") grid()Figure pleine page
figure(figsize=(10,4)) plot(t,v5) xlabel("t (ms)") ylabel("V5 (V)") grid()Figure pleine page
Les valeurs moyennes sont légèrement différentes de celles calculées plus haut. On avait calculé V5=6 V; ici la moyenne est d'environ 5.9 V. Cet écart est principalement dû à la valeur de Vbe qui était légèrement surestimée. Le gain est bien d'environ 50.
Voici le tracé du courant délivré par la source en entrée :
Ii = data["i(vi)"]*1e6 figure(figsize=(10,4)) plot(t,Ii) xlabel("t (ms)") ylabel("Ii (muA)") grid()Figure pleine page
On en déduit que l'impédance d'entrée est d'environ 1 kΩ à cette fréquence.
Voyons le gain et le déphasage en fonction de la fréquence (réponse AC) :
.INCLUDE modeles.cir Vi 1 0 AC 10M Vcc 3 0 15 Ci 1 2 10U R1 2 3 10K R2 2 0 1.2K Q1 5 2 4 2n2222a RC 3 5 10K RE1 4 6 180 RE2 6 0 820 CE 6 0 10U .control AC DEC 10 1K 100MEG PRINT vdb(5) vp(5) > export-3.txt .endc .end
ngspice -b ampli-2.cir
L'amplitude de la tension de sortie est exportée en décibel. Il faut ajouter +40 dB (amplitude en entrée de 10 mV) pour obtenir le gain en décibel :
data = lectureSpicePrint("export-3.txt") freq = data["frequency"] gdb = data["vdb(5)"] gdb = np.add(gdb,40) 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
Le gain dans la bande passante (environ 33 dB) est légèrement inférieur au gain calculé plus haut. La fréquence de coupure est à 1 MHz. À 100 MHz, le gain n'est plus que de 5 dB. Pour obtenir un gain important à cette fréquence, on a intérêt à utiliser le montage sans stabilisation, dont voici la simulation avec une amplitude de 1 mV en entrée :
.INCLUDE modeles.cir Vi 1 0 AC 1M Vcc 3 0 15 Ci 1 2 10U R1 2 3 10K R2 2 0 1.2K Q1 5 2 4 2n2222a RC 3 5 10K RE 4 0 1K CE 4 0 10U .control AC DEC 10 1K 100MEG PRINT vdb(5) vp(5) > export-4.txt .endc .end
ngspice -b ampli-3.cir
data = lectureSpicePrint("export-4.txt") freq = data["frequency"] gdb = data["vdb(5)"] gdb = np.add(gdb,60) 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
Le gain à 100 MHz est de 18 dB.