PID Algoritması

Hayatımızın her alanında karşılaştığımız ama farkına varmadığımız algoritmalardan birisi de PID algoritmasıdır. Temel amacı daha yumuşak tepkiler vererek istenilen sonuca en hızlı ve en stabil şekilde ulaşmaktır.

PID Algoritması

PID algoritması sistemdeki hatayı mümkün olduğunca düşürmek için en sık kullanılan algoritmalardan birisidir. Bu algoritma ilk başlarda çok karmaşık gibi gözükse de bu tarz algoritmalara göre çok basit bir yapısı bulunmaktadır.

Aslında algoritmanın ismi bir kısaltmadan oluşmaktadır. P ingilizce orantı anlamına gelen "proportion" kelimesinin baş harfidir. I "Integral" kelimesinden ve D de ingilizce türev anlamına gelen "derivative" kelimesinin baş harfidir.

PID Kontrolcüleri

PID algoritması aslında 3 tip algoritmanın birleşiminden oluşmaktadır. Bunlar P(oran), I(integral) ve D(türev) algoritmaları bunlar aralarında farklı kombinasyonlar oluşturarak aynı hedef doğrultusunda ihtiyaçlar ve duruma göre bu kombinasyonlar arasından tercihler yapılmaktadır.

P(Oran) Kontrolcüsü

Eğer sisteminiz çok kompleks bir yapıya sahip değilse genellikle yalnızca P kontrolcüsü ile çözüme ulaşabilirsiniz. Bu kontrolcü sistemin doğrusal tepkiye göre daha yumuşak tepkiler vermesini sağlamaktadır. Bu tepki Kp katsayısı ile kontrol edilir.

int sensorDegeri = 0;
float tepkiDegeri = 0.0;
int hedefDeger = 512;
int hata=0;
float Kp = 0.2;
while(1) {
// Sensör bilgisi okunuyor
sensorDegeri = sensorOku();
// Sensor değeri ile hedeflenen değer arasındaki fark bulunuyor
hata = hedefDeger - sensorDegeri;
// Hata değerimiz belirlediğimiz oran katsayısı ile çarpılıyor
tepkiDegeri = Kp*hata;
// Düzeltme için verilecek tepki değeri çıktı olarak iletiliyor
tepkiVer(tepkiDegeri);
}

Eğer bu katsayı ideal düzeyin altında olursa genellikle sonuca çok düzgün bir şekilde erişilir ancak bu erişim için geçen süre uzun olacaktır.

Eğer Kp ideal düzeyin üstünde olursa istenilen durum aşılabilir ve overshot ve undershot etkisi gözüktünden sonra istenilen durum elde edilir.

Eğer Kp ideal düzeyin çok üstünde olursa istenilen duruma asla erişilemez ve sürekli dalgalı bir sonuç elde edilir.

I(Integral) Kontrolcüsü

Bu kontrolcünün tercih edilmesinin en temel sebebi sürekli olan hatadır. Bu sürekli hata sistemden sisteme değişiklik göstermektedir. Eğer sürekli olan bir hata kaynağınız varsa sisteminizde I kontolcüsü kullanmanız gerekli olmaktadır. Bu kontrolcüde asıl işi genellikle beraberinde kullanılan P kontrolcüsü yapsa da hatanın belirli yönde sürekli olmasını sağlayan durumun da hesaba katılması için integral kontrolcüsü de kullanmak gereklidir. Ki katsayısı ile kontrol edilebilir.

PI.cpp
int sensorDegeri = 0;
float tepkiDegeri = 0.0;
int hedefDeger = 512;
int hata=0;
int integralDegeri = 0;
float Kp = 0.2;
float Ki = 0.2;
while(1) {
// Sensör bilgisi okunuyor
sensorDegeri = sensorOku();
// Sensor değeri ile hedeflenen değer arasındaki fark bulunuyor
hata = hedefDeger - sensorDegeri;
// Hatanın integrali alınıyor
integralDegeri = integralDegeri + hata;
// Hesapladığımız değerler katsayılar ile çarpılarak tepki degerine ulaşılıyor
tepkiDegeri = (Kp*hata) + (Ki*integralDegeri);
// Düzeltme için verilecek tepki değeri çıktı olarak iletiliyor
tepkiVer(tepkiDegeri);
}

Eğer Ki değeri ideal düzeyin altında olursa sürekli olan hata çok geç düzeltilecektir.

Eğer Ki ideal değerin üstünde olursa tepkinin normal hale gelmesi gecikecek ve sürekli salınımlar meydana gelecektir.

