Picproje Elektronik Sitesi

ENDÜSTRiYEL OTOMASYON => Robotik Sistem Tasarımı => Konuyu başlatan: LukeSkywalker - 08 Aralık 2010, 20:50:22

Başlık: PID Kontrol
Gönderen: LukeSkywalker - 08 Aralık 2010, 20:50:22
Merhaba arkadaşlar. PID kontrol tekniği ile çizgi izleyen robot yapacağım. Daha önce P kontrol ile yaptığım ve yarışmalarda derece aldığım iki adet robotum var fakat artık PID kontrol tekniğine geçmemiz gerektiğini düşünüyorum. Yaklaşık 1 aydır bu teknik üzerinde araştırmalar yapıyorum. Burada yardım alabileceğimi düşündüğüm için bu konuyu açmaya karar verdim. Şimdi sorularım şunlar;

--------------------------------------------------------------------------------------------------------------

1-) 8 adet sensör dizisinden gelen verileri analog olarak okuduktan sonra PID döngüsüne bu verileri ne şekilde girmem gerekiyor?

--------------------------------------------------------------------------------------------------------------

2-) Error = target_pos – current_pos      //hatanın hesaplanması
     P = Error * Kp                                //hata ile oransal katsayının çarpımı
     P I = I + Error                               //Üretilen hatanın integrale eklenmesi
     I = I * Ki                                       //İntegral değerinin integral katsayısı ile çarpılması
     D = Error – Previos_error                //Türevin bulunması
     Correction = P + I + D           // Düzeltme değerinin bulunması.

     Yukarıdaki PID döngüsündeki Kp,Ki,Kd değerleri nasıl hesaplanabilir?

--------------------------------------------------------------------------------------------------------------

3-) Düzeltme verisi sağ ve sol motorlara ne şekilde aktarılacak?

--------------------------------------------------------------------------------------------------------------

Bu 3 konuda edeceğiniz yardımlardan eminim ki bir çok arkadaş faydalanacaktır. Dc motor kontrolünde çok önemli bir konu olan PID tekniği ülkemizde yaygın olarak bilinmiyor. Katkıda bulunmanızı diliyorum. Teşekkürler.

Başlık: Ynt: PID Kontrol
Gönderen: justice_for_all - 08 Aralık 2010, 21:11:56
hocam pwmlw yapmaniz gerek cikan sonucu pwm dutynize ekleyip veya cikarip max dutynize gore ayarlama yapabilirsiniz...

ornegin su sekilde;

SpeedError = DesiredSpeed - ActualSpeed;
SpeedIntegral += SpeedError;
DutyCycle = (((long)Kps*(long)SpeedError + (long)Kis*(long)SpeedIntegral) >> 16);
PDC1 = PDC1 + DutyCycle;
if (PDC1 < 50)
{PDC1 = 50;SpeedIntegral = 0;}
if (PDC1 > 512)
{PDC1 = 512;SpeedIntegral = 0;}
PDC2 = PDC1;
PDC3 = PDC1;
Başlık: Ynt: PID Kontrol
Gönderen: necati - 08 Aralık 2010, 21:19:05
http://servomagazine.com/index.php/magazine/downloads/
inceleyiniz
Başlık: Ynt: PID Kontrol
Gönderen: LukeSkywalker - 08 Aralık 2010, 21:33:15
Alıntı yapılan: justice_for_all - 08 Aralık 2010, 21:11:56
hocam pwmlw yapmaniz gerek cikan sonucu pwm dutynize ekleyip veya cikarip max dutynize gore ayarlama yapabilirsiniz...

ornegin su sekilde;

SpeedError = DesiredSpeed - ActualSpeed;



SpeedIntegral += SpeedError;
DutyCycle = (((long)Kps*(long)SpeedError + (long)Kis*(long)SpeedIntegral) >> 16);
PDC1 = PDC1 + DutyCycle;
if (PDC1 < 50)
{PDC1 = 50;SpeedIntegral = 0;}
if (PDC1 > 512)
{PDC1 = 512;SpeedIntegral = 0;}
PDC2 = PDC1;
PDC3 = PDC1;


