www.gusucode.com > control_featured 案例源码程序 matlab代码 > control_featured/opampdemo.m
%% Feedback Amplifier Design % This example shows the design of a non-inverting feedback % amplifier circuit using Control System Toolbox(TM). This design % is built around the operational amplifier (op amp), a standard % building block of electrical feedback circuits. % % This tutorial shows how a real electrical system can be % designed, modeled, and analyzed using the tools provided by % Control System Toolbox. % Copyright 1986-2014 The MathWorks, Inc. %% Op Amp Description % 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 below. % % <<../opampdemofigures_01.png>> %% % This example 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. % % *Open-Loop Transfer Function:* % % $$ a(s)=\frac{a_0}{(1+s/\omega_1)(1+s/\omega_2)} $$ %% % The following system parameters are assumed: % % $$ a_0 = 1e5 $$ % % $$ \omega_1 = 1e4 $$ % % $$ \omega_2 = 1e6 $$ a0 = 1e5; w1 = 1e4; w2 = 1e6; %% % Next, you want to create a transfer function model of this system % using Control System Toolbox. This model will be stored in % the MATLAB(R) workspace as an LTI object. %% % 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) %% % You can view the frequency response of a(s) using the BODEPLOT command: % h = bodeplot(a,'r'); setoptions(h,'FreqUnits','rad/s','MagUnits','dB','PhaseUnits','deg',... 'YLimMode','Manual','YLim',{[0,110],[-180,0]}); %% % 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. %% % You can view the normalized step response of a(s) using the STEPPLOT % and DCGAIN commands: % a_norm = a / dcgain(a); stepplot(a_norm,'r') title('Normalized Open-Loop Step Response'); ylabel('Normalized Amplitude'); %% % 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. %% Feedback Amplifier % Now add a resistive feedback network and wire the system as a % non-inverting amplifier. % % <<../opampdemofigures_02.png>> % % 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) %% % The block diagram representation of the system is shown below. % % <<../opampdemofigures_03.png>> % % 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 %% % Now assume that you need to design an amplifier of dc gain (Vo/Vp) 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) %% % 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 BODEMAG command: % bodemag(a,'r',A,'b'); legend('Open-Loop Gain (a)','Closed-Loop Gain (A)') ylim([0,110]); % Annotations opampdemo_annotate(1) %% % 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. %% % Before deriving the system sensitivity, however, it is useful to % define the loop gain, L(s)=a(s)b(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. %% % The system sensitivity, S(s), represents the sensitivity of A(s) to % variation in a(s). % % $$ S = \frac{\delta A/A}{\delta a/a}= \frac{1}{1+a(s)b(s)}=\frac{1}{1+L(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); %% % The magnitudes of S(s) and A(s) may be plotted together using the % BODEMAG command: % bodemag(A,'b',S,'g') legend('Closed-Loop Gain(A)', 'System Sensitivity(S)','Location','SouthEast') %% % 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. %% % You can check the step response of A(s) using the STEPPLOT command: % stepplot(A) % Annotation opampdemo_annotate(2) %% % 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. %% % 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. %% Feedback Lead Compensation % 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. % % <<../opampdemofigures_04.png>> % % 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. % %% % The new feedback transfer function is shown below. % % <<../opampdemofigures_05.png>> %% % 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) %% % 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: % % <<../opampdemofigures_06.png>> %% 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 %% % 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 STEPPLOT command: % stepplot(A,'b:',A_array,'b',[0:.005:1]*1.5e-6); title('Closed-Loop Step Response (Compensated)'); % Plot Annotations opampdemo_annotate(3) %% % 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'); ax = gca; xlim([0.8 3.6]); ylim([45 60]); ax.Box = 'on'; xlabel('Compensation Capacitor, C (pF)'); ylabel('Phase Margin (deg)') % Plot Annotations opampdemo_annotate(4) %% % A maximum phase margin of 58 deg is obtained when C=2pF (2e-12). % % 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); stepplot(A,'b:',A_comp,'b') legend('Uncompensated (0 pF)','Compensated (2 pF)') %% % Note that the settling time has been further reduced (by an % additional 85%). %% % We can overlay the frequency-response of all three models (open-loop, % closed-loop, compensated closed-loop) using the BODE command: % bodeplot(a,'r',A,'b:',A_comp,'b') legend('a(s)','A(s)','A\_comp(s)'); %% % Note how the addition of the compensation capacitor has eliminated % peaking in the closed-loop gain and also greatly extended the phase % margin. %% Summary % A brief summary of the choice of component values in the design of this % non-inverting feedback amplifier circuit: % % * Final component values: R1 = 10 kOhm, R2 = 90 kOhm, C = 2 pF. % % * A resistive feedback network (R1,R2) was selected to yield a % broadband amplifier gain of 10 (20 dB). % % * Feedback lead compensation was used to tune the loop gain near % the crossover frequency. The value for the compensation % capacitor, C, was optimized to provide a maximum phase margin % of about 58 degrees. %