add the mtriode parameter scale the triode region independently from saturation current
This commit is contained in:
parent
3b38624233
commit
f9b66af074
|
|
@ -91,6 +91,7 @@ IFparm VDMOSmPTable[] = { /* model parameters */
|
|||
IOP("rd", VDMOS_MOD_RD, IF_REAL, "Drain ohmic resistance"),
|
||||
IOP("rs", VDMOS_MOD_RS, IF_REAL, "Source ohmic resistance"),
|
||||
IOP("rg", VDMOS_MOD_RG, IF_REAL, "Gate ohmic resistance"),
|
||||
IOP("mtriode", VDMOS_MOD_MTRIODE, IF_REAL, "Conductance multiplier in triode region"),
|
||||
|
||||
/* body diode */
|
||||
IOP("bv", VDMOS_MOD_BV, IF_REAL, "Vds breakdown voltage"),
|
||||
|
|
|
|||
|
|
@ -326,6 +326,7 @@ typedef struct sVDMOSmodel { /* model structure for a resistor */
|
|||
double VDMOScgdmax;
|
||||
double VDMOSa;
|
||||
double VDMOScgs;
|
||||
double VDMOSmtr;
|
||||
|
||||
/* bulk diode */
|
||||
double VDIOjunctionCap; /* input - use tCj */
|
||||
|
|
@ -368,6 +369,7 @@ typedef struct sVDMOSmodel { /* model structure for a resistor */
|
|||
unsigned VDMOScgdmaxGiven :1;
|
||||
unsigned VDMOScgsGiven :1;
|
||||
unsigned VDMOSaGiven :1;
|
||||
unsigned VDMOSmtrGiven :1;
|
||||
|
||||
unsigned VDMOSDbvGiven :1;
|
||||
unsigned VDMOSDibvGiven :1;
|
||||
|
|
@ -431,6 +433,7 @@ enum {
|
|||
VDMOS_MOD_A,
|
||||
VDMOS_MOD_CGS,
|
||||
VDMOS_MOD_RB,
|
||||
VDMOS_MOD_MTRIODE,
|
||||
VDMOS_MOD_BV,
|
||||
VDMOS_MOD_IBV,
|
||||
VDMOS_MOD_NBV,
|
||||
|
|
|
|||
|
|
@ -403,8 +403,10 @@ VDMOSload(GENmodel *inModel, CKTcircuit *ckt)
|
|||
/*
|
||||
* saturation region
|
||||
*/
|
||||
/* scale vds with mtr */
|
||||
double mtr = model->VDMOSmtr;
|
||||
betap = Beta*(1 + model->VDMOSlambda*(vds*here->VDMOSmode));
|
||||
if (vgst <= (vds * here->VDMOSmode)) {
|
||||
if (vgst <= (vds * here->VDMOSmode) * mtr) {
|
||||
cdrain = betap*vgst*vgst*.5;
|
||||
here->VDMOSgm = betap*vgst;
|
||||
here->VDMOSgds = model->VDMOSlambda*Beta*vgst*vgst*.5;
|
||||
|
|
@ -413,13 +415,13 @@ VDMOSload(GENmodel *inModel, CKTcircuit *ckt)
|
|||
/*
|
||||
* linear region
|
||||
*/
|
||||
cdrain = betap * (vds * here->VDMOSmode) *
|
||||
(vgst - .5 * (vds * here->VDMOSmode));
|
||||
here->VDMOSgm = betap * (vds * here->VDMOSmode);
|
||||
here->VDMOSgds = betap * (vgst - (vds * here->VDMOSmode)) +
|
||||
cdrain = betap * (vds * here->VDMOSmode) * mtr *
|
||||
(vgst - .5 * (vds*here->VDMOSmode) * mtr);
|
||||
here->VDMOSgm = betap * (vds * here->VDMOSmode) * mtr;
|
||||
here->VDMOSgds = betap * (vgst - (vds * here->VDMOSmode) * mtr) +
|
||||
model->VDMOSlambda * Beta *
|
||||
(vds * here->VDMOSmode) *
|
||||
(vgst - .5 * (vds * here->VDMOSmode));
|
||||
(vds * here->VDMOSmode) * mtr *
|
||||
(vgst - .5 * (vds * here->VDMOSmode) * mtr);
|
||||
here->VDMOSgmbs = here->VDMOSgm * arg;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -45,6 +45,9 @@ VDMOSmAsk(CKTcircuit *ckt, GENmodel *inst, int which, IFvalue *value)
|
|||
case VDMOS_MOD_RG:
|
||||
value->rValue = model->VDMOSgateResistance;
|
||||
return(OK);
|
||||
case VDMOS_MOD_MTRIODE:
|
||||
value->rValue = model->VDMOSmtr;
|
||||
return(OK);
|
||||
case VDMOS_MOD_TYPE:
|
||||
if (model->VDMOStype > 0)
|
||||
value->sValue = "vdmosn";
|
||||
|
|
|
|||
|
|
@ -117,6 +117,10 @@ VDMOSmParam(int param, IFvalue *value, GENmodel *inModel)
|
|||
model->VDMOScgs = value->rValue;
|
||||
model->VDMOScgsGiven = TRUE;
|
||||
break;
|
||||
case VDMOS_MOD_MTRIODE:
|
||||
model->VDMOSmtr = value->rValue;
|
||||
model->VDMOSmtrGiven = TRUE;
|
||||
break;
|
||||
case VDMOS_MOD_BV:
|
||||
model->VDMOSDbv = value->rValue;
|
||||
model->VDMOSDbvGiven = TRUE;
|
||||
|
|
|
|||
|
|
@ -72,6 +72,9 @@ VDMOSsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt,
|
|||
if (!model->VDMOSaGiven) {
|
||||
model->VDMOSa = 1.;
|
||||
}
|
||||
if (!model->VDMOSmtrGiven) {
|
||||
model->VDMOSmtr = 1.;
|
||||
}
|
||||
if (!model->VDMOSDbvGiven) {
|
||||
model->VDMOSDbv = 1.0e30;
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue