html
Hari Santoso
Mohon maaf karena sudah beberapa pekan vakum, ada banyak aktifitas yang harus
kita kerjakan dan kita siapkan. Aktifitas sharing jadi terkendala karena kita
kebanjiran request program Arduino. Bahkan ebook versi 3 juga sedikit terkendala.
Mohon dimaafkan. ;)
Mari kita lanjut pembahasan tentang PID Controller dan cara mencari konstantanya.
Teknik yang dipakai dalam pembahasan kali adalah metodenya Cohen-Coon, dan
mungkin agak sama dengan proses analisa grafiknya.
Tahap-tahap yang akan dilakukan dalam mencari konstanta PID sebagai berikut:
1. Analisa grafik untuk menemukan Transfer Function
2. Mencari Konstanta PID
3. Contoh Coding
Saat ini kita akan mengambil studi kasus tentang kontrol panas cairan. Oleh sebab
itu, tugas alat yang kita tanamkan PID adalah : Memastikan suhu cairan stabil pada
panas tertentu dengan mengontrol sudut bukaan kran gas. Kran gras dikontrol
dengan servo.
Berdasarkan kasus tersebut, maka data INPUT-nya adalah bukaan gas (dalam
derajat), sedangkan RESPONSE / OUTPUT-nya adalah suhu cairan.
Ada dua grafik yang kita butuhkan, yaitu grafik perubahan input terhadap waktu dan
grafik perubahan response terhadap waktu, dengan rincian sebagai berikut :
Waktu satuannya dalam detik. Untuk kasus lain, satuan ini bisa disesuaikan. Sudut
satuannya derajat. Suhu satuannya derajat selsius. Selanjutnya, untuk
mempermudah analisa, maka kedua grafik ini digabung jadi satu (lihat gambar).
1 of 5 10/26/2019, 3:03 PM
Contoh Kontrol PID : Menghitung Nilai PID & Coding Arduino https://www.elangsakti.com/2018/02/contoh-kontrol-pid.html
Dalam teknik cohen-coon, berdasarkan grafik, yang harus kita tentukan adalah :
a. selisih kenaikan suhu (Δ)
b. selisih kenaikan sudut (∂)
c. Gain K
d. Nilai 28% dan 63% dari Δ
e. Waktu saat 28% dan 63% dari Δ
f. Konstanta effective time (τ)
g. Deadtime (θ)
h. Rumus Transfer Function
2 of 5 10/26/2019, 3:03 PM
Contoh Kontrol PID : Menghitung Nilai PID & Coding Arduino https://www.elangsakti.com/2018/02/contoh-kontrol-pid.html
d. Nilai 28% dan 63% ini sudah standar metode tersebut, ada referensi yang
menggunakan 28.2% dan 63.2% dari Δ
28%Δ = Suhu terendah + 0.28*Δ
28%Δ = 25.75 + 0.28*69.5 = 45.21
e. Mencari waktu saat 28% dan 63% bisa menggunakan rumus segitiga atau bisa
langsung lihat posisinya di grafik. PENTING!!! Perhitungan waktu dimulai dari saat
pertama kali input diubah (TChange). Misal, waktu saat start adalah detika ke-341,
waktu saat 28% adalah detik ke-720 dan waktu saat 63% adalah detik ke-1191. Maka :
h. Dari data-data tersebut maka rumus transfer function G(s) yang kita dapatkan
ditentukan berdasarkan :
Baik, pada tahap ini kita sudah mendapatkan rumus transfer function. Lalu apa?
Jika sudah punya rumus transfer function, Anda bisa mencari konstanta PID dengan
metode coba-coba. Anda bisa membuat simulasi di Matlab dengan memasukkan
rumus tersebut sebagai rumus transfer functionnya. Jadi Anda juga bisa melihat step
3 of 5 10/26/2019, 3:03 PM
Contoh Kontrol PID : Menghitung Nilai PID & Coding Arduino https://www.elangsakti.com/2018/02/contoh-kontrol-pid.html
Namun, karena yang akan dibahas adalah dengan metode cohen-coon, maka yang
akan kita lakukan adalah mencari nilai PID dengan perhitungan yang ditemukan oleh
cohen-coon. :D
τI = θ(32+(6θ/τ)) / (13+(8θ/τ))
τI = 143.5*(32+(6*143.5/706.5)) / (13+(8*143.5/706.5))
τI = 325.9425599
τD = 4θ / (11+(2τ/τ))
τD = (4*143.5) / (11+(28706.5/706.5))
τD = 44.15384615
Ki = Kc/τI
Ki = 3.137593061/325.9425599
Ki = 0.009626215
Kd = Kc*τD
Kd = 3.137593061*44.15384615
Kd = 138.5368013
Potongan coding di bawah ini contoh penggunaan konstanta PID dalam Arduino.
1. unsigned long last_compute = millis();
2. unsigned long DT = 1000;
3.
4. float ERR = 0;
5. float ERR_LAST = 0;
6. float ERR_CORRECTION = 0;
7. float SETPOINT = 70;
4 of 5 10/26/2019, 3:03 PM
Contoh Kontrol PID : Menghitung Nilai PID & Coding Arduino https://www.elangsakti.com/2018/02/contoh-kontrol-pid.html
8. float INTEGRAL = 0;
9. float DERIVATIVE = 0;
10.
11. const float KP = 3.137593061;
12. const float KI = 0.009626215;
13. const float KD = 138.5368013;
14.
15. int SERVO = 0;
16. int SERVO_LAST = 0;
17. int servo_start_min = 0;
18. int servo_start_max = 180;
19.
20. void ServoController(){
21.
22. if( millis() - last_compute > DT){
23.
24. // baca sensor suhu
25. float SUHU = BacaSensorSuhu();
26.
27. // hitung pid
28.
29. ERR = ERR_CORRECTION + SETPOINT - SUHU;
30. float TheP = KP * ERR;
31.
32. INTEGRAL = ERR / DT;
33. float TheI = KP * INTEGRAL;
34.
35. DERIVATIVE = (ERR - ERR_LAST)/DT;
36. float TheD = KD * DERIVATIVE;
37.
38. // sudut servo
39. SERVO = TheP + TheI - TheD;
40.
41. // catat error terakhir
42. ERR_LAST = ERR;
43.
44. // sesuaikan sesuai batasan servo
45. if(SERVO > servo_start_max) SERVO = servo_start_max;
46. if(SERVO < servo_start_min) SERVO = servo_start_min;
47.
48. // jika sudut servo berubah
49. if(SERVO!=SERVO_LAST){
50.
51. // gerakkan servo sesuai sudut
52. SetServo(SERVO);
53.
54. SERVO_LAST = SERVO;
55. }
56.
57. last_compute = millis();
58. }
59. }
Semoga bermanfaat. :)
Kira-kira, apa yang akan kita share berikutnya?
5 of 5 10/26/2019, 3:03 PM