PID not achieving required results

4 views (last 30 days)
Hi all, a newbie here.
I have been trying to achieve a PID control with rise time of 0.5 seconds and settling time of less than 2 seconds, but this doesn't seem to be possible ... am i doing something wrong or do i just need to add another component to the system to improve the parameters. I have tried both Matlab and Simulink, but no joy.
Help please!
s = tf('s');
P = 0.047/(s^3+3.88*s^2+0.26*s+0.07);
step(P)
pidTuner(P,'pid')
Error using matlab.internal.lang.capability.Capability.require
This functionality is not available on remote platforms.

Error in matlab.internal.webwindow (line 161)
Capability.require(Capability.WebWindow);

Error in matlab.ui.container.internal.AppContainer/buildWindow (line 2054)
window = matlab.internal.webwindow(url, this.getOpenPort());

Error in matlab.ui.container.internal.AppContainer/set.Visible (line 689)
this.Window = this.buildWindow(windowBounds);

Error in pidtool.PIDToolDesktop/open (line 138)
this.TPComponent.Visible = true;

Error in pidtool.PIDToolDesktop (line 100)
this.open();

Error in pidtool (line 112)
eval(cmd);

Error in pidTuner (line 91)
eval(cmd);

Accepted Answer

Sam Chak
Sam Chak on 20 May 2022
Edited: Sam Chak on 20 May 2022
The Plant (a 3rd-order system) settles at around 123 seconds.
s = tf('s');
Gp = 0.047/(s^3 + 3.88*s^2 + 0.26*s + 0.07); % Plant (original open loop system)
figure(1)
step(Gp)
grid on
PID controller:
K = 1.11155;
Gpid = K*(1 + 36*s + (18*s)^2)/s % PID Controller
Gcl1 = feedback(Gpid*Gp, 1);
Gcl1 = minreal(Gcl1) % Closed-loop Control System #1
figure(2)
step(Gcl1, 3)
S1 = stepinfo(Gcl1)
grid on
hold on
S1 =
struct with fields:
RiseTime: 0.379837466412825
SettlingTime: 1.99996802024607
SettlingMin: 0.96521666875026
SettlingMax: 1.20603245716344
Overshoot: 20.6032457163443
Undershoot: 0
Peak: 1.20603245716344
PeakTime: 0.880851721438949
High-order Compensator:
a1 = 14.528;
a2 = 165.347073378685;
a3 = 1090.83668370638;
b1 = 98834.1688799017;
b2 = 580988.793504546;
b3 = 845755.825300342;
G1 = (b1*s^2 + b2*s + b3)/(s^3 + a1*s^2 + a2*s + a3);
c1 = 847380.47568033;
d1 = 14.528;
d2 = 165.34707337868;
d3 = 1090.8366837063;
G2 = c1/(s^3 + d1*s^2 + d2*s + d3);
Gcom = G2/(G1*Gp - G2*Gp + 1);
Gcom = minreal(Gcom, 1e-6) % 6th-order Compensation Filter
Gcl2 = feedback(Gcom*Gp, 1);
Gcl2 = minreal(Gcl2) % Closed-loop Control System #2
step(Gcl2, 3)
S2 = stepinfo(Gcl2)
hold off
S2 =
struct with fields:
RiseTime: 0.498556717717106
SettlingTime: 1.05004587168131
SettlingMin: 0.904167446381624
SettlingMax: 1.01000955014111
Overshoot: 1.00095447432156
Undershoot: 0
Peak: 1.01000955014111
PeakTime: 1.7860121485132
Both proposed controllers satisfy the performance requirements (Rise time ≤ 0.5 sec; Settling time ≤ 2 sec). However, the control system under the high-order compensator (6th-order compensation filter) converges nearly 1 second faster and there is no significant overshoot.

More Answers (0)

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!