Secara dasar kontrol classic PID masih banyak digunakan baik industri
maupun education. Karena kontrol ini cukup mudah implementasinya. Contoh sederhana
dari penggunaan kontrol ini adalah pada robot tracking line. Robot ini
mengikuti garis putih atau hitam pada lantai sebagai referensinya.
Berikut adalah persamaan kontrol PID.
Kontrol PID mempunyai tiga bagian; konstanta kontrol proporsional (Kp), konstanta
kontrol integral (Ki), dan konstanta kontrol derivative (Kd). Sedangkan e
adalah error. Jika nilai Ki adalah nol maka persamaan diatas akan menjadi
kontrol PD, sedangkan jika nilai Kd adalah nol maka kontrol PI.
Lalu bagaimana implementasi kontrol ini dalam program? Ok, sekarang kita
lihat implementasi dari kontrol ini dengan menggunakan C program.
void PID_Initialize(float kp, float ki, float kd, float error_thresh, float step_time); float PID_Update(float error); static int m_started; static float m_kp, m_ki, m_kd, m_h, m_inv_h, m_prev_error, m_error_thresh, m_integral; void PID_Initialize(float kp, float ki, float kd, float error_thresh, float step_time) { /* Initialize controller parameters */ m_kp = kp; m_ki = ki; m_kd = kd; m_error_thresh = error_thresh; /* Controller step time and its inverse */ m_h = step_time; m_inv_h = 1 / step_time; /* Initialize integral and derivative calculations */ m_integral = 0; m_started = 0; } float PID_Update(float error) { float q, deriv; /* Set q to 1 if the error magnitude is below the threshold and 0 otherwise */ if (fabs(error) < m_error_thresh) q = 1; else q = 0; /* Update the error integral */ m_integral += m_h*q*error; /* Compute the error derivative */ if (!m_started) { m_started = 1; deriv = 0; } else deriv = (error - m_prev_error) * m_inv_h; m_prev_error = error; /* Return the PID controller actuator command */ return m_kp*(error + m_ki*m_integral + m_kd*deriv); }
Cukup sederhana implementasi dari program ini, program diatas bisa langsung
diaplikasikan dalam mikrokontroller.
“step_time” adalah interval waktu (dalam seconds) antara pemanggilan fungsi PID_Update(), jadi semakin kecil nilai ini maka akan semakin mendekati persamaan PID diatas. Misal kita men-set “step_time” = 0.010 sec, yang berarti rentang waktu untuk memanggil fungsi PID_Update() juga 0.010 sec.
Untuk menggunakan program ini panggil PID_Initialize() untuk menset-up parameter PID kontroller. Kemudian panggil PID_Update() dalam suatu loop dengan rentang waktu sesuai dengan “step_time”.
int main() { // Initialization float Kp = 2.0f; float Ki = 0.5f; float Kd = 0.5f; float error_threshold = 50.0f; float step_time = 0.01f; // 10ms PID_Initialize(Kp, Ki, Kd, error_threshold, step_time); while(1) { // Call every 10ms If (timer1 == step_time) { // Calculate error error = reference – sensor_input; // Call PID update every step_time Output = PID_Update(error); // Do with the output } } }
mas anhar _
ReplyDeletesaya masih bingung tentang bagaimana memasukkan kontrol PID kedalam suatu program.
mas anhar bisa kasih saya referensi ndak untuk saya agar bisa lebih mudah memahami kontrol PID,
terima kasih sebelumnya _
salam kenal_
Salam kenal juga,
DeleteProgram diatas sudah bisa digunakan secara langsung pada suatu aplikasi, mas Afan tinggal ikuti saja contohnya seperti pada bagian main() function. Biasanya pada mikrokontroler dibutuhkan timer untuk memanggil fungsi PID_Update()
Berikut adalah beberapa tutorial secara detailnya http://www.engin.umich.edu/group/ctm/PID/PID.html
dan berikut adalah tutorial yg sangat bagus dari AVR
http://www.mediafire.com/?t2x76h4zvf23j0h
saya upload beserta source codenya.
Smoga bermanfaat, jgn malu untuk bertanya..