www.gusucode.com > control_featured 案例源码程序 matlab代码 > control_featured/systuneWorkflowExample.m

    %% Tuning Control Systems with SYSTUNE
% The |systune| command can jointly tune the gains of your 
% control system regardless of its architecture and number of feedback
% loops. This example outlines the |systune| workflow on a simple 
% application.

% Copyright 1986-2015 The MathWorks, Inc.

%% Head-Disk Assembly Control
% This example uses a 9th-order model of the head-disk assembly (HDA) in a 
% hard-disk drive. This model captures the first few flexible modes in the HDA.

load rctExamples G
bode(G), grid

%%
% We use the feedback loop shown below to position the head on the 
% correct track. This control structure consists of a PI controller and 
% a low-pass filter in the return path. The head position |y| should 
% track a step change |r| with a response time of about 
% one millisecond, little or no overshoot, and no steady-state error.
%
% <<../systuneworkflow1.png>>
%
% *Figure 1: Control Structure*

%%
% You can use |systune| to directly tune the PI gains and filter coefficient
% $a$ subject to a variety of time- and frequency-domain requirements.

%% Specifying the Tunable Elements
% There are two tunable elements in the control structure of Figure 1:
% the PI controller $C(s)$ and the low-pass filter
%
% $$ F(s) = {a \over s+a} . $$
%
% You can use the |tunablePID| object to parameterize the PI block:

C0 = tunablePID('C','pi');  % tunable PI

%%
% To parameterize the lowpass filter $F(s)$, create a tunable real parameter
% $a$ and construct a first-order transfer function with numerator $a$ and 
% denominator $s+a$:

a = realp('a',1);    % filter coefficient
F0 = tf(a,[1 a]);    % filter parameterized by a

%%
% See the _"Building Tunable Models"_ example for an overview of available tunable
% elements.

%% Building a Tunable Closed-Loop Model
% Next build a closed-loop model of the feedback loop in Figure 1. To
% facilitate open-loop analysis and specify open-loop requirements
% such as desired stability margins, add an analysis point at the plant
% input |u|:

AP = AnalysisPoint('u');

%%
% <<../systuneworkflow2.png>>
%
% *Figure 2: Analysis Point Block*

%%
% Use |feedback| to build a model of the closed-loop transfer from reference
% |r| to head position |y|:

T0 = feedback(G*AP*C0,F0);  % closed-loop transfer from r to y
T0.InputName = 'r';
T0.OutputName = 'y';

%%
% The result |T0| is a generalized state-space model (|genss|) that depends
% on the tunable elements $C$ and $F$.

%% Specifying the Design Requirements
% The |TuningGoal| package contains a variety of control design requirements
% for specifying the desired behavior of the control system. These include
% requirements on the response time, deterministic and stochastic gains, 
% loop shape, stability margins, and pole locations. Here we use two 
% requirements to capture the control objectives:
%
% * *Tracking requirement* : The position |y| should track the reference |r| with a 1 millisecond response time
% * *Stability margin requirement* : The feedback loop should have 6dB of gain margin and 45 degrees of phase margin
% 
% Use the |TuningGoal.Tracking| and |TuningGoal.Margins| objects to capture
% these requirements. Note that the margins requirement applies to the open-loop
% response measured at the plant input |u| (location marked by the analysis
% point |AP|).

Req1 = TuningGoal.Tracking('r','y',0.001);
Req2 = TuningGoal.Margins('u',6,45);

%% Tuning the Controller Parameters
% You can now use |systune| to tune the PI gain and filter coefficient $a$. This
% function takes the tunable closed-loop model |T0| and the requirements
% |Req1,Req2|. Use a few randomized starting points to improve the chances of
% getting a globally optimal design.

rng('default')
Options = systuneOptions('RandomStart',3);
[T,fSoft] = systune(T0,[Req1,Req2],Options);

%%
% All requirements are normalized so a requirement is satisfied when its value is less
% than 1. Here the final value is slightly greater than 1, indicating that the 
% requirements are nearly satisfied. Use the output |fSoft| to see the tuned value of each 
% requirement. Here we see that the first requirement (tracking) is slightly violated 
% while the second requirement (margins) is satisfied.

fSoft

%%
% The first output |T| of |systune| is the "tuned" closed-loop model. Use |showTunable| or
% |getBlockValue| to access the tuned values of the PI gains and filter coefficient:

getBlockValue(T,'C')  % tuned value of PI controller

%%

showTunable(T)  % tuned values of all tunable elements

%% Validating Results
% First use |viewSpec| to inspect how the tuned system does against each requirement.
% The first plot shows the tracking error as a function of frequency, and the second plot
% shows the normalized disk margins as a function of frequency (see |loopmargin|). See 
% the _"Creating Design Requirements"_ example for details.

clf, viewSpec([Req1 Req2],T)

%%
% Next plot the closed-loop step response from reference |r| to head position |y|. The response
% has no overshoot but wobbles a little.

clf, step(T)

%%
% To investigate further, use |getLoopTransfer| to get the open-loop response at the plant
% input.

L = getLoopTransfer(T,'u');
bode(L,{1e3,1e6}), grid
title('Open-loop response')

%%
% The wobble is due to the first resonance after the gain crossover. To eliminate it, 
% you could add a notch filter to the feedback loop and tune its coefficients along
% with the lowpass coefficient and PI gains using |systune|.