Cevaplarınız için teşekkür ederim.
Vermiş olduğunuz kodda PDC1 bizim pwm değerimiz yanılmıyorsam. 512 max değer 50 ise min PWM değeri doğru mudur? Bir de eğerki iki adet motor kontrol edeceksem hem çizginin sağ tarafında kalan sensörler için bir PWM değeri hem de sağdaki sensörler için başka bir pwm değeri üretip ayrı iki adet PID döngüsüne sokup motorları ayrı ayrı kontrol edeceğim yanılmıyorsam, vermiş olduğunuz koda göre hareket edersem?
Başlık: Ynt: PID Kontrol
Gönderen: justice_for_all - 08 Aralık 2010, 21:39:59
hocam ne icin yapiyosunuz pid kontrolu,sensor olarak ne kullancaksiniz?
Başlık: Ynt: PID Kontrol
Gönderen: LukeSkywalker - 08 Aralık 2010, 21:44:50
PID kontrolü çizgi izleyen robot yapımında kullanacağım. Sensör olarak http://www.pololu.com/catalog/product/960 (http://www.pololu.com/catalog/product/960) adresindeki 8 adet sıralı IR led -Foto transistör çiftini kullanacağım.
Başlık: Ynt: PID Kontrol
Gönderen: justice_for_all - 08 Aralık 2010, 21:49:48
benim gonderdigim program hiz kontrolu uygulamalarinda kullaniliyo hocam egerki sizde hiz kontrolu yapcaksiniz kullanabilirsiniz...
Başlık: Ynt: PID Kontrol
Gönderen: LukeSkywalker - 08 Aralık 2010, 21:53:59
Peki sizin vermiş olduğunuz kodda PDC1 >50 diye işlem yaptırırken PWM değerinin minimum değerinin 50 olması gerektiğini,PDC1 > 512 derkende max değerin 512 olması gerektiğini mi söylüyorsunuz ?
Başlık: Ynt: PID Kontrol
Gönderen: justice_for_all - 08 Aralık 2010, 21:58:26
simdi hocam 0 deger kullandiginiz denetleyiciye,pwm frekansina gore degisebilir..bunlar hakkinda cevaplar verebilirsen daha net konusabilirim...
Başlık: Ynt: PID Kontrol
Gönderen: zamzam23 - 09 Aralık 2010, 10:37:00
Alıntı yapılan: maytere - 08 Aralık 2010, 20:50:22


--------------------------------------------------------------------------------------------------------------

2-) Error = target_pos – current_pos      //hatanın hesaplanması
     P = Error * Kp                                //hata ile oransal katsayının çarpımı
     P I = I + Error                               //Üretilen hatanın integrale eklenmesi
     I = I * Ki                                       //İntegral değerinin integral katsayısı ile çarpılması
     D = Error – Previos_error                //Türevin bulunması
     Correction = P + I + D           // Düzeltme değerinin bulunması.

     Yukarıdaki PID döngüsündeki Kp,Ki,Kd değerleri nasıl hesaplanabilir?

arkadasım türev boyle alınmaz. hani nerde örnekleme aralıgına bolmemıssın.
Başlık: Ynt: PID Kontrol
Gönderen: LukeSkywalker - 09 Aralık 2010, 19:42:57
Hocam O formülün doğrusu şu şekilde olmalı

D = Error – Previos_error*Kd


Peki bu Kp, Ki, Kd katsayılarını nasıl hesaplayacağız veya bulacağız? Bana bu değerlerin hesabı lazım. 
Başlık: Ynt: PID Kontrol
Gönderen: zamzam23 - 09 Aralık 2010, 20:07:31
bencede şöyle olmalı:
D = ((Error – Previos_error)/dt)*Kd

o parametreleri ben deneme yanılmayla buldum sende oyle yapabılırsın. yada motorun parametrelerını bılıyorsan simulınkte de bulursun
Başlık: Ynt: PID Kontrol
Gönderen: LukeSkywalker - 09 Aralık 2010, 20:36:02
Deneme yanılma yöntemini izlerken nasıl bir yol izlediniz. Mesela ilk olarak hangi değeri verdiniz?
Başlık: Ynt: PID Kontrol
Gönderen: Tagli - 09 Aralık 2010, 20:36:35
Ziegler-Nichols (http://www.chem.mtu.edu/~tbco/cm416/zn.html) yöntemi başlangıç değerlerinin belirlenmesi için sıkça kullanılan bir yöntem. Sonradan elle ince ayar yapılabilir. Ama bu yöntemi her sisteme uygulamak mümkün olmayabilir.
Başlık: Ynt: PID Kontrol
Gönderen: zamzam23 - 09 Aralık 2010, 20:45:03
https://www.picproje.org/index.php/topic,29634.msg205929.html#msg205929 (https://www.picproje.org/index.php/topic,29634.msg205929.html#msg205929)
Başlık: Ynt: PID Kontrol
Gönderen: LukeSkywalker - 09 Aralık 2010, 20:46:24
Üstad tamam bu method ile katsayıları hesaplamak kolay. Fakat ben çizgi izleyen robotun salınıma girmesini  nasıl anlayacağım veya salınım periyodunu hangi periyodu baz alarak ne cinsinden bulacağım?
Başlık: Ynt: PID Kontrol
Gönderen: LukeSkywalker - 09 Aralık 2010, 20:54:20
Zamzam, üstad verdiğin bilgiler çok yararlı oldu. Teşekkür ederim. Peki dt değerini nasıl hesapladınız?
Başlık: Ynt: PID Kontrol
Gönderen: zamzam23 - 09 Aralık 2010, 20:58:22
dt süresi senin ilk hata ile sonraki hatayı hesaplama süren arasındakı fark: yani sana kalmıs sen kaca ayarlarsan artık. mesela timerı 10ms yeye kurup timer içinde hata hesaplarsan dt=0.01 olur. bu linkteki dosya da işine yarayabilir.

http://hotfile.com/dl/88308987/0aa4eda/00964A.pdf.html (http://hotfile.com/dl/88308987/0aa4eda/00964A.pdf.html)
Başlık: Ynt: PID Kontrol
Gönderen: LukeSkywalker - 09 Aralık 2010, 21:00:37
Hocam süpersin eyvallah. Birçok kişi faydalanacaktır eminimki bu konudan. Teşekkür ederim.
Başlık: Ynt: PID Kontrol
Gönderen: Tagli - 09 Aralık 2010, 21:04:30
Bu işlemde bölen sayıyı 2'nin kuvveti olarak seçersen PIC sana duacı olur :) Gerçe derleyici olayı anlar mı bilmiyorum. Sen kendin kaydırma yap bence.
Başlık: Ynt: PID Kontrol
Gönderen: zamzam23 - 09 Aralık 2010, 21:05:01
estgfrllah rica ederim. sende öğrendiklerini başı sıkışık başka birine aktarırsın ödeşiriz :)
Başlık: Ynt: PID Kontrol
Gönderen: LukeSkywalker - 09 Aralık 2010, 21:43:19
@tagli
bölen derken dt değerinden bahsediyorsunuz anladığım kadarı ile. Derleyicinin üretmiş olduğu asm koda bakıp PID döngüsünün nekadar sürede tamamlandığını öğrenmem lazım dt değerini bulabilmek için. İnşallah çift sayı çıkar.

