Computational routine
eng
NPN
model NPN "Simple BJT according to Ebers-Moll"
parameter Real Bf=50 "Forward beta";
parameter Real Br=0.1 "Reverse beta";
parameter Real Is=1.e-16 "Transport saturation current";
parameter Real Vak=0.02 "Early voltage (inverse), 1/Volt";
parameter Real Tauf=0.12e-9 "Ideal forward transit time";
parameter Real Taur=5e-9 "Ideal reverse transit time";
parameter Real Ccs=1e-12 "Collector-substrat(ground) cap.";
parameter Real Cje=0.4e-12 "Base-emitter zero bias depletion cap.";
parameter Real Cjc=0.5e-12 "Base-coll. zero bias depletion cap.";
parameter Real Phie=0.8 "Base-emitter diffusion voltage";
parameter Real Me=0.4 "Base-emitter gradation exponent";
parameter Real Phic=0.8 "Base-collector diffusion voltage";
parameter Real Mc=0.333 "Base-collector gradation exponent";
parameter Real Gbc=1e-15 "Base-collector conductance";
parameter Real Gbe=1e-15 "Base-emitter conductance";
parameter Real Vt=0.02585 "Voltage equivalent of temperature";
parameter Real EMinMax=40 "if x > EMax, the exp(x) function is linearized";
Real vbc;
Real vbe;
Real qbk;
Real ibc;
Real ibe;
Real cbc;
Real cbe;
Real ExMin;
Real ExMax;
Real Capcje;
Real Capcjc;
Real EMax;
Real EMin;
Pin C "Collector";
Pin B "Base";
Pin E "Emitter";
equation
EMax=EMinMax;
EMin=-2*EMinMax;
ExMin = Modelica.Math.exp(EMin);
ExMax = Modelica.Math.exp(EMax);
vbc = B.v - C.v;
vbe = B.v - E.v;
qbk = 1 - vbc*Vak;
ibc = if noEvent(vbc/Vt < EMin) then Is*(ExMin*(vbc/Vt - EMin + 1) - 1) + vbc*Gbc
else if noEvent(vbc/Vt > EMax) then Is*(ExMax*(vbc/Vt - EMax + 1) - 1) + vbc*Gbc
else Is*(Modelica.Math.exp(vbc/Vt) - 1) + vbc*Gbc;
ibe = if noEvent(vbe/Vt < EMin) then Is*(ExMin*(vbe/Vt - EMin + 1) - 1) + vbe*Gbe
else if noEvent(vbe/Vt > EMax) then Is*(ExMax*(vbe/Vt - EMax + 1) - 1) + vbe*Gbe
else Is*(Modelica.Math.exp(vbe/Vt) - 1) + vbe*Gbe;
Capcjc = if (vbc/Phic > 0) then Cjc*(1 + Mc*vbc/Phic) else Cjc*(1 - vbc/Phic);
Capcje = if (vbe/Phie > 0) then Cje*(1 + Me*vbe/Phie) else Cje*(1 - vbe/Phie);
cbc = if noEvent(vbc/Vt < EMin) then Taur*Is/Vt*ExMin*(vbc/Vt - EMin + 1) + Capcjc
else if noEvent(vbc/Vt > EMax) then Taur*Is/Vt*ExMax*(vbc/Vt - EMax + 1) + Capcjc
else Taur*Is/Vt*Modelica.Math.exp(vbc/Vt) + Capcjc;
cbe = if noEvent(vbe/Vt < EMin) then Tauf*Is/Vt*ExMin*(vbe/Vt - EMin + 1) + Capcje
else if noEvent(vbe/Vt > EMax) then Tauf*Is/Vt*ExMax*(vbe/Vt - EMax + 1) + Capcje
else Tauf*Is/Vt*Modelica.Math.exp(vbe/Vt) + Capcje;
C.i = (ibe - ibc)*qbk - ibc/Br - cbc*der(vbc) + Ccs*der(C.v);
B.i = ibe/Bf + ibc/Br + cbc*der(vbc) + cbe*der(vbe);
E.i = -B.i - C.i + Ccs*der(C.v);
end NPN;