add parallel resistor rds (between outer drain and source nodes, parallel to bulk diode)

This commit is contained in:
Holger Vogt 2018-04-11 12:38:40 +02:00 committed by rlar
parent b7c6145f5e
commit 4a3c707036
7 changed files with 39 additions and 5 deletions

View File

@ -97,6 +97,7 @@ IFparm VDMOSmPTable[] = { /* model parameters */
IOP("bv", VDMOS_MOD_BV, IF_REAL, "Vds breakdown voltage"),
IOP("ibv", VDMOS_MOD_IBV, IF_REAL, "Current at Vds=bv"),
IOP("nbv", VDMOS_MOD_NBV, IF_REAL, "Vds breakdown emission coefficient"),
IOP("rds", VDMOS_MOD_RDS, IF_REAL, "Drain-source shunt resistance"),
IOP("rb", VDMOS_MOD_RB, IF_REAL, "Body diode ohmic resistance"),
IOP("n", VDMOS_MOD_N, IF_REAL, "Bulk diode emission coefficient"),
IOP("tt", VDMOS_MOD_TT, IF_REAL, "Body diode transit time"),

View File

@ -54,6 +54,7 @@ typedef struct sVDMOSinstance {
double VDMOSsourceConductance; /*conductance of source(or 0):set in setup*/
double VDMOSdrainConductance; /*conductance of drain(or 0):set in setup*/
double VDMOSgateConductance; /*conductance of gate(or 0):set in setup*/
double VDMOSdsConductance; /*conductance of drain to source:set in setup*/
double VDMOStemp; /* operating temperature of this instance */
double VDMOSdtemp; /* operating temperature of the instance relative to circuit temperature*/
@ -245,6 +246,10 @@ typedef struct sVDMOSinstance {
* (gate node, gate prime node) */
double *VDMOSGPgPtr; /* pointer to sparse matrix element at
* (gate prime node, gate node) */
double *VDMOSDsPtr; /* pointer to sparse matrix element at
* (source node, drain node) */
double *VDMOSSdPtr; /* pointer to sparse matrix element at
* (drain node, source node) */
/* bulk diode */
double *VDIORPdPtr; /* pointer to sparse matrix element at
* (diode prime node, drain node) */
@ -340,6 +345,7 @@ typedef struct sVDMOSmodel { /* model structure for a resistor */
double VDIOresistTemp1;
double VDIOresistTemp2;
double VDIOconductance;
double VDMOSrds;
double VDMOSDn;
double VDIOtransitTime;
double VDIOtranTimeTemp1;
@ -377,6 +383,7 @@ typedef struct sVDMOSmodel { /* model structure for a resistor */
unsigned VDIOjunctionPotGiven :1;
unsigned VDIObrkdEmissionCoeffGiven :1;
unsigned VDIOresistanceGiven :1;
unsigned VDMOSrdsGiven :1;
unsigned VDMOSDnGiven :1;
unsigned VDIOtransitTimeGiven :1;
unsigned VDMOSDegGiven :1;
@ -437,6 +444,7 @@ enum {
VDMOS_MOD_BV,
VDMOS_MOD_IBV,
VDMOS_MOD_NBV,
VDMOS_MOD_RDS,
VDMOS_MOD_N,
VDMOS_MOD_TT,
VDMOS_MOD_EG,

View File

@ -563,9 +563,6 @@ bypass :
ceqgb = ceqgb - gcgb*vgb + ckt->CKTag[0] *
*(ckt->CKTstate0 + here->VDMOSqgb);
}
/*
* store charge storage info for meyer's cap in lx table
*/
/*
* load current vector
@ -597,9 +594,9 @@ bypass :
* load y matrix
*/
*(here->VDMOSDdPtr) += (here->VDMOSdrainConductance);
*(here->VDMOSDdPtr) += (here->VDMOSdrainConductance + here->VDMOSdsConductance);
*(here->VDMOSGgPtr) += (here->VDMOSgateConductance); //((gcgd + gcgs + gcgb));
*(here->VDMOSSsPtr) += (here->VDMOSsourceConductance);
*(here->VDMOSSsPtr) += (here->VDMOSsourceConductance + here->VDMOSdsConductance);
*(here->VDMOSBbPtr) += (here->VDMOSgbd + here->VDMOSgbs + gcgb);
*(here->VDMOSDPdpPtr) +=
(here->VDMOSdrainConductance + here->VDMOSgds +
@ -630,6 +627,9 @@ bypass :
*(here->VDMOSSPdpPtr) += (-here->VDMOSgds - xrev*
(here->VDMOSgm + here->VDMOSgmbs));
*(here->VDMOSDsPtr) += (-here->VDMOSdsConductance);
*(here->VDMOSSdPtr) += (-here->VDMOSdsConductance);
/* bulk diode model
* Delivers reverse conduction and forward breakdown

View File

@ -95,6 +95,9 @@ VDMOSmAsk(CKTcircuit *ckt, GENmodel *inst, int which, IFvalue *value)
case VDMOS_MOD_NBV:
value->rValue = model->VDIObrkdEmissionCoeff;
return(OK);
case VDMOS_MOD_RDS:
value->rValue = model->VDMOSrds;
return(OK);
case VDMOS_MOD_FC:
value->rValue = model->VDIOdepletionCapCoeff;
return(OK);

View File

@ -133,6 +133,10 @@ VDMOSmParam(int param, IFvalue *value, GENmodel *inModel)
model->VDIObrkdEmissionCoeff = value->rValue;
model->VDIObrkdEmissionCoeffGiven = TRUE;
break;
case VDMOS_MOD_RDS:
model->VDMOSrds = value->rValue;
model->VDMOSrdsGiven = TRUE;
break;
case VDMOS_MOD_N:
model->VDMOSDn = value->rValue;
model->VDMOSDnGiven = TRUE;

View File

@ -84,6 +84,9 @@ VDMOSsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt,
if (!model->VDIObrkdEmissionCoeffGiven) {
model->VDIObrkdEmissionCoeff = 1.;
}
if (!model->VDMOSrdsGiven) {
model->VDMOSrds = 1.0e30;
}
if (!model->VDMOSDnGiven) {
model->VDMOSDn = 1.;
}
@ -279,6 +282,9 @@ do { if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\
TSTALLOC(VDMOSGgpPtr, VDMOSgNode, VDMOSgNodePrime);
TSTALLOC(VDMOSGPgPtr, VDMOSgNodePrime, VDMOSgNode);
TSTALLOC(VDMOSDsPtr, VDMOSdNode, VDMOSsNode);
TSTALLOC(VDMOSSdPtr, VDMOSsNode, VDMOSdNode);
TSTALLOC(VDIORPdPtr, VDIOposPrimeNode, VDMOSdNode);
TSTALLOC(VDIODrpPtr, VDMOSdNode, VDIOposPrimeNode);
TSTALLOC(VDIOSrpPtr, VDMOSsNode, VDIOposPrimeNode);

View File

@ -160,6 +160,18 @@ VDMOStemp(GENmodel *inModel, CKTcircuit *ckt)
} else {
here->VDMOSgateConductance = 0;
}
if (model->VDMOSrdsGiven) {
if (model->VDMOSrds != 0) {
here->VDMOSdsConductance = here->VDMOSm /
model->VDMOSrds;
}
else {
here->VDMOSdsConductance = 0;
}
}
else {
here->VDMOSdsConductance = 0;
}
/* bulk diode model */
double egfet1, arg1, fact1, pbfact1, pbo, gmaold;