Home │ Audio
Home Page |
Copyright © 2013 by Wayne Stegall
Updated December 9, 2015. See Document History at end for
details.
Figure
1:
Current
Limiter |
(1) |
ILIMIT = |
VT
RS |
Figure
2:
Voltage
Limiter |
(2) |
VLIMIT = |
R1 + R2
R1 |
× VT |
Figure
3:
Amplified
diode |
Figure
4:
Safe-area
Limiter |
Figure
5:
Specified
load-line
and
power
limit
boundaries |
Legend: — load line — power limit |
Figure
6:
Illustration
of
a
parallel
limit
line
positioned
for
maximum
power |
Legend: — load line — power limit — limit line |
Figure
7:
Illustration
of
a
limit
more
likely
to
activate
at
peak
signal |
Legend: — load line — power limit — limit line |
(3) |
kvVDS + kiIDS = VT |
(4) |
VDS = |
VT
- kiIDS
kv |
= |
VT
kv |
– | ki
kv |
IDS |
(5) |
P = IDSVDS = IDS | VT
kv |
– | ki
kv |
IDS |
(6) |
P = – | ki
kv |
IDS2 | + | VT
kv |
IDS |
(7) |
dP dIDS |
= – | 2ki
kv |
IDS | + | VT
kv |
= 0 |
(8) |
2ki
kv |
IDS | = | VT
kv |
(9) |
IDS | = | VT
2ki |
(10) |
PMAX = |
VT
kv |
VT
2ki |
– | ki
kv |
VT
2ki |
2 |
(11) |
PMAX = |
VT2
2kvki |
– | kiVT2
4kvki2 |
= | VT2
2kvki |
– |
VT2
4kvki |
(12) |
PMAX = |
VT2
4kvki |
If ZLIM = - |
ki
kv |
, then ki = |ZLIM|kv |
(13) |
PMAX = |
VT2
4|ZLIM|kv2 |
(14) |
kv = |
|
(15) |
kv = | R1 || R3
(R1 || R3) + R2 |
(16) |
ki = | R1 || R2
(R1 || R2) + R3 |
(17) |
|
VD + |
R1 || R2
(R1 || R2) + R3 |
IDS = VT |
(18) |
(R1 || R3) + R2 = | R1 || R3
kv |
(19) |
R2 = | R1 || R3
kv |
– (R1 || R3) |
(20) |
(R1 || R2) + R3 = | R1 || R2
ki |
(21) |
R3 = | R1 || R2
ki |
– (R1 || R2) |
Figure
8:
C++
code
for
calculating
safe-area
limiter
component
values |
/* sal.cpp - prove the equations calculated to define a single-slope safe area limiter. */ #include <iostream> #include <cmath> using namespace std; #define PAR(x,y) ((x)*(y)/((x)+(y))) /* If convergence is at least as good as binary, iterations equal to the number of bits in the mantissa of a double are sure to produce double accuracy */ #define ITER 52 int main(void) { int i; double zlim, pmax, kv, ki, vt; double r1, r2, r3, rs, rtmp; double vmax, imax; // input values zlim = 8.0; pmax = 300.0; r1 = 68.0; rs = 0.1; vt = 0.763; // calculate limit line specifications kv = sqrt((vt*vt)/(4.0*zlim*pmax)); ki = kv*zlim; vmax = vt/kv; imax = vt/ki; // calculate component values r2 = r1; r3 = r1; for(i=0;i<ITER;i++) { rtmp = PAR(r1,r3); r2 = (rtmp/kv)-rtmp; rtmp = PAR(r1,r2); r3 = (rs*rtmp/ki)-rtmp; // watch results for convergence cout << "R2 = " << r2 << ",\t" << "R3 = " << r3 << endl; } // print remaining results cout << "Seed values:" << endl; cout << "R1 = " << r1 << ",\t" << "RS = " << rs << endl; cout << "VT = " << vt << ",\t" << "PMAX = " << pmax; cout << ",\t" << "ZLIM = " << zlim << endl; cout << "Endpoints: " << vmax << "V,\t" << imax << "A" << endl; return 0; } |
Figure 9: Program output for parameters given |
R2 =
4332.06, R3 = 40.5156 R2 = 3234.86, R3 = 40.3043 R2 = 3224.26, R3 = 40.3016 ... R2 = 3224.13, R3 = 40.3016 Seed values: R1 = 68, RS = 0.1 VT = 0.763, PMAX = 300, ZLIM = 8 Endpoints: 97.9796V, 12.2474A |
Figure
10:
Illustration
of
a
limit
more
likely
to
activate
at
peak
signal |
SPICE model |
Figure
11:
An
op-amp
model
of
limit
line
only.: |
(22) |
VD = – | R2
R3 |
(RSIDS–VT) – | R2
R1 |
(0–VT) + VT |
(23) |
VD = – | R2RS
R3 |
IDS + | R2
R3 |
+ |
R2
R1 |
+ 1 |
VT |
(24) |
ZLIM = – | R2RS
R3 |
(25) |
IR1 = – | VD–VT
R2 |
+ | RSIDS–VT
R3 |
= |
VT
R1 |
(26) |
R1 = |
|
(27) |
R1 = |
|
Figure
12:
C++
code
for simpler calculations of safe-area
limiter
component
values. |
/* sal2.cpp - prove the equations calculated to define a single-slope safe area limiter. */ #include <iostream> #include <cmath> using namespace std; #define PAR(x,y) ((x)*(y)/((x)+(y))) int main(void) { double zlim, pmax, kv, ki, vt; double r1, r2, r3, rs; double vmax, imax; // input values zlim = 8.0; pmax = 300.0; //r1 = 68.0; r3 = 40.3016; rs = 0.1; vt = 0.763; // calculate limit line specifications kv = sqrt((vt*vt)/(4.0*zlim*pmax)); ki = kv*zlim; vmax = vt/kv; imax = vt/ki; // calculate component values r2 = zlim*r3/rs; // calculate r1 at midpoint //r1 = vt/(((0.5*vmax)-vt)/r2+(rs*(0.5*imax)-vt)/r3); // calculate r1 at voltage endpoint r1 = vt/((vmax-vt)/r2 - vt/r3); // print results cout << "R2 = " << r2 << ",\t" << "R3 = " << r3 << endl; cout << "Seed values:" << endl; cout << "R1 = " << r1 << ",\t" << "RS = " << rs << endl; cout << "VT = " << vt << ",\t" << "PMAX = " << pmax; cout << ",\t" << "ZLIM = " << zlim << endl; cout << "Endpoints: " << vmax << "V,\t" << imax << "A" << endl; return 0; } |
Figure 13: Program output for parameters given |
R2 = 3224.13,
R3 = 40.3016 Seed values: R1 = 68, RS = 0.1 VT = 0.763, PMAX = 300, ZLIM = 8 Endpoints: 97.9796V, 12.2474A |
(12) |
PMAX = |
VT2
4kvki |
If ZLIM = - |
ki
kv |
, then kv = |
ki
|ZLIM| |
(28) |
PMAX = |
|ZLIM|VT2
4ki2 |
(29) |
|ZLIM| = |
4ki2PMAX
VT2 |
(30) | IMAX = |
VT
ki |
, therefore ki =
|
VT
IMAX |
(31) | PMAX = | |ZLIM|VT2
4 |
× |
IMAX2
VT2 |
(32) | PMAX = | |ZLIM| × IMAX2
4 |
(33) | |ZLIM| = | 4PMAX
IMAX2 |
Figure 14: C++ code for
calculation of safe-area limiter component values from power and
current limit specifications. |
/* sal3.cpp - prove the equations calculated to define a single-slope safe area limiter. */ #include <iostream> #include <cmath> using namespace std; #define PAR(x,y) ((x)*(y)/((x)+(y))) int main(void) { double zlim, pmax, kv, ki, vt; double r1, r2, r3, rs; double vmax, imax; // input values imax = 10.0; pmax = 300.0; r3 = 47; rs = 0.1; vt = 0.763; // calculate limit line specifications zlim = 4*pmax/(imax*imax); // remaining limit line specifications are informational // and not necessary to finish calculations kv = sqrt((vt*vt)/(4.0*zlim*pmax)); ki = vt/imax; kv = ki/zlim; vmax = vt/kv; // calculate component values r2 = zlim*r3/rs; // calculate r1 at midpoint //r1 = vt/(((0.5*vmax)-vt)/r2+(rs*(0.5*imax)-vt)/r3); // calculate r1 at current endpoint r1 = vt/((-vt)/r2+(rs*imax-vt)/r3); // print results cout << "R2 = " << r2 << ",\t" << "R3 = " << r3 << endl; cout << "R1 = " << r1 << ",\t" << "RS = " << rs << endl; cout << "VT = " << vt << ",\t" << "PMAX = " << pmax; cout << ",\t" << "ZLIM = " << zlim << endl; cout << "Endpoints: " << vmax << "V,\t" << imax << "A" << endl; return 0; } |
Figure 15: Program output for parameters given |
R2 = 5640, R3
= 47 R1 = 155.484, RS = 0.1 VT = 0.763, PMAX = 300, ZLIM = 12 Endpoints: 120V, 10A |
Figure
16:
SPICE
plot
of
resulting
load
line |
SPICE model |
|
Document History
March 16, 2013 Created.
April 5, 2013 Added an improved component calculation sequence
and additional power calculations.
December 9, 2015 Corrected two misspellings.