Pid motor kontrolünde FeedBack Periyodu

Başlatan Mucit23, 05 Mayıs 2014, 12:55:44

Mucit23

Merhaba arkadaşlar,

PID ile 20W DC motorun devrini sabitlemeye çalışacağım. Şimdiye kadar PID konusunda herhangi bir çalışma yapmadım. Şuanda sadece program temellerini atıp devir okuma kısmını hallettim. Burada ilerleyen zamanlarda PID ile ilgili birkaç soru sormam gerekecek.

1sn aralıklarla devir bilgim güncelleniyor. Yani 1 sn aralıklarla okunan Devri PID algoritmasına vereceğim.

Hızlı tepki için en fazla kaç ms aralıklarla devir okuyup motora PID uygulamak gerekir? 1sn çok yavaş diye tahmin ediyorum.

z

En yaygin cevrim peryodu

10 Khz akim kontrolu (Tercihen 20Khz)
1Khz hiz kontrolu
100 Hz pozisyon kontrolu

Bazi firmalar bunu 10 ile carparlar.

Yani 100Khz akim kontrolu
10Khz hiz kontrolu
1Khz pozisyon kontrolu

Ikinci secenegin ciddi bir getirisi yok. Cunku motor yavas calisan bir malzemedir. Buna ragmen ureticiler bunu reklam araci olarak kullanir.

Senin 1ms araliklarla hizi denetlemen tavsiye edilir. Islemcin buna ayak uyduramazsa fedakarlik edersin.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

Erol YILMAZ

AC Vektör Motor Kontrolünde 4 Khz lik kontrol çevrimleri uyguluyorlar diye aklımda kalmış.
8 kHz Pwm sinyali için.

Sen PID yi ne kadar sürede hesaplayabiliyorsun ?
Matematik yeteneği olan 16 bit mcu lar lazım olmaya başlar şimdi sana :)

fgokcegoz

Motorun hızını PID ile kontrol edeceksen öncelikle kontrol edeceğin sistemi modellemelisin. Sistemi modelledikten sonra uygun bir kontrol periyodu seçebilirsin... Ne kadar çok hızlı kontrol çevrimi yaparsam o kadar iyidir mantığı doğru olmuyor çünkü. Ayrıca 1sn motor hızını tesbit etmek için çok yavaş bir süre. Çok daha hızlı bir şekilde devir sayısını ölçmen gerekecek...
"Vicdanın ziyası, ulûm-u diniyedir. Aklın nuru, fünun-u medeniyedir. İkisinin imtizacıyla hakikat tecelli eder." (Bediüzzaman Said Nursi)

z

Evet sample alma suren arttikca sensorlerin cozunurlukleri de artmak zorunda.

Aksi takdirde ayni degerleri okur durursun. Hic degisim algilayamazsin.

Bana e^st de diyebilirsiniz.   www.cncdesigner.com

z



Yukarida ustteki resimde sensorden alinan samplelar ince dikmelerin oldugu zamanlara denk geliyor. Her dort sample da birbirinin ayni. Boyle bir sistemde ornekleme zamanini 4 kat yavaslatabiliriz.

Asagidaki resimde ise yuksek cozunurluklu bir sensor kullanilmis. Goreceginiz uzere daha yuksek hizda sample almanin avantaji var.

Sample alma hizi maliyetinizi belirler.

Sensorunuzun fiyati artar, islemcinizin fiyati artar, ADC nizin fiyati artar, pwm guc katinin fiyati artar vs vs.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

Mucit23

Hocam profesyonel bir sistem yapmak istemiyorum. Basit bir 20W lık DC motorum var. Üzerinde 20 delikli bir enkoder var. Devrini 500 ile 3000rpm arasına sabitlemeye çalışacağım

Şimdilik 16F serisi bir mcu ile çalışacağım.(Muhtemelen 16F886) Bu yüzden hesaplamaları max sürede yaptığımı düşünün.

1ms aralıklarla nasıl devir okurum çok değilmi bu değer? Devri örneğin 10ms de okumak istersem nasıl hesap yapacam. 10ms şukadar pals gelmişse 1 saniyede şu kadar 1 dakikada da şu kadar pals gelir diyip devri ona göremi hesaplayacağım?

fgokcegoz

#7
Bu işi illa pulse sayarak yapman gerekmiyor ki. İki pulse arası süreyi hesaplayıp ta devir sayısını ölçebilirsin.

Farz edelim ki; 2 pulse arasını 2.5msn olarak ölçtün.

1sn de => 400 pulse gelecek demektir.

400 pulse / 20 delik = 20 tur

Motor mili 1sn de 20 tur dönüyor ise 1dk da 1200 tur döner.  Bu şekilde "1200rpm" değerini elde edebilirsin.


