www.gusucode.com > robust_featured 案例源码程序 matlab代码 > robust_featured/dcmotor_demo.m
%% Robustness of Servo Controller for DC Motor % This example shows how to use uncertain objects in Robust Control % Toolbox(TM) to model uncertain systems and to automate robustness % calculations using the robustness analysis tools. % Copyright 1986-2012 The MathWorks, Inc. %% Data Structures for Uncertainty Modeling % Robust Control Toolbox lets you create uncertain elements, such as % physical parameters whose values are not known exactly, and combine these % elements into uncertain models. You can then easily analyze the impact of % uncertainty on the control system performance. % % For example, consider a plant model % % $$P(s) = \frac{\gamma}{\tau s + 1}$$ % % where |gamma| can range in the interval [3,5] and |tau| has average % value 0.5 with 30% variability. You can create an uncertain model of P(s) % as in this example: gamma = ureal('gamma',4,'range',[3 5]); tau = ureal('tau',.5,'Percentage',30); P = tf(gamma,[tau 1]) %% % Suppose we have designed an integral controller |C| for the nominal % plant (|gamma|=4 and |tau|=0.5). To find out how variations of % |gamma| and |tau| affect the plant and the closed-loop performance, % we form the closed-loop system |CLP| from |C| and |P|. KI = 1/(2*tau.Nominal*gamma.Nominal); C = tf(KI,[1 0]); CLP = feedback(P*C,1) %% % We can now generate 20 random samples of the uncertain parameters % |gamma| and |tau| and plot the corresponding step responses of the % plant and closed-loop models: subplot(2,1,1); step(usample(P,20)), title('Plant response (20 samples)') subplot(2,1,2); step(usample(CLP,20)), title('Closed-loop response (20 samples)') %% % *Figure 1:* Step responses of the plant and closed-loop models %% % The bottom plot shows that the closed-loop system is reasonably robust despite % significant fluctuations in the plant DC gain. This is a desirable, and % common characteristic of a properly designed feedback system. %% DC Motor Example with Parameter Uncertainty and Unmodeled Dynamics % Now we'll build on the Control System Toolbox(TM) DC motor example by adding % parameter uncertainty and unmodeled dynamics, and investigating the % robustness of the servo controller to such uncertainty. % % The nominal model of the DC motor is defined by the resistance R, the % inductance L, the emf constant Kb, armature constant Km, the linear % approximation of viscous friction Kf and the inertial load J. Each of % these components varies within a specific range of values. The resistance % and inductance constants range within +/- 40% of their nominal values. % We use the |ureal| function to construct these uncertain parameters: R = ureal('R',2,'Percentage',40); L = ureal('L',0.5,'Percentage',40); %% % For physical reasons, the values of Kf and Kb are the same, even if they % are uncertain. In this example, the nominal value is 0.015 with a range % between 0.012 and 0.019. K = ureal('K',0.015,'Range',[0.012 0.019]); Km = K; Kb = K; %% % Viscous friction, Kf, has a nominal value of 0.2 with a 50% variation in % its value. Kf = ureal('Kf',0.2,'Percentage',50); %% Electrical and Mechanical Equations % The current in the electrical circuit, and the torque applied to the % rotor can be expressed in terms of the applied voltage and the angular % speed. Create the transfer function |H| relating these variables, and % make |AngularSpeed| an output of |H| for later use: H = [1;0;Km] * tf(1,[L R]) * [1 -Kb] + [0 0;0 1;0 -Kf]; H.InputName = {'AppliedVoltage';'AngularSpeed'}; H.OutputName = {'Current';'AngularSpeed';'RotorTorque'}; %% % H is an multi-input, multi-output uncertain system as seen from its % display. H %% % The motor typically drives an inertia, whose dynamic characteristics % relate the applied torque to the rate-of-change of the angular speed. % For a rigid body, this is a constant. A more realistic, but uncertain, model % might contain unknown damped resonances. Use the |ultidyn| object to model % uncertain linear time-invariant dynamics. The nominal value % of the rigid body inertia is set to 0.02 and we add 15% dynamic uncertainty % in multiplicative form: J = 0.02*(1 + ultidyn('Jlti',[1 1],'Type','GainBounded','Bound',0.15,... 'SampleStateDim',4)); %% Uncertain Model of DC Motor % It is a simple matter to relate the |AngularSpeed| input to the |RotorTorque| % output through the uncertain inertia, |J|, using the |lft| command. % The AngularSpeed input equals RotorTorque/(J*s), hence "positive" % feedback from the 3rd output to the 2nd input of |H| is used % to make the connection. This results in a system with 1 input % (|AppliedVoltage|) and 2 outputs, (|Current| and |AngularSpeed|). Pall = lft(H, tf(1,[1 0])/J); %% % Select only the AngularSpeed output for the remainder of the control % analysis. P = Pall(2,:) %% % P is a single-input, single-output uncertain model of the DC motor. % For analysis purposes, we use the nominal controller synthesized for the DC % motor in the "Getting Started with the Control System Toolbox(TM)" manual. Cont = tf(84*[.233 1],[.0357 1 0]); %% Open-Loop Analysis % First, let's compare the step response of the nominal DC motor with 20 samples of the % uncertain model of the DC motor: clf step(P.NominalValue,'r-+',usample(P,20),'b',3) legend('Nominal','Samples') %% % *Figure 2:* Open-loop step response analysis %% % Similarly, we can compare the Bode plot of the open-loop nominal (red) and % sampled (blue) uncertain models of the DC motor. om = logspace(-1,2,80); Pg = ufrd(P,om); bode(usample(Pg,25),'b',Pg.NominalValue,'r-+'); legend('Samples','Nominal') %% % *Figure 3:* Open-loop Bode plot analysis %% Closed-Loop Robustness Analysis % In this section, we analyze the stability and performance robustness of % the closed-loop DC motor system. Our initial analysis of the nominal % closed-loop system indicates the nominal closed-loop system is very % robust with 10.5 gain margin and 54.3 deg of phase margin. margin(P.NominalValue*Cont) %% % *Figure 4:* Closed-loop robustness analysis %% % The |loopmargin| function provides comprehensive stability analysis for % multivariable feedback systems. For a control system with N feedback % channels, the |loopmargin| function returns: % % * The classical gain and phase margins SM for each individual feedback % channel (loop-at-a-time margins) % * The disk margins DM for each individual feedback channel. % The disk margin for the j-th feedback channel indicates by how much the % transfer function Lj(s) can vary before this particular loop goes unstable. % * The multi-loop disk margin MM % This indicates how much simultaneous, independent gain and phase % variations can be tolerated in each feedback channel before the overall % closed-loop system goes unstable (same as DM for single-loop control % systems). % [SM,DM,MM] = loopmargin(P.NominalValue*Cont); %% % Classical stability margins SM %% % Disk margin DM %% % Recall that the DC motor plant is uncertain. In addition to the standard % gain and phase margins, we can use the |wcmargin| function to determine the % worst-case gain/phase margins for the plant-controller feedback loop. The % |wcmargin| function calculates the worst-case disk gain and phase margins % for each input/output channel. The worst-case analysis shows a possible % degradation of the disk gain and phase margins, which were 11 dB % and 59 degs respectively, to 1.2dB and 8 degs, respectively, in the % presence of the 5 forms of uncertainty modeled in |P|. wcmarg = wcmargin(Pg,Cont) %% Robustness of Disturbance Rejection Characteristics % The sensitivity function is a standard measure of closed-loop performance for % the feedback system. Let's compute the uncertain sensitivity function |S| and % compare the Bode magnitude plots for the nominal and sampled uncertain % sensitivity function. S = feedback(1,P*Cont); bodemag(usample(S,20),'b',S.Nominal,'r-+'); legend('Samples','Nominal') %% % *Figure 5:* Magnitude of sensitivity function S. %% % In the time domain, the sensitivity function indicates how well a % step disturbance can be rejected. Let's sample the uncertain sensitivity % function and plot its step response to see the variability in % disturbance rejection characteristics (nominal appears in red). step(usample(S,20),'b',S.Nominal,'r-+',3); title('Disturbance Rejection') legend('Samples','Nominal') %% % *Figure 6:* Rejection of a step disturbance. %% % We can use the |wcgain| function to compute the worst-case value of the % uncertain sensitivity function gain (peak across frequency). % Alternatively, we can use the |wcsens| function to compute this value: % this value. Sg = ufrd(S,om); [maxgain,worstuncertainty] = wcgain(Sg); maxgain %% % With the |usubs| function you can substitute the worst-case values of the % uncertainty |worstuncertainty| into the uncertain sensitivity function % |S|. This gives the worst-case sensitivity function |Sworst| over the % entire uncertainty range. Note that the peak gain of |Sworst| matches the % lower-bound computed by |wcgain|. Sworst = usubs(S,worstuncertainty); Sgworst = frd(Sworst,Sg.Frequency); norm(Sgworst,inf) maxgain.LowerBound %% % Now let's compare the step responses of the nominal and worst-case % sensitivity: step(Sworst,'b',S.NominalValue,'r-+',6); title('Disturbance Rejection') legend('Worst-case','Nominal') %% % *Figure 7:* Nominal and worst-case rejection of a step disturbance %% % Finally, let's plot Bode magnitude plots of the nominal and worst-case values of the % sensitivity function. Observe that the peak value of |Sworst| occurs at % the frequency |maxgain.CriticalFrequency|: bodemag(Sg.NominalValue,'r-+',Sgworst,'b'); legend('Worst-case','Nominal') hold on semilogx(maxgain.CriticalFrequency,20*log10(maxgain.LowerBound),'g*') hold off %% % *Figure 8:* Magnitude of nominal and worst-case sensitivity