@zamzam23
;)
Başlık: Ynt: PID Kontrol
Gönderen: Tagli - 09 Aralık 2010, 21:56:53
Evet, dt'den bahsediyorum. Bu süreyi timer kesmesini uygun şekilde ayarlayarak sen belirlemelisin zaten. 2'nin katı değil, kuvveti olmalı: Mesela 64, 128 gibi. Derleyici, bölme komutu verdiğinde kaydırma yapmayı kendisi akıl edemeyebilir, bunu bilmiyorum. İşi şansa bırakmamak için kaydırma işlemini senin yapman daha iyi olur.
Başlık: Ynt: PID Kontrol
Gönderen: LukeSkywalker - 09 Aralık 2010, 22:34:11
PID çevrimini en kısa sürede tamamlamak benim için aslında en iyi olanı. Yani bu değer float bir değer olacak, örneğin 0.001 gibi...
Başlık: Ynt: PID Kontrol
Gönderen: Tagli - 10 Aralık 2010, 02:29:39
0.0039 saniye kurtarır mı mesela? Deminden beri AN964 (http://ww1.microchip.com/downloads/en/AppNotes/00964A.pdf)'e bakıyorum, benim de kafamı karıştırmıştı daha önce ama şimdi durum netleşti gibi. Ts'i (sampling time) 3.9 ms alıyor, böylece frekans yaklaşık 256 Hz oluyor. Ts'e bölmek ve frekans ile çarpmak aynı şey sonuçta. Adam bulduğu farkı 256 ile çarpıyor. Ayrıca o notta daha farklı bir durum daha var: Son okuduğu değeri bir önceki değil 3 önceki okumayla karşılaştırıyor. O kısmı tam anlayamadım ama sanırım önce normal yöntemi denemek daha doğru olur.
Başlık: Ynt: PID Kontrol
Gönderen: LukeSkywalker - 10 Aralık 2010, 14:41:07
Burada türev değeri kd katsayısı ile çarpıldıktan sonra 32'ye bölünmüş. 256 değerini göremedim ben.
//Calculate the differential term
derivative_term = en0 - en3;
if(derivative_term > 120){
derivative_term = 120;
}
if(derivative_term < -120){
derivative_term = -120;
}
derivative_term = derivative_term * kd;
derivative_term =derivative_term>>5;
//divide by 32
}
if(derivative_term > 120){
derivative_term = 120;
}
if(derivative_term> -120){
derivative_term = -120;
}
Başlık: Ynt: PID Kontrol
Gönderen: Tagli - 10 Aralık 2010, 15:13:15
Hımm... Koda bakmamıştım. Şimdi benim de kafam karıştı.  ???
Başlık: Ynt: PID Kontrol
Gönderen: LukeSkywalker - 10 Aralık 2010, 23:23:45
Hocam çözerseniz bizide haberdar edin..
Başlık: Ynt: PID Kontrol
Gönderen: inventor - 05 Aralık 2011, 16:45:02
Konu biraz eskimiş ama yine de birilerine faydası olabilir. Geçen gün ETE hocanın web sitesinde bu konuda bir tartışma çıkmıştı ve PID ve PIC kodları hususunda uzunca bir yazı yayınlamıştık.PID nedir nasıl yapılır ve gerekli dosyalar. Aynısını buraya aktarmak yerine link vereyim dedim.

http://etepic.com/index.php?topic=190.msg1539#msg1539