mirror of
https://github.com/gabrielkheisa/control-system.git
synced 2024-11-23 20:03:22 +07:00
112 lines
2.5 KiB
Matlab
112 lines
2.5 KiB
Matlab
clc
|
|
clear all
|
|
close all
|
|
|
|
% Get the tangent line
|
|
J = 0.01;
|
|
b = 0.1;
|
|
K = 0.01;
|
|
R = 1;
|
|
L = 0.5;
|
|
s = tf('s');
|
|
|
|
num_motor = [K];
|
|
den_motor = [J*L J*R+b*L R*b+K*K];
|
|
motor = tf(num_motor,den_motor);
|
|
|
|
% =========== mencari tangenline dan menetukan nilai T dan Y ================
|
|
tic
|
|
timeVal=tic;
|
|
[y,t] = step(motor);
|
|
h = mean(diff(t));
|
|
dy = gradient(y, h); % Numerical Derivative
|
|
[~,idx] = max(dy); % Index Of Maximum
|
|
b = [t([idx-1,idx+1]) ones(2,1)] \ y([idx-1,idx+1]); % Regression Line Around Maximum Derivative
|
|
tv = [-b(2)/b(1); (1-b(2))/b(1)]; % Independent Variable Range For Tangent Line Plot
|
|
f = [tv ones(2,1)] * b; % Calculate Tangent Line
|
|
|
|
L = tv(1);
|
|
T = tv(2);
|
|
|
|
figure(1)
|
|
plot(t, y)
|
|
hold on
|
|
plot(tv, f, '-r') % Tangent Line
|
|
plot(t(idx), y(idx), '.r')
|
|
title('Mencari tangent line plant ')% Maximum Vertical
|
|
hold off
|
|
grid
|
|
|
|
% ================ menentukan control PID sistem ===================
|
|
|
|
% Deklarasi variable control
|
|
control = tf(zeros(1,1,5));
|
|
sys=tf(zeros(1,1,5));
|
|
complete=tf(zeros(1,1,5));
|
|
|
|
% sistem dengan P
|
|
kp = T/L
|
|
control(:,:,1)= tf([0 kp 0],[1 0]);
|
|
|
|
% sistem dengan PI
|
|
kp = 0.9*T/L
|
|
Ti= L/0.3;
|
|
ki = kp/Ti
|
|
control(:,:,2)= tf([0 kp ki],[1 0]);
|
|
|
|
% sistem dengan PID
|
|
kp = 1.2*T/L
|
|
Ti= 2*L;
|
|
ki = kp/Ti
|
|
Td = 0.5*L;
|
|
kd = kp*Td
|
|
control(:,:,3)= tf([kd kp ki],[1 0]);
|
|
|
|
toc
|
|
|
|
%menentukan transfer function sistem
|
|
for x = 1:3
|
|
sys(:,:,x) = motor*control(:,:,x);
|
|
complete(:,:,x) = feedback(sys(:,:,x),1);
|
|
end
|
|
|
|
|
|
for x = 1:3
|
|
%Step response
|
|
figure(2)
|
|
hold on
|
|
step(complete(:,:,x));
|
|
title('Step Response sistem')
|
|
legend('kendali P', 'kendali PI','kendali PID')
|
|
hold off
|
|
|
|
% Mencari karakteristik gelombang
|
|
tf_info(x)= stepinfo(complete(:,:,x));
|
|
% mencari steady state error
|
|
[y,t]=step(complete(:,:,x));
|
|
sserror(x)=(1-y(end));
|
|
|
|
% Impulse Repsonse
|
|
figure(3)
|
|
hold on
|
|
impulse(complete(:,:,x));
|
|
title('Impulse Response sistem')
|
|
legend('kendali P', 'kendali PI','kendali PID')
|
|
hold off
|
|
|
|
% Ramp Repsonse
|
|
figure(4)
|
|
hold on
|
|
step(complete(:,:,x)/s);
|
|
title('Ramp Response sistem')
|
|
legend('kendali P', 'kendali PI','kendali PID')
|
|
hold off
|
|
|
|
figure(5)
|
|
hold on
|
|
step(complete(:,:,x)/(s*s));
|
|
title('Acceleration Response sistem')
|
|
legend('kendali P', 'kendali PI','kendali PID')
|
|
hold off
|
|
end
|