Eğer sürekli olan hatanın hızlı düzelmesini ve sürekli salınım olmamasını istemiyorsanız istediğiniz duruma eriştiğinizde integral değerini sıfırlayabilir ya da azaltabilirsiniz. Bu yöntem çok kompleks ve ciddi sürekli hata kaynaklarının bulunduğu sistemlerde sıklıkla tercih edilmektedir.

D(Türev) Kontrolcüsü

Bu algoritmada ortalama değer teoremi yani türev kullanarak oran(P) algoritması ile oluşturulan tepkinin daha hızlı ve daha düzenli olmasını sağlamaktadır. Eğer sistemde tepki hızı çok önemli ise kesinlikle işin içerisinde türev olmalıdır. İşin içerisine türev girdiğinde oran ve integral değerleri daha geniş aralıklarda tanımlanabilir. Bu nedenle sistem çok daha hızlı ve kaliteli tepkiler verebilmektedir. 

Doğal koşullarda daha kararlı tepkiler vermesine yararı olsa da istenmeyen ve durumu etkileyen bir etki olduğunda sistem daha da zor toparlanacaktır. Örneğin güç kaynağına anlık bir yük bağladığınızda voltaj düşer bu durum daha öncesinde hesaba katılmadığı için tepki yavaşlar ve sistemin kendini toparlaması zorlaşır. Bu nedenle bu katsayı bu hissedilemeyen tepkiler de hesaba katılarak belirlenmelidir.

PD.cpp
int sensorDegeri = 0;
float tepkiDegeri = 0.0;
int hedefDeger = 512;
int sonHata = 0;
int hata=0;
int turevDegeri = 0;
float Kp = 0.2;
float Kd = 0.2;
while(1) {
// Sensör bilgisi okunuyor
sensorDegeri = sensorOku();
// Sensor değeri ile hedeflenen değer arasındaki fark bulunuyor
hata = hedefDeger - sensorDegeri;
// Son hata ile anlık hata arasında ortalama değişim oranı(türev) hesaplanıyor
turevDegeri = sonHata - hata;
// Hesapladığımız değerler katsayılar ile çarpılarak tepki degerine ulaşılıyor
tepkiDegeri = (Kp*hata) + (Kd*turevDegeri);
// Düzeltme için verilecek tepki değeri çıktı olarak iletiliyor
tepkiVer(tepkiDegeri);
}

Eğer Kd değerini düşük olarak belirlerseniz sisteminiz az da olsa hızlnacaktır. Bu değerin az olması sistemde herhangi bir soruna sebep olmaz.

Eğer Kd değerini yüksek olarak belirlerseniz sistem salınım yapmaya başlayacaktır. Bu nedenle ideal değerlerde Kd değeri sistemin çok daha kaliteli ve hızlı tepki vermesinde çok faydalı etkiler sunacaktır.

PID Algoritması

Bu algoritma kompleks ve hızlı çalışan sistemlerde kullanılır. Örneğin çizgi takip eden bir robotta bu algoritmanın tercih edilmesinin nedeni çizgiden ayrılmamasının gerekmesi, motor farkları nedeniyle sürekli hata kaynağının olması ve hızlı tepki vermesi gereken yerler olması sırasıyla oran, integral ve türev hesaplamalarına ihtiyacımızın olduğunun kanıtıdır. Bu nedenle bu tarz sistemlerde genellikle PID algoritması tercih edilir.

PID.cpp
int sensorDegeri = 0;
float tepkiDegeri = 0.0;
int hedefDeger = 512;
int sonHata = 0;
int hata=0;
int integralDegeri = 0;
int turevDegeri = 0;
float Kp = 0.2;
float Ki = 0.2;
float Kd = 0.2;
while(1) {
// Sensör bilgisi okunuyor
sensorDegeri = sensorOku();
// Sensor değeri ile hedeflenen değer arasındaki fark bulunuyor
hata = hedefDeger - sensorDegeri;
// Son hata ile anlık hata arasında ortalama değişim oranı(türev) hesaplanıyor
turevDegeri = sonHata - hata;
// Hatanın integrali alınıyor
integralDegeri = integralDegeri + hata;
// Hesapladığımız değerler katsayılar ile çarpılarak tepki degerine ulaşılıyor
tepkiDegeri = (Kp*hata) + (Ki*integralDegeri) + (Kd*turevDegeri);
// Düzeltme için verilecek tepki değeri çıktı olarak iletiliyor
tepkiVer(tepkiDegeri);
}

