Add SOA-check for collector-substrate diode (model parameter bvsub)

This commit is contained in:
Holger Vogt 2023-03-22 18:08:15 +01:00
parent ff77c583d7
commit 443567dbaf
5 changed files with 24 additions and 2 deletions

View File

@ -185,6 +185,8 @@ IFparm VBICmPTable[] = { /* model parameters */
IOPR("bvbc", VBIC_MOD_VBC_MAX, IF_REAL, "maximum voltage B-C junction"),
IOP("vce_max", VBIC_MOD_VCE_MAX, IF_REAL, "maximum voltage C-E branch"),
IOPR("bvce", VBIC_MOD_VCE_MAX, IF_REAL, "maximum voltage C-E branch"),
IOP("vsub_max", VBIC_MOD_VSUB_MAX, IF_REAL, "maximum voltage C-substrate branch"),
IOPR("bvsub", VBIC_MOD_VSUB_MAX, IF_REAL, "maximum voltage C-substrate branch"),
IOP("selft", VBIC_MOD_SELFT, IF_INTEGER, "0: self-heating off, 1: self-heating on")
};

View File

@ -485,6 +485,7 @@ typedef struct sVBICmodel { /* model structure for a vbic */
double VBICvbeMax; /* maximum voltage over B-E junction */
double VBICvbcMax; /* maximum voltage over B-C junction */
double VBICvceMax; /* maximum voltage over C-E branch */
double VBICvsubMax; /* maximum voltage over C-substrate branch */
unsigned VBICtnomGiven : 1;
unsigned VBICextCollResistGiven : 1;
@ -600,6 +601,7 @@ typedef struct sVBICmodel { /* model structure for a vbic */
unsigned VBICvbeMaxGiven : 1;
unsigned VBICvbcMaxGiven : 1;
unsigned VBICvceMaxGiven : 1;
unsigned VBICvsubMaxGiven : 1;
} VBICmodel;
#ifndef NPN
@ -736,6 +738,7 @@ enum {
VBIC_MOD_VBE_MAX,
VBIC_MOD_VBC_MAX,
VBIC_MOD_VCE_MAX,
VBIC_MOD_VSUB_MAX,
VBIC_MOD_SELFT,
};

View File

@ -363,6 +363,9 @@ VBICmAsk(CKTcircuit *ckt, GENmodel *instPtr, int which, IFvalue *value)
case VBIC_MOD_VCE_MAX:
value->rValue = here->VBICvceMax;
return(OK);
case VBIC_MOD_VSUB_MAX:
value->rValue = here->VBICvsubMax;
return(OK);
case VBIC_MOD_TYPE:
if (here->VBICtype == NPN)
value->sValue = "npn";

View File

@ -509,6 +509,10 @@ VBICmParam(int param, IFvalue *value, GENmodel *inModel)
mods->VBICvceMax = value->rValue;
mods->VBICvceMaxGiven = TRUE;
break;
case VBIC_MOD_VSUB_MAX:
mods->VBICvsubMax = value->rValue;
mods->VBICvsubMaxGiven = TRUE;
break;
case VBIC_MOD_SELFT:
mods->VBICselft = value->iValue;
mods->VBICselftGiven = TRUE;

View File

@ -17,14 +17,15 @@ VBICsoaCheck(CKTcircuit *ckt, GENmodel *inModel)
{
VBICmodel *model = (VBICmodel *) inModel;
VBICinstance *here;
double vbe, vbc, vce; /* actual bjt voltages */
double vbe, vbc, vce, vsub; /* actual bjt voltages */
int maxwarns;
static int warns_vbe = 0, warns_vbc = 0, warns_vce = 0;
static int warns_vbe = 0, warns_vbc = 0, warns_vce = 0, warns_vsub = 0;
if (!ckt) {
warns_vbe = 0;
warns_vbc = 0;
warns_vce = 0;
warns_vsub = 0;
return OK;
}
@ -40,6 +41,8 @@ VBICsoaCheck(CKTcircuit *ckt, GENmodel *inModel)
ckt->CKTrhsOld [here->VBICcollNode]);
vce = fabs(ckt->CKTrhsOld [here->VBICcollNode] -
ckt->CKTrhsOld [here->VBICemitNode]);
vsub = fabs(ckt->CKTrhsOld [here->VBICcollNode] -
ckt->CKTrhsOld [here->VBICsubsNode]);
if (vbe > model->VBICvbeMax)
if (warns_vbe < maxwarns) {
@ -65,6 +68,13 @@ VBICsoaCheck(CKTcircuit *ckt, GENmodel *inModel)
warns_vce++;
}
if (vsub > model->VBICvsubMax)
if (warns_vsub < maxwarns) {
soa_printf(ckt, (GENinstance*) here,
"|Vce|=%g has exceeded Vce_max=%g\n",
vsub, model->VBICvsubMax);
warns_vsub++;
}
}
}