Add a limit capability to the code model aswitch
Example switch-oscillators_inc.cir showed currents up to 3GA
This commit is contained in:
parent
4bcacb310d
commit
fdc143ce16
|
|
@ -3,14 +3,13 @@
|
|||
.control
|
||||
destroy all
|
||||
run
|
||||
plot I(vmeasure)
|
||||
plot I(vmeasure) ylimit 0 5m
|
||||
plot V(Osc_out)
|
||||
rusage
|
||||
.endc
|
||||
|
||||
.ic v(N017)=0.25
|
||||
.tran 50p 40n 50p uic
|
||||
*.option method=gear maxord=3
|
||||
.tran 50p 40n 50p
|
||||
|
||||
VDD VDD2 0 DC 3
|
||||
|
||||
|
|
|
|||
|
|
@ -8029,7 +8029,7 @@ static struct card *pspice_compat(struct card *oldcard)
|
|||
tfree(card->line);
|
||||
rep_spar(modpar);
|
||||
card->line = tprintf(
|
||||
".model a%s aswitch(%s %s %s %s log=TRUE)", modname,
|
||||
".model a%s aswitch(%s %s %s %s log=TRUE limit=TRUE)", modname,
|
||||
modpar[0], modpar[1], modpar[2], modpar[3]);
|
||||
}
|
||||
for (i = 0; i < 4; i++)
|
||||
|
|
@ -8210,7 +8210,7 @@ static struct card *pspice_compat(struct card *oldcard)
|
|||
tfree(card->line);
|
||||
rep_spar(modpar);
|
||||
card->line = tprintf(
|
||||
".model a%s aswitch(%s %s %s %s log=TRUE)", modname,
|
||||
".model a%s aswitch(%s %s %s %s log=TRUE limit=TRUE)", modname,
|
||||
modpar[0], modpar[1], modpar[2], modpar[3]);
|
||||
}
|
||||
for (i = 0; i < 4; i++)
|
||||
|
|
|
|||
|
|
@ -150,7 +150,14 @@ void cm_aswitch(ARGS) /* structure holding parms,
|
|||
if ( PARAM(log) == MIF_TRUE ) { /* Logarithmic Variation in 'R' */
|
||||
intermediate = log(r_off / r_on) / (cntl_on - cntl_off);
|
||||
r = r_on * exp(intermediate * (cntl_on - INPUT(cntl_in)));
|
||||
if(r<=1.0e-9) r=1.0e-9;/* minimum resistance limiter */
|
||||
|
||||
if (PARAM(limit) == MIF_TRUE) {
|
||||
if(r<r_on) r=r_on;/* minimum resistance limiter */
|
||||
if(r>r_off) r=r_off;/* maximum resistance limiter */
|
||||
}
|
||||
else {
|
||||
if(r<=1.0e-9) r=1.0e-9;/* minimum resistance limiter */
|
||||
}
|
||||
pi_pvout = 1.0 / r;
|
||||
pi_pcntl = intermediate * INPUT(out) / r;
|
||||
}
|
||||
|
|
@ -158,14 +165,18 @@ void cm_aswitch(ARGS) /* structure holding parms,
|
|||
intermediate = (r_on - r_off) / (cntl_on - cntl_off);
|
||||
r = INPUT(cntl_in) * intermediate + ((r_off*cntl_on -
|
||||
r_on*cntl_off) / (cntl_on - cntl_off));
|
||||
if(r<=1.0e-9) r=1.0e-9;/* minimum resistance limiter */
|
||||
|
||||
if (PARAM(limit) == MIF_TRUE) {
|
||||
if(r<r_on) r=r_on;/* minimum resistance limiter */
|
||||
if(r>r_off) r=r_off;/* maximum resistance limiter */
|
||||
}
|
||||
else {
|
||||
if(r<=1.0e-9) r=1.0e-9;/* minimum resistance limiter */
|
||||
}
|
||||
pi_pvout = 1.0 / r;
|
||||
pi_pcntl = -intermediate * INPUT(out) / (r*r);
|
||||
}
|
||||
|
||||
/*pi_pvout = 1.0 / r;*/
|
||||
|
||||
|
||||
if(ANALYSIS != MIF_AC) { /* Output DC & Transient Values */
|
||||
OUTPUT(out) = INPUT(out) / r; /* Note that the minus */
|
||||
PARTIAL(out,out) = pi_pvout; /* Signs are required */
|
||||
|
|
|
|||
|
|
@ -67,11 +67,11 @@ Null_Allowed: yes yes
|
|||
|
||||
PARAMETER_TABLE:
|
||||
|
||||
Parameter_Name: r_on
|
||||
Description: "on resistance"
|
||||
Data_Type: real
|
||||
Default_Value: 1.0
|
||||
Limits: -
|
||||
Vector: no
|
||||
Vector_Bounds: -
|
||||
Null_Allowed: yes
|
||||
Parameter_Name: r_on limit
|
||||
Description: "on resistance" "set upper and lower limits to resistance"
|
||||
Data_Type: real boolean
|
||||
Default_Value: 1.0 false
|
||||
Limits: - -
|
||||
Vector: no no
|
||||
Vector_Bounds: - -
|
||||
Null_Allowed: yes yes
|
||||
|
|
|
|||
Loading…
Reference in New Issue