RSS

REALISASI KONTROL PID (PROPORSIONAL INTEGRAL DERIVATIF) KEDALAM BAHASA PEMROGRAMAN BAHASA C

18 Apr

Menurut sebuah survey, bahwa 97% industri yang bergerak dibidang proses menggunakan kontrol PID dalam melakukan pengontrolannya. Luasnya penggunaan kontrol PID pada dasarnya dilatarbelakangi beberapa hal diantaranya:

  • Kesederhanaan struktur kontrol. Hanya mempunyai 3 parameter utama yang perlu diatur (tuning).
  • kontrol PID memiliki sejarah yang panjang. PID telah digunakan jauh sebelum era digital berkembang (1930an)
  • Kontrol PID dalam banyak kasus telah terbukti menghasilkan unjuk kerja yang relatif memuaskan baik digunakan sebagai sistem regulator maupun sebagai sistem servo.

Pada awalnya kontrol PID umumnya diimplementasikan dengan menggunakan rangkaian elektronika analog. Bahkan  banyak diantaranya direalisasikan dalam komponen mekanis dan pneumatis murni.

Seiring dengan berkembangnya dunia digital (terutama mikroprosessor dan mikrokontroler) maka algoritma kontrol PID dapat direalisasikan kedalam bentuk persamaan PID digital. Yang jika diimplementasikan hanya berupa sebuah program saja yang ditanamkan kedalam embedded system (mikroprosessor atau mikrokontroler).

Berikut adalah beberapa penjelasan singkat tentang kontrol PID:

Kontrol Proporsional

kontrol proporsional berfungsi untuk memperkuat sinyal kesalahan penggerak (sinyal error), sehingga akan mempercepat keluaran sistem mencapai titik referensi. Hubungan antara input kontroler u(t) dengan sinyal error e(t) terlihat pada persamaan 1.

Kp adalah konstanta proporsional. Diagram blok kontrol proporsional ditunjukkan pada gambar 1.

gambar 1 diagram blok kontrol proporsional

Kontrol Integral

Kontrol integral pada prinsipnya bertujuan untuk menghilangkan kesalahan keadaan tunak (offset) yang biasanya dihasilkan oleh kontrol proporsional. Hubungan antara output kontrol integral u(t) dengan sinyal error e(t) terlihat pada persamaan 2.

Ki adalah konstanta integral. Diagram blok kontrol integral ditunjukkan pada gambar 2.

gambar 2 diagram blok kontrol integral

Kontrol Derivatif (turunan)

Kontrol derivatif dapat disebut pengendali laju, karena output kontroler sebanding dengan laju perubahan sinyal error.  Hubungan antara output kontrol derivatif u(t) dengan sinyal error e(t) terlihat pada persamaan 3.

Blok kontrol derivatif ditunjukkan pada Gambar 3. Kontrol derivatif tidak akan pernah digunakan sendirian, karena kontroler ini hanya akan aktif pada periode peralihan. Pada periode peralihan, kontrol derivatif menyebabkan adanya redaman pada sistem sehingga lebih memperkecil lonjakan. Seperti pada kontrol proporsional, kontrol derivatif juga tidak dapat menghilangkan offset.

gambar 3 diagram blok kontrol derivatif


Gabungan dari ketiga kontroler tersebut menjadi kontrol PID. Diagram Blok dari kontrol PID ditunjukan pada gambar 4.

gambar 4  diagram blok kontrol PID

Sehingga persamaan untuk kontrol PID adalah:

atau

Dengan:
u(t) = sinyal output pengendali PID
Kp  = konstanta proporsional
Ti   = waktu integral
Td  = waktu derivatif
Ki   = konstanta integral (Kp⁄Ti )
Kd  = konstanta derivatif (Kp.Td )
e(t) = sinyal error = referensi – keluaran plant = set point – nilai sensor

Untuk persamaan PID no. (4) merupakan PID bentuk independent dan persamaan no. (5) merupakan PID bentuk dependent. Istilah tersebut mengacu kepada ketergantungan setiap suku persamaan terhadap nilai Kp. Untuk persamaan no (4), jika kita melakukan peruhan nilai pada konstanta proporsional (Kp) maka tidak akan mempengaruhi konstanta parameter lainnya. Sedangkan untuk persamaan no. (5), dengan merubah nilai Kp maka akan merubah nilai dari parameter-parameter lainnya. Disini saya akan menggunakan persamaan PID bentuk independent. Jika anda ingin menggunakan persamaan dependent, maka anda tinggal memasukan nilai dari Ki=Kp/Ti dan Kd=Kp.Td

Pada persamaan-persamaan (persamaan (1) – (5)) diatas merupakan persamaan dalam kawasan waktu continuous (analog). Sedangkan agar persamaan persamaan tersebut dapat direalisasikan dalam bentuk pemrograman, maka persamaan dalam kawasan waktu continuous tersebut harus didiskretisasi terlebih dahulu (kawasan digital). Berikut adalah diskretisasi menggunakan metode numerik rectangular mundur (backward rectangular).

