Вы находитесь на странице: 1из 7

Modul 3 (Tiga)

Pengendali P, PI, PD dan PID pada Motor DC


1. Tujuan Praktikum
- Mahasiswa dapat memahami karakteristik Pengendali P, PI, PD dan
PID.
- Mahasiswa mampu menggunakan kendali PID dalam pengendalian
sistem kendali.
- Mampu menerangkan pengaruh kontroler P, PI, PD dan PID pada
kinerja system.

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

𝐾𝑑 = 𝐾𝑝 𝑥 𝑇𝑑 adalah parameter derivatif.


Dalam perancangan pengendali PID, ketiga konstata tersebut harus
dipilih agar sistem close-loop memberikan respon yang diinginkan. Respon
yang diinginkan haruslah memiliki settling time yang minimal dengan
overshoot yang kecil atau tanpa overshoot dari respon step sistem close-loop.

Gambar 3.2 Sistem close-loop

PID Controller sebenarnya terdiri dari 3 jenis cara pengaturan yang


saling dikombinasikan, yaitu P (Proportional) Controller, D (Derivative)
Controller, dan I (Integral) Controller. Masing-masing memiliki parameter
tertentu yang harus diset untuk dapat beroperasi dengan baik, yang disebut
sebagai konstanta. Setiap jenis, memiliki kelebihan dan kekurangan masing-
masing, hal ini dapat dilihat pada tabel di bawah ini:
Tabel 1
Respon PID Controller Terhadap Perubahan Konstanta[1]

Type Rise Time Overshoot Settling Time Steady State Error


Kp Decrease Increase Small change Decrease
Ki Decrease Increase Increase Eliminate
Kd Small change Decrease Decrease Small change

Sebuah kontrol otomatis dapat menggunakan sistem kontrol yang


mengkombinasikan antara ketiga elemen sistem kontrol yang ada. Yang
paling banyak digunakan adalah sistem kontrol proporsional, proporsional
ditambah integral (PI), dan proporsional ditambah integral ditambah
derivatif (PID).
Karakteristik aksi pengontrolan Proporsional adalah mengurangi
waktu naik, menambah overshoot, dan mengurangi kesalahan keadaan
tunak. Fungsi alih sistem dengan menambahkan aksi pengontrolan P
menjadi:

𝑃(𝑠) 𝐾𝑝
= 2
𝑞(𝑠) 𝑆 + 5𝑠 + (8 + 𝐾𝑝)

Misal, diambil konstanta Kp = 80, maka :

Kp = 80;

Ps = [Kp];

Qs = [1 5 8+Kp];

t = 0 : 0.01 : 2;

step(Ps, Qs)

title(‘Tanggapan Sistem Loop Tertutup Proporsional’)

Gambar 3.3: Tanggapan sistem terhadap aksi kontrol proporsional

Penambahan aksi kontrol P mempunyai pengaruh mengurangi


waktu naik dan kesalahan keadaan tunak, tetapi konsekuensinya overshoot
naik cukup besar. Kenaikan overshoot ini sebanding dengan kenaikan nilai
parameter Kp. Waktu turun juga menunjukkan kecenderungan yang
membesar.
Kontrol PID merupakan alat standar bagi otomasi industri.
Fleksibilitas pada kontroler membuat kontrol PID digunakan pada banyak
situasi. Kontroller juga dapat digunakan pada selective control maupun
konfigurasi kontroller yang lain. Algoritma PID dapat didefinisikan sebagai
berikut:

1 𝑡 𝑑𝑒
𝑢(𝑡) = 𝐾𝑐 (𝑒(𝑡) + ∫ 𝑒(𝑡)𝑑𝑡 + 𝑇𝐷 )
𝑇𝐼 0 𝑑𝑡

dimana:

u(t) : sinyal kontrol


e(t) : error
Kc : gain kontroller
𝑇𝑖 : integral time

𝑇𝑑 : derivative time

Keluaran kontroller PID merupakan penjumlahan dari keluaran


kontroller proporsional, kontroller integral dan kontroller differensial.
Karakteristik kontroller PID sangat dipengaruhi oleh kontribusi besar dari
ketiga parameter P, I dan D. Penngaturan nilai konstanta Kp, Ti, dan Td
akan mengakibatkan penonjolan sifat dari masing-masing elemen.

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.

3. Alat dan Bahan


- Komputer/Laptop
- Software Arduino IDE
- Software Visio
- Kit Praktikum Sistem Kendali
- Modul Praktikum

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);

#define encoder0PinA 2 //turn on pullup resistor

#define encoder0PinB 3 //digitalWrite(encoder0PinA, HIGH); //ONLY FOR SOME


ENCODER(MAGNETIC)!!!!
long I, interval = 1000;
pinMode(encoder0PinB, INPUT);
long previousMillis = 0;
//turn on pullup resistor
volatile int encoder0Pos = 0;
//digitalWrite(encoder0PinB, HIGH); //ONLY FOR SOME
volatile boolean PastA = 0; ENCODER(MAGNETIC)!!!!
volatile boolean PastB = 0; PastA = (boolean)digitalRead(encoder0PinA); //initial value of
long timeNow; channel A;

int lastMilis; PastB = (boolean)digitalRead(encoder0PinB); //and channel B

long rpm;

const int Toleransi = 5; //To speed up even more, you may define manually the ISRs

double v_aktual, P,D,nilai_PID,delta_error,I_error; // encoder A channel on interrupt 0 (Arduino's pin 2)

double error, v_ref,motor_pwm,error_sebelumnya; attachInterrupt(0, doEncoderA, RISING);

void setup() // encoder B channel pin on interrupt 1 (Arduino's pin 3)

{ attachInterrupt(1, doEncoderB, CHANGE);

pinMode(encoder0PinA, INPUT); Serial.begin (115200);

pinMode(9, OUTPUT); timeNow = millis();

pinMode(6, OUTPUT); lastMilis = timeNow;

pinMode(7, OUTPUT); }

digitalWrite(6,HIGH);

//turn on pullup resistor long akselerasi=0 ;

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;

PastB = (boolean)digitalRead(encoder0PinB); //and channel B if(seconds>=1000){

rpm = (encoder0Pos/24)*60;

//To speed up even more, you may define manually the ISRs lastMilis=timeNow;

// encoder A channel on interrupt 0 (Arduino's pin 2) encoder0Pos=0;

attachInterrupt(0, doEncoderA, RISING); }

// 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);

void loop() I = Ki*I_error;

{ D = Kd*delta_error/0.1;

v_ref = 50; //dalam percent, maksimum 1700 rpm double u = P + I + D ;

timeNow = millis(); u = constrain(u, -5, 5);

int seconds = timeNow-lastMilis; motor_pwm += u;

if(seconds>=1000){ motor_pwm = constrain(motor_pwm, 0, 255);

rpm = (encoder0Pos/24)*60; analogWrite(9, motor_pwm);

lastMilis=timeNow;

encoder0Pos=0;

} unsigned long currentMillis = timeNow;

v_aktual =map(rpm,0,2160,0,100); //konversi dari rpm ke delay(100);


persent
if(currentMillis - previousMillis > interval) {
error = v_ref-v_aktual;
// save the last time you blinked the LED
delta_error = error - error_sebelumnya;
previousMillis = currentMillis;
I_error = I_error+error;
Serial.print("$");

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 ;

u = constrain(u, -5, 5);


void doEncoderA()
void doEncoderA()
motor_pwm += u;
{
{ motor_pwm = constrain(motor_pwm, 0, 255);
encoder0Pos++;
encoder0Pos++;
analogWrite(9, motor_pwm);
}
}

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);

Вам также может понравиться