Python ile PID Kontrol Kodlaması

PID kontrol, kontrol sistemler arasında kullanılan en yaygın yöntemdir. Önceki yazımda PID kontrolün nasıl çalıştığını ve sisteme olan etkilerine bakmıştık. Teorik açıklamaların bulunduğu bu yazımı okuyabilirsiniz. Bu yazımda ise PID kontrolün kodlanmasını ve kendi oluşturduğumuz sisteme olan etkilerine bakacağız. Kodlara adresten ulaşabilirsiniz.




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.


# hatayı hesaplıyoruz
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)



Sistemin çıktısı, tekrar geri bildirim olarak kullanılır. P,I ve D parametlerinin değerleri tasarlanılan sistemin özelliklerine göre değişmektedir. Bu sistemdeki değerler ise:

P = 0
I = 0.001
D = 0.5

Oluşturduğumuz sistemin girdi ve çıktı değerleri aşağıdaki figürdeki gibidir.


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

Bu blogdaki popüler yayınlar

PWM NEDİR?