part of temperature level=3 model

This commit is contained in:
dwarning 2012-08-18 21:10:48 +02:00
parent 67132108ad
commit 5ca213b481
6 changed files with 113 additions and 20 deletions

View File

@ -206,7 +206,13 @@ IFparm BJTmPTable[] = { /* model parameters */
IOP("tmjs2",BJT_MOD_TMJS2, IF_REAL, "MJS 2. temperature coefficient"),
IOP("tns1", BJT_MOD_TNS1, IF_REAL, "NS 1. temperature coefficient"),
IOP("tns2", BJT_MOD_TNS2, IF_REAL, "NS 2. temperature coefficient"),
IOP("nkf", BJT_MOD_NKF, IF_REAL, "NKF High current beta rolloff exponent")
IOP("nkf", BJT_MOD_NKF, IF_REAL, "NKF High current beta rolloff exponent"),
IOP("tis1", BJT_MOD_TIS1, IF_REAL, "IS 1. temperature coefficient"),
IOP("tis2", BJT_MOD_TIS2, IF_REAL, "IS 2. temperature coefficient"),
IOP("tise1", BJT_MOD_TISE1, IF_REAL, "ISE 1. temperature coefficient"),
IOP("tise2", BJT_MOD_TISE2, IF_REAL, "ISE 2. temperature coefficient"),
IOP("tisc1", BJT_MOD_TISC1, IF_REAL, "ISC 1. temperature coefficient"),
IOP("tisc2", BJT_MOD_TISC2, IF_REAL, "ISC 2. temperature coefficient")
};
char *BJTnames[] = {

View File

@ -443,6 +443,12 @@ typedef struct sBJTmodel { /* model structure for a bjt */
double BJTf3;
double BJTf6;
double BJTf7;
double BJTtis1;
double BJTtis2;
double BJTtise1;
double BJTtise2;
double BJTtisc1;
double BJTtisc2;
unsigned BJTsubsGiven : 1;
unsigned BJTtnomGiven : 1;
@ -543,6 +549,12 @@ typedef struct sBJTmodel { /* model structure for a bjt */
unsigned BJTtns1Given : 1;
unsigned BJTtns2Given : 1;
unsigned BJTnkfGiven : 1;
unsigned BJTtis1Given : 1;
unsigned BJTtis2Given : 1;
unsigned BJTtise1Given : 1;
unsigned BJTtise2Given : 1;
unsigned BJTtisc1Given : 1;
unsigned BJTtisc2Given : 1;
} BJTmodel;
#ifndef NPN
@ -673,7 +685,13 @@ typedef struct sBJTmodel { /* model structure for a bjt */
#define BJT_MOD_TNS1 198
#define BJT_MOD_TNS2 199
#define BJT_MOD_SUBS 200
#define BJT_MOD_NKF 100
#define BJT_MOD_NKF 201
#define BJT_MOD_TIS1 202
#define BJT_MOD_TIS2 203
#define BJT_MOD_TISE1 204
#define BJT_MOD_TISE2 205
#define BJT_MOD_TISC1 206
#define BJT_MOD_TISC2 207
/* device questions */
#define BJT_QUEST_FT 201

View File

@ -360,6 +360,24 @@ BJTmAsk(CKTcircuit *ckt, GENmodel *instPtr, int which, IFvalue *value)
case BJT_MOD_NKF:
value->rValue = here->BJTnkf;
return(OK);
case BJT_MOD_TIS1:
value->rValue = here->BJTtis1;
return(OK);
case BJT_MOD_TIS2:
value->rValue = here->BJTtis2;
return(OK);
case BJT_MOD_TISE1:
value->rValue = here->BJTtise1;
return(OK);
case BJT_MOD_TISE2:
value->rValue = here->BJTtise2;
return(OK);
case BJT_MOD_TISC1:
value->rValue = here->BJTtisc1;
return(OK);
case BJT_MOD_TISC2:
value->rValue = here->BJTtisc2;
return(OK);
default:
return(E_BADPARM);
}

View File

@ -430,6 +430,30 @@ BJTmParam(int param, IFvalue *value, GENmodel *inModel)
mods->BJTnkf = value->rValue;
mods->BJTnkfGiven = TRUE;
break;
case BJT_MOD_TIS1:
mods->BJTtis1 = value->rValue;
mods->BJTtis1Given = TRUE;
break;
case BJT_MOD_TIS2:
mods->BJTtis2 = value->rValue;
mods->BJTtis2Given = TRUE;
break;
case BJT_MOD_TISE1:
mods->BJTtise1 = value->rValue;
mods->BJTtise1Given = TRUE;
break;
case BJT_MOD_TISE2:
mods->BJTtise2 = value->rValue;
mods->BJTtise2Given = TRUE;
break;
case BJT_MOD_TISC1:
mods->BJTtisc1 = value->rValue;
mods->BJTtisc1Given = TRUE;
break;
case BJT_MOD_TISC2:
mods->BJTtisc2 = value->rValue;
mods->BJTtisc2Given = TRUE;
break;
default:
return(E_BADPARM);
}

View File

@ -304,6 +304,24 @@ BJTsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, int *states)
model->BJTnkf = 1.0;
}
}
if(!model->BJTtis1Given) {
model->BJTtis1 = 0.0;
}
if(!model->BJTtis2Given) {
model->BJTtis2 = 0.0;
}
if(!model->BJTtise1Given) {
model->BJTtise1 = 0.0;
}
if(!model->BJTtise2Given) {
model->BJTtise2 = 0.0;
}
if(!model->BJTtisc1Given) {
model->BJTtisc1 = 0.0;
}
if(!model->BJTtisc2Given) {
model->BJTtisc2 = 0.0;
}
/*
* COMPATABILITY WARNING!

View File

@ -156,21 +156,25 @@ BJTtemp(GENmodel *inModel, CKTcircuit *ckt)
here->BJTtjunctionExpSub = model->BJTexponentialSubstrate * (1+model->BJTtmjs1*dt+model->BJTtmjs2*dt*dt);
here->BJTtemissionCoeffS = model->BJTemissionCoeffS * (1+model->BJTtns1*dt+model->BJTtns2*dt*dt);
vt = here->BJTtemp * CONSTKoverQ;
fact2 = here->BJTtemp/REFTEMP;
egfet = 1.16-(7.02e-4*here->BJTtemp*here->BJTtemp)/
(here->BJTtemp+1108);
arg = -egfet/(2*CONSTboltz*here->BJTtemp)+
1.1150877/(CONSTboltz*(REFTEMP+REFTEMP));
pbfact = -2*vt*(1.5*log(fact2)+CHARGE*arg);
if ((model->BJTtlev == 0) || (model->BJTtlev == 1)) {
vt = here->BJTtemp * CONSTKoverQ;
fact2 = here->BJTtemp/REFTEMP;
egfet = 1.16-(7.02e-4*here->BJTtemp*here->BJTtemp)/
(here->BJTtemp+1108);
arg = -egfet/(2*CONSTboltz*here->BJTtemp)+
1.1150877/(CONSTboltz*(REFTEMP+REFTEMP));
pbfact = -2*vt*(1.5*log(fact2)+CHARGE*arg);
ratlog = log(here->BJTtemp/model->BJTtnom);
ratio1 = here->BJTtemp/model->BJTtnom -1;
factlog = ratio1 * model->BJTenergyGap/vt +
model->BJTtempExpIS*ratlog;
factor = exp(factlog);
here->BJTtSatCur = model->BJTsatCur * factor;
here->BJTtSubSatCur = model->BJTsubSatCur * factor;
ratlog = log(here->BJTtemp/model->BJTtnom);
ratio1 = here->BJTtemp/model->BJTtnom -1;
factlog = ratio1 * model->BJTenergyGap/vt +
model->BJTtempExpIS*ratlog;
factor = exp(factlog);
here->BJTtSatCur = model->BJTsatCur * factor;
here->BJTtSubSatCur = model->BJTsubSatCur * factor;
} else if (model->BJTtlev == 3) {
here->BJTtSatCur = pow(model->BJTsatCur,(1+model->BJTtis1*dt+model->BJTtis2*dt*dt));
}
if (model->BJTtlev == 0) {
bfactor = exp(ratlog*model->BJTbetaExp);
@ -186,10 +190,15 @@ BJTtemp(GENmodel *inModel, CKTcircuit *ckt)
else
here->BJTtBetaR = model->BJTbetaR * bfactor;
here->BJTtBEleakCur = model->BJTleakBEcurrent *
exp(factlog/model->BJTleakBEemissionCoeff)/bfactor;
here->BJTtBCleakCur = model->BJTleakBCcurrent *
exp(factlog/model->BJTleakBCemissionCoeff)/bfactor;
if ((model->BJTtlev == 0) || (model->BJTtlev == 1)) {
here->BJTtBEleakCur = model->BJTleakBEcurrent *
exp(factlog/model->BJTleakBEemissionCoeff)/bfactor;
here->BJTtBCleakCur = model->BJTleakBCcurrent *
exp(factlog/model->BJTleakBCemissionCoeff)/bfactor;
} else if (model->BJTtlev == 3) {
here->BJTtBEleakCur = pow(model->BJTleakBEcurrent,(1+model->BJTtise1*dt+model->BJTtise2*dt*dt));
here->BJTtBCleakCur = pow(model->BJTleakBCcurrent,(1+model->BJTtisc1*dt+model->BJTtisc2*dt*dt));
}
if (model->BJTtlevc == 0) {
pbo = (model->BJTpotentialBE-pbfact)/fact1;