% TAHAP2 PERANCANGAN PENGENDALI dengan UMPAN-BALIK PEUBAH KEADAAN
% (State Variable Feedback Controller)
% untuk PENDULUM TERBALIK
%
clear
L = 0.6; % panjang batang pendulum [m]
M = 0.25; % berat kereta [kg]
m = 0.1; % berat pendulum [kg]
g = 10; % percepatan gravitasi [m/sec2]
% TANPA PENGENDALI
K1 = 0;
K2 = 0;
K3 = 0;
K4 = 0;
sim('pendulum_terbalik_dengan_pengendali_2021_MOD.slx')
subplot(151), plot(gaya,time), grid on, xlabel('GAYA [N]'), ylabel('time [sec]')
subplot(152), plot(posisi,time), grid on, xlabel('POSISI [m]'), ylabel('time [sec]')
subplot(153), plot(kecepatan,time), grid on, xlabel('KECEPATAN [m/sec]'), ylabel('time [sec]')
subplot(154), plot(sudut,time), grid on, xlabel('SUDUT [o]'), ylabel('time [sec]')
subplot(155), plot(RPM,time), grid on, xlabel('RPM'), ylabel('time [sec]')
%
display ('Tekan ENTER')
pause
%
display('Pendulum Terbalik adalah KENDALIAN Tak Linier Tak Stabil') 
display('Unstable Non-linear PLANT')
%
display('LINIERISASI')
%
% Sistem Kendali dengan Umpan-balik Peubah Keadaan dirancang hanya untuk
% kendalian linier. Jadi terlebih dahulu dilakukan linierisasi dengan
% meng-asumsi-kan semua peubah keadaan cukup kecil, dianggap NOL
% Lebih Detail, dapat dilihat catatan:
% http://web.unhas.ac.id/rhiza/arsip/kuliah/Perancangan-Sistem-Kendali/PSKendali2018/Project_4_2018_Pendulum_Terbalik_hal-1.pdf
% dan
% http://web.unhas.ac.id/rhiza/arsip/kuliah/Perancangan-Sistem-Kendali/PSKendali2018/Project_4_2018_Pendulum_Terbalik_hal-2.pdf
% 
display ('Tekan ENTER')
pause
% Matrix A dan B hasil LINIERISASI:
%
A = [0 1 0 0;0 0 -m*g/M 0; 0 0 0 1; 0 0 (M+m)*g/(M*L) 0]
B = [0; 1/M; 0; -1/(M*L)]
%
Nilai_Eigen_A = eig(A)
display ('Tekan ENTER')
pause
% Untuk men-stabil-kan pendulum, maka dilakukan penempatan pole (pole
% placement) ke sebelah kiri sumbu khayal menggunakan perintah >>> place 
% (untuk lebih jelasnya: Pada Command Window: >>> help place
% Misalnya Nilai Eigen matrix [A - BK] akan ditempatkan SEKITAR P = -10
%
P = -10;
N = 10^15;
j = sqrt(-1);
format long;
p(1) = P + (N*eps);
p(2) = P - (N*eps);
p(3) = P + j*(N*eps);
p(4) = P - j*(N*eps);
% Penjelasan mengapa poles tidak ditempatkan tepat pada P = -10 dapat dibaca di link:
% http://www.unhas.ac.id/rhiza/arsip/arsip-macam2/eigenvalues.doc 
%
LAMBDA = [p(1) p(2) p(3) p(4)]';
GAIN_K = place(A,B,LAMBDA);
K1 = GAIN_K(1);
K2 = GAIN_K(2);
K3 = GAIN_K(3);
K4 = GAIN_K(4);
K = [K1 K2 K3 K4]
Nilai_Eigen_Gain_K = eig(A - B*K)
%
display ('Tekan ENTER')
pause
%
sim('pendulum_terbalik_dengan_pengendali_2021_MOD.slx')
subplot(151), plot(gaya,time), grid on, xlabel('GAYA [N]'), ylabel('time [sec]')
subplot(152), plot(posisi,time), grid on, xlabel('POSISI [m]'), ylabel('time [sec]')
subplot(153), plot(kecepatan,time), grid on, xlabel('KECEPATAN [m/sec]'), ylabel('time [sec]')
subplot(154), plot(sudut,time), grid on, xlabel('SUDUT [o]'), ylabel('time [sec]')
subplot(155), plot(RPM,time), grid on, xlabel('RPM'), ylabel('time [sec]')

