PID not achieving required results

6 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.
  1 Comment
Desislava Petkova
Desislava Petkova on 20 May 2022
Thank you so much for your help!
Best Regards,
Desislava

Sign in to comment.

More Answers (0)

Community Treasure Hunt

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

Start Hunting!