Browse Source

Fix a bug in simple diode, when ilimit is set, but not epsilon.

Make model more similar to LTSPICE
Add an example
pre-master-46
Holger Vogt 4 years ago
parent
commit
ec6a902fb9
  1. 25
      examples/xspice/simple-diode.cir
  2. 13
      src/xspice/icm/xtradev/sidiode/cfunc.mod

25
examples/xspice/simple-diode.cir

@ -0,0 +1,25 @@
simple diode automatic test
* 'set ngbehavior=lta' required in .spiceinit
V1 in 0 dc 0
D1 in out1 A
R1 out1 0 1u
D2 in out2 B
R2 out2 0 1u
D3 in out3 C
R3 out3 0 1u
.probe alli
.model A D(Ron=1 Roff=1Meg Vfwd=1 Vrev=2)
.model B D(Ron=1 Roff=1Meg Vfwd=1 Vrev=2 Ilimit=1 RevILimit=1)
.model C D(Ron=1 Roff=1Meg Vfwd=1 Vrev=2 Ilimit=1 RevILimit=1 epsilon=1 revepsilon=1)
.control
dc V1 -5 5 1m
display
set xbrushwidth=2
plot i(r1) i(r2) i(r3)
.endc
.end

13
src/xspice/icm/xtradev/sidiode/cfunc.mod

@ -147,23 +147,22 @@ void cm_sidiode(ARGS) /* structure holding parms,
grev = 1./PARAM(rrev); grev = 1./PARAM(rrev);
hRevepsilon = 0.5 * PARAM(revepsilon); hRevepsilon = 0.5 * PARAM(revepsilon);
loc->Va = Va = Vrev - hRevepsilon;
loc->Vb = Vb = Vrev + hRevepsilon;
loc->Va = Va = Vrev - PARAM(revepsilon); //hRevepsilon;
loc->Vb = Vb = Vrev; //+ hRevepsilon;
loc->a2 = grev/Revilimit;
if(hRevepsilon > 0.0) { if(hRevepsilon > 0.0) {
loc->a1 = (goff - grev)/PARAM(revepsilon); loc->a1 = (goff - grev)/PARAM(revepsilon);
loc->a2 = grev/Revilimit;
loc->revepsi = MIF_TRUE; loc->revepsi = MIF_TRUE;
} }
else else
loc->revepsi = MIF_FALSE; loc->revepsi = MIF_FALSE;
hEpsilon = 0.5 * PARAM(epsilon); hEpsilon = 0.5 * PARAM(epsilon);
loc->Vc = Vc = Vfwd - hEpsilon;
loc->Vd = Vd = Vfwd + hEpsilon;
loc->Vc = Vc = Vfwd; // - hEpsilon;
loc->Vd = Vd = Vfwd + PARAM(epsilon); //hEpsilon;
loc->b2 = gon/Ilimit;
if(hEpsilon > 0.0) { if(hEpsilon > 0.0) {
loc->b1 = (gon - goff)/PARAM(epsilon); loc->b1 = (gon - goff)/PARAM(epsilon);
loc->b2 = gon/Ilimit;
loc->epsi = MIF_TRUE; loc->epsi = MIF_TRUE;
} }
else else

Loading…
Cancel
Save