Python ile PID Kontrol Kodlaması
PID kontrolde, kapalı döngü sistemlerinde (close loop) çıkış değerimizden(output value) gelen sonuç ile istenilen değerimiz(desired point) arasındaki fark hesaplanır. Yani hata değerimiz hesaplanır. Her bir P,I ve D parametsine göre hata değerleri hesaplanır. Bu hata değerleri ile Kp, Ki ve Kd kazançları (gain) çarpılır ve hepsi toplanır. Bu toplam sistemimize girdi olarak verilir ve sonra çıkış değerimiz hesaplanır. Bu işlemi belirlediğimiz threshold değerine göre ya da örneklem aralığı (sampling rate) göre devam ettirebiliriz.
Peki örnekleme aralığının(sampling rate) sisteme etkisi nedir?
Eğer örnekleme aralığı çok fazla ise türev etkisi gürültüye, integral etkisi ise taşmaya(overflow) sebep olmaktadır. Peki örnekle aralığı çok az olur ise ne olur? Örneklemenin gecikmesinden dolayı sistem istediğimiz performansı gösteremez.
PID kontrol sisteminin her parçasının çalışma yapısına yukarıda değindik. Şimdi ise bu yapıları nasıl kodlayabileceğimize bakalım.
- İlk olarak sistemimizi oluşturuyoruz.
system = lambda x : 0.2*x + 0.5
Sistemde istenilen değer ile geri bildirim(feedback) yani çıktı değeri arasındaki farkı ölçüyoruz. Bunun için ilk olarak sisteme geri bildirim eklememiz gerekiyor. Sistem çıktısını, geri bildirim olarak gönderiyoruz.
#sistem ciktisi
def systemOutput(self,processOutput):
self.output = self.system(processOutput)
return self.output
İstenilen değer(desired value) ile geri bildirim değeri arasındaki farkı hesaplıyoruz. Bu değere hata(error) değerimiz diyoruz. Amacımız istenilen değer ile çıktı arasındaki farkı yani hata değerimizi azaltmak.
def errorCalculate(self,feedback):
self.error = self.desiredValue - feedback
return self.error
- P, I ve D değerlerini hesaplamak için kazanç değerlerimizi ve hata değerimizi kullanıyoruz. Oransal kontrol ile anlık durumu kontrol ediyoruz. Integral kontrolde geçmiş hata değerlerimizi kullanıyoruz. Türevsel kontrol ile gelecekteki hata değişimlerini öngörüyoruz.
- Hata değerimizi her parametrenin kazanç değerleri ile işleme sokuyoruz. Hesaplanan P,I ve D değerlerini toplayarak, sisteme girdi olarak veriyoruz.
# pıd değerlerini ve outputu hesaplıyoruz def pid(self,feedback): self.last_err = 0 errorI = 0 errorD = self.errorCalculate(feedback) - self.last_err / self.getSampleTime() errorI += (self.getSampleTime() * (self.errorCalculate(feedback) / 2 )) P = self.Kp * self.error I = self.Ki * errorI D = self.Kd * errorD output = P + I + D self.last_err = self.error return self.systemOutput(output)
P = 0
I = 0.001
D = 0.5
Input ve Output ilişkisi |
- Peki bu işlem süresi neye göre değişmektedir? Örnekleme süresi seçip, o süre boyunca bu işlemleri yapabiliriz. Bir hata oranı ya da değeri belirleyerek o değere ulaştığında sistemi durdurabiliriz. Farklı yöntemlerle sistemin kontrol edebiliriz.
PID kontrol uygulanması oldukça basit olan ama oldukça etkili bir kontrol algoritmasıdır. Yaptığım örnek çalışmada da bunun bir örneğini gördük.
Bir sonraki yazımda görüşmek üzere.
Kaynakça :
Yorumlar
Yorum Gönder