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

    %% Designing PID for Disturbance Rejection with PID Tuner
% This example shows how to design a PI controller with good disturbance
% rejection performance using the PID Tuner tool.  The example also shows
% how to design an ISA-PID controller for both good disturbance rejection
% and good reference tracking.

% Copyright 2009-2013 The MathWorks, Inc.

%% Launching the PID Tuner with Initial PID Design
% The plant model is
%
% $$ G(s) = \frac{6(s+5)e^{-s}}{(s+1)(s+2)(s+3)(s+4)} $$
%
G = zpk(-5,[-1 -2 -3 -4],6,'OutputDelay',1);
G.InputName = 'u';  
G.OutputName = 'y';

%%
% Use the following command to launch the PID Tuner to design a PI
% controller in parallel form for plant G.
%
%   pidtool(G,'pi')
%
% The PID Tuner automatically designs an initial PI controller. Click "Show
% parameters" button to display the controller gains and performance
% metrics.
%
% <<../isapiddemo1.png>>
%
% <<../isapiddemo1a.png>>

%% 
% For step reference tracking, the settling time is about 12 seconds and
% the overshoot is about 6.3 percent, which is acceptable for this example.

%% Tuning PID for Disturbance Rejection
% Assume that a step disturbance occurs at the plant input and the main
% purpose of the PI controller is to reject this disturbance quickly. In
% the rest of this section, we will show how to design the PI controller
% for better disturbance rejection in the PID Tuner. We also expect that
% the reference tracking performance is degraded as disturbance rejection
% performance improves.

%%
% Because the attenuation of low frequency disturbance is inversely
% proportional to integral gain Ki, maximizing the integral gain is a
% useful heuristic to obtain a PI controller with good disturbance
% rejection. For background, see Karl Astrom et al., "Advanced PID
% Control", Chapter 4 "Controller Design", 2006, The ISA Society.

%%
% Click *Add Plot*, select *Input disturbance rejection*, and click *Add*
% to plot the input disturbance step response. The peak deviation is
% about 1 and it settles to less than 0.1 in about 9 seconds.
%
% <<../isapiddemo1b.png>>
%
% <<../isapiddemo2.png>>

%%
% Tile the plots to show both the reference tracking  and input disturbance
% responses. Move the response time slider to the right to increase the
% response speed (open loop bandwidth). The Ki gain in the *Controller
% parameters* table first increases and then decreases, with the maximum
% value occurring at 0.3. When Ki is 0.3, the peak deviation is reduced to
% 0.9 (about 10% improvement) and it settles to less than 0.1 in about 6.7
% seconds (about 25% improvement).
%
% <<../isapiddemo3.png>>
%
% <<../isapiddemo4.png>>

%%
% Because we increased the bandwidth, the step reference tracking response
% becomes more oscillatory. Additionally the overshoot exceeds 15 percent,
% which is usually unacceptable. This type of performance trade off between
% reference tracking and disturbance rejection often exists because a
% single PID controller is not able to satisfy both design goals at the
% same time.

%%
% Click *Export* to export the designed PI controller to the MATLAB
% Workspace. The controller is represented by a PID object and you need it
% to create an ISA-PID controller in the next section.
%
% <<../isapiddemo5.png>>

%%
% You can also manually create the same PI controller in MATLAB Workspace
% by using the *pid* command. In this command you can directly specify the
% Kp and Ki gains obtained from the parameter table of the PID Tuner.
C = pid(0.64362,0.30314);
C.InputName = 'e';  
C.OutputName = 'u';
C

%% Extending PID controller to ISA-PID Controller 
% A simple solution to make a PI controller perform well for both
% reference tracking and disturbance rejection is to upgrade it to an
% ISA-PID controller. It improves reference tracking response by providing
% an additional tuning parameters *b* that allows independent control of
% the impact of the reference signal on the proportional action.
%
% <<../isapiddemo6.png>>

%%
% In the above ISA-PID structure, there is a feedback controller C and a
% feed-forward filter F. In this example, C is a regular PI controller in
% parallel form that can be represented by a PID object:
%
% $$ C(s) = pid(K_p,K_i) = K_p + \frac{K_i}{s} $$
%
% F is a pre-filter that involves Kp and Ki gains from C plus the setpoint
% weight *b*:
%
% $$ F(s) = \frac{b K_p s+K_i}{K_p s+K_i} $$
%
% Therefore the ISA-PID controller has two inputs (r and y) and one output
% (u).

%%
% Set-point weight *b* is a real number between 0 and 1.  When it decreases,
% the overshoot in the reference tracking response is reduced. In this
% example, *b* is chosen to be 0.7. 

b = 0.7;
% The following code constructs an ISA-PID from F and C
F = tf([b*C.Kp C.Ki],[C.Kp C.Ki]);
F.InputName = 'r';  
F.OutputName = 'uf';
Sum = sumblk('e','uf','y','+-');
ISAPID = connect(C,F,Sum,{'r','y'},'u');
tf(ISAPID)

%% Compare Performance
% The reference tracking response with ISA-PID controller has much less
% overshoot because setpoint weight *b* reduces overshoot.

% Closed-loop system with PI controller for reference tracking 
sys1 = feedback(G*C,1);
% Closed-loop system with ISA-PID controller
sys2 = connect(ISAPID,G,{'r','u'},'y');
% Compare responses
step(sys1,'r-',sys2(1),'b.');
legend('show','location','southeast')
title('Reference Tracking')

%%
% The disturbance rejection responses are the same because setpoint weight
% *b* only affects reference tracking.

% Closed-loop system with PI controller for disturbance rejection
sys1 = feedback(G,C);
% Compare responses
step(sys1,'r-',sys2(2),'b.');
legend('PID','ISA-PID');
title('Disturbance Rejection')

%%