Haberler:

Forum kuralları güncellendi LÜTFEN  okuyunuz:  https://bit.ly/2IjR3ME

Ana Menü

PID konusunda yardım

Başlatan bulut_01, 01 Mayıs 2017, 22:16:24

bulut_01

iyi aksamlar picproje ailesi pid kontrollü motor sürücüsü yapacagım girdiğim referans hız değeri ile dönmesini istiyorum elimdeki dc motor enkoder kısmı var 100 pulslık enkoder okuyorum asagıdaki pid kodlarını nasıl kullanabilirim bana anlatırsanız sevinirim böylelikle pid konusundaki kafaya takılan soru işaretlerini burda gidermiş oluruz bu kodları nasıl kullanacagız ?

typedef struct
{
  double dState;      	// Last position input
  double iState;      	// Integrator state
  double iMax, iMin;  	
  // Maximum and minimum allowable integrator state
  double	iGain,    	// integral gain
        	pGain,    	// proportional gain
         	dGain;     	// derivative gain
} SPid;
double UpdatePID(SPid * pid, double error, double position)
{
  double pTerm,
 dTerm, iTerm;
  pTerm = pid->pGain * error;   
  // calculate the proportional term
// calculate the integral state with appropriate limiting
  pid->iState += error;
  if (pid->iState > pid->iMax) pid->iState = pid->iMax;
  else if (pid->iState 
<
 pid->iMin) pid->iState = pid->iMin;
  iTerm = pid->iGain * iState;  // calculate the integral term
  dTerm = pid->dGain * (position - pid->dState);
  pid->dState = position;
  return pTerm + iTerm - dTerm;
}
YENİLMEZ..

tunayk

Merhaba Elindeki kod parçası sana doğrudan sürücüye vereceğin set değerini üretiyor.  Fonksiyona işlem için gerekli parametreleri verirsen, sana doğrudan yeni set değerini üretiyor.  Sistemin tepki durumuna göre uygun sıklıkta bu fonksiyonu, periyodik olarak (Ör. 100ms) çağırıp yeni değeri ürettirirsin.Bu işlem öncesinde, Aktüel Hız bilgisini hesaplaman gerekiyor(Enkoderden gelen puls/sn değerini kullanabilirsin mesela). Sonrasında Set Hız - Aktüel Hız verisinden de Hata yı hesaplayacaksın.

Fonksiyonun işini yapabilmesi için, SPid tipinde (Ör. xPid) bir değişkenin ve fonksiyonun ürettiği değeri tuttuğun başka bir değişkenin olacak. Böylece;

SetDegeri = UpdatePID(xPid, Hata, SetDegeri);

Şeklinde fonksiyonu çağıracak ve SetDeğerini sürücüyü kontrol için kullanacaksın. xPid değişkeni içindeki P,I,D Katsayılarına(Gain) ve Integral Sınırlarına  uygun değerler atamayı unutma.



bulut_01

@tunayk hocam öncelik tşk ederim ilginiz için o zmn enkoderden gelen pulslar/60 deyip dakikada kaç rpm döndüğünü hesaplıyacaz rpm bilgisi elimizde oldukdan sonra set hız ayarını ve diğer anlattıgınız değerleri kod üzerindn biraz daha detaylı anlatırsanız daha makbule geçecek bu PID konusuna baya yabancıyım anlamaya çalışıyorum simdiden saolun.
YENİLMEZ..

tunayk

Merhaba Aslında kod içinde yeterli açıklama var zaten.   Nasıl kullanacağın kısmını da kod olarak da açıklamıştım. Geriye kalan sadece kendi algoritmanıza göre ilgili değişkenlerin içini doldurmak.  "xPid->iGain  = xx" gibi.

PID'nin ne olduğu konusunda biraz araştırma yaparsan oldukça detay var zaten. Çok fazla teoriye boğulmana gerek yok.  Kontrol ettiğin bir değişkenin var (Sürücüye verilen set değeri),  Ulaşmak istediğin hız değerin var (Proses Set Hız Değeri) ve Proses Aktüel değerin var (Aktüel Hız). PID nin görevi sistemin tepki hızı ile bağıntılı olarak sürücüye gidecek set değerini ayarlayarak Aktüel Hız Değerini, Set Hız değerinde tutmak. 
PID katsayıları (pGain,iGain, dGain ) senin sisteminin tepki hızına göre seçilecek katsayılar. Elinde sistemin matematik modeli varsa, bundan hareket ile katsayılar hesaplanabilir. Yoksa, deneme yanılma yoluyla kendin bulacaksın.  Keyfi olarak hepsine 0.5 verirsin, sistemin çalışmasına bakarsın. Yavaş kalıyorsa arttırırsın. Hızlı geldiyse azaltırsın.  Hatta ilk olarak tek tek değer verip diğer katsayıları 0 vererek sistemin tepkisini izlersen daha çok şey anlarsın.
En önemli konu sistemin hız/zaman grafiğini takip edeceğin bir aracın olmalı. Katsayılar ile oynarken, hızın zamana göre değişimini bir grafik ile takip edersen çok daha iyi anlarsın.  Değilse biraz zahmetli olabilir.

bulut_01

#4
iyi günler picproje ailesi pid calısmalarıma devam ediyorum lakin asagıdaki pid algoritmasını tam anlamadım bana bunu anlatacak arkadaslara simdiden tşk ederim dc motor enkoder hız ve yön bilgisini elde ediyorum elde ettiğim değerleri asagıdaki algoritmaya nasıl yerlestireciğim yardımcı olursanız sevinirim.
Girdiğim referans değerinde dönmesini istiyorum motorun asagıdakı kodda referans hız bilgisi hangi satırdaki oluyor?

typedef struct

{
  double dState;      	                               
  
  double iState;      	                              
  
  double iMax, iMin;  	
                                                     
  
   double	iGain,    	                   
        	pGain,    	                   
         	dGain;     	                  

} SPid;
double UpdatePID(SPid * pid, double error, double position)

{
  double pTerm,iTerm,dTerm;
  
  pTerm = pid->pGain * error;                     
  

  pid->iState += error;                         
  
if (pid->iState > pid->iMax) pid->iState = pid->iMax;
  
    else if (pid->iState < pid->iMin) pid->iState = pid->iMin;
 
  iTerm = pid->iGain * iState;                   
  dTerm = pid->dGain * (position - pid->dState);
  pid->dState = position;
  return pTerm + iTerm - dTerm;
}
YENİLMEZ..

Tagli

Kod epey garip yazılmış. Aradığın şey büyük ihtimalle position değişkeni, ama yine de emin olmak için error değişkeninin hesaplandığı yere bakmak lazım. Tavsiyem daha anlaşılır ve düzgün yazılmış bir örnek üzerinden gitmen.
Gökçe Tağlıoğlu

bulut_01

@taglı hocam anlaşılır pid algoritması varmı bildiğiniz paylaşırsanız makbule geçer nettediki örnekler hep buna benzer bu konuda yardımcı olursanız tsk ederim.
YENİLMEZ..

skara1214

Hız kontrolü için sadece p yi kullanmak yeterli yalnız dikkat etmeniz gereken sample rate i olabildiğince yüksek tutmak
Herkes ölür ama herkes gerçekten yaşamaz

bulut_01

@skara hocam sadece hız kontrolü deil devir ve tork sabit olması lazım düşük devirlerde bile yüksek tork elde etmem lazım dısarda güc uygulandıgında referans devirin dışında hızlı dönmemeside lazım gerekirse frenlemede yapması lazım sistemin sabit devir ve torkda dönmesi için pid şart.
YENİLMEZ..

skara1214

Hocam istediğiniz ne olursa olsun istediğiniz devirde dönmesi degilmi? Eğer öyleyse p yeter i ve d ye gerek yok yalnız bir önceki mesajimdada belirttiğim gibi sample rateniz 1 khz gibi seçerseniz güzel sonuç alirsiniz( deneyip de performans almazsanız o zaman pid yi denerseniz illa i ve d yi eklemeye gerek yok)
Herkes ölür ama herkes gerçekten yaşamaz

Tagli

Alıntı yapılan: skara1214 - 21 Mayıs 2017, 10:53:40
Hız kontrolü için sadece p yi kullanmak yeterli yalnız dikkat etmeniz gereken sample rate i olabildiğince yüksek tutmak
Konum kontrolü sadece P ile de olur ancak hız kontrolü için I (integratör) da gerekir. Yoksa sürekli rejim hatası kalır.

Aşağıda hız kontrolü için yazdığım koddan bir parça var. Buradaki DT, kontrolörün çalışma periyodu (benim sistemde 0.005 saniye idi, yani 200 Hz). Burada aslında D teriminin hesaplanması pratik olarak yanlış, çünkü bunu filtrelemeden kullanmamak gerekir. Ben zamanında üşendiğim için uğraşmamıştım. İnternette muhtemelen filtreli D terimi ile ilgili kod bulunabilir. Özellikle integratör için bir limit koymak önemli.
error = spdRef - monitor.speed;
spdInteg += (DT * error * spdPid.ki);
spdInteg = limit(spdInteg, -95, 95);
pTerm = error * spdPid.kp;
iTerm = spdInteg;
dTerm = error * spdPid.kd / DT;
effort = limit(pTerm + iTerm + dTerm, -95, 95);
setDuty(effort);
Gökçe Tağlıoğlu

skara1214

Gerekmez tagli hocam. Target ilerletme ile deneyin goreceksiniz
Herkes ölür ama herkes gerçekten yaşamaz

Tagli

#12
"Target ilerletme" nedir? Daha önce hiç duymadım.

DC motorlar bir miktar ihmal ve basitleştirme ile modellendiklerinde giriş gerilimi ve açısal hız arasındaki transfer fonksiyonu [latex=inline]\frac {\omega (s)}{V (s)} = \frac{K}{\tau s + 1}[/latex] biçiminde birinci mertebe bir sistem çıkar. Bu sistem kendi içinde bir integratör olmaması sebebiyle "Tip 0" sistem olarak anılır. Bu sistem eğer sadece P ile kapalı çevrim kontrol edilirse bir sürekli rejim hatası kalır. Bu sonuca hata sinyali s domain'de hesaplanarak ve bulunan değere son değer teoremi uygulanarak da ulaşılabilir. Sürekli rejim hatası, yüksek bir Kp değeri verilerek azaltılabilir ancak tam sıfırlanamaz. Yüksek Kp değeri ise sistemde salınıma sebep olabilir, hatta sistemi kararsızlığa da götürebilir.

İşin teorisi böyle.

Pratikte konum kontrolünde dahi integratör gerekebilir.
Gökçe Tağlıoğlu

Zoroaster

Seytan deliginden kacti.

skara1214

Pozisyonlamayi nasıl yapıyorsunuz? TrPezoidal move u nasıl hesapliyorsunuz mesela?
Herkes ölür ama herkes gerçekten yaşamaz