Академический Документы
Профессиональный Документы
Культура Документы
2. Teori Dasar
2.1. Pengendali Proporsional Integrative Derivative
Pengontrol PID adalah jenis pengontrol yang banyak diaplikasikan
dalam kontrol proses industri karena kesederhanaan strukturnya, lebih
tahan terhadap gangguan luar serta dapat diterapkan dalam kondisi
operasi yang bervariasi. Tetapi pengontrol PID perlu ditala secara benar
yaitu menentukan harga konstanta pengontrol proporsional, integral dan
derivatif yang mengoptimalkan kinerja sistem. Setelah tiga parameter
tersebut ditala, maka nilai parameter pengontrol tersebut pada PID
biasanya dipertahankan tetap selama proses pengontrolan.
Sebuah sistem kendali close-loop yang dasar, diperlihatkan pada
Gambar 3.2 terdiri dari sebuah pengendali dan sebuah plant. Pada makalah
ini PID digunakan sebagai pengendali. Pengendali PID ini terdiri dari tiga
buah komponen: bagian proportional, bagian integral dan bagian
derivative. Pengendali PID menggunakan persamaan kendali sebagai
berikut:
1 𝐾𝑑 𝑠 2 + 𝐾𝑝 𝑠 + 𝐾𝑖
𝐶(𝑠) = 𝐾𝑝 (1 + + 𝑇𝑑 𝑠) =
𝑇𝑖 𝑠 𝑠
dimana:
𝐾𝑝 adalah parameter proporsional,
𝐾𝑖 = 𝐾𝑝 /𝑇𝑖 adalah parameter integral dan
𝑃(𝑠) 𝐾𝑝
= 2
𝑞(𝑠) 𝑆 + 5𝑠 + (8 + 𝐾𝑝)
Kp = 80;
Ps = [Kp];
Qs = [1 5 8+Kp];
t = 0 : 0.01 : 2;
step(Ps, Qs)
1 𝑡 𝑑𝑒
𝑢(𝑡) = 𝐾𝑐 (𝑒(𝑡) + ∫ 𝑒(𝑡)𝑑𝑡 + 𝑇𝐷 )
𝑇𝐼 0 𝑑𝑡
dimana:
𝑇𝑑 : derivative time
Satu atau dua dari ketiga konstanta tersebut dapat disetting lebih
menonjol dibanding yang lain sehingga konstanta yang menonjol itulah
akan memberikan kontribusi lebih dominan pada respon sistem secara
keseluruhan.
Pengaruh nilai Kp, Ti dan Td pada respon sistem adalah:
• Kp yang kecil akan membuat pengendali menjadi sensitif dan
cenderung membawa loop berosilasi, sedangkan Kp yang besar
akan menghilangkan offset yang besar juga.
• Ti yang kecil bermanfaat untuk menghilangkan offset tetapi
juga cenderung membawa sistem menjadi lebih sensitif dan
lebih mudah berosilasi, sedangkan Ti yang besar belum tentu
efektif menghilangkan offset dan juga cenderung membuat
sistem menjadi lambat.
• Td yang besar akan membawa unsur Derivative menjadi lebih
menonjol sehingga respon cenderung cepat, sedangkan Td yang
kecil kurang memberi nilai ekstra pada saat – saat awal.
4. Langkah Percobaan
1) Persiapkan alat dan bahan yang akan digunakan saat praktikum
dimulai.
2) Pastikan setiap komponen pada kit praktikum dalam keadaan baik.
3) Buka software arduino IDE pada komputer/laptop lalu copy/paste
script yang terlampir.
4) Upload script pada kit praktikum dan ubahlah nilai Kp, Ki dan Kd
sesuai dengan instruksi dari Assisten Praktikum.
5) Perhatikan dan analisa grafik yang terlihat pada software visio! Apa
pengaruh nilai Kp, Ki dan Kd pada kendali motor DC tsb.
6) Ulangi langkah 4-5 sampai menemukan nilai pengendali yang
menurut anda paling baik dan berikan alasan dengan teori yang
benar.
//PIN's definition digitalWrite(6,HIGH);
long rpm;
const int Toleransi = 5; //To speed up even more, you may define manually the ISRs
pinMode(7, OUTPUT); }
digitalWrite(6,HIGH);
void loop()
//digitalWrite(encoder0PinA, HIGH); //ONLY FOR SOME
ENCODER(MAGNETIC)!!!! {
pinMode(encoder0PinB, INPUT);
//turn on pullup resistor v_ref = 50; //dalam percent, maksimum 1700 rpm
//digitalWrite(encoder0PinB, HIGH); //ONLY FOR SOME
ENCODER(MAGNETIC)!!!!
timeNow = millis();
PastA = (boolean)digitalRead(encoder0PinA); //initial value of
channel A; int seconds = timeNow-lastMilis;
rpm = (encoder0Pos/24)*60;
//To speed up even more, you may define manually the ISRs lastMilis=timeNow;
// encoder B channel pin on interrupt 1 (Arduino's pin 3) v_aktual =map(rpm,0,2160,0,100); //konversi dari rpm ke
persent
attachInterrupt(1, doEncoderB, CHANGE);
error = v_ref-v_aktual;
Serial.begin (115200);
delta_error = error - error_sebelumnya;
timeNow = millis();
I_error = I_error+error;
lastMilis = timeNow;
}
const double Kp=0.025,Kd=10,Ki=0.000002;
long akselerasi=0 ;
long akselerasi=0 ; P = (Kp * error);
{ D = Kd*delta_error/0.1;
lastMilis=timeNow;
encoder0Pos=0;
Serial.print(v_ref);
const double Kp=??,Kd=??,Ki=??;
Serial.print(", ");
Serial.println(v_aktual);
Serial.println(v_aktual);
P = (Kp * error);
I = Ki*I_error;
}
}D = Kd*delta_error/0.1;
error_sebelumnya = error;
error_sebelumnya = error;
}
} double u = P + I + D ;
void doEncoderB()
void doEncoderB()
unsigned long currentMillis = timeNow;
{
{ delay(100);
PastB = !PastB;
PastB = !PastB; - previousMillis > interval) {
if(currentMillis
}
} // save the last time you blinked the LED
previousMillis = currentMillis;
Serial.print("$");
Serial.print(v_ref);
Serial.print(", ");
Serial.println(v_aktual);