introduce recombination current component

This commit is contained in:
dwarning 2018-07-19 15:44:06 +02:00
parent 3bae0e371c
commit 376a37a5d6
7 changed files with 46 additions and 1 deletions

View File

@ -106,6 +106,8 @@ IFparm DIOmPTable[] = { /* model parameters */
IOP( "fv_max", DIO_MOD_FV_MAX, IF_REAL, "maximum voltage in forward direction"),
IOP( "bv_max", DIO_MOD_BV_MAX, IF_REAL, "maximum voltage in reverse direction"),
IOP( "isr", DIO_MOD_ISR, IF_REAL, "Recombination saturation current"),
IOP( "nr", DIO_MOD_NR, IF_REAL, "Recombination current emission coefficient"),
IP( "d", DIO_MOD_D, IF_FLAG, "Diode model")
};

View File

@ -115,6 +115,7 @@ typedef struct sDIOinstance {
double DIOreverseKneeCurrent; /* Reverse Knee current */
double DIOjunctionCap; /* geometry adjusted junction capacitance */
double DIOjunctionSWCap; /* geometry adjusted junction sidewall capacitance */
double DIOtRecSatCur; /* temperature adjusted recombination saturation current */
/*
* naming convention:
@ -231,6 +232,8 @@ typedef struct sDIOmodel { /* model structure for a diode */
unsigned DIOtunEGcorrectionFactorGiven : 1;
unsigned DIOfv_maxGiven : 1;
unsigned DIObv_maxGiven : 1;
unsigned DIOrecSatCurGiven : 1;
unsigned DIOrecEmissionCoeffGiven : 1;
int DIOlevel; /* level selector */
double DIOsatCur; /* saturation current */
@ -284,6 +287,8 @@ typedef struct sDIOmodel { /* model structure for a diode */
double DIOtunEGcorrectionFactor; /* EG correction factor for tunneling (KEG) */
double DIOfv_max; /* maximum voltage in forward direction */
double DIObv_max; /* maximum voltage in reverse direction */
double DIOrecSatCur; /* Recombination saturation current */
double DIOrecEmissionCoeff; /* Recombination emission coefficient */
} DIOmodel;
@ -365,6 +370,8 @@ enum {
DIO_MOD_KEG,
DIO_MOD_FV_MAX,
DIO_MOD_BV_MAX,
DIO_MOD_ISR,
DIO_MOD_NR,
};
#include "dioext.h"

View File

@ -45,7 +45,8 @@ DIOload(GENmodel *inModel, CKTcircuit *ckt)
double delvd; /* change in diode voltage temporary */
double evd;
double evrev;
double gd, gdb, gdsw;
double gd, gdb, gdsw, gen_fac, gen_fac_vd;
double evd_rec, cdb_rec, gdb_rec;
double geq;
double gspr; /* area-scaled conductance */
double sarg;
@ -234,6 +235,15 @@ next1: if (model->DIOsatSWCurGiven) { /* sidewall current */
evd = exp(vd/vte);
cdb = csat*(evd-1);
gdb = csat*evd/vte;
evd_rec = exp(vd/(model->DIOrecEmissionCoeff*vt)); /* recombination current */
cdb_rec = here->DIOtRecSatCur*(evd_rec-1);
gdb_rec = here->DIOtRecSatCur*evd_rec/vt;
gen_fac = pow((pow((1-vd/here->DIOtJctPot), 2) + 0.005), here->DIOtGradingCoeff/2);
gen_fac_vd = here->DIOtGradingCoeff * (1-vd/here->DIOtJctPot) * pow((pow((1-vd/here->DIOtJctPot), 2) + 0.005), here->DIOtGradingCoeff/2-1);
cdb_rec = cdb_rec * gen_fac;
gdb_rec = gdb_rec * gen_fac + cdb_rec * gen_fac_vd;
cdb = cdb + cdb_rec;
gdb = gdb + gdb_rec;
} else if((!(model->DIObreakdownVoltageGiven)) ||
vd >= -here->DIOtBrkdwnV) { /* reverse */

View File

@ -172,6 +172,12 @@ DIOmAsk (CKTcircuit *ckt, GENmodel *inModel, int which, IFvalue *value)
case DIO_MOD_BV_MAX:
value->rValue = model->DIObv_max;
return(OK);
case DIO_MOD_ISR:
value->rValue = model->DIOrecSatCur;
return(OK);
case DIO_MOD_NR:
value->rValue = model->DIOrecEmissionCoeff;
return(OK);
default:
return(E_BADPARM);
}

View File

@ -209,6 +209,14 @@ DIOmParam(int param, IFvalue *value, GENmodel *inModel)
model->DIObv_max = value->rValue;
model->DIObv_maxGiven = TRUE;
break;
case DIO_MOD_ISR:
model->DIOrecSatCur = value->rValue;
model->DIOrecSatCurGiven = TRUE;
break;
case DIO_MOD_NR:
model->DIOrecEmissionCoeff = value->rValue;
model->DIOrecEmissionCoeffGiven = TRUE;
break;
case DIO_MOD_D:
/* no action - we already know we are a diode, but this */
/* makes life easier for spice-2 like parsers */

View File

@ -159,6 +159,12 @@ DIOsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, int *states)
if(!model->DIObv_maxGiven) {
model->DIObv_max = 1e99;
}
if(!model->DIOrecEmissionCoeffGiven) {
model->DIOrecEmissionCoeff = 1;
}
if(!model->DIOrecSatCurGiven) {
model->DIOrecSatCur = 1e-14;
}
/* loop through all the instances of the model */
for (here = DIOinstances(model); here != NULL ;

View File

@ -157,6 +157,12 @@ DIOtemp(GENmodel *inModel, CKTcircuit *ckt)
model->DIOtunSaturationCurrentExp *
log(here->DIOtemp/model->DIOnomTemp) );
here->DIOtRecSatCur = model->DIOrecSatCur * here->DIOarea * exp(
((here->DIOtemp/model->DIOnomTemp)-1) *
model->DIOactivationEnergy/(model->DIOrecEmissionCoeff*vt) +
model->DIOsaturationCurrentExp/model->DIOrecEmissionCoeff *
log(here->DIOtemp/model->DIOnomTemp) );
/* the defintion of f1, just recompute after temperature adjusting
* all the variables used in it */
here->DIOtF1=here->DIOtJctPot*