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.
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;
http://servomagazine.com/index.php/magazine/downloads/
inceleyiniz
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?
hocam ne icin yapiyosunuz pid kontrolu,sensor olarak ne kullancaksiniz?
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.
benim gonderdigim program hiz kontrolu uygulamalarinda kullaniliyo hocam egerki sizde hiz kontrolu yapcaksiniz kullanabilirsiniz...
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 ?
simdi hocam 0 deger kullandiginiz denetleyiciye,pwm frekansina gore degisebilir..bunlar hakkinda cevaplar verebilirsen daha net konusabilirim...
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.
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.
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
Deneme yanılma yöntemini izlerken nasıl bir yol izlediniz. Mesela ilk olarak hangi değeri verdiniz?
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.
https://www.picproje.org/index.php/topic,29634.msg205929.html#msg205929 (https://www.picproje.org/index.php/topic,29634.msg205929.html#msg205929)
Ü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?
Zamzam, üstad verdiğin bilgiler çok yararlı oldu. Teşekkür ederim. Peki dt değerini nasıl hesapladınız?
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)
Hocam süpersin eyvallah. Birçok kişi faydalanacaktır eminimki bu konudan. Teşekkür ederim.
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.
estgfrllah rica ederim. sende öğrendiklerini başı sıkışık başka birine aktarırsın ödeşiriz :)
@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
;)
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.
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...
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.
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;
}
Hımm... Koda bakmamıştım. Şimdi benim de kafam karıştı. ???
Hocam çözerseniz bizide haberdar edin..
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