diode: add alternative bangap calculation for tlev=2
This commit is contained in:
parent
5fdd21f239
commit
6b80d21e36
|
|
@ -84,6 +84,8 @@ IFparm DIOmPTable[] = { /* model parameters */
|
||||||
IOP( "tlev", DIO_MOD_TLEV, IF_INTEGER, "Diode temperature equation selector"),
|
IOP( "tlev", DIO_MOD_TLEV, IF_INTEGER, "Diode temperature equation selector"),
|
||||||
IOP( "tlevc", DIO_MOD_TLEVC, IF_INTEGER, "Diode temperature equation selector"),
|
IOP( "tlevc", DIO_MOD_TLEVC, IF_INTEGER, "Diode temperature equation selector"),
|
||||||
IOP( "eg", DIO_MOD_EG, IF_REAL, "Activation energy"),
|
IOP( "eg", DIO_MOD_EG, IF_REAL, "Activation energy"),
|
||||||
|
IOP( "gap1", DIO_MOD_GAP1, IF_REAL, "First bandgap correction factor"),
|
||||||
|
IOP( "gap2", DIO_MOD_GAP2, IF_REAL, "Second bandgap correction factor"),
|
||||||
IOP( "xti", DIO_MOD_XTI, IF_REAL, "Saturation current temperature exp."),
|
IOP( "xti", DIO_MOD_XTI, IF_REAL, "Saturation current temperature exp."),
|
||||||
IOP( "cta", DIO_MOD_CTA, IF_REAL, "Area junction temperature coefficient"),
|
IOP( "cta", DIO_MOD_CTA, IF_REAL, "Area junction temperature coefficient"),
|
||||||
IOPR( "ctc", DIO_MOD_CTA, IF_REAL, "Area junction capacitance temperature coefficient"),
|
IOPR( "ctc", DIO_MOD_CTA, IF_REAL, "Area junction capacitance temperature coefficient"),
|
||||||
|
|
|
||||||
|
|
@ -262,6 +262,8 @@ typedef struct sDIOmodel { /* model structure for a diode */
|
||||||
unsigned DIOtlevGiven : 1;
|
unsigned DIOtlevGiven : 1;
|
||||||
unsigned DIOtlevcGiven : 1;
|
unsigned DIOtlevcGiven : 1;
|
||||||
unsigned DIOactivationEnergyGiven : 1;
|
unsigned DIOactivationEnergyGiven : 1;
|
||||||
|
unsigned DIOfirstBGcorrFactorGiven : 1;
|
||||||
|
unsigned DIOsecndBGcorrFactorGiven : 1;
|
||||||
unsigned DIOsaturationCurrentExpGiven : 1;
|
unsigned DIOsaturationCurrentExpGiven : 1;
|
||||||
unsigned DIOctaGiven : 1;
|
unsigned DIOctaGiven : 1;
|
||||||
unsigned DIOctpGiven : 1;
|
unsigned DIOctpGiven : 1;
|
||||||
|
|
@ -332,6 +334,8 @@ typedef struct sDIOmodel { /* model structure for a diode */
|
||||||
int DIOtlev; /* Diode temperature equation selector */
|
int DIOtlev; /* Diode temperature equation selector */
|
||||||
int DIOtlevc; /* Diode temperature equation selector */
|
int DIOtlevc; /* Diode temperature equation selector */
|
||||||
double DIOactivationEnergy; /* activation energy (EG) */
|
double DIOactivationEnergy; /* activation energy (EG) */
|
||||||
|
double DIOfirstBGcorrFactor; /* First bandgap correction factor */
|
||||||
|
double DIOsecndBGcorrFactor; /* Second bandgap correction factor */
|
||||||
double DIOsaturationCurrentExp; /* Saturation current exponential (XTI) */
|
double DIOsaturationCurrentExp; /* Saturation current exponential (XTI) */
|
||||||
double DIOcta; /* Area junction temperature coefficient */
|
double DIOcta; /* Area junction temperature coefficient */
|
||||||
double DIOctp; /* Perimeter junction temperature coefficient */
|
double DIOctp; /* Perimeter junction temperature coefficient */
|
||||||
|
|
@ -420,6 +424,8 @@ enum {
|
||||||
DIO_MOD_VJ,
|
DIO_MOD_VJ,
|
||||||
DIO_MOD_M,
|
DIO_MOD_M,
|
||||||
DIO_MOD_EG,
|
DIO_MOD_EG,
|
||||||
|
DIO_MOD_GAP1,
|
||||||
|
DIO_MOD_GAP2,
|
||||||
DIO_MOD_XTI,
|
DIO_MOD_XTI,
|
||||||
DIO_MOD_FC,
|
DIO_MOD_FC,
|
||||||
DIO_MOD_BV,
|
DIO_MOD_BV,
|
||||||
|
|
|
||||||
|
|
@ -106,6 +106,12 @@ DIOmAsk (CKTcircuit *ckt, GENmodel *inModel, int which, IFvalue *value)
|
||||||
case DIO_MOD_EG:
|
case DIO_MOD_EG:
|
||||||
value->rValue = model->DIOactivationEnergy;
|
value->rValue = model->DIOactivationEnergy;
|
||||||
return (OK);
|
return (OK);
|
||||||
|
case DIO_MOD_GAP1:
|
||||||
|
value->rValue = model->DIOfirstBGcorrFactor;
|
||||||
|
return (OK);
|
||||||
|
case DIO_MOD_GAP2:
|
||||||
|
value->rValue = model->DIOsecndBGcorrFactor;
|
||||||
|
return (OK);
|
||||||
case DIO_MOD_XTI:
|
case DIO_MOD_XTI:
|
||||||
value->rValue = model->DIOsaturationCurrentExp;
|
value->rValue = model->DIOsaturationCurrentExp;
|
||||||
return(OK);
|
return(OK);
|
||||||
|
|
|
||||||
|
|
@ -133,6 +133,14 @@ DIOmParam(int param, IFvalue *value, GENmodel *inModel)
|
||||||
model->DIOactivationEnergy = value->rValue;
|
model->DIOactivationEnergy = value->rValue;
|
||||||
model->DIOactivationEnergyGiven = TRUE;
|
model->DIOactivationEnergyGiven = TRUE;
|
||||||
break;
|
break;
|
||||||
|
case DIO_MOD_GAP1:
|
||||||
|
model->DIOfirstBGcorrFactor = value->rValue;
|
||||||
|
model->DIOfirstBGcorrFactorGiven = TRUE;
|
||||||
|
break;
|
||||||
|
case DIO_MOD_GAP2:
|
||||||
|
model->DIOsecndBGcorrFactor = value->rValue;
|
||||||
|
model->DIOsecndBGcorrFactorGiven = TRUE;
|
||||||
|
break;
|
||||||
case DIO_MOD_XTI:
|
case DIO_MOD_XTI:
|
||||||
model->DIOsaturationCurrentExp = value->rValue;
|
model->DIOsaturationCurrentExp = value->rValue;
|
||||||
model->DIOsaturationCurrentExpGiven = TRUE;
|
model->DIOsaturationCurrentExpGiven = TRUE;
|
||||||
|
|
|
||||||
|
|
@ -114,6 +114,12 @@ DIOsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, int *states)
|
||||||
if(!model->DIOactivationEnergyGiven) {
|
if(!model->DIOactivationEnergyGiven) {
|
||||||
model->DIOactivationEnergy = 1.11;
|
model->DIOactivationEnergy = 1.11;
|
||||||
}
|
}
|
||||||
|
if(!model->DIOfirstBGcorrFactorGiven) {
|
||||||
|
model->DIOfirstBGcorrFactor = 7.02e-4;
|
||||||
|
}
|
||||||
|
if(!model->DIOsecndBGcorrFactorGiven) {
|
||||||
|
model->DIOsecndBGcorrFactor = 1108.0;
|
||||||
|
}
|
||||||
if(!model->DIOsaturationCurrentExpGiven) {
|
if(!model->DIOsaturationCurrentExpGiven) {
|
||||||
model->DIOsaturationCurrentExp = 3;
|
model->DIOsaturationCurrentExp = 3;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -63,14 +63,21 @@ void DIOtempUpdate(DIOmodel *inModel, DIOinstance *here, double Temp, CKTcircuit
|
||||||
|
|
||||||
/* this part gets really ugly - I won't even try to
|
/* this part gets really ugly - I won't even try to
|
||||||
* explain these equations */
|
* explain these equations */
|
||||||
fact2 = Temp/REFTEMP;
|
if ((model->DIOtlev == 0) || (model->DIOtlev == 1)) {
|
||||||
egfet = 1.16-(7.02e-4*Temp*Temp)/
|
egfet = 1.16-(7.02e-4*Temp*Temp)/
|
||||||
(Temp+1108);
|
(Temp+1108);
|
||||||
|
egfet1 = 1.16 - (7.02e-4*model->DIOnomTemp*model->DIOnomTemp)/
|
||||||
|
(model->DIOnomTemp+1108);
|
||||||
|
} else {
|
||||||
|
egfet = model->DIOactivationEnergy-(model->DIOfirstBGcorrFactor*Temp*Temp)/
|
||||||
|
(Temp+model->DIOsecndBGcorrFactor);
|
||||||
|
egfet1 = model->DIOactivationEnergy - (model->DIOfirstBGcorrFactor*model->DIOnomTemp*model->DIOnomTemp)/
|
||||||
|
(model->DIOnomTemp+model->DIOsecndBGcorrFactor);
|
||||||
|
}
|
||||||
|
fact2 = Temp/REFTEMP;
|
||||||
arg = -egfet/(2*CONSTboltz*Temp) +
|
arg = -egfet/(2*CONSTboltz*Temp) +
|
||||||
1.1150877/(CONSTboltz*(REFTEMP+REFTEMP));
|
1.1150877/(CONSTboltz*(REFTEMP+REFTEMP));
|
||||||
pbfact = -2*vt*(1.5*log(fact2)+CHARGE*arg);
|
pbfact = -2*vt*(1.5*log(fact2)+CHARGE*arg);
|
||||||
egfet1 = 1.16 - (7.02e-4*model->DIOnomTemp*model->DIOnomTemp)/
|
|
||||||
(model->DIOnomTemp+1108);
|
|
||||||
arg1 = -egfet1/(CONSTboltz*2*model->DIOnomTemp) +
|
arg1 = -egfet1/(CONSTboltz*2*model->DIOnomTemp) +
|
||||||
1.1150877/(2*CONSTboltz*REFTEMP);
|
1.1150877/(2*CONSTboltz*REFTEMP);
|
||||||
fact1 = model->DIOnomTemp/REFTEMP;
|
fact1 = model->DIOnomTemp/REFTEMP;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue