Bende mi bi sorun var neden PID yi anlayamıyorum...

Başlatan cntrller, 12 Temmuz 2010, 19:03:19

cntrller

Teorisi tamam ama uygulamasını bir türlü çözemiyorum. Pic ile daha önce bu olayı gerçekleştirebilen var mı? Bir de çizgi izleyen robot PID ile nasıl kontrol edilebilir?

serdararikan

http://www.pololu.com/docs/0J21/7.c

burada pid le çizgi izleyen robotun nasıl yapılacağını anlatıyor.ilk olarak neden pid kullanılıyor bunu anlamaya çalışın.pid parametrelerin anlamlarını öğrenin sonra çizgi izleyen robotun pid ile nasıl yapıldğını bu siteden anlayabilirsiniz.

cntrller

kp=...
ki=...
kd=...
istenen_deger=....'Bu değerlerimiz sabit diyelim
hata_toplam=0

basla:
     gecerli_deger=......' burada geçerli olan değer okundu bir şekilde
     
     hata = istenen_deger - gecerli_deger
     hata_toplam = hata_toplam + hata
     
     oransal = kp*hata
     integral = ki*(hata_toplam)
     turev     = kd*(hata - eski_hata)
     
     cikis=oransal + integral + turev

     eski_hata=hata
goto basla


böyle bişey mi acaba tabi önemli olanlar katsayıları bulmak ama programlama mantığı böyle bişey mi? yanlış veya eksik yaptığım biyer var mı acaba?

z

#3
Genel hatlari ile elestireyim.

Hesaplamalarinda sample suresi yok gorunuyor. Haydi diyelim bu sureyi carpan-bolen olarak Ki ve Kd icine gomdun. Bu kez de ana dongu de bu sample suresi gorulmuyor. PID hesaplamalarinin hemen ardindan tekrar hesaplamaya dalmissin.

Eger hesaplamalarim zaten zaman aliyor bu sure de zaten benim sample alma surem dersen herseyi yerli yerinde ve dogru yapmisin.

Fakat hesaplamalarin floating point yapisinda ve bu sample alma sureni uzatan yani seni yavaslatan bir islem metodu. Dolayisi ile kontrol sisteminin band genisligini sinirlamakta. Floating hesaplama, siradan islemcilerde cok zaman alacagi icin bunun yerine saturasyon denetimli fixpoint hesaplama tercih edilir. Ayrica saturasyon olayina da dikkat etmemissin.

Diyelimki +/- 12v ile beslenen opamplarla analog PID devresi yaptin. Bu devrenin hic bir noktasinin gerilimi +/- 12 voltun disina tasamaz. Benzer yapiyi hesaplamalarinda da kurman gerekir. Aksi halde sistemi kontrol altinda tutamazsin ve sistemin osilasyona suruklenir. Zira integratorler kararsizlik sorunu olusturmaya meyilli, hatayi integre ederek depolayip cikisi cok buyuk degerlere cekmeye calisan tehlikeli bir blok.

Ote yandan koyacagin herbir saturasyon rutini sistemi iyiden iyiye nonlinear hale getirir.

Benzer sekilde turev alma da dikkat ister.

Kabaca PID de bu saydiklarima dikkat etmen gerekir. Katsayilarin tespiti de ayri bir is.


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

bigbey

Bir adet DC 12v fırçalı motoru kullanarak miline bağlı tacho bilgisinden faydalanarak PIC ile asm olarak bir arkadaşın tezine yardım etmiştim.
potansiyometreden verilen devir bilgisi, motor yüke bindikçe pwm artırarak devri sabit tutmaya çalışıyor. Yükten kurtuldukça da devir sabitlemek için pwm değeri azalıyor.  Sistem güzel çalıştı ve tam not aldı.
Bu yapılan işleme kısaca PID kontrol işlemi yapılmış diyebilirmiyiz.
TA6R

zamzam23


sigmoid

en.wikipedia.org/wiki/Fixed-point_arithmetic