Kontrol Proporsional

Jika dari persamaan (1) didiskretisai maka akan menjadi:

Kontrol Integral

Jika dari persamaan (2) didiskretisai maka akan menjadi:

Tc= waktu sampling atau waktu cuplik (Sampling time)

Agar lebih mengerti dari persamaan diatas, akan saya terangkan secara singkat dan jelas.

“Integral (∫) adalah suatu operator matemamis dalam kawasan kontinyu jika didiskretisasi maka akan menjadi sigma (∑), yang merupakan operator matematis dalam kawasan diskret. Dimana fungi dari operator sigma adalah menjumlahkan nilai ke i sampai dengan nilai ke k. Berdasarkan perhitungan diatas variabel error (e) yang di integralkan sehingga dalam kawasan diskret menjadi e(0)+e(1)+…+e(k-1)+e(k), atau dengan kata lain error yang sebelumnya dijumlahkan dengan error-error yang sebelumnya hingga error yang sekarang.”

Kontrol Derivatif

Jika dari persamaan (3) didiskretisai dengan menggunakan cara yang sama seperti kontrol integral maka akan menjadi:

Tc= waktu sampling atau waktu cuplik (Sampling time)

Agar lebih mengerti dari persamaan diatas, akan saya terangkan secara singkat dan jelas.

“Derivatif (de/dt) adalah suatu operator matemamis dalam kawasan kontinyu jika didiskretisasi maka akan menjadi limit, yang merupakan operator matematis dalam kawasan diskret. Dimana fungi dari operator limit adalah mengurangi nilai ke k dengan nilai ke k-1. Berdasarkan perhitungan diatas variabel error (e) yang di derivatifkan, atau dengan kata lain error yang sekarang dikurangi error yang sebelumnya.”

Waktu sampling adalah lamanya waktu yang digunakan untuk mencuplik atau mensampling nilai dari sensor.  Nilai dari sensor ini berguna untuk mendapatkan sinyal error (error(e)=set point-nilai sensor). Dimana waktu sampling ini sangat berpengaruh pada kesensitifan sistem yang akan dikontrol.

Dari persamaan-persamaan (6), (7) dan (8) sudah berupa persamaan digital yang telah didiskretisasi, sehingga bisa langsung direalisasikan kedalam bahasa pemrograman. Disini saya mengimplementasikan kedalam bahasa pemrograman C dengan compiler CodeVision AVR.

Sebelumnya kita harus menentukan terlebih dahulu nilai set point dan waktu sampling. Serta melakukan pembacaan nilai dari sensor dengan lamanya periode sesuai waktu sampling.

float set_point=60, Tc=0.01;
//jika setpoint bernilai 60 dan lamanya waktu sampling 0.01 detik

Dan untuk mendapatkan nilai dari sensor dapat dilakukan dengan pembacaan ADC, dan untuk mensampling nilai ADC selama 0.01 detik dapat menggunakan fitur Timer yang sudah ada pada AVR.

nilai_sensor=read_adc(0);

Untuk kontrol proporsional

error=set_point-nilai_sensor;
outP=Kp*error;  //nilai Kp ditentukan melalui tuning

Untuk kontrol integral

errorI=error+error_sblmI;
outI=Ki*errorI*Tc;  //nilai Ki ditentukan melalui tuning

error_sblmI=errorI;

/*untuk menggeser nilai error integral sekarang menjadi nilai error hasil penjumlahan-penjumlahan sebelumnya  untuk digunakan pada rekursi berikutnya*/

Untuk kontrol derivatif

errorD=error-error_sblmD;
outD=(Kd*errorD)/Tc;   //nilai Kd ditentukan melalui tuning

error_sblmD=error;

/*untuk menggeser nilai error derivatif sekarang menjadi sebelumnya untuk digunakan pada rekursi berikutnya*/

Sedangkan untuk kontrol PID merupakan gabungan dari ketiga kontrol diatas, dan menjadi:

outPID=outP+outI+outD;

CATATAN: nilai Kp, Ki dan Kd didapat melalui tuning dengan menggunakan metode yang sudah ada atau melalui metode try and error (coba-coba).

Berikut adalah listing program lengkapnya:

float KP=5, TI=3, TD=1, error_sblmI=0, error_sblmD=0, outPID, set_point=30, Tc=0.01, error, errorI, errorD, outP, outI, outD;

#include <mega16.h>

// Read the AD conversion result
unsigned int read_adc(unsigned char adc_input)
{
ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
// Delay needed for the stabilization of the ADC input voltage
delay_us(10);
// Start the AD conversion
ADCSRA|=0x40;
// Wait for the AD conversion to complete
while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10;
return ADCW;
}

// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{  
TCNT0=0x8A; //mengunakan timer 0 untuk sampling 0.01 detik kemudian baca ADC
nilai_sensor = read_adc(0);                                  
}

