Picproje Elektronik Sitesi

DERLEYİCİLER => PIC C => Konuyu başlatan: fbasaris - 22 Mart 2014, 23:43:56

Başlık: pid problemim hakkında...
Gönderen: fbasaris - 22 Mart 2014, 23:43:56
Merhaba arkadaşlar,

wikipedia da pid ile ilgili standart temel kod var.

previous_error = 0
integral = 0
start:
  error = setpoint - measured_value
  integral = integral + error*dt
  derivative = (error - previous_error)/dt
  output = Kp*error + Ki*integral + Kd*derivative
  previous_error = error
  wait(dt)
  goto start

buradaki dt örnekleme zamanı şeklinde açıklanmış..sorum şu:

dt  program içerinde bir değişken olarak benim tanımlayacağım bir değer mi olacak , yoksa timer kullanarak belirleyeceğim bir süre mi ?





Başlık: Ynt: pid problemim hakkında...
Gönderen: skara1214 - 23 Mart 2014, 00:06:40
dt birim zaman sen ne kadar sürede bir  örnek alıyorsan o kadar.Bunu ister delay verip delay süresini al program içinde olsun ister timerla belli zaman aralığında interrupt oluştur onu ala ama mantıklısı timer ile interrupt oluşturmak.
Başlık: Ynt: pid problemim hakkında...
Gönderen: fbasaris - 23 Mart 2014, 00:47:52
cevap için teşekkürler..

timer0 ı kullanarak kesme oluşturabilirim.

soru1 : Ancak ne kadarlık bir süre belirlemeliyim?

ve dt yerine de o süreyi mi girmeliyim?













Başlık: Ynt: pid problemim hakkında...
Gönderen: LukeSkywalker - 23 Mart 2014, 09:23:51
Kp ki ve kd degerlerini nasil olsa deneme yanilma ile bulacagina gore, dt'nin pek onemi yok.
Başlık: Ynt: pid problemim hakkında...
Gönderen: fbasaris - 23 Mart 2014, 12:32:44



cur_pos=adc_oku();     //mevcut durumu oku
error =cur_pos-ref_pos;
derivative = (error - previous_error);
integral = integral + error;
previous_error = error;
output=error*Kp+derivative*Kd+integral*Ki;



şeklinde yazsak olur mu??? dt yi kullanmadan...
Başlık: Ynt: pid problemim hakkında...
Gönderen: z - 23 Mart 2014, 13:14:10
Olur. Fakat buradaki

Kd,  Kd'
Ki,   Ki' seklinde farkli degiskene donusmus olur.

Atiyorum eskiden Ki=100 iken artik 0.00001 gibi bir deger alacak.
Başlık: Ynt: pid problemim hakkında...
Gönderen: fbasaris - 23 Mart 2014, 13:38:53
o zaman bu kp,kd ya da ki float tanımlanmalı değil mi?


ama ben outputu  integer  olarak kullanıyorum..Acaba hesaplamayı float yaptıktan sonra output değişkeni integer tanımlandıysa derleyici sonucu otomatik çevirir mi??
Başlık: Ynt: pid problemim hakkında...
Gönderen: fbasaris - 23 Mart 2014, 14:05:06
void pid()
{

error =ref_pos-cur_pos;

P = error*Kp;

I = (I + error)*Ki;

D = (error - previous_error)*Kd;

output=P+I+D;

previous_error = error;

}

void hiz_ayarla()
{
if(output>motor_hiz) output=motor_hiz;

if(output<-motor_hiz) output=-motor_hiz;

set_pwm1_duty(motor_hiz+output);//sol motor

set_pwm2_duty(motor_hiz-output);// sağ motor
}


kodun doğru olduğunu düşünüyorum ama maalesef çalıştıramadım...Bir de siz inceler misiniz?
Başlık: Ynt: pid problemim hakkında...
Gönderen: XX_CİHAN_XX - 23 Mart 2014, 14:24:02
Bütün işlemleri float olarak yaptıktan sonra sonucu değerlendirirken integer olarak tip dönüşümü yapabilirsin.
output un da float olduğunu var sayarsak bunu motor_hiz değişkenine integer olarak atmak için;

motor_hiz = (uint16_t)(output);

hız alt ve üst limitlerin varsa bunu da şu şekilde denetleyebilirsin

if(motor_hiz<MIN_SPEED)
   motor_hiz=MIN_SPEED
else if(motor_hiz>MAX_SPEED)
   motor_hiz=MAX_SPEED


mesaj birleştirme:: 23 Mart 2014, 14:26:09

kp, ki ve kd değerlerini güzel seçebilirsen output verisini doğrudan pwm verisi olarak kullanabilirsin. Gerekirse output a bir ofset değeri ekleyerek yada bir sabit katsayı ile çarparak ta kullanman mümkün.
Başlık: Ynt: pid problemim hakkında...
Gönderen: datasheet - 23 Mart 2014, 14:38:23
benimde bir sorum olacak konu açmaya gerek yok , çizgi izleyen de engel için dış kesme yaptğımızda sadece b0 pinindemi bu işi gerçekleştirebiliriz?yoksa picin herhangi bir portunda herhangi pininde bu işlemi gerçekleştirebilirmiyiz?
Başlık: Ynt: pid problemim hakkında...
Gönderen: XX_CİHAN_XX - 23 Mart 2014, 14:51:30
PIC16 serisi için konuşuyorsanız harici kesme pinleri B0 ve B4~B7 pinleridir.
Başlık: Ynt: pid problemim hakkında...
Gönderen: XX_CİHAN_XX - 23 Mart 2014, 16:23:26
Benim merak ettiğim konu pid uygulamalarında kp, ki ve kd değerlerini nasıl pratik ve kesin bir şekilde tespit edebiliriz?
Değer vererek deneme-yanılma sürecini kolaylaştırabileceğimiz bir yol var mı? 
Matlab dan bu konuda nasıl faydalanabiliriz?
Başlık: Ynt: pid problemim hakkında...
Gönderen: moksan - 31 Ocak 2015, 16:36:52
PID katsayılarının bulunma yöntemleri vardır.İnternet de PID taratması yaptığında birçok kaynak bulunmaktadır.Aşağıdaki linkde yükseklisans tezinde kontrolör arayüz tasarımı altında matlab guide de bir arayüz tasarlanıp PID katsayıları bulunmuşve daha evelsinde nedir nasıl die açıklamalarda bulunulmuş.Küçük bir araştırmayla konuyu daha iyi anlayabilirsin. İyi çalışmalar..

http://personel.trakya.edu.tr/aydingullu/#.VMznQdKsUfY (http://personel.trakya.edu.tr/aydingullu/#.VMznQdKsUfY)