Remove instance parameter temp. To specify offset to ambient temperature use dtemp instead.

Remove temp update double application for beta and series resistances and fix derivatives for selfheating model.
This commit is contained in:
dwarning 2025-10-22 18:21:49 +02:00
parent 4560fce4af
commit 3340df46ca
7 changed files with 19 additions and 28 deletions

View File

@ -16,7 +16,6 @@ IFparm VDMOSpTable[] = { /* parameters */
IP("off", VDMOS_OFF, IF_FLAG, "Device initially off"),
IOPU("icvds", VDMOS_IC_VDS, IF_REAL, "Initial D-S voltage"),
IOPU("icvgs", VDMOS_IC_VGS, IF_REAL, "Initial G-S voltage"),
IOPU("temp", VDMOS_TEMP, IF_REAL, "Instance temperature"),
IOPU("dtemp", VDMOS_DTEMP, IF_REAL, "Instance temperature difference"),
IP( "ic", VDMOS_IC, IF_REALVEC, "Vector of D-S, G-S voltages"),

View File

@ -23,9 +23,6 @@ VDMOSask(CKTcircuit *ckt, GENinstance *inst, int which, IFvalue *value,
NG_IGNORE(select);
switch(which) {
case VDMOS_TEMP:
value->rValue = here->VDMOStemp - CONSTCtoK;
return(OK);
case VDMOS_DTEMP:
value->rValue = here->VDMOSdtemp;
return(OK);

View File

@ -148,7 +148,6 @@ typedef struct sVDMOSinstance {
int VDMOSmode; /* device mode : 1 = normal, -1 = inverse */
unsigned VDMOSoff:1; /* non-zero to indicate device is off for dc analysis*/
unsigned VDMOStempGiven :1; /* instance temperature specified */
unsigned VDMOSdtempGiven :1; /* instance delta temperature specified */
unsigned VDMOSmGiven :1;
unsigned VDMOSdNodePrimeSet :1;
@ -498,7 +497,6 @@ enum {
VDMOS_CG,
VDMOS_CS,
VDMOS_POWER,
VDMOS_TEMP,
VDMOS_M,
VDMOS_DTEMP,
VDMOS_THERMAL,

View File

@ -296,16 +296,18 @@ VDMOSload(GENmodel *inModel, CKTcircuit *ckt)
/* Calculate temperature dependent values for self-heating effect */
if (selfheat) {
double TempRatio = Temp / here->VDMOStemp;
Beta = here->VDMOStTransconductance * pow(TempRatio,model->VDMOSmu);
dBeta_dT = Beta * model->VDMOSmu / Temp;
rd0T = here->VDMOSdrainResistance * pow(TempRatio, model->VDMOStexp0);
drd0T_dT = rd0T * model->VDMOStexp0 / Temp;
Beta = here->VDMOStTransconductance;
dBeta_dT = Beta * model->VDMOSmu * pow(Temp, model->VDMOSmu-1) / pow(model->VDMOStnom, model->VDMOSmu);
rd0T = here->VDMOSdrainResistance;
if (model->VDMOStexp0Given)
drd0T_dT = rd0T * model->VDMOStexp0 * pow(Temp, model->VDMOStexp0-1) / pow(model->VDMOStnom, model->VDMOStexp0);
else
drd0T_dT = rd0T * (model->VDMOStrd1 + model->VDMOStrd2*(2*model->VDMOStnom*Temp - model->VDMOStnom*model->VDMOStnom));
rd1T = 0.0;
drd1T_dT = 0.0;
if (model->VDMOSqsGiven) {
rd1T = here->VDMOSqsResistance * pow(TempRatio, model->VDMOStexp1);
drd1T_dT = rd1T * model->VDMOStexp1 / Temp;
rd1T = here->VDMOSqsResistance;
drd1T_dT = rd1T * model->VDMOStexp1 * pow(Temp, model->VDMOStexp1-1) / pow(model->VDMOStnom, model->VDMOStexp1);
}
} else {
Beta = here->VDMOStTransconductance;

View File

@ -30,10 +30,6 @@ VDMOSparam(int param, IFvalue *value, GENinstance *inst, IFvalue *select)
scale = 1;
switch (param) {
case VDMOS_TEMP:
here->VDMOStemp = value->rValue+CONSTCtoK;
here->VDMOStempGiven = TRUE;
break;
case VDMOS_DTEMP:
here->VDMOSdtemp = value->rValue;
here->VDMOSdtempGiven = TRUE;

View File

@ -304,6 +304,10 @@ VDMOSsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt,
here->VDIOconductance = 0.0;
}
if (!here->VDMOSdtempGiven) here->VDMOSdtemp = 0.0;
here->VDMOStemp = ckt->CKTtemp + here->VDMOSdtemp;
if (model->VDMOSdrainResistance > 0) {
if (here->VDMOSdNodePrime == 0) {
error = CKTmkVolt(ckt, &tmp, here->VDMOSname, "drain");

View File

@ -191,11 +191,6 @@ VDMOStemp(GENmodel *inModel, CKTcircuit *ckt)
/* loop through all the instances */
for(here=VDMOSinstances(model);here;here=VDMOSnextInstance(here)) {
if(!here->VDMOSdtempGiven) here->VDMOSdtemp = 0.0;
if(!here->VDMOStempGiven)
here->VDMOStemp = ckt->CKTtemp + here->VDMOSdtemp;
VDMOStempUpdate(model, here, here->VDMOStemp, ckt);
} /* instance */