add alternative temperature model for certain jfet parameter

This commit is contained in:
dwarning 2020-08-25 17:36:10 +02:00 committed by Holger Vogt
parent b0a790a463
commit aab54e8a55
6 changed files with 98 additions and 31 deletions

View File

@ -67,10 +67,14 @@ IFparm JFETmPTable[] = { /* model parameters */
IOP("b", JFET_MOD_B, IF_REAL,"Doping tail parameter"),
/* end Sydney University mod. */
IOPU("tnom", JFET_MOD_TNOM, IF_REAL,"parameter measurement temperature"),
IOP("tcv", JFET_MOD_TCV, IF_REAL, "Threshold voltage temperature coefficient"),
IOP("vtotc", JFET_MOD_VTOTC, IF_REAL, "Threshold voltage temperature coefficient alternative"),
IOP("bex", JFET_MOD_BEX, IF_REAL, "Mobility temperature exponent"),
IOP("betatce", JFET_MOD_BETATCE, IF_REAL, "Mobility temperature exponent alternative"),
IOP("xti", JFET_MOD_XTI, IF_REAL, "Gate junction saturation current temperature exponent"),
IOP("eg", JFET_MOD_EG, IF_REAL, "Bandgap voltage"),
IOP("kf", JFET_MOD_KF, IF_REAL, "Flicker Noise Coefficient"),
IOP("af", JFET_MOD_AF, IF_REAL, "Flicker Noise Exponent"),
IOP("tcv", JFET_MOD_TCV, IF_REAL, "Threshold voltage temperature coefficient"),
IOP("bex", JFET_MOD_BEX, IF_REAL, "Mobility temperature exponent"),
IOP("nlev",JFET_MOD_NLEV, IF_INTEGER, "Noise equation selector"),
IOP("gdsnoi", JFET_MOD_GDSNOI, IF_REAL, "Channel noise coefficient")
};

View File

@ -207,9 +207,13 @@ typedef struct sJFETmodel { /* model structure for a jfet */
double JFETb; /* doping profile parameter */
double JFETbFac; /* internal derived doping profile parameter */
/* end Sydney University mod */
double JFETtnom; /* temperature at which parameters were measured */
double JFETtnom; /* temperature at which parameters were measured */
double JFETtcv;
double JFETvtotc;
double JFETbex;
double JFETbetatce;
double JFETxti;
double JFETeg;
unsigned JFETthresholdGiven : 1;
unsigned JFETbetaGiven : 1;
@ -225,12 +229,16 @@ typedef struct sJFETmodel { /* model structure for a jfet */
unsigned JFETbGiven : 1;
/* end Sydney University mod */
unsigned JFETtnomGiven : 1; /* user specified Tnom for model */
unsigned JFETtcvGiven : 1;
unsigned JFETvtotcGiven : 1;
unsigned JFETbexGiven : 1;
unsigned JFETbetatceGiven : 1;
unsigned JFETxtiGiven : 1;
unsigned JFETegGiven : 1;
unsigned JFETfNcoefGiven : 1;
unsigned JFETfNexpGiven : 1;
unsigned JFETnlevGiven : 1;
unsigned JFETgdsnoiGiven : 1;
unsigned JFETtcvGiven : 1;
unsigned JFETbexGiven : 1;
} JFETmodel;
@ -268,11 +276,15 @@ enum {
JFET_MOD_NJF,
JFET_MOD_PJF,
JFET_MOD_TNOM,
JFET_MOD_KF,
JFET_MOD_AF,
JFET_MOD_B, /* Modification for Sydney University JFET model */
JFET_MOD_TCV,
JFET_MOD_VTOTC,
JFET_MOD_BEX,
JFET_MOD_BETATCE,
JFET_MOD_XTI,
JFET_MOD_EG,
JFET_MOD_KF,
JFET_MOD_AF,
JFET_MOD_NLEV,
JFET_MOD_GDSNOI,
};

View File

@ -71,24 +71,36 @@ JFETmAsk(CKTcircuit *ckt, GENmodel *inModel, int which, IFvalue *value)
case JFET_MOD_SOURCECONDUCT:
value->rValue = model->JFETsourceConduct;
return(OK);
case JFET_MOD_KF:
value->rValue = model->JFETfNcoef;
return(OK);
case JFET_MOD_AF:
value->rValue = model->JFETfNexp;
return(OK);
case JFET_MOD_TCV:
value->rValue = model->JFETtcv;
return(OK);
case JFET_MOD_VTOTC:
value->rValue = model->JFETvtotc;
return(OK);
case JFET_MOD_BEX:
value->rValue = model->JFETbex;
return(OK);
case JFET_MOD_BETATCE:
value->rValue = model->JFETbetatce;
return(OK);
case JFET_MOD_XTI:
value->rValue = model->JFETxti;
return(OK);
case JFET_MOD_EG:
value->rValue = model->JFETeg;
return(OK);
case JFET_MOD_TYPE:
if (model->JFETtype == NJF)
value->sValue = "njf";
else
value->sValue = "pjf";
return(OK);
case JFET_MOD_KF:
value->rValue = model->JFETfNcoef;
return(OK);
case JFET_MOD_AF:
value->rValue = model->JFETfNexp;
return(OK);
case JFET_MOD_NLEV:
value->iValue = model->JFETnlev;
return(OK);

View File

@ -72,14 +72,6 @@ JFETmParam(int param, IFvalue *value, GENmodel *inModels)
model->JFETtype = PJF;
}
break;
case JFET_MOD_KF:
model->JFETfNcoefGiven = TRUE;
model->JFETfNcoef = value->rValue;
break;
case JFET_MOD_AF:
model->JFETfNexpGiven = TRUE;
model->JFETfNexp = value->rValue;
break;
/* Modification for Sydney University JFET model */
case JFET_MOD_B:
model->JFETbGiven = TRUE;
@ -90,10 +82,34 @@ JFETmParam(int param, IFvalue *value, GENmodel *inModels)
model->JFETtcvGiven = TRUE;
model->JFETtcv = value->rValue;
break;
case JFET_MOD_VTOTC:
model->JFETvtotcGiven = TRUE;
model->JFETvtotc = value->rValue;
break;
case JFET_MOD_BETATCE:
model->JFETbetatceGiven = TRUE;
model->JFETbetatce = value->rValue;
break;
case JFET_MOD_BEX:
model->JFETbexGiven = TRUE;
model->JFETbex = value->rValue;
break;
case JFET_MOD_XTI:
model->JFETxtiGiven = TRUE;
model->JFETxti = value->rValue;
break;
case JFET_MOD_EG:
model->JFETegGiven = TRUE;
model->JFETeg = value->rValue;
break;
case JFET_MOD_KF:
model->JFETfNcoefGiven = TRUE;
model->JFETfNcoef = value->rValue;
break;
case JFET_MOD_AF:
model->JFETfNexpGiven = TRUE;
model->JFETfNexp = value->rValue;
break;
case JFET_MOD_NLEV:
model->JFETnlevGiven = TRUE;
model->JFETnlev = value->iValue;