dspic fixed point işlem yapiyor. fixed point ve floating point bellekte farkli mantikta tutuluyor. floating pointte noktanin konumu sürekli değiştiğinden ekstra yük getiriyor. ama daha geniş bir aralikta sayilari tutabiliyor. fixed pointte noktanin yeri sabittir. daha dar bir sayiyi hafizada tutar ama fixed point olan bir sayi ile işlem yapmak daha hizlidir.

iyildirim

Alıntı yapılan: zamzam23 - 22 Ocak 2011, 09:51:55
fixpoint hesaplama nedir

Sabit noktalı hesaplama anlamında.
Uygulamanıza göre değerlerin alabileceği max büyüklük veya ihtiyacınız olan hassasiyete göre noktanın yerini belirler ve o şekilde çalışılır. Noktanın yerini belirlemekten kasıt tamsayı kısmına kaç bit bıraktığımızdır şeklinde düşünülebilir.
Genellikle fractional denen veri tipi kullanılır. Örneğin   +- 1 arasında değerlerle çalışıyorsak ve işlemcimiz 16 bit ise 15 bitlik ve hassasiyetde çalışırız. Bu şekilde tanımlanmış veri tipine de Q(15) denir. 32 bitlik işlemlerde de bunun karşılığı Q(31) dir. DSP işlemlerin vazgeçilmezidir.

_MOD_

Alıntı yapılan: bunalmis - 22 Ocak 2011, 01:59:15
Hesaplamalarinda sample suresi yok gorunuyor. Haydi diyelim bu sureyi carpan-bolen olarak Ki ve Kd icine gomdun. Bu kez de ana dongu de bu sample suresi gorulmuyor. PID hesaplamalarinin hemen ardindan tekrar hesaplamaya dalmissin.

Sample süresini kaç yerde kullanıyoruz?

Bir tane integrali hesaplarken giriyor çarpan olarak, bir tane de türev alırken bölüm olarak. Başka sample süresinin hesaba dahil olduğu kısım varmı?

iyildirim

Alıntı yapılan: _MOD_ - 19 Şubat 2011, 23:35:40
Alıntı yapılan: bunalmis - 22 Ocak 2011, 01:59:15
Hesaplamalarinda sample suresi yok gorunuyor. Haydi diyelim bu sureyi carpan-bolen olarak Ki ve Kd icine gomdun. Bu kez de ana dongu de bu sample suresi gorulmuyor. PID hesaplamalarinin hemen ardindan tekrar hesaplamaya dalmissin.

Sample süresini kaç yerde kullanıyoruz?

Bir tane integrali hesaplarken giriyor çarpan olarak, bir tane de türev alırken bölüm olarak. Başka sample süresinin hesaba dahil olduğu kısım varmı?

Sample süresinin hesaplara dahil edildiği başka bir yer yok..
Yukarıda Bunalmis hocanın da dediği gibi sample süresi çarpan ve bölen olarak katsayılara dahil edildi ise zaten sorun yok. Ancak Bu sample süresinin gerçeğe uygun olması gerekli. Yani Örneğin sample süresi atıyorum 10ms ve sabit ise gerçekten de 10ms de bir ölçüm yapmak gerekir. Eğer sample süresi sabit değilse hesaplara dahil etmek gerekir.

Örnek kodda sanki bütün hesapların yapılma süresi tam da sample süresi gibi imişcesine goto Basla ile döngü devam ediyor. Burada ya bir bekleme vs olmalı yada daha iyisi PID kısmını alt program olarak yazıp ölçüm ve PID altprogramını çağırma işini bir timer'a bağlamalı. Yada sample süresi ölçülüp hesaplara dahil edilmeli ..



_MOD_

#10
Bir de şu fixed point olayını anlamadım. Nerde neden kullanacağız bu fixed point olayını?

Ben mesela Sample frekansını 256Hz almak istiyorum. O zaman integrali 256' ya bölmem gerekiyor. Sağa doğru 8 bit kaydırınca halloluyor.

Ama bu sefer de türevi 256 ile çarpmam gerekiyor. 256 ile çarpmak demekte sola 8 bit kaydırmak demek. Sola 8 bit kaydırınca, yani 256 ile çarpınca Türev kısmı çok büyük çıkıyor. Diğer bir çarpan olan KD'yi de saymıyorum.

Fixed point burdamı devreye giriyor? Nasıl bir işlevi var?