parent
10b2f96ed1
commit
c8d76014b9
|
|
@ -6,7 +6,7 @@ Ve e 0 0
|
||||||
|
|
||||||
Q1 c b e MPSA92
|
Q1 c b e MPSA92
|
||||||
|
|
||||||
.MODEL MPSA92 PNP(IS=9.53E-14 ISE=8.37E-13 ISC=9.99E-11 XTI=3.00 BF=9.80E1 BR=4.78 IKF=3.49E-2 IKR=1.00 XTB=1.5 VAF=2.60E2 VAR=1.40E2 VJE=3.00E-1 VJC=3.00E-1 RE=1.00E-2 RC=1.00E-2 RB=2.76E1 RBM=6.66E-2 IRB=7.02E-4 CJE=9.54E-11 CJC=4.66E-11 .00 FC=5.00E-1 NF=1.00 NR=1.55 NE=1.49 NC=1.50 MJE=4.26E-1 MJC=7.00E-1 TF=9.52E-10 TR=516.9p ITF=4.12E-1 VTF=9.99E5 XTF=1.03 EG=1.11 VCEO=300 ICRATING=500m MFG=SIEMENS pow_max=0.625 rth0=200 tnom=25)
|
.MODEL MPSA92 PNP(IS=9.53E-14 ISE=8.37E-13 ISC=9.99E-11 XTI=3.00 BF=9.80E1 BR=4.78 IKF=3.49E-2 IKR=1.00 XTB=1.5 VAF=2.60E2 VAR=1.40E2 VJE=3.00E-1 VJC=3.00E-1 RE=1.00E-2 RC=1.00E-2 RB=2.76E1 RBM=6.66E-2 IRB=7.02E-4 CJE=9.54E-11 CJC=4.66E-11 .00 FC=5.00E-1 NF=1.00 NR=1.55 NE=1.49 NC=1.50 MJE=4.26E-1 MJC=7.00E-1 TF=9.52E-10 TR=516.9p ITF=4.12E-1 VTF=9.99E5 XTF=1.03 EG=1.11 VCEO=300 ICRATING=500m MFG=SIEMENS pd_max=0.625 rth0=200 tnom=25)
|
||||||
|
|
||||||
.option warn=1 maxwarns=2
|
.option warn=1 maxwarns=2
|
||||||
.temp 50
|
.temp 50
|
||||||
|
|
|
||||||
|
|
@ -230,7 +230,7 @@ IFparm BJTmPTable[] = { /* model parameters */
|
||||||
IOP("vbe_max", BJT_MOD_VBE_MAX, IF_REAL, "maximum voltage B-E junction"),
|
IOP("vbe_max", BJT_MOD_VBE_MAX, IF_REAL, "maximum voltage B-E junction"),
|
||||||
IOP("vbc_max", BJT_MOD_VBC_MAX, IF_REAL, "maximum voltage B-C junction"),
|
IOP("vbc_max", BJT_MOD_VBC_MAX, IF_REAL, "maximum voltage B-C junction"),
|
||||||
IOP("vce_max", BJT_MOD_VCE_MAX, IF_REAL, "maximum voltage C-E branch"),
|
IOP("vce_max", BJT_MOD_VCE_MAX, IF_REAL, "maximum voltage C-E branch"),
|
||||||
IOP("pow_max", BJT_MOD_POW_MAX, IF_REAL, "maximum device power dissipation"),
|
IOP("pd_max", BJT_MOD_PD_MAX, IF_REAL, "maximum device power dissipation"),
|
||||||
IOP("ic_max", BJT_MOD_IC_MAX, IF_REAL, "maximum collector current"),
|
IOP("ic_max", BJT_MOD_IC_MAX, IF_REAL, "maximum collector current"),
|
||||||
IOP("ib_max", BJT_MOD_IB_MAX, IF_REAL, "maximum base current"),
|
IOP("ib_max", BJT_MOD_IB_MAX, IF_REAL, "maximum base current"),
|
||||||
IOP("te_max", BJT_MOD_TE_MAX, IF_REAL, "maximum temperature"),
|
IOP("te_max", BJT_MOD_TE_MAX, IF_REAL, "maximum temperature"),
|
||||||
|
|
|
||||||
|
|
@ -500,7 +500,7 @@ typedef struct sBJTmodel { /* model structure for a bjt */
|
||||||
double BJTvceMax; /* maximum voltage over C-E branch */
|
double BJTvceMax; /* maximum voltage over C-E branch */
|
||||||
double BJTicMax; /* maximum collector current */
|
double BJTicMax; /* maximum collector current */
|
||||||
double BJTibMax; /* maximum base current */
|
double BJTibMax; /* maximum base current */
|
||||||
double BJTpowMax; /* maximum device power dissipation */
|
double BJTpdMax; /* maximum device power dissipation */
|
||||||
double BJTteMax; /* maximum device temperature */
|
double BJTteMax; /* maximum device temperature */
|
||||||
double BJTrth0; /* thermal resistance juntion to ambient */
|
double BJTrth0; /* thermal resistance juntion to ambient */
|
||||||
|
|
||||||
|
|
@ -622,7 +622,7 @@ typedef struct sBJTmodel { /* model structure for a bjt */
|
||||||
unsigned BJTvbeMaxGiven : 1;
|
unsigned BJTvbeMaxGiven : 1;
|
||||||
unsigned BJTvbcMaxGiven : 1;
|
unsigned BJTvbcMaxGiven : 1;
|
||||||
unsigned BJTvceMaxGiven : 1;
|
unsigned BJTvceMaxGiven : 1;
|
||||||
unsigned BJTpowMaxGiven : 1;
|
unsigned BJTpdMaxGiven : 1;
|
||||||
unsigned BJTicMaxGiven : 1;
|
unsigned BJTicMaxGiven : 1;
|
||||||
unsigned BJTibMaxGiven : 1;
|
unsigned BJTibMaxGiven : 1;
|
||||||
unsigned BJTteMaxGiven : 1;
|
unsigned BJTteMaxGiven : 1;
|
||||||
|
|
@ -780,7 +780,7 @@ enum {
|
||||||
BJT_MOD_VBE_MAX,
|
BJT_MOD_VBE_MAX,
|
||||||
BJT_MOD_VBC_MAX,
|
BJT_MOD_VBC_MAX,
|
||||||
BJT_MOD_VCE_MAX,
|
BJT_MOD_VCE_MAX,
|
||||||
BJT_MOD_POW_MAX,
|
BJT_MOD_PD_MAX,
|
||||||
BJT_MOD_IC_MAX,
|
BJT_MOD_IC_MAX,
|
||||||
BJT_MOD_IB_MAX,
|
BJT_MOD_IB_MAX,
|
||||||
BJT_MOD_TE_MAX,
|
BJT_MOD_TE_MAX,
|
||||||
|
|
|
||||||
|
|
@ -422,8 +422,8 @@ BJTmAsk(CKTcircuit *ckt, GENmodel *instPtr, int which, IFvalue *value)
|
||||||
case BJT_MOD_IB_MAX:
|
case BJT_MOD_IB_MAX:
|
||||||
value->rValue = here->BJTibMax;
|
value->rValue = here->BJTibMax;
|
||||||
return(OK);
|
return(OK);
|
||||||
case BJT_MOD_POW_MAX:
|
case BJT_MOD_PD_MAX:
|
||||||
value->rValue = here->BJTpowMax;
|
value->rValue = here->BJTpdMax;
|
||||||
case BJT_MOD_RTH0:
|
case BJT_MOD_RTH0:
|
||||||
value->rValue = here->BJTrth0;
|
value->rValue = here->BJTrth0;
|
||||||
return(OK);
|
return(OK);
|
||||||
|
|
|
||||||
|
|
@ -514,9 +514,9 @@ BJTmParam(int param, IFvalue *value, GENmodel *inModel)
|
||||||
mods->BJTibMax = value->rValue;
|
mods->BJTibMax = value->rValue;
|
||||||
mods->BJTibMaxGiven = TRUE;
|
mods->BJTibMaxGiven = TRUE;
|
||||||
break;
|
break;
|
||||||
case BJT_MOD_POW_MAX:
|
case BJT_MOD_PD_MAX:
|
||||||
mods->BJTpowMax = value->rValue;
|
mods->BJTpdMax = value->rValue;
|
||||||
mods->BJTpowMaxGiven = TRUE;
|
mods->BJTpdMaxGiven = TRUE;
|
||||||
break;
|
break;
|
||||||
case BJT_MOD_TE_MAX:
|
case BJT_MOD_TE_MAX:
|
||||||
mods->BJTteMax = value->rValue;
|
mods->BJTteMax = value->rValue;
|
||||||
|
|
|
||||||
|
|
@ -375,8 +375,8 @@ BJTsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, int *states)
|
||||||
if(!model->BJTibMaxGiven) {
|
if(!model->BJTibMaxGiven) {
|
||||||
model->BJTibMax = 1e99;
|
model->BJTibMax = 1e99;
|
||||||
}
|
}
|
||||||
if(!model->BJTpowMaxGiven) {
|
if(!model->BJTpdMaxGiven) {
|
||||||
model->BJTpowMax = 1e99;
|
model->BJTpdMax = 1e99;
|
||||||
}
|
}
|
||||||
if(!model->BJTteMaxGiven) {
|
if(!model->BJTteMaxGiven) {
|
||||||
model->BJTteMax = 1e99;
|
model->BJTteMax = 1e99;
|
||||||
|
|
|
||||||
|
|
@ -18,18 +18,18 @@ BJTsoaCheck(CKTcircuit *ckt, GENmodel *inModel)
|
||||||
BJTmodel *model = (BJTmodel *) inModel;
|
BJTmodel *model = (BJTmodel *) inModel;
|
||||||
BJTinstance *here;
|
BJTinstance *here;
|
||||||
double vbe, vbc, vce; /* actual bjt voltages */
|
double vbe, vbc, vce; /* actual bjt voltages */
|
||||||
double pow;
|
double pd;
|
||||||
double ic, ib; /* actual bjt currents */
|
double ic, ib; /* actual bjt currents */
|
||||||
int maxwarns;
|
int maxwarns;
|
||||||
static int warns_vbe = 0, warns_vbc = 0, warns_vce = 0;
|
static int warns_vbe = 0, warns_vbc = 0, warns_vce = 0;
|
||||||
static int warns_pow = 0, warns_ic = 0, warns_ib = 0;
|
static int warns_pd = 0, warns_ic = 0, warns_ib = 0;
|
||||||
|
|
||||||
|
|
||||||
if (!ckt) {
|
if (!ckt) {
|
||||||
warns_vbe = 0;
|
warns_vbe = 0;
|
||||||
warns_vbc = 0;
|
warns_vbc = 0;
|
||||||
warns_vce = 0;
|
warns_vce = 0;
|
||||||
warns_pow = 0;
|
warns_pd = 0;
|
||||||
warns_ic = 0;
|
warns_ic = 0;
|
||||||
warns_ib = 0;
|
warns_ib = 0;
|
||||||
return OK;
|
return OK;
|
||||||
|
|
@ -90,49 +90,49 @@ BJTsoaCheck(CKTcircuit *ckt, GENmodel *inModel)
|
||||||
warns_ib++;
|
warns_ib++;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (warns_pow < maxwarns) {
|
if (warns_pd < maxwarns) {
|
||||||
pow = fabs(*(ckt->CKTstate0 + here->BJTcc) *
|
pd = fabs(*(ckt->CKTstate0 + here->BJTcc) *
|
||||||
(*(ckt->CKTrhsOld + here->BJTcolNode) -
|
(*(ckt->CKTrhsOld + here->BJTcolNode) -
|
||||||
*(ckt->CKTrhsOld + here->BJTemitNode))
|
*(ckt->CKTrhsOld + here->BJTemitNode))
|
||||||
);
|
);
|
||||||
pow += fabs(*(ckt->CKTstate0 + here->BJTcb) *
|
pd += fabs(*(ckt->CKTstate0 + here->BJTcb) *
|
||||||
(*(ckt->CKTrhsOld + here->BJTbaseNode) -
|
(*(ckt->CKTrhsOld + here->BJTbaseNode) -
|
||||||
*(ckt->CKTrhsOld + here->BJTemitNode))
|
*(ckt->CKTrhsOld + here->BJTemitNode))
|
||||||
);
|
);
|
||||||
pow += fabs(*(ckt->CKTstate0 + here->BJTcdsub) *
|
pd += fabs(*(ckt->CKTstate0 + here->BJTcdsub) *
|
||||||
(*(ckt->CKTrhsOld + here->BJTsubstConNode) -
|
(*(ckt->CKTrhsOld + here->BJTsubstConNode) -
|
||||||
*(ckt->CKTrhsOld + here->BJTsubstNode))
|
*(ckt->CKTrhsOld + here->BJTsubstNode))
|
||||||
);
|
);
|
||||||
if ((ckt->CKTcurrentAnalysis & DOING_TRAN) && !(ckt->CKTmode &
|
if ((ckt->CKTcurrentAnalysis & DOING_TRAN) && !(ckt->CKTmode &
|
||||||
MODETRANOP)) {
|
MODETRANOP)) {
|
||||||
pow += *(ckt->CKTstate0 + here->BJTcqsub) *
|
pd += *(ckt->CKTstate0 + here->BJTcqsub) *
|
||||||
fabs(*(ckt->CKTrhsOld + here->BJTsubstConNode) -
|
fabs(*(ckt->CKTrhsOld + here->BJTsubstConNode) -
|
||||||
*(ckt->CKTrhsOld + here->BJTsubstNode));
|
*(ckt->CKTrhsOld + here->BJTsubstNode));
|
||||||
}
|
}
|
||||||
pow *= here->BJTm;
|
pd *= here->BJTm;
|
||||||
/* derating without self-heating, external temp and model tnom given */
|
/* derating without self-heating, external temp and model tnom given */
|
||||||
if (model->BJTrth0Given && model->BJTpowMaxGiven && model->BJTtnomGiven) {
|
if (model->BJTrth0Given && model->BJTpdMaxGiven && model->BJTtnomGiven) {
|
||||||
double pow_max;
|
double pd_max;
|
||||||
if (here->BJTtemp < model->BJTtnom)
|
if (here->BJTtemp < model->BJTtnom)
|
||||||
pow_max = model->BJTpowMax;
|
pd_max = model->BJTpdMax;
|
||||||
else {
|
else {
|
||||||
pow_max = model->BJTpowMax - (here->BJTtemp - model->BJTtnom) / model->BJTrth0;
|
pd_max = model->BJTpdMax - (here->BJTtemp - model->BJTtnom) / model->BJTrth0;
|
||||||
pow_max = (pow_max > 0) ? pow_max : 0.;
|
pd_max = (pd_max > 0) ? pd_max : 0.;
|
||||||
}
|
}
|
||||||
if (pow > pow_max) {
|
if (pd > pd_max) {
|
||||||
soa_printf(ckt, (GENinstance*)here,
|
soa_printf(ckt, (GENinstance*)here,
|
||||||
"Pow=%.4g W has exceeded Pow_max=%.4g W\n at Vce=%.4g V, Ib=%.4g A, Ic=%.4g A, and Te=%.4g C\n",
|
"Pd=%.4g W has exceeded Pd_max=%.4g W\n at Vce=%.4g V, Ib=%.4g A, Ic=%.4g A, and Te=%.4g C\n",
|
||||||
pow, pow_max, vce, ib, ic, here->BJTtemp - CONSTCtoK);
|
pow, pd_max, vce, ib, ic, here->BJTtemp - CONSTCtoK);
|
||||||
warns_pow++;
|
warns_pd++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/* no derating */
|
/* no derating */
|
||||||
else {
|
else {
|
||||||
if (pow > model->BJTpowMax) {
|
if (pd > model->BJTpdMax) {
|
||||||
soa_printf(ckt, (GENinstance*)here,
|
soa_printf(ckt, (GENinstance*)here,
|
||||||
"Pow=%.4g W has exceeded Pow_max=%.4g W\n at Vce=%.4g V, Ib=%.4g A, and Ic=%.4g A\n",
|
"Pd=%.4g W has exceeded Pd_max=%.4g W\n at Vce=%.4g V, Ib=%.4g A, and Ic=%.4g A\n",
|
||||||
pow, model->BJTpowMax, vce, ib, ic);
|
pd, model->BJTpdMax, vce, ib, ic);
|
||||||
warns_pow++;
|
warns_pd++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue