Sunday, April 22, 2012

Implementasi Kontrol PID


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
        }
    }
}

2 comments:

  1. mas anhar _
    saya 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_

    ReplyDelete
    Replies
    1. Salam kenal juga,
      Program 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..

      Delete