mirror of
https://git.code.sf.net/p/ngspice/ngspice
synced 2026-08-22 13:57:32 +02:00
Some update to SOA for a diode:
Limit output to four digits Add power and temperature limits. Derating with self-heating, or with fixed temperature, or no derating at all, selectable by setting model parameters. Example file: SOA plotted as frame, with diode current.
This commit is contained in:
@@ -0,0 +1,117 @@
|
||||
SOA test for generic diode, including self-heating
|
||||
* forward direction
|
||||
* ngspice-35
|
||||
|
||||
*.temp 200
|
||||
|
||||
vtamb tamb 0 27
|
||||
|
||||
v1 1 0 0.7
|
||||
R1 1 0 100 ; just a parallel resistor
|
||||
D1 1 0 tj dmod thermal
|
||||
Rtj tj tamb 100 ; the thermal resistance junction to ambient
|
||||
* diode model parameters include all SOA parameters
|
||||
.model dmod d (rs=200m bv=21 rth0=1e6 tnom=25 fv_max=1.5 bv_max=20 id_max=1.5 pd_max=1 te_max=175)
|
||||
|
||||
.option warn=1 maxwarns=2
|
||||
|
||||
.control
|
||||
save @d1[id] all
|
||||
*dc v1 3 -22.5 -0.5
|
||||
dc v1 0.02 2 0.02
|
||||
*display
|
||||
set xbrushwidth=3
|
||||
|
||||
* get data from diode model
|
||||
let pdmax = @dmod[pd_max]
|
||||
let idmax = @dmod[id_max]
|
||||
let vmax = @dmod[fv_max]
|
||||
let tmax = @dmod[te_max]
|
||||
let tnom = @dmod[tnom]
|
||||
|
||||
let iid = @d1[id]
|
||||
let ilen = length(iid)
|
||||
let soa = unitvec(ilen) * idmax
|
||||
* the current power dissipation in the diode
|
||||
let pd=@d1[id]*v(1) + 1p ; 1p for log scale, avoid 0
|
||||
|
||||
* plot the static SOA diagram
|
||||
* no self heating
|
||||
let i = 0
|
||||
while i < ilen
|
||||
* power limit
|
||||
let pp = soa[i] * v(1)[i]
|
||||
if pp > pdmax
|
||||
let soa[i] = soa[i] * pdmax / pp
|
||||
end
|
||||
* voltage limit
|
||||
if v(1)[i] > vmax
|
||||
let soa[i] = 1p
|
||||
end
|
||||
* temperature limit
|
||||
let tcur = pp * @Rtj[r] + v(tamb)
|
||||
if tcur[i] > tmax
|
||||
let soa[i] = 1p
|
||||
end
|
||||
let i = i + 1
|
||||
end
|
||||
|
||||
settype current iid soa
|
||||
plot iid soa loglog ylimit 10m 10 xlimit 0.1 1 title 'Diode SOA (safe operating area, no self-heating)' ylabel 'Diode current' xlabel 'Diode forward voltage'
|
||||
|
||||
|
||||
|
||||
unlet pdmax
|
||||
let pdmax = @dmod[pd_max] - (v(tj) - tnom) / @Rtj[r]
|
||||
let tdio = v(tj)
|
||||
|
||||
echo
|
||||
*echo pdmax $&pdmax
|
||||
*echo temp $&tdio
|
||||
*echo tnom $&tnom
|
||||
echo
|
||||
|
||||
let plen = length(pdmax)
|
||||
let i = 0
|
||||
while i < plen
|
||||
if pdmax[i] < 0
|
||||
let pdmax[i] = 1p
|
||||
end
|
||||
let i = i + 1
|
||||
end
|
||||
|
||||
* plot the static SOA diagram
|
||||
* now with self heating
|
||||
let i = 0
|
||||
while i < ilen
|
||||
* power limit
|
||||
let pp = soa[i] * v(1)[i]
|
||||
if pp > pdmax[i]
|
||||
let soa[i] = soa[i] * pdmax[i] / pp
|
||||
end
|
||||
* voltage limit
|
||||
if v(1)[i] > vmax
|
||||
let soa[i] = 1p
|
||||
end
|
||||
* temperature limit
|
||||
let tcur = pp * @Rtj[r] + v(tamb)
|
||||
if tcur[i] > tmax
|
||||
let soa[i] = 1p
|
||||
end
|
||||
let i = i + 1
|
||||
end
|
||||
|
||||
settype current iid soa
|
||||
plot iid soa loglog ylimit 10m 10 xlimit 0.1 1 title 'Diode SOA (safe operating area, including self-heating)' ylabel 'Diode current' xlabel 'Diode forward voltage'
|
||||
|
||||
*settype power pd pdmax
|
||||
*plot pd pdmax loglog ylimit 1m 10 xlimit 0.1 1
|
||||
|
||||
*settype temperature tj
|
||||
*plot tj
|
||||
|
||||
*plot pd vs tj pdmax vs tj
|
||||
|
||||
.endc
|
||||
|
||||
.end
|
||||
Reference in New Issue
Block a user