Denklem olarak ifade edecek olursak;

(T:msn cinsinden ve encoder 20 delikli)

"RPM = 3000/T" olarak hesaplanabilir...
"Vicdanın ziyası, ulûm-u diniyedir. Aklın nuru, fünun-u medeniyedir. İkisinin imtizacıyla hakikat tecelli eder." (Bediüzzaman Said Nursi)

Mucit23

Pid de inteğral hesabı aşağıdaki gibi oluyor

I = I + (Ki * Hata * dt)


Buradaki dt parametresi bir önceki pid uygulanmasından buyana geçen süre diye geçiyor.

Örneğin bana her 10ms aralıklarla devir bilgisi geliyor. Ben her 10ms lik aralıklarla pid algoritmasını yürüttüğümü varsayarsak dt parametresi ne olmalı(pid işlemleri 10 ms de bittiğini varsayalım.)

LukeSkywalker

Buradaki dt'yi ki içerisine enjekte edin. Ki'yi deneme yanılma ile bulacağınız için Dt pek önem arzetmemis olur.  En hızlı yapabileceğiniz sekilde fonksiyonu olusturursunuz.

Mucit23

Pid Parametreleri için bir menu yaptım. Oradan istediğim değeri seçiyorum. Sizin dediğinize göre DT parametresinide menüden Ki ye ekleyip programa vereyim. Sanırım bu işleri biraz daha hızlandırır.


pisayisi

dt yi 1 birim olarak seçebilirsiniz...
Murat

Mucit23

Şuanda sadece P kontrolü yapmaya çalışıyorum. Yaptım aslında sistem cevap veriyor .

Fakat enkoder çözünürlüğü düşük olduğu için düşük devirlerde problem yaşadım. Sistem hemen osilasyona giriyor. Bende Testlerimi 500rpm ve üzerinde yapıyorum.

Şunu sorayım. Diyelimki Motorun RPM değeri Referans değerinden büyük, Bu durumda sistem nasıl davranmalı? Çıkışı komple kapatmalımı? 

pisayisi

#13
Çıkış komple kapatılırsa referansın altına çok düşer çıkış, bu durumda titreşimler ve osilasyon artar. Kademeli olarak gecikmeyle düşürülmeli devir taa ki referans civarında minik düzeltmeler yapana kadar...

mesaj birleştirme:: 14 Mayıs 2014, 15:22:54

P kontrolünden ziyade en azından PD yapmaya çalışın derim...
Murat

Mucit23

#14
Hocam ilk başta p yapmamın sebebi sistemi aşama aşama çalıştırmak istemem. Çünkü sistemin nasıl tepki vereceği konusunda bilgim yok. Sonuç sebeb ilişkisi kuramıyorum.

İlk Başta PID yaptım. Düzgün bir sonuç alamadım.

DT parametresinide 100ms aralıklarla örnek aldığım için 0.1 yaptım.

Şimdi PI denemesini yapayım.

Edit;

PID için şöyle bir fonksiyon hazırladım.

float calc_pid(unsigned int16 set_value, unsigned int16 rpm_value){
  float output=0;
  
  error= set_value-rpm_value;
  err_dif=error-old_error;
  
  P = Kp * error;
  I = I + (Ki * error * DT);
  D =(Kd * err_dif) / DT;
  
  Output = P + I + D;
  old_error = error;
return output;
}


Sistem ilk başladığında Motor  devri set değerini çok fazla aşıyor. Durum böyle olunca set değeri rpm değerinden küçük olup error parametresini negatiflere düşürüyor. Bu durumda dediğiniz gibi çıkışı kapatmak osilasyona sebeb oluyor.

Sistemin kendi kendine motor devrini düşürmesini nasıl sağlayacağım. PID mantığındamı hata var?

mesaj birleştirme:: 14 Mayıs 2014, 16:35:34

Aslında PI ile isiste test yapıyorum. PID fonksiyonuna sabit değerler gönderiyorum.

Örneğin Set değerini 100 RPM değerini 100 yapınca gelen output değeri 0 oluyor.

Set değeri 100 RPM değerini 99 yapınca sistem çıkışı yavaş bir şekilde arttırmaya başlıyor.

Set Değeri 100 RPM değeri 101 veya daha fazla oluca çok büyük değerler alıyorum. 54000+ küsür. Aradaki farka göre git gide artıyor.

Nasıl yapmam gerektiğini bilmiyorum. Ben sadece kitaplarda yazanı uygulamaya çalışyorum ama gerçekte istediğim sonuçları alamıyorum.

Yanlış yaptığım noktalar neresi bu konularda yardıma ihtiyacım var.