timeNow = millis();
int seconds = timeNow-lastMilis; 0,1 416 % 50 ms 300 ms
if(seconds>=1000){ 0,5 60 % 25 ms Tidak ada
rpm = (encoder0Pos/24)*60;
lastMilis=timeNow;
encoder0Pos=0;
}
v_aktual =map(rpm,0,2160,0,100); //konversi dari rpm
ke persent
error = v_ref-v_aktual;
delta_error = error - error_sebelumnya;
I_error = I_error+error;
P = (Kp * error);
I = Ki*I_error;
D = Kd*delta_error/0.1;
double u = P + I + D ;
double u = P + I + D ;
Tabel 4.1
Tabel 4.3
V. SIMPULAN
Berdasarkan percobaan yang telah dilakukan, terdapat 4
jenis pengendali yang digunakan dalam praktikum ini.
Pengendali tersebut yaitu pengendali P, PI, PD, dan PID.
Masing-masing pengendali memiliki karakteristik masing-
Gambar 4.14 Grafik pada tabel 3 dengan Kp =0,1 dan Kd = 3,5 masing.
Nilai Kp mempengaruhi tingkat kesensitifan respon.
Apabila nilai Kp yang diinputkan kecil maka berdampak
meningkatkan tingkatkan sensitivitas pengendali. Nilai Kp
Tabel 4 diinputkan besar maka berdampak pada kenaikan nilai
offset pengendali
Kp Ki overshoot Rising Settling Nilai Td berperan dalam unsur derivative. Hal ini terlihat
time time dari cepatnya respon saat nilai Td bernilai besar sedangkan
0,1 0,000001 40 % 40 ms 185 ms dalam kondisi nilai Td kecil maka respon awal (rising
time) kurang cepat mencapai set point.
Nilai Ti digunakan untuk menghilangkan offset. fungsi
dari besaran Ti akan bekerja maksimal apabila nilai Ti
bernilai tepat. Kondisi nilai Ti kecil dapat mengakibatkan
respon lebih sensitive dan mudah berosilasi sedangkan
dalam kondisi nilai Ti besar dapat mengakibatkan respon
menjadi lambat.
REFERENSI
[1] McRobert, Michael, “Beginning Arduino,” in Diving DC Motor, 5th ed.
Springer Science+Business Media, LLC., 233 Spring Street, 6th Floor,
New York USA:, year 2010, ch5. , sec. 1, pp. 99-102.
Gambar 4.15 Grafik pada tabel 4 dengan Kp = 0,1 dan Ki = [2] Modul 3 Praktikum Sistem Kendali Institut teknologi Sumatera
0,000001 [3] http://ctms.engin.umich.edu/CTMS/index.php?example=Introduction&s
ection=ControlPID
diakses tanggal 4 Desember 2018 pukul 15.43 WIB
Berdasarkan praktikum yang telah dilakukan diperoleh data [4] https://forum.arduino.cc/index.php?topic=410029.0
diakses tanggal 4 Desember 2018 pukul 15.40 WIB
pada gambar 4.15. Apabila ditinjau dari grafik tersebut maka, [5] https://medium.com/luosrobotics/an-introduction-to-pid-control-with-dc-
dapat dilihat bahwa respon mengalami overshoot sebesar 40% motor-1fa3b26ec661
dan menghabiskan waktu 40 ms serta mencapai settling time diakses tanggal 4 Desember 2018 pukul 15.00 WIB
saat 185 ms. Alasan menjadikan grafik 4.15 sebagai grafik
dengan respon terbaik dibanding grafik-grafik sebelumnya.
Hal ini diperkuat dengan waktu respon mencapai referensi di
Lampiran
1. Source code untuk tugas I
//PIN's definition
#define encoder0PinA 2
#define encoder0PinB 3
long I, interval = 1000;
long previousMillis = 0;
volatile int encoder0Pos = 0;
volatile boolean PastA = 0;
volatile boolean PastB = 0;
long timeNow;
int lastMilis;
long rpm;
const int Toleransi = 5;
double v_aktual, P,D,nilai_PID,delta_error,I_error;
double error, v_ref,motor_pwm,error_sebelumnya;
void setup()
{
pinMode(encoder0PinA, INPUT);
pinMode(9, OUTPUT);
pinMode(6, OUTPUT);
pinMode(7, OUTPUT);
digitalWrite(6,HIGH);
//turn on pullup resistor
//digitalWrite(encoder0PinA, HIGH); //ONLY FOR SOME ENCODER(MAGNETIC)!!!!
pinMode(encoder0PinB, INPUT);
//turn on pullup resistor
//digitalWrite(encoder0PinB, HIGH); //ONLY FOR SOME ENCODER(MAGNETIC)!!!!
PastA = (boolean)digitalRead(encoder0PinA); //initial value of channel A;
PastB = (boolean)digitalRead(encoder0PinB); //and channel B
//To speed up even more, you may define manually the ISRs
// encoder A channel on interrupt 0 (Arduino's pin 2)
attachInterrupt(0, doEncoderA, RISING);
// encoder B channel pin on interrupt 1 (Arduino's pin 3)
attachInterrupt(1, doEncoderB, CHANGE);
Serial.begin (115200);
timeNow = millis();
lastMilis = timeNow;
}
long akselerasi=0 ;
void loop()
{
timeNow = millis();
int seconds = timeNow-lastMilis;
if(seconds>=1000){
rpm = (encoder0Pos/24)*60;
lastMilis=timeNow;
encoder0Pos=0;
}
v_aktual =map(rpm,0,2160,0,100); //konversi dari rpm ke persent
error = v_ref-v_aktual;
delta_error = error - error_sebelumnya;
I_error = I_error+error;
P = (Kp * error);
I = Ki*I_error;
D = Kd*delta_error/0.1;
double u = P + I + D ;
double u = P + I + D ;