Feedback Amplifier Demo
This demo demonstrates the design of a non-inverting feedback amplifier circuit using the Control System Toolbox. This design is built around the operational amplifier (op amp), a standard building block of electrical feedback circuits.
This tutorial demonstrates how a real electrical system can be designed, modeled, and analyzed using the tools provided by the Control System Toolbox.
Authors: A. DiVergilio Copyright 1986-2002 The MathWorks, Inc. $Revision: 1.9 $ $Date: 2002/04/08 16:22:23 $
The standard building block of electrical feedback circuits is the operational amplifier (op amp), a differential voltage amplifier designed to have extremely high dc gain, often in the range of 1e5 to 1e7.
The electrical symbol for the op amp is shown above.
opampdemo_aux(1)
This demo assumes the use of an uncompensated op amp with 2 poles (at frequencies w1,w2) and high dc gain (a0). Assuming this op amp is operated in its linear mode (not saturated), then its open-loop transfer function can be represented as a linear time-invariant (LTI) system, as shown above.
Though higher-order poles will exist in a physical op amp, it has been assumed in this case that these poles lie in a frequency range where the magnitude has dropped well below unity.
opampdemo_aux(2)
The following system parameters are assumed:
>> a0 = 1e5; >> w1 = 1e4; >> w2 = 1e6;
Next, you want to create a transfer function model of this system using the Control System Toolbox. This model will be stored in the MATLAB workspace as an LTI object.
opampdemo_aux(3)
First, define the Laplace variable, s, using the TF command. Then use 's' to construct the open-loop transfer function, a(s):
>> s = tf('s'); >> a = a0/(1+s/w1)/(1+s/w2)
Transfer function: 100000 -------------------------- 1e-10 s^2 + 0.000101 s + 1
opampdemo_aux(4)
You can view the frequency response of a(s) using the BODE command:
>> bode(a,'r')
Right-click on the plot to access a menu of properties for this Bode Diagram. Left-click on the curves to create moveable data markers which can be used to obtain response details.
opampdemo_aux(5)
You can view the normalized step response of a(s) using the STEP and DCGAIN commands:
>> a_norm = a / dcgain(a); >> step(a_norm,'r')
Right-click on the plot and select "Characteristics -> Settling Time" to display the settling time. Hold the mouse over the settling time marker to reveal the exact value of the settling time.
opampdemo_aux(6)
Now add a resistive feedback network and wire the system as a non-inverting amplifier.
This feedback network, b(s), is simply a voltage divider with input Vo and output Vn. Solving for the ratio Vn/Vo yields the transfer function for b(s):
b = Vn / Vo = R1 / (R1 + R2)
opampdemo_aux(7)
The block diagram representation of the system is shown above.
Solving for the ratio Vo/Vp yields the closed-loop gain, A(s):
A = Vo / Vp = a / (1 + ab)
If the product 'ab' is sufficiently large (>>1), then A(s) may be approximated as
A = 1 / b
opampdemo_aux(8)
Now assume that you need to design an amplifier of dc gain 10 and that R1 is fixed at 10 kOhm. Solving for R2 yields:
>> A0 = 10; >> b = 1 / A0; % approximation for ab>>1 >> R1 = 10000; >> R2 = R1 * (1/b - 1)
R2 = 90000
opampdemo_aux(9)
Construct the closed-loop system using the FEEDBACK command:
>> A = feedback(a,b);
Next, plot the frequency responses of a(s) and A(s) together using the BODE command:
>> bode(a,'r',A,'b')
opampdemo_aux(10)
The use of negative feedback to reduce the low-frequency (LF) gain has led to a corresponding increase in the system bandwidth (defined as the frequency where the gain drops 3dB below its maximum value).
This gain / bandwidth tradeoff is a powerful tool in the design of feedback amplifier circuits.
Since the gain is now dominated by the feedback network, a useful relationship to consider is the sensitivity of this gain to variation in the op amp's natural (open-loop) gain.
opampdemo_aux(11)
Before deriving the system sensitivity, however, it is useful to define the loop gain, L(s), which is the total gain a signal experiences traveling around the loop:
>> L = a * b;
You will use this quantity to evaluate the system sensitivity and stability margins.
opampdemo_aux(12)
The system sensitivity, S(s), represents the sensitivity of A(s) to variation in a(s). The inverse relationship between S(s) and L(s) reveals another benefit of negative feedback: "gain desensitivity".
>> S = 1 / (1 + L);
S(s) has the same form as the feedback equation and, therefore, may be constructed using the more-robust FEEDBACK command:
>> S = feedback(1,L);
opampdemo_aux(13)
The magnitudes of S(s) and A(s) may be plotted together using the BODEMAG command:
>> bodemag(A,'b',S,'g')
The very small low-frequency sensitivity (about -80 dB) indicates a design whose closed-loop gain suffers minimally from open-loop gain variation. Such variation in a(s) is common due to manufacturing variability, temperature change, etc.
opampdemo_aux(14)
You can check the step response of A(s) using the STEP command:
>> step(A)
Note that the use of feedback has greatly reduced the settling time (by about 98%). However, the step response now displays a large amount of ringing, indicating poor stability margin.
opampdemo_aux(15)
You can analyze the stability margin by plotting the loop gain, L(s), with the MARGIN command:
>> margin(L)
The resulting plot indicates a phase margin of less than 6 degrees. You will need to compensate this amplifier in order to raise the phase margin to an acceptable level (generally 45 deg or more), thus reducing excessive overshoot and ringing.
opampdemo_aux(16)
A commonly used method of compensation in this type of circuit is "feedback lead compensation". This technique modifies b(s) by adding a capacitor, C, in parallel with the feedback resistor, R2.
The capacitor value is chosen so as to introduce a phase lead to b(s) near the crossover frequency, thus increasing the amplifier's phase margin.
opampdemo_aux(17)
The new feedback transfer function is shown above.
You can approximate a value for C by placing the zero of b(s) at the 0dB crossover frequency of L(s):
>> [Gm,Pm,Wcg,Wcp] = margin(L); >> C = 1/(R2*Wcp)
C = 1.1139e-12
opampdemo_aux(18)
To study the effect of C on the amplifier response, create an LTI model array of b(s) for several values of C around your initial guess:
>> K = R1/(R1+R2); >> C = [1:.2:3]*1e-12; >> for n = 1:length(C) b_array(:,:,n) = tf([K*R2*C(n) K],[K*R2*C(n) 1]); end
opampdemo_aux(19)
Now you can create LTI arrays for A(s) and L(s):
>> A_array = feedback(a,b_array); >> L_array = a*b_array;
You can plot the step response of all models in the LTI array, A_array(s), together with A(s) using the STEP command:
>> step(A,'b:',A_array,'b');
opampdemo_aux(20)
The phase margins for our loop gain array, L_array(s), are found using the MARGIN command:
>> [Gm,Pm,Wcg,Wcp] = margin(L_array);
The phase margins may now be plotted as a function of C:
>> plot(C*1e12,Pm,'g');
A maximum phase margin of 58 deg is obtained when C=2pF (2e-12).
opampdemo_aux(21)
The model corresponding to C=2pF is the sixth model in the LTI array, b_array(s). You can plot the step response of the closed- loop system for this model by selecting index 6 of the LTI array A_array(s):
>> A_comp = A_array(:,:,6); >> step(A,'b:',A_comp,'b')
Note that the settling time has been further reduced (by an additional 85%).
opampdemo_aux(22)
We can overlay the frequency-response of all three models (open-loop, closed-loop,compensated closed-loop) using the BODE command:
>> bode(a,'r',A,'b:',A_comp,'b')
Note how the addition of the compensation capacitor has eliminated peaking in the closed-loop gain and also greatly extended the phase margin.
opampdemo_aux(23)
A brief summary of the choice of component values in the design of this non-inverting feedback amplifier circuit:
opampdemo_aux(24)