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

    %% Tuning Feedback Loops with LOOPTUNE
% This example shows the basic workflow of tuning feedback loops with
% the |looptune| command. |looptune| is similar to |systune| and meant to
% facilitate loop shaping design by automatically generating the tuning
% requirements.

% Copyright 1986-2015 The MathWorks, Inc.

%% Engine Speed Control
% This example uses a simple engine speed control application as illustration.
% The control system consists of a single PID loop and the PID controller gains
% must be tuned to adequately respond to step changes in the desired speed.
% Specifically, we want the response to settle in less than 5 seconds with 
% little or no overshoot.
%
% <<../looptuneworkflow1.png>>
%
% *Figure 1: Engine Speed Control Loop*
%
% We use the following fourth-order model of the engine dynamics.

load rctExamples Engine
bode(Engine), grid

%% Specifying the Tunable Elements
% We need to tune the four PID gains to achieve the desired performance.
% Use the |tunablePID| class to parameterize the PID controller.

PID0 = tunablePID('SpeedController','pid')  

%% Building a Tunable Model of the Feedback Loop
% |looptune| tunes the generic SISO or MIMO feedback loop of Figure 2.
% This feedback loop models the interaction between the plant and the 
% controller. Note that this is a _positive_ feedback interconnection. 
%
% <<../looptuneworkflow2.png>>
%
% *Figure 2: Generic Feedback Loop*
%
% For the speed control loop, the plant $G$ is the engine model and the 
% controller $C$ consists of the PID and the prefilter $F$. 
%
% <<../looptuneworkflow3.png>>
%
% *Figure 3: Feedback Loop for Engine Speed Control*
%
% To use |looptune|, create models for $G$ and $C$ in Figure 3. Assign 
% names to the inputs and outputs of each model to specify the feedback
% paths between plant and controller. Note that the controller $C$ has two
% inputs: the speed reference "r" and the speed measurement "speed".

F = tf(10,[1 10]);  % prefilter

G = Engine;
G.InputName = 'throttle';
G.OutputName = 'speed';

C0 = PID0 * [F , -1];
C0.InputName = {'r','speed'};
C0.OutputName = 'throttle';

%%
% Here |C0| is a generalized state-space model (|genss|) that depends
% on the tunable PID block |PID0|.

%% Tuning the Controller Parameters
% You can now use |looptune| to tune the PID gains subject to a simple 
% control bandwidth requirement. To achieve the 5-second settling
% time, the gain crossover frequency of the open-loop response should be 
% approximately 1 rad/s. 
% Given this basic requirement, |looptune| automatically shapes the open-loop
% response to provide integral action, high-frequency roll-off, and adequate
% stability margins. Note that you could
% specify additional requirements to further constrain the design, see 
% _"Decoupling Controller for a Distillation Column"_ for an
% example. 

wc = 1;  % target gain crossover frequency 

[~,C,~,Info] = looptune(G,C0,wc);

%%
% The final value is less than 1, indicating that the desired bandwidth was 
% achieved with adequate roll-off and stability margins. |looptune| returns
% the tuned controller |C|. Use |getBlockValue| to retrieve the tuned value 
% of the PID block.

PIDT = getBlockValue(C,'SpeedController')

%% Validating Results
% Use |loopview| to validate the design and visualize the loop shaping 
% requirements implicitly enforced by |looptune|. 

clf, loopview(G,C,Info)

%%
% Next plot the closed-loop response to a step command in engine speed.
% The tuned response satisfies our requirements.

T = connect(G,C,'r','speed');  % closed-loop transfer from r to speed
clf, step(T)