Feed-forward & feedback synthesis with prescribed controller structures

This example illustrates the design of a conventional 2-DOF control structure with restricted complexity of components.

  1. The feedback component consists of a PID controller.
  2. The feed-forward block is a 2nd-order filter.

Contents

Define nominal plant

s = tf('s');
ny = 1; nu = 1;
G = ss( 1/(s-1) ); % unstable SISO plant

Build synthesis interconnection and define specifications using linlft

Define reference model capturing performance constraints.

num = 11.11; den = [1 6 11.11] ;
Gref = tf(num , den); % reference model
io = getlinio('TwoDOF'); % r, zu, e and y
Blocks = {'TwoDOF/Ksim','TwoDOF/Fsim'};

Pperf = linlft('TwoDOF',io([1 3]),Blocks);       % r -> e  perf
Pu    = linlft('TwoDOF',io([1 2]),Blocks);       % penalize control signal
Psim  = linlft('TwoDOF',io([1 4]),Blocks);       % simulation channel

Define controller blocks

K = ltiblock.pid('K','pid');      % PID feedback
F = ltiblock.ss('F',2, nu, ny );  % feed-forward of order 2
C0 = blkdiag(K,F);                % gather all blocks

Include weighting functions and aggregate objectives

W1 = (0.25*s+0.6)/(s+0.006); % performance in the low frequency range
Wu = 0.01 ;                  % control signal penalization
% Gather closed-loop objectives through diagonal augmentation
CL0 = blkdiag( W1*lft(Pperf, C0), Wu*lft(Pu,C0) ) ;

Run hinfstruct

[CL,gam] = hinfstruct(CL0);
Final: Peak gain = 0.0177, Iterations = 83

Retrieve feedback and feed-forward blocks in transfer function format

Kpid = pid(CL.Blocks.K), Ftf = tf(CL.Blocks.F),
Continuous-time PIDF controller in parallel form:
 
           1            s    
Kp + Ki * --- + Kd * --------
           s          Tf*s+1 
 
With Kp = 3.05, Ki = 2.8, Kd = 167, Tf = 2.03e+05
 
 
Transfer function:
-3.763 s^2 - 24.35 s - 56.19
----------------------------
   s^2 + 13.82 s + 22.81
 

Check results

norm( ss(CL) , inf), gam,
ans =

    0.0176


gam =

    0.0177

Simulate set-point responses

CLsim = lft(Psim, blkdiag(Kpid,Ftf) );
figure(8); clf; step(CLsim , 5); grid; hold on; step(Gref,5);
legend('system output', 'reference model') ;