add the mtriode parameter scale the triode region independently from saturation current

This commit is contained in:
Holger Vogt 2018-04-09 23:12:32 +02:00 committed by rlar
parent 3b38624233
commit f9b66af074
6 changed files with 23 additions and 7 deletions

View File

@ -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"),

View File

@ -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,

View File

@ -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;
}
}

View File

@ -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";

View File

@ -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;

View File

@ -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;
}