View File

@ -62,12 +62,6 @@ JFETsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, int *states)
if(!model->JFETdepletionCapCoeffGiven) {
model->JFETdepletionCapCoeff = .5;
}
if(!model->JFETfNcoefGiven) {
model->JFETfNcoef = 0;
}
if(!model->JFETfNexpGiven) {
model->JFETfNexp = 1;
}
/* Modification for Sydney University JFET model */
if(!model->JFETbGiven) {
@ -78,9 +72,27 @@ JFETsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, int *states)
if(!model->JFETtcvGiven) {
model->JFETtcv = 0.0;
}
if(!model->JFETvtotcGiven) {
model->JFETvtotc = 0.0;
}
if(!model->JFETbexGiven) {
model->JFETbex = 0.0;
}
if(!model->JFETbetatceGiven) {
model->JFETbetatce = 0.0;
}
if(!model->JFETxtiGiven) {
model->JFETxti = 3.0;
}
if(!model->JFETegGiven) {
model->JFETeg = 1.11;
}
if(!model->JFETfNcoefGiven) {
model->JFETfNcoef = 0;
}
if(!model->JFETfNexpGiven) {
model->JFETfNexp = 1;
}
if(!model->JFETnlevGiven) {
model->JFETnlev = 2;
}

View File

@ -89,7 +89,11 @@ JFETtemp(GENmodel *inModel, CKTcircuit *ckt)
vt = here->JFETtemp * CONSTKoverQ;
fact2 = here->JFETtemp/REFTEMP;
ratio1 = here->JFETtemp/model->JFETtnom -1;
here->JFETtSatCur = model->JFETgateSatCurrent * exp(ratio1*1.11/vt);
if (model->JFETxtiGiven) {
here->JFETtSatCur = model->JFETgateSatCurrent * exp(ratio1*model->JFETeg/vt) * pow(ratio1+1,model->JFETxti);
} else {
here->JFETtSatCur = model->JFETgateSatCurrent * exp(ratio1*model->JFETeg/vt);
}
here->JFETtCGS = model->JFETcapGS * cjfact;
here->JFETtCGD = model->JFETcapGD * cjfact;
kt = CONSTboltz*here->JFETtemp;
@ -108,9 +112,16 @@ JFETtemp(GENmodel *inModel, CKTcircuit *ckt)
here->JFETf1 = here->JFETtGatePot * (1 - exp((1-.5)*xfc))/(1-.5);
here->JFETvcrit = vt * log(vt/(CONSTroot2 * here->JFETtSatCur));
here->JFETtThreshold = model->JFETthreshold - model->JFETtcv*(here->JFETtemp-model->JFETtnom);
here->JFETtBeta = model->JFETbeta * pow(here->JFETtemp/model->JFETtnom,model->JFETbex);
if (model->JFETvtotcGiven) {
here->JFETtThreshold = model->JFETthreshold + model->JFETvtotc*(here->JFETtemp-model->JFETtnom);
} else {
here->JFETtThreshold = model->JFETthreshold - model->JFETtcv*(here->JFETtemp-model->JFETtnom);
}
if (model->JFETbetatceGiven) {
here->JFETtBeta = model->JFETbeta * pow(1.01,model->JFETbetatce*(here->JFETtemp-model->JFETtnom));
} else {
here->JFETtBeta = model->JFETbeta * pow(here->JFETtemp/model->JFETtnom,model->JFETbex);
}
}
}
return(OK);