PID tuning to meet conditions for settling time and overshoot while a stable system with minimum peak time and zero velocity error.
60 views (last 30 days)
Show older comments
Ashaya KC
on 2 Dec 2024 at 3:28
So I am trying to find the gain values for a PI control system that would give me a settling time not exceeding 6 seconds, and an maximum overshoot not going over 5% while ensuring that the peaktime is the lowest it can be, and that the system is stable, and also has zero velocity error.
I have written the following code. Starting with a kp and ki value of 1 each, I get a system that gives desirable overshoot and settling time, but I am wondering if the peaktime can be even lower while still having settling time <= 6 and overshoot <= 5.
I am using the following toolboxes: Control System Toolbox
Questions
- Using the rlocus function, I have also shown that the real parts of the poles are negative, so this demonstrates that my system is stable right?
- Also am I using Lsim correctly to determine if velocity error is zero? The resultant graph has a gray line showing the time response, and a blue line that is parallel to it. This means zero velocity error right?
- What is the best way to fine-tune the gain values kp and ki to minimize peak time while ensuring the above conditions are still met?
I would like to use matlab only and no simulink for this please.
clc
clear all
% plant transfer function
G = tf([1], [0.5 1.5 1])
kp = 1
ki = 1
% PI controller
C = tf([kp ki], [1 0])
% closed loop transfer function
T = feedback(C*G, 1)
rlocus(T)
% Find the poles
poles = pole(T)
% step response
figure;
step(T);
title('Step Response');
grid on;
% Step analysis
info = stepinfo(T)
% Ramp Input
t = 0:0.01:10;
ramp = t;
% System response to ramp
figure;
lsim(T, ramp, t);
title('Ramp Response')
legend
grid on
1 Comment
Paul
on 2 Dec 2024 at 12:47
T is the closed-loop transfer function. The root locus should be plotted for the (open-)loop transfer function.
Accepted Answer
Sam Chak
on 2 Dec 2024 at 12:53
Hi @Ashaya KC
Here is the solution using pidtune(). There is no direct way to input the desired settling time and overshoot percentage; however, you can enter the desired phase margin. This has been a concern for me in MATLAB for many years. Nevertheless, based on the desired overshoot percentage, you can apply the formula from your lecture notes to determine the desired phase margin.
%% The Plant
Gp = tf([1], [0.5 1.5 1])
%% Using pidtune
Pm = 68.2; % desired Phase Margin
opt = pidtuneOptions('PhaseMargin', Pm, 'DesignFocus', 'balanced');
[Gc, info] = pidtune(Gp, 'pidf', opt)
%% Closed-loop system
Gcl = feedback(Gc*Gp, 1)
S = stepinfo(Gcl)
step(Gcl), grid on, grid minor
xline(S.SettlingTime, '--', sprintf('Settling Time: %.3f s', S.SettlingTime), 'color', '#7F7F7F', 'LabelVerticalAlignment', 'bottom')
yline(1+S.Overshoot/100, '--', sprintf('Overshoot: %.3f %%', S.Overshoot), 'color', '#7F7F7F', 'LabelVerticalAlignment', 'top')
0 Comments
More Answers (2)
Epsilon
on 2 Dec 2024 at 5:34
Hi Ashaya,
The answers to your queries are:
- Yes, for a linear close looped continuous-time system the negative real parts of all the poles do indeed represent a stable system.
- The resultant graph does not show a zero-velocity error as there is a steady state error present (response of the system does not match the ramp input). Tuning the gain parameters can help in achieving a zero steady state error.
- To automatically fine tune the value of the gain parameters(kp,ki), use ‘pidtune’. Alternatively, the ‘PID Tuner App’ can also be used. Attaching a code snippet for reference:
% using pidtune function
[C, info] = pidtune(G, 'PI');
kp = C.Kp;
ki = C.Ki;
% Alternatively, opening the PID Tuner App
% pidTuner(G, 'PI');
Documentation link to PID Tuner App and pidtune function:
Hope it helps!
Sam Chak
on 2 Dec 2024 at 11:26
Hi @Ashaya KC
Let's first use the ideal mathematical solution and then compare it to your solution obtained using the pidtune() command. In this context, 'ideal' means that the order of the controller should match the order of the plant. Since your plant is of order 2, the controller should ideally also be of order 2. The practical PID controller fits this requirement.
% Plant
Gp = tf([1], [0.5 1.5 1])
% PID controller
kp = 0.561012507894632;
ki = 0.723966578400112;
kd = -0.044798506317072;
Tf = 0.725085073492745;
Gc = pid(kp, ki, kd, Tf)
% Closed-loop system
Gcl = feedback(Gc*Gp, 1)
S = stepinfo(Gcl)
step(Gcl), grid on, grid minor
xline(S.SettlingTime, '--', sprintf('Settling Time: %.3f s', S.SettlingTime), 'color', '#7F7F7F', 'LabelVerticalAlignment', 'bottom')
yline(1+S.Overshoot/100, '--', sprintf('Overshoot: %.3f %%', S.Overshoot), 'color', '#7F7F7F', 'LabelVerticalAlignment', 'top')
0 Comments
See Also
Categories
Find more on Classical Control Design in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!