PID algoritması her ne kadar çok iyi sonuçlar oluştursa da eğer sıradan olmayan hızlarda ve karmaşık yapılar ile çalışıyorsanız bu algoritmayı daha düzgün hale getirmek için bazı eklemeler yapılmaktadır.

Örneğin sistem başlatıldığında farklı katsayılar, sistem rölantide çalışırken farklı katsayılar tercih edilebilir. Tepki düzeyinin aşırıya kaçmasını engellemek için tepki sınırlandırılabilir. Pek çok farklı eklemeler yapılarak algoritma daha stabil hale getirilebilir.

PID Algoritmasında Zaman

Eğer sisteminizin hızlı tepkiler vermesi ve iyi sonuçlar almak istiyorsanız algoritmanın mümkün olduğunca küçük zaman dilimlerinde çalıştırılması gerekmektedir. Bu işlemin çok aşırı hızlı yapılması boşa enerji tüketimi olacağı için bu sürenin ortalama değerlerde deneyerek ya da karmaşık hesaplama yöntemleri ile belirlenmesi gerekmektedir. Hızlı hesaplamaları sağlamak için genellikle DSP (Dijital Sinyal İşlemcisi) veya FPGA tarzında hızlı hesaplamalar yapabilecek kontrolcüler tercih edilmektedir.

İntegral ve türev döngü zamanları yani Ti ve Td değerleri de mümkün olduğunca mantıklı seçilmelidir. Eğer Ti arttırılırsa integralin algoritmadaki etkisi azalacaktır. Eğer Td değeri arttırılırsa algoritmada türevin etkisi artacaktır. Bu nedenle döngü zamanının değişmesi katsayılarında değişimini gerektirir. Yani sistemi yavaş bir şekilde çalıştırıp değerleri belirledikten sonra hızlandırırsanız aynı sonucu elde edemeyebilirsiniz.

Eğer sistemi yavaş olarak deneyip değerleri bulduktan sonra hızını değiştirmek istiyorsanız pid örnekleme hızını da arttırmalısınız.

PID Algoritması Döngü Ayarı

PID algoritmasını en stabil düzeye getirebilmek için doğru Kp, Ki ve Kd değerleri verilmelidir. Basit sistemlerde bu değerleri rasgele vererek sonucu inceleyip ona göre yeniden değerlerin yapılandırılması ile ideal katsayıları bulmak çok daha kolay olacaktır. Ancak eğer karmaşık sistemler ile uğraşıyorsanız simülasyonlar ve matematiksel hesaplamalar yapmanız gerekmektedir.

Ziegler-Nichols Yöntemi ile Döngü Ayarı*

PID Algoritması Kullanılan Sistem Örnekleri

Sıcaklık Sabitleyiciler (Termostat)

Basit termostatlarda genellikle tepki tamamen ya da hiç verilmez ancak analog tepki verebilen termostatlarda sıcaklığı dengelemek için ısıtıcı ve soğutucu sistemler pid algoritması yardımıyla kontrol edilir.

Drone Dengeleme

Drone sistemlerinde motor farkları ve diğer dış etkenler nedeniyle denge sürekli bozulmaktadır. Bu dengenin düzeltilmesi için genellikle PID algoritması tercih edilir. Bu tip sistemlerde birden fazla algoritma çalıştırıldığı için içerisinde DSP(Dijital Sinyal İşlemcisi) olan mikrokontrolcüler hatta mikroişlemciler tercih edilebilir. Çok hızlı tepkiler vermesi ve hareketlerin güvenli olması istenen askeri sistemlerde FPGA gibi çok yüksek hızlarda pararel işlem yapabilen yapılar tercih edilebilir.

Güç Kaynakları

Güç Kaynaklarında komponentlerin toleransları nedeniyle değişen voltajı belirli bir değerde sabit tutabilmek için PID algoritması kullanılmaktadır. Lineer güç kaynaklarında bu tepki için genellikle donanımsal tasarımlar bulunsa da switch-mode güç kaynaklarında donanımsal tasarım ile sabitlemek çok daha zor olduğu için genellikle yazılımsal kontrol sağlanır.

Motorlar

Motorlarda belirli devirde dönmeyi sağlamak için closed-loop(kapalı döngü) sistemleri kullanılmaktadır. Bu sistemlerin çok büyük bir kısmı PID algoritması kullanarak motor devrinin sabitlenmesini sağlamaktadır.

Kaynaklar:

https://www.ni.com/en-tr/innovations/white-papers/06/pid-theory-explained.html

https://robotics.sjtu.edu.cn/upload/course/1/files/Chapter51.pdf

https://tr.wikipedia.org/wiki/PID

Dosyalar