# PID Controller Design at the Command Line

This example shows how to design a PID controller for the plant given by:

$$sys=\frac{1}{{\left(s+1\right)}^{3}}.$$

As a first pass, create a model of the plant and design a simple PI controller for it.

```
sys = zpk([],[-1 -1 -1],1);
[C_pi,info] = pidtune(sys,'PI')
```

C_pi = 1 Kp + Ki * --- s with Kp = 1.14, Ki = 0.454 Continuous-time PI controller in parallel form.

`info = `*struct with fields:*
Stable: 1
CrossoverFrequency: 0.5205
PhaseMargin: 60.0000

`C_pi`

is a `pid`

controller object that represents a PI controller. The fields of `info`

show that the tuning algorithm chooses an open-loop crossover frequency of about 0.52 rad/s.

Examine the closed-loop step response (reference tracking) of the controlled system.

T_pi = feedback(C_pi*sys, 1); step(T_pi)

To improve the response time, you can set a higher target crossover frequency than the result that `pidtune`

automatically selects, 0.52. Increase the crossover frequency to 1.0.

`[C_pi_fast,info] = pidtune(sys,'PI',1.0)`

C_pi_fast = 1 Kp + Ki * --- s with Kp = 2.83, Ki = 0.0495 Continuous-time PI controller in parallel form.

`info = `*struct with fields:*
Stable: 1
CrossoverFrequency: 1
PhaseMargin: 43.9973

The new controller achieves the higher crossover frequency, but at the cost of a reduced phase margin.

Compare the closed-loop step response with the two controllers.

T_pi_fast = feedback(C_pi_fast*sys,1); step(T_pi,T_pi_fast) axis([0 30 0 1.4])

`ans = `*1×4*
0 30.0000 0 1.4000

legend('PI','PI,fast')

ans = Legend (PI, PI,fast) with properties: String: {'PI' 'PI,fast'} Location: 'northeast' Orientation: 'vertical' FontSize: 9 Position: [0.7287 0.7968 0.1572 0.0789] Units: 'normalized' Use GET to show all properties

This reduction in performance results because the PI controller does not have enough degrees of freedom to achieve a good phase margin at a crossover frequency of 1.0 rad/s. Adding a derivative action improves the response.

Design a PIDF controller for `Gc`

with the target crossover frequency of 1.0 rad/s.

`[C_pidf_fast,info] = pidtune(sys,'PIDF',1.0)`

C_pidf_fast = 1 s Kp + Ki * --- + Kd * -------- s Tf*s+1 with Kp = 2.72, Ki = 0.985, Kd = 1.72, Tf = 0.00875 Continuous-time PIDF controller in parallel form.

`info = `*struct with fields:*
Stable: 1
CrossoverFrequency: 1
PhaseMargin: 60.0000

The fields of info show that the derivative action in the controller allows the tuning algorithm to design a more aggressive controller that achieves the target crossover frequency with a good phase margin.

Compare the closed-loop step response and disturbance rejection for the fast PI and PIDF controllers.

T_pidf_fast = feedback(C_pidf_fast*sys,1); step(T_pi_fast, T_pidf_fast); axis([0 30 0 1.4]); legend('PI,fast','PIDF,fast');

You can compare the input (load) disturbance rejection of the controlled system with the fast PI and PIDF controllers. To do so, plot the response of the closed-loop transfer function from the plant input to the plant output.

S_pi_fast = feedback(sys,C_pi_fast); S_pidf_fast = feedback(sys,C_pidf_fast); step(S_pi_fast,S_pidf_fast); axis([0 50 0 0.4]); legend('PI,fast','PIDF,fast');

This plot shows that the PIDF controller also provides faster disturbance rejection.