PID Nedir, Nasıl Kullanılır
PID (proportional-integral-derivative) kontrol sistemdeki hatayı; hatanın miktarı, hatadaki değişim hızı ve yapılan toplam hatayı hesaplayarak giderme yöntemidir. Bu değerlerin etkisini kontrol etmek için katsayılar kullanılır.
P katsayısı sistemin hataya karşı vereceği tepkiyi belirler. Büyük olursa hatayı hızlı kapatır ama denge noktasını geçer. Bu etkiyi frenlemek için hatadaki değişim hesaplanır. Hatadaki değişimin etkisi de D katsayısı belirler. Toplam hata, sistemin geçmişte yaptığı hatayı telafi etmek için hesaplanır ve etkisi I katsayısıyla belirlenir. Basit bir örnekle açıklarsak;
PID kontrolle bir aracın A noktasından B noktasına ortalama 90km/s hızla gitmesini sağlayalım. Araç hareketsizken ilk kontrolde P “hızmız 0km/s 90km/s hıza çıkmamız lazım hata 90km/s , gazla” der. İkinci kontrolde aracın hızı 50km/s olsun P “hata 40km/s gazlamaya devam” der, D “hatayı çok hızlı kapatıyorsun böyle gazlamaya devam edersen hedef hızı geçeceksin” der ve gaz biraz kapatılır. Araç 90km/s hıza ulaşana kadar bu atışma devam eder. D, P nin tepkisini yumuşatıcı etki yaptığı için araç 90km/s hıza ulaştığında ivme sıfırlanmış olacaktır ki, I atılır “ortalama hız 90km/s olacak 0 dan 90 a çıkana kadar zaman kaybettik, bu zamanı telafi etmemiz lazım hızlanmaya devam” der ve araç hızlanmaya devam eder. Kaybettikleri zamanı telafi ettikten sonra aracın hızını 90km/s e düşürürler ve mutlu mesut B noktasına ulaşırlar.
P, I ve D aynı anda bir sistemde kullanılmak zorunda değildir. Mesela aracımızın sadece 90km/s sabit hızla gitmesi istenseydi I kullanmamıza gerek kalmazdı.
PID kontrol ile servo yapımı
Kod:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 |
byte PWMA = 9; byte AIN1 = 7; byte AIN2 = 8; byte sec; float byteRead; float kd; float kp; float ki; int pot1; int pot2; int pwm; void setup() { Serial.begin(9600); } void loop() { /* bu kısım serial monitorden kp, kd ve ki katsayılarını değiştirmemizi sağlıyor. kp için p, kd için d, ki için i yazıp ardından değeri girip enter tuşuna bastığımızda yazdığımız değer geçerli oluyor(girdiğimiz değer 100 bölünüyor) */ while (Serial.available()) { byteRead = Serial.read(); if (byteRead == 112) { sec = 1; kp = 0; } else if (byteRead == 100) { sec = 0; kd = 0; } else if (byteRead == 105) { sec = 2; ki = 0; } if (sec == 1) { if (byteRead > 47 && byteRead < 58) { kp = (kp * 10) + (byteRead - 48) / 100; } } else if (sec == 0) { if (byteRead > 47 && byteRead < 58) { kd = (kd * 10) + (byteRead - 48) / 100; } } else if (sec == 2) { if (byteRead > 47 && byteRead < 58) { ki = (ki * 10) + (byteRead - 48)/100; } } } //pot değerleri okunuyor pot1=analogRead(A0); pot2=analogRead(A1); //pid kontrol ile pwm hesaplanıyor pwm += pid(pot1, pot2); pwm = constrain(pwm, -255, 255); don(pwm); delay(20); //bilgiler ekrana yazdırılıyor Serial.print(pot1); Serial.print(" "); Serial.print(pot2); Serial.print(" "); Serial.print(pwm); Serial.print(" "); Serial.print(kp); Serial.print(" "); Serial.print(kd); Serial.print(" "); Serial.println(ki); } //motoru sürmek için void don(int hiz){ boolean inPin1; boolean inPin2; if(hiz<0){ inPin1 = 1; inPin2 = 0; } else { inPin1 = 0; inPin2 = 1; } hiz=abs(hiz); digitalWrite(AIN1, inPin1); digitalWrite(AIN2, inPin2); analogWrite(PWMA, hiz); } //pid hesabı int pid(int hedef_dgr, int dgr) { float pidTerm; int hata; static int son_hata; static int toplam_hata; hata = hedef_dgr - dgr; toplam_hata += hata; pidTerm = (hata) * kp + (hata - son_hata) * kd + toplam_hata * ki; son_hata = hata; return (int(pidTerm)); } |
kardes pid parametreleri kac aldın
Kullandığın donanım burdakilerle bire bir aynı olmadıktan sonra burda kullanılan değerler işine yaramaz.
Çok teşekkürler aradığım bilgileri buldum. PID kütüpanesi ile Solid stade relay kontrol edebilirmiyim ?
P oransal, i integral, d diferansiyel katsayısı peki ama integral elemanında geçen süreyle çarpmamışsın ve türev elemanında da geçen süreye bölmemişsin. Eksik değil mi?
Orada süreyle çarpılan bişey yok. PID fonksiyonu belirli bir zaman aralığında(örnek kodda yaklaşık 20ms de bir) çalışıyor. P o anki hata, D bir önceki hata ile şimdiki hata arasındaki fark, I toplam hata.
peki pid katsayıları kendinden uyarlamalı yapılabilir mi ? yani örneğin düşürücü tip bir konverter tasarlıyorsak referans değeri değiştiğinde değişimi algılayıp ona göre parametre değişebilir mi?
Sadece referans değeri değiştirmek pid katsayılarını değiştirmeyi gerektirmez. Sistem yeni referans değerine göre çalışmaya devam eder.
Merhabalar pid katsayıları tam olarak neye göre belirleniyor. Ve bu katsayıları değiştirdikçe nasıl davranıyor sistem.
Değerli bilgiler için teşekkür ederim