void kontrol_PID()
{
//kendaliproporsional
error=set_point-nilai_sensor;
outP=Kp*error;  //nilai Kp ditentukan melalui tuning

//kendali integral
errorI=error+error_sblmI;
outI=Ki*errorI*Tc;  //nilai Ki ditentukan melalui tuning
error_sblmI=errorI;

//kendali Deferensial
errorD=error-error_sblmD;
outD=(Kd*errorD)/Tc;   //nilai Kd ditentukan melalui tuning
error_sblmD=error;

//kontrol PID
outPID=outP+outI+outD;
}

void main(void)
{
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 11.719 kHz
// Mode: Normal top=FFh
// OC0 output: Disconnected
TCCR0=0x05;
TCNT0=0x8A;
OCR0=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x01;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;

// ADC initialization
// ADC Clock frequency: 750.000 kHz
// ADC Voltage Reference: AVCC pin
// ADC Auto Trigger Source: None
ADMUX=ADC_VREF_TYPE & 0xff;
ADCSRA=0x84;

// Global enable interrupts
#asm(“sei”)

while (1)
      {
      kontrol_PID()
      };
}
Semoga bermanfaat…

 
8 Comments

Posted by on April 18, 2011 in Miscellaneous

 

Tags: , , , , , ,

8 responses to “REALISASI KONTROL PID (PROPORSIONAL INTEGRAL DERIVATIF) KEDALAM BAHASA PEMROGRAMAN BAHASA C

  1. sri rezeki

    June 15, 2011 at 20:23

    mas bisa minta skema lengkap contoh kendali PID dengan microcontroler, beserta programnya…oh ya…kalo mo belajar mikro AVR ada rekomendasi buku apa dan baiknya pakai/belajar bhs asembly apa C ?….tq….

     
    • ElectrO-cOntrOl Team

      June 16, 2011 at 01:53

      sebenarnya pada postingan saya ini sudah cukup jelas cara memprogram kendali PID. Klo mau belajar AVR lebih baik menggunakan bahasa C dengan compiler CodeVision AVR (menurut saya lebih mudah). Klo bukunya, selama ini saya menggunakan berbagai macam referensi baik berupa ebook yg berbahasa inggris maupun buku yg bahasa indonesia. Tp saya sarankan untuk yg indonesia pakai “C & AVR Rahasia Kemudahan Bahasa C dalam MIkrokontroler ATmega8535” penerbit: Graha Ilmu, Penulis: Agus Bejo
      soalnya saya dulu belajar dari situ

       
      • tri

        June 19, 2011 at 16:15

        Betul mas, sdh sesuai penjelasannya dan mudah dimengerti

         
      • ElectrO-cOntrOl Team

        June 19, 2011 at 17:38

        terima kasih…. mudah2an bisa bermanfaat

         
      • sri rezeki

        June 21, 2011 at 15:48

        tanya lagi mas, kalo dilihat dari program…kontrol PIDnya kok tidak membalikkan suatu nilai ya…?,…maksudnya…return dari fungsi PID kan nantinya diberikan ke plant (object yang dikendalikan)….lah saya kok belum lihat out PIDnya …mohon penjelasan. Sekalian minta contoh penerapan…skema misal mengendalikan kecepatan putar motor DC…..atau mengendalikan suhu dalam ruangan dengan pemanas heater…diaman tegangan ke heater yang kita atur dengan kendali PID….maaf mas …pertanyaannya banyak…ini karena aku cuma belajar teori melulu………blum pernah praktek…..makanya pengen nyoba programnya punya mas…tp…blum ada contoh …skema rangkaian atau….plantnya………terimakasih…….salam untuk anak pulau….

         
  2. ElectrO-cOntrOl Team

    June 21, 2011 at 16:13

    sebuah fungsi kan tidak harus mempunyai sebuah nilai balik (return). klo cuplikan program diatas sinyal kontrol PID nya berada pada variabel outPID. Sebgai contoh jika anda ingin mengatur kecepatan motor DC menggunakan PID. Anda tinggal mengumpankan saja sinyal output kontrol PID (variabel outPID) ke sinyal kontrol PWM motor DC. misalnya:

    PWM=outPID;

    klo contoh penerapannya saya belum punya… karena saya ga punya plantnya

     
    • sri_rezeki

      June 22, 2011 at 07:39

      makasih penjelasannnya mas……jadi ….fungsi kontrol_PID() langsung bisa kita pakai ambil outputnya dengan cara seperti itu……(PWM=outPID) ….ohhh…….tengkyu….

       
      • ElectrO-cOntrOl Team

        June 22, 2011 at 13:55

        betul sekali keluaran dari fungsi void kontrol_PID() adalah variabel outPID, yg nantinya variabel ini digunakan untuk pengontrolan aktuator

         

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

 
%d bloggers like this: