introduce parameter ksubthres, compatible to LTSPICE

This commit is contained in:
Holger Vogt 2018-04-29 00:09:53 +02:00 committed by rlar
parent a0867ff1a3
commit 93e34540b8
6 changed files with 37 additions and 1 deletions

View File

@ -87,6 +87,7 @@ IFparm VDMOSmPTable[] = { /* model parameters */
/* weak inversion */
IOP("subslope", VDMOS_MOD_SUBSLOPE, IF_REAL, "Slope of weak inversion log current versus vgs - vth"),
IOP("subshift", VDMOS_MOD_SUBSHIFT, IF_REAL, "Shift of weak inversion plot on the vgs axis"),
IOP("ksubthres", VDMOS_MOD_KSUBTHRES, IF_REAL, "Shift of weak inversion plot on the vgs axis"),
/* body diode */
IOP("bv", VDMOS_MOD_BV, IF_REAL, "Vds breakdown voltage"),

View File

@ -334,6 +334,7 @@ typedef struct sVDMOSmodel { /* model structure for a resistor */
double VDMOScgs;
double VDMOSsubsl;
double VDMOSsubshift;
double VDMOSksubthres;
double VDMOSmtr;
/* bulk diode */
@ -383,6 +384,7 @@ typedef struct sVDMOSmodel { /* model structure for a resistor */
unsigned VDMOSaGiven :1;
unsigned VDMOSsubslGiven :1;
unsigned VDMOSsubshiftGiven :1;
unsigned VDMOSksubthresGiven :1;
unsigned VDMOSmtrGiven :1;
unsigned VDMOSDbvGiven :1;
@ -452,6 +454,7 @@ enum {
VDMOS_MOD_MTRIODE,
VDMOS_MOD_SUBSLOPE,
VDMOS_MOD_SUBSHIFT,
VDMOS_MOD_KSUBTHRES,
VDMOS_MOD_BV,
VDMOS_MOD_IBV,
VDMOS_MOD_NBV,

View File

@ -367,7 +367,29 @@ VDMOSload(GENmodel *inModel, CKTcircuit *ckt)
arg = 0;
/* drain current including subthreshold current
* numerical differentiation for gd and gm with a delta of 2 mV */
if (model->VDMOSsubslGiven && (here->VDMOSmode == 1)) {
if (model->VDMOSksubthresGiven && (here->VDMOSmode == 1)) {
double delta = 0.001;
cdrain = cweakinv(model->VDMOSksubthres, model->VDMOSsubshift, vgst, vds, model->VDMOSlambda,
Beta, vt, model->VDMOSmtr);
/* gd */
double vds1 = vds + delta;
double cdrp = cweakinv(model->VDMOSksubthres, model->VDMOSsubshift, vgst, vds1, model->VDMOSlambda,
Beta, vt, model->VDMOSmtr);
vds1 = vds - delta;
double cdrm = cweakinv(model->VDMOSksubthres, model->VDMOSsubshift, vgst, vds1, model->VDMOSlambda,
Beta, vt, model->VDMOSmtr);
here->VDMOSgds = (cdrp - cdrm) / (2. * delta);
/* gm */
double vgst1 = vgst + delta;
cdrp = cweakinv(model->VDMOSksubthres, model->VDMOSsubshift, vgst1, vds, model->VDMOSlambda,
Beta, vt, model->VDMOSmtr);
vgst1 = vgst - delta;
cdrm = cweakinv(model->VDMOSksubthres, model->VDMOSsubshift, vgst1, vds, model->VDMOSlambda,
Beta, vt, model->VDMOSmtr);
here->VDMOSgm = (cdrp - cdrm) / (2. * delta);
here->VDMOSgmbs = 0.;
}
else if (model->VDMOSsubslGiven && (here->VDMOSmode == 1)) {
double delta = 0.001;
cdrain = cweakinv(model->VDMOSsubsl, model->VDMOSsubshift, vgst, vds, model->VDMOSlambda,
Beta, vt, model->VDMOSmtr);

View File

@ -60,6 +60,9 @@ VDMOSmAsk(CKTcircuit *ckt, GENmodel *inst, int which, IFvalue *value)
case VDMOS_MOD_SUBSHIFT:
value->rValue = model->VDMOSsubshift;
return(OK);
case VDMOS_MOD_KSUBTHRES:
value->rValue = model->VDMOSksubthres;
return(OK);
case VDMOS_MOD_TYPE:
if (model->VDMOStype > 0)
value->sValue = "vdmosn";

View File

@ -141,6 +141,10 @@ VDMOSmParam(int param, IFvalue *value, GENmodel *inModel)
model->VDMOSsubshift = value->rValue;
model->VDMOSsubshiftGiven = TRUE;
break;
case VDMOS_MOD_KSUBTHRES:
model->VDMOSksubthres = value->rValue;
model->VDMOSksubthresGiven = TRUE;
break;
case VDMOS_MOD_BV:
model->VDMOSDbv = value->rValue;
model->VDMOSDbvGiven = TRUE;

View File

@ -78,6 +78,9 @@ VDMOSsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt,
if (!model->VDMOSsubshiftGiven) {
model->VDMOSsubshift = 0;
}
if (!model->VDMOSksubthresGiven) {
model->VDMOSksubthres = 0;
}
if (!model->VDMOSmtrGiven) {
model->VDMOSmtr = 1.;
}