Picproje Elektronik Sitesi

ENDÜSTRiYEL OTOMASYON => Motorlar & Sürücüler => Konuyu başlatan: bulut_01 - 16 Ocak 2018, 22:46:46

Başlık: pid motor kontrol
Gönderen: bulut_01 - 16 Ocak 2018, 22:46:46
iyi aksamlar arkadaslar pid algoritmasını ögrenmeye calısıyorum asagıda kücük bir örnek verecegım. motorun var olan hızı (rpm) birde kendim dönmesini istediğim referans (ref) değeri var.  bu algoritmada dt (pid fonksiyonuna her girdiğindeki geçen zaman) bu kısmın değerini 1 yaptıgımda sacma sapan sinyaller görüyorum similasyonu proteusda yapıyorum algoritmada yanlış yerler varsa sizce nereler ?
I (İntegral) Bu bölüm hiç sabit kalmıyor motor sabit hızda dönerken.

int8 kp=8;
int8 ki=5;
int8 kd=5;
int8 dt=1;

Hata = Ref - rpm  ;
                                                     
HD = Hata - EHata;                                                 

P = Kp * Hata;

I = I + Ki * Hata * dt;

D = Kd * HD/dt;

EHata = Hata;

PID = P + I + D;

set_pwm1_duty(PID);
Başlık: Ynt: pid motor kontrol
Gönderen: Mucit23 - 16 Ocak 2018, 23:18:07
Kp ki ve kd katsayıları float türünde olsun. Bazı sistemlerde virgülden sonra 2 hane bile sistemin tepkisini değiştirebiliyor.
Başlık: Ynt: pid motor kontrol
Gönderen: OptimusPrime - 16 Ocak 2018, 23:26:54
https://electronicsfreelancer.wordpress.com/2017/05/08/pid-implementasyonu-kodlamasi/

dt surekli zamani ifade eden bir deger. sen burada ayrik zamanda calisiyorsun ayrik zamanda dt yok. dolayisi ile bu deger aslinda katsayinin icine yedirilmis bir deger olmaliydi. daha baska seylerde var. yukaridaki yaziyi okunami tavsiye ederim.
Başlık: Ynt: pid motor kontrol
Gönderen: bulut_01 - 16 Ocak 2018, 23:55:09
Alıntı yapılan: OptimusPrime - 16 Ocak 2018, 23:26:54
https://electronicsfreelancer.wordpress.com/2017/05/08/pid-implementasyonu-kodlamasi/

dt surekli zamani ifade eden bir deger. sen burada ayrik zamanda calisiyorsun ayrik zamanda dt yok. dolayisi ile bu deger aslinda katsayinin icine yedirilmis bir deger olmaliydi. daha baska seylerde var. yukaridaki yaziyi okunami tavsiye ederim.
Üstad verdiğin link okudum ordaki örneği anlamak isterdim ama fazla anlayamadım ayrık ve sürekli kavramları neyi ifade ediyor tam olarak? birde verdiğim örnek üzerinden anlatım yaparsanız daha iyi anlıyacagım sanırım verdiğim algoritma calısıyor ama istediğim derecede stabil calısmıyor dt değeri 0 oldugunda integral kısmı pasif kalıyor dt değeri 1 yaptıgımda sacma sapan sinyal cıkıyor mcu dan bu pid konusunu daha detaylı ve anlasılır sekılde anlatırsanız benim gibi bu konuda fazla bilgisi olmayan arkadaslar pid konusu daha iyi anlıyacaklardır.
Başlık: Ynt: pid motor kontrol
Gönderen: foseydon - 17 Ocak 2018, 01:06:45
Hocam sen ne PİD mantığını anlamamışsın. Basitçe anlatayım bildiğim kadarı ile.

PİD kontrolü anlamak için şoyle bir grafik duşün. Y ekseni kontrol etmek istediğimiz değişkenin değeri. X ekseni zaman. Birde kontrol değişkenini tutmak istediğimiz değer var. Bu da Y ekseninden x eksenine paralel sabit bir değer. Kontrol degiskenimiz zaman içerisinde değişir, sürekli bir fonksiyondur.

Şimdi pid mantığında 3 bileşen vardır. Proportional : bu herhangi bir t anında kontrol değişkeninin değeri ile onu tutmak istediğimiz değer arasındaki fark. Grafiğe göre düşünürsek. X ekseninden herhangi bir noktadan cekecegimiz dikmenin düz çizgiyi kestiği nokta ile fonksiyonu kestiği nokta arasında kalan fark. Bu farka bakarak istenen noktadan ne kadar uzakta olduğumuza anlık olarak bakar ve kontrolünü buna göre yaparsak P kontrol yapmış oluruz. Bunun dezavantajı geçmiş bilgisi yoktur. Yani sistemin önceki durumundan bağımsız kontrol sağlanır. Anliktir.

İntegral kısmında sistem geçmişinde tutulur. Yine grafiğe göre düşünürsek, sabit fonksiyon ile sürekli değişen fonksiyon arasında kalan alandır. Bunun avantajı şudur, yaptığınız işlemlerin sisteme olan etkisini de hesaba katmış oluruz bu stabiliteyi sağlar.

Derivative, sonuncu bileşen, türevidir. Bu da sistemin gelecekte nereye gittiğini kestirerek kontrole yardımcı olur. Grafikte düşünürsek, sürekli değişen grafikte herhangi bir t anında grafiğe çizilen tegettir. Burada yaptığımız kontrolün sistemi gelecekte nereye götürdugune bakarak kontrolumuzu ayarlamamizi sağlar.

Türev bileşeni genelde kullanılmaz. Çoğu endüstriyel kontrol Pİ dir.

Senin yazdığın koda gelirsek. İntegral bileşenindeki dt yıl çıkarsan bile sonuç değişmez. Çünkü 2 sabiti çarparsan sonuç sabit olur. Bu yüzden 2 sabit yazmak yerine tek sabit yazarsın. Optimus un içine yedirmek dediği bu.

Birde işin katsayı belirmeye kısmı var. Kafana göre pi katsayısı yazamazsin. Hesabı var. Hesap yapmayacağım dersen uygulamalı metotları var. Önce P katsayısını bulursun, diğerlerini sıfır larsin. Sonra P sabit tutup İ katsayısını bulursun (D sıfır) en son D yıl bulursun.
Başlık: Ynt: pid motor kontrol
Gönderen: bulut_01 - 17 Ocak 2018, 07:43:14
O zaman benim algoritmam tam olar pid mantıgında calışmıyor mu?  evet pid yeniyim ögrenmeye calışıyorum eksen örnegi için tşk ederim bu teorik bilgileri algoritmayı daha stabil hale getirmek için nerelerde düzenlemeler yapmam laZım?
Başlık: Ynt: pid motor kontrol
Gönderen: foseydon - 17 Ocak 2018, 13:32:01
öncelikle yazdığın kodları okunaklı yazman ve (code)(/code) takısı içerisine alman lazım. Kod dökümantasyonunun birinci kaynağı kodun kendisidir. okuyan kişinin bir bakışta anlaması lazım. Ben olsam PID kontrolünü şöyle yazardım.


struct PID{
    int8 kp;
    int8 ki;
    int8 kd;
    int interval;
    int error;
    int lastError;
    int referenceValue;
    int measuredValue;
    unsigned long long buffer;
};

void main(){
    struct PID pid;
    while(1){
        pid.measuredValue = RPM
        pid.error = pid.reference - pid.measuredValue;
        pid.buffer = pid.error + ( pid.ki * pid.error ) + pid.kd * ( pid.error - pid.lastError ) * pid.interval;
        // check for buffer saturation here
        set_pwm1_duty(PID);
    }
}


şu tarz yazarsan daha okunaklı olur. bundan daha iyisi, pid hesabını bir fonksiyon yapıp PID structını argüman olarak vermek. kafan karışmasın diye o şekilde yapmadım. Neyse, önemli olan okunaklı kod yazmak yazmak. Ben misal EHata ne diye düşünmek zorunda kaldım. Oysa EskiHata yazsan direk anlaşılır. Sen 3 tane harfe basmaktan kurtulurken başka birisi saatlarce o kodu çözmek için uğraşabilir. Burada anlaştığımıza göre deval edelim.

Öncelikle, PID kontrol yapmaya çalışma. Madem öğrenmeye çalışıyorsun. Önce, sadece P kontrol yap. Sonra I ya geç, en son D yi ekle. Bu sayede, her kontrolün senin kontrol mekanizmana nasıl etki ettiğini görmüş olursun. Misal, sadece P yaptığın zaman istediğin referans değere oturtamayacaksın offset kalacak. I eklediğinde bu offset azalacak veya yok olacak. D eklediğinde referans değerine çok daha hızlı oturduğunu göreceksin vs. vs. bunları görürerek deneyerek öğrenirsen daha kalıcı olur.

Birde tüm yazılım mantığını göremiyoruz, ama pid buffer'ını direk duty değeri olarak vermezsin çoğu durumda. buffer çok çok büyük olur, kontrol çözünürlüğünü artırmak için. bu değer saturasyona tabidir, sınırlarını kontrol eder duty değerine eşleştirir öyle yazarsın.

ingilizcen varsa, katsuhiko ogata'nın conrol kitabının PID kısmını okusan bayağı faydası olur. Ama matematiği ağır biraz. matematik bilgin zayıfsa uğraşma.
Başlık: Ynt: pid motor kontrol
Gönderen: bulut_01 - 17 Ocak 2018, 13:57:24
Alıntı yapılan: foseydon - 17 Ocak 2018, 13:32:01
öncelikle yazdığın kodları okunaklı yazman ve (code)(/code) takısı içerisine alman lazım. Kod dökümantasyonunun birinci kaynağı kodun kendisidir. okuyan kişinin bir bakışta anlaması lazım. Ben olsam PID kontrolünü şöyle yazardım.


struct PID{
    int8 kp;
    int8 ki;
    int8 kd;
    int interval;
    int error;
    int lastError;
    int referenceValue;
    int measuredValue;
    unsigned long long buffer;
};

void main(){
    struct PID pid;
    while(1){
        pid.measuredValue = RPM
        pid.error = pid.reference - pid.measuredValue;
        pid.buffer = pid.error + ( pid.ki * pid.error ) + pid.kd * ( pid.error - pid.lastError ) * pid.interval;
        // check for buffer saturation here
        set_pwm1_duty(PID);
    }
}


şu tarz yazarsan daha okunaklı olur. bundan daha iyisi, pid hesabını bir fonksiyon yapıp PID structını argüman olarak vermek. kafan karışmasın diye o şekilde yapmadım. Neyse, önemli olan okunaklı kod yazmak yazmak. Ben misal EHata ne diye düşünmek zorunda kaldım. Oysa EskiHata yazsan direk anlaşılır. Sen 3 tane harfe basmaktan kurtulurken başka birisi saatlarce o kodu çözmek için uğraşabilir. Burada anlaştığımıza göre deval edelim.

Öncelikle, PID kontrol yapmaya çalışma. Madem öğrenmeye çalışıyorsun. Önce, sadece P kontrol yap. Sonra I ya geç, en son D yi ekle. Bu sayede, her kontrolün senin kontrol mekanizmana nasıl etki ettiğini görmüş olursun. Misal, sadece P yaptığın zaman istediğin referans değere oturtamayacaksın offset kalacak. I eklediğinde bu offset azalacak veya yok olacak. D eklediğinde referans değerine çok daha hızlı oturduğunu göreceksin vs. vs. bunları görürerek deneyerek öğrenirsen daha kalıcı olur.

Birde tüm yazılım mantığını göremiyoruz, ama pid buffer'ını direk duty değeri olarak vermezsin çoğu durumda. buffer çok çok büyük olur, kontrol çözünürlüğünü artırmak için. bu değer saturasyona tabidir, sınırlarını kontrol eder duty değerine eşleştirir öyle yazarsın.

ingilizcen varsa, katsuhiko ogata'nın conrol kitabının PID kısmını okusan bayağı faydası olur. Ama matematiği ağır biraz. matematik bilgin zayıfsa uğraşma.


Üstad tsk ederim bilgiler için codların karsısına // acıklama yapacaktım aksam unutmusum o konuda haklısın üstad buffer direk pwm basmamam gerektiğini karşılastırma yapıp öyle yazmam lazım bu kısmı algoritma üzerinden yani kodu belirterek yada yazarak anlatırsanız kafamda daha iyi oturacagına inanıyorum evet p i d hepsi farklı işlevleri var bu algoritmada kp ki kd değerleri oynayarak pwmdeki değişkenlerden görüyorum sizin örneğinizde dt göremedim(pid fonk geçen zaman) pid konusunda çok ilgiliyim elimden geldiğince bişeyler yapmaya calısıyorum sizin yardımlarınızla daha iyi olacagına inanıyorum.
Başlık: Ynt: pid motor kontrol
Gönderen: foseydon - 17 Ocak 2018, 14:00:22
pid.interval = dt oluyor.
Başlık: Ynt: pid motor kontrol
Gönderen: bulut_01 - 17 Ocak 2018, 14:02:03
Ayrıca şunuda biliyorum ölçtüğümüz rpm ile referans rpm degerleri aynı olması gerekiyor( - 1 +1) pid kullanılan degiskenler farklı degerlerde olursa pid calısmaz bu buffer ve pwm degerleri içinde geçerli değilmidir?

" pid buffer'ını direk duty değeri olarak vermezsin çoğu durumda. buffer çok çok büyük olur, kontrol çözünürlüğünü artırmak için. bu değer saturasyona tabidir, sınırlarını kontrol eder duty değerine eşleştirir öyle yazarsın."
Hocam bu kısmı detaylı anlatırsanız sevinirim.
Başlık: Ynt: pid motor kontrol
Gönderen: foseydon - 17 Ocak 2018, 16:33:33
Alıntı yapılan: bulut_01 - 17 Ocak 2018, 14:02:03
Ayrıca şunuda biliyorum ölçtüğümüz rpm ile referans rpm degerleri aynı olması gerekiyor( - 1 +1) pid kullanılan degiskenler farklı degerlerde olursa pid calısmaz bu buffer ve pwm degerleri içinde geçerli değilmidir?

" pid buffer'ını direk duty değeri olarak vermezsin çoğu durumda. buffer çok çok büyük olur, kontrol çözünürlüğünü artırmak için. bu değer saturasyona tabidir, sınırlarını kontrol eder duty değerine eşleştirir öyle yazarsın."
Hocam bu kısmı detaylı anlatırsanız sevinirim.

Şöyle düşün senin pwm çözünürlüğün 12 bit olsun. Bu durumda maksimum yazacagin duty 2^12 = 4096 olur. ADC çözünürlüğün 12 bit olsun. Send control değişkenini adc bin okuyabilirsiniz en yüksek değere ayarlarsan ve bu değerin sıfır olduğu durumdan kontrole başlarsan pid hatası 4096 olur. Bunun üstüne integrali de eklersen 4096 yıl aşar. Bu durumda gidip bu değeri sütü değeri olarak verirsen duty = değer % 4096 olur. Aslında rastgele birşey yazmış olursun. Kontrol sende olmaz. Bunun için, pid toplamını duty çözünürlüğüne oranlayip yazarsın. Pid toplamını 4096000 Maksim olsun diyelim. Bu 2048000 çıktıysa sütü 2048000 yazmasın. Çıkan sonuç 1e1000 olduğu için 1000e böler yazarsın.
Başlık: Ynt: pid motor kontrol
Gönderen: bulut_01 - 17 Ocak 2018, 16:46:34
Sütü değeri nedemek? Anladıgım kadarı ile mcu pwm çözürlüğü ile pid çözünürlüğüne eşitleyecegiz burda adc kullanımı yok pid algoritmasında adc neden yazdınız anlamadım?
Rpm nasıl elde ediyorum rb kesmesinden elde ediyorum gerekli matematiksel işlemlerden sonra rpm ölçmüş oluyorum bu detaylar haricinde daha ögrenmemiz gereken pid konusundaki püf noktaları anlatmaya devam ederseniz ögrenmeye devam ediyoruz.
6.  satırdan sonrasını fazla anlayamadım üstad.
Başlık: Ynt: pid motor kontrol
Gönderen: OptimusPrime - 17 Ocak 2018, 20:51:08
@bulut_01
dt yi unut :)

- sistemde P var carpani var, I var carpani var, D var carpani var. (motor uygulamalarinda genel olarak D kullanilmaz)
- PID icin bir ornekleme zamani belirlemen gerekiyor. mesela saniyede bir ornek. bu ornegi PID algoritmasina verip bir sonraki ornekleme zamani gelene kadar tum hesaplamalari bitirmis ve PWM cikisina yeni degeri yazmis olmalisin
- degiskenlerin gercek sayilar olsun ki yuvarlamalardan dolayi sistem kararsiz calismasin
- PID islemlerini -1 +1 araligina olmali veya herhangi bir aralikta tanimlayabilirsin. Bu durumda her girisi bu araliga cekmelisin. PID sonucunda PWM icin bir deger uretecek, bu deger haliyle normalize ettigin aralikta olacak. Bunu tekrar olmasi gereken araliga cekeceksin. verdigim linkte kodlar mevcut.
- bundan sonra sadece ayarlama kismi kaliyor onuda ziegler nichols efendiye gore yapiyorsun. bununda nasil yapildigi verdigim linkte anlatiliyor.

Başlık: Ynt: pid motor kontrol
Gönderen: bulut_01 - 17 Ocak 2018, 21:29:23
Alıntı yapılan: OptimusPrime - 17 Ocak 2018, 20:51:08
@bulut_01
dt yi unut :)

- sistemde P var carpani var, I var carpani var, D var carpani var. (motor uygulamalarinda genel olarak D kullanilmaz)
- PID icin bir ornekleme zamani belirlemen gerekiyor. mesela saniyede bir ornek. bu ornegi PID algoritmasina verip bir sonraki ornekleme zamani gelene kadar tum hesaplamalari bitirmis ve PWM cikisina yeni degeri yazmis olmalisin
- degiskenlerin gercek sayilar olsun ki yuvarlamalardan dolayi sistem kararsiz calismasin
- PID islemlerini -1 +1 araligina olmali veya herhangi bir aralikta tanimlayabilirsin. Bu durumda her girisi bu araliga cekmelisin. PID sonucunda PWM icin bir deger uretecek, bu deger haliyle normalize ettigin aralikta olacak. Bunu tekrar olmasi gereken araliga cekeceksin. verdigim linkte kodlar mevcut.
- bundan sonra sadece ayarlama kismi kaliyor onuda ziegler nichols efendiye gore yapiyorsun. bununda nasil yapildigi verdigim linkte anlatiliyor.



üstad verdiğin linkdeki kod bana karmasık geldi pid konusuna hakim olmadıgım için benim verdiğim algoritma üzerinden konussak ben daha iyi anlarım anlatımlarınızı benim algoritmamın karsılaması ıcın nerelerinde değişik yapmam gerekiyor verdiğim örnek üzerinden anlatırsanız hem daha iyi anlıyacagım eger diyorsanızkı bu algoritma pid olarak işe yaramaz kaldır at derseniz anlıyacagım sekılde algorıtma yazabilirmisiniz yada örnek gösterirseniz sevinecegim hocam.
dt neden unutmam gerekiyor ?
-1 +1  mantıgını biliyorum asagıdakı algoritmam bu kurala uydurmam lazım sanırım.

int kp=6;
int ki=1;
int kd=1;
float dt=0.005;
unsigned long long pid=0;

Hata = Ref - rpm  ;

HD = Hata - EHata;                                     

P = Kp * Hata;

I = I + Ki * Hata * dt;

D = Kd * HD/dt;

EHata = Hata;

PID = P + I + D;

set_pwm1_duty(PID);

Başlık: Ynt: pid motor kontrol
Gönderen: berat23 - 17 Ocak 2018, 21:36:50
bence pid kontrolcüden önce kontrol nedir neden yapılır kısmına bakmak daha doğru. yoksa pid kodu hava cıvadır, önemli olan kontrolcüdür.

yani sistemin modeli nedir, kararlı mıdır bilmeden kontrolcü yapılmaz. sonra ezber oluyor, p olunca responsive olur, ı olunca steady state error olmaz gibi. önce kullandığın sistem yani motorun transfer fonksiyonuna bak. sonra integral neye yarıyor ya da neden derivative kullanımı gerekli değil ortaya çıkıyor. öyle bakınca başka şeyler de göreceksin, mesela integral aslında ne kadar tehlikelidir gibi.

ayıca kod-proteus ikilisinden ziyade bu işin doğrusu bence simulink'tir. hem orda kararlılık ya da parametreleri tune etmek için araçlar da var, teoriyi doğrularsın. sonra mcu'ya gömmekte birşey yok, altı üstü çarpma toplama
Başlık: Ynt: pid motor kontrol
Gönderen: bulut_01 - 17 Ocak 2018, 21:46:00
Alıntı yapılan: berat23 - 17 Ocak 2018, 21:36:50
bence pid kontrolcüden önce kontrol nedir neden yapılır kısmına bakmak daha doğru. yoksa pid kodu hava cıvadır, önemli olan kontrolcüdür.

yani sistemin modeli nedir, kararlı mıdır bilmeden kontrolcü yapılmaz. sonra ezber oluyor, p olunca responsive olur, ı olunca steady state error olmaz gibi. önce kullandığın sistem yani motorun transfer fonksiyonuna bak. sonra integral neye yarıyor ya da neden derivative kullanımı gerekli değil ortaya çıkıyor. öyle bakınca başka şeyler de göreceksin, mesela integral aslında ne kadar tehlikelidir gibi.

ayıca kod-proteus ikilisinden ziyade bu işin doğrusu bence simulink'tir. hem orda kararlılık ya da parametreleri tune etmek için araçlar da var, teoriyi doğrularsın. sonra mcu'ya gömmekte birşey yok, altı üstü çarpma toplama

arkadasım elektronik bölüm mezunuyum biliyoruz birseyler pid konusunda yabancıyım ugrasmadıgım bölüm pid konusunda eksiklerimi tamamlamaya calısıyorum amacım ezber değil ortada örnek algoritma uzerinden bilmediklerimi yada yanlıs bildiklerimi düzeltmeye calısıyorum
amacım jilet gibi dönen dc motor kontrol yapmak istiyorum motorun teknik verileri yok kp ki kd degiskenlerıyle oynayarak en stabil calısma seklini olusturmak.
Başlık: Ynt: pid motor kontrol
Gönderen: foseydon - 17 Ocak 2018, 22:26:41
Alıntı yapılan: berat23 - 17 Ocak 2018, 21:36:50
bence pid kontrolcüden önce kontrol nedir neden yapılır kısmına bakmak daha doğru. yoksa pid kodu hava cıvadır, önemli olan kontrolcüdür.

yani sistemin modeli nedir, kararlı mıdır bilmeden kontrolcü yapılmaz. sonra ezber oluyor, p olunca responsive olur, ı olunca steady state error olmaz gibi. önce kullandığın sistem yani motorun transfer fonksiyonuna bak. sonra integral neye yarıyor ya da neden derivative kullanımı gerekli değil ortaya çıkıyor. öyle bakınca başka şeyler de göreceksin, mesela integral aslında ne kadar tehlikelidir gibi.

ayıca kod-proteus ikilisinden ziyade bu işin doğrusu bence simulink'tir. hem orda kararlılık ya da parametreleri tune etmek için araçlar da var, teoriyi doğrularsın. sonra mcu'ya gömmekte birşey yok, altı üstü çarpma toplama

Berat usta kontrolcü nedir?
Başlık: Ynt: pid motor kontrol
Gönderen: OptimusPrime - 17 Ocak 2018, 22:29:04
Yine donup dolasip verdigim linkteki kodu yazacaz ama hadi hayirlisi bakalim


//bu fonksiyon bir timer kesme ritini icinde cagirilmali.
void PID(void)
{
float kp=6;
float ki=1;
float kd=1;
float pid=0;

//burada hatayi ve referansi -1 +1 araligina cekmelisin

Hata = Ref - rpm ;

HD = Hata - EHata;                                     

P = Kp * Hata;
I = I + Ki * Hata;
D = Kd * HD;
//burada PID degerlerin limitlemelisin (en azindan I yi limitlemelisin - ucup gitmesin)

PID = P + I + D;
//Burada PID toplamini limitlemelisin

//PID degeri bu noktadan sonra PWM register ina yazilacagindan araligi degistirmelisin
set_pwm1_duty(PID);

EHata = Hata;



Başlık: Ynt: pid motor kontrol
Gönderen: bulut_01 - 17 Ocak 2018, 22:39:06
@OptimusPrime hocam tsk ederim yardımlarınız için aradaki acıklamalarınızı kodlada yardım etsenız örnek olarak

burada PID degerlerin limitlemelisin (en azindan I yi limitlemelisin - ucup gitmesin) cümlenizdeki I nasıl sabitliyecegız kod yazabilirmisiniz bunun için ?

//burada hatayi ve referansi -1 +1 araligina cekmelisin --- bunun kod karsılıgı nedir ?
Başlık: Ynt: pid motor kontrol
Gönderen: berat23 - 17 Ocak 2018, 23:05:54
valla kusura bakmayın da pid nedir bilen biri gidip dt nedir diye sormaz. ya da saturation nedir, windup nedir gibi soruların da cevabını bilir. yoksa pid nedir, toplamda iki satır kod ki defalarca örnek verilmiş...

her soru tamam ama böyle temelden eksik gelip biliyoruz yaa tribi atmak nedir anlamıyorum...
Başlık: Ynt: pid motor kontrol
Gönderen: bulut_01 - 18 Ocak 2018, 07:43:57
Alıntı yapılan: berat23 - 17 Ocak 2018, 23:05:54
valla kusura bakmayın da pid nedir bilen biri gidip dt nedir diye sormaz. ya da saturation nedir, windup nedir gibi soruların da cevabını bilir. yoksa pid nedir, toplamda iki satır kod ki defalarca örnek verilmiş...

her soru tamam ama böyle temelden eksik gelip biliyoruz yaa tribi atmak nedir anlamıyorum...
Yukarda belirtmişim pid konusunda yabancıyım bilmiyorum diye triple ne alakası var bilen arkadaslarımız abilerimiz elinden geldiğince yardımcı oluyor sen biliyosun yada bilmiyosun demiyorlar sende birseyler biliyosan örnek üzerinden sordugum sorulara cvp yaz I nasıl sabitlenir - 1+1 kurulanı anlat nasıl çevrilir biliyosan bunlara cvp yaz bilmiyosanda trip atıyosun vs vs tarzında cümleler bu teknik konuya gitmiyor arkadas.
Başlık: Ynt: pid motor kontrol
Gönderen: bulut_01 - 18 Ocak 2018, 19:44:05
Alıntı yapılan: bulut_01 - 17 Ocak 2018, 22:39:06
@OptimusPrime

burada PID degerlerin limitlemelisin (en azindan I yi limitlemelisin - ucup gitmesin) cümlenizdeki I nasıl sabitliyecegız kod yazabilirmisiniz bunun için ?

//burada hatayi ve referansi -1 +1 araligina cekmelisin --- bunun kod karsılıgı nedir ?

Bu konuda yardımlarınızı bekliyorum arkadaslar I sabitlemeyi nasıl yapabilirim?
Başlık: Ynt: pid motor kontrol
Gönderen: Zoroaster - 19 Ocak 2018, 00:46:29
Yi=Yi+Err*DT;
if Yi>Ymax Yi=Ymax;
else if Yi<-Ymax Yi=-Ymax;

Boylece hatanin integralinin cok buyuk degerler almasi engellenmis olur.
Başlık: Ynt: pid motor kontrol
Gönderen: bulut_01 - 19 Ocak 2018, 07:59:41
Tşk ederim bülent abim verdiğin kodun basına I=Yi mi koymalıyım yada direk Yi yerlerine direk I yazmalıyım.
Başlık: Ynt: pid motor kontrol
Gönderen: Cemre. - 19 Ocak 2018, 08:30:18
Alıntı yapılan: Zoroaster - 19 Ocak 2018, 00:46:29
Yi=Yi+Err*DT;
if Yi>Ymax Yi=Ymax;
else if Yi<-Ymax Yi=-Ymax;

Boylece hatanin integralinin cok buyuk degerler almasi engellenmis olur.

Integrali saturasyona sokmaktansa aktuatore giden değeri aktuator sınırları ile sature edip integral için anti-windup implemente edilse daha güzel olur diye düşünüyorum. Öyle çok zor bir şey de değil. Saturasyona girmeden önceki değeri saturasyondan çıkan değerden çıkartıyorsunuz (böylece çıkışın limitlerden ne kadar fazla saptığını yani aradaki farkı buluyoruz), bunu integral hesabına giden hata ile topluyoruz.

Aşağıdaki dökümanı incelemenizi tavsiye ederim.
http://cse.lab.imtlucca.it/~bemporad/teaching/ac/pdf/AC2-09-AntiWindup.pdf
Başlık: Ynt: pid motor kontrol
Gönderen: bulut_01 - 19 Ocak 2018, 08:39:42
linke baktım Umin Umax mı kast ediyosunuz saturasyon için.
Başlık: Ynt: pid motor kontrol
Gönderen: Cemre. - 19 Ocak 2018, 10:30:12
Alıntı yapılan: bulut_01 - 19 Ocak 2018, 08:39:42
linke baktım Umin Umax mı kast ediyosunuz saturasyon için.

Evet, o kısımda saturasyon anlatılıyor. @Zoroaster hocanın verdiği kod parçası da zaten bunu yapıyor...
Başlık: Ynt: pid motor kontrol
Gönderen: bulut_01 - 19 Ocak 2018, 12:18:17
Bülent abim saolsun yardımcı oluyor eve gidince deneyecegim kodları

-1+1 değişkenler sabitleme olayı var onuda çözebilirsem biraz yol kat etmiş olacagım.
Başlık: Ynt: pid motor kontrol
Gönderen: Zoroaster - 19 Ocak 2018, 13:04:35
Alıntı yapılan: bulut_01 - 19 Ocak 2018, 07:59:41
...verdiğin kodun basına I=Yi mi koymalıyım yada direk Yi yerlerine direk I yazmalıyım.

PIDout =Yp+Yi+Yd

Yi denen cikis PID cikisinin integral bileseni. Verdigim kod orneginde Ki integral katsayisini eklemeyi unutmusum.

Dogrusu asagidaki gibi olmali;

Yi=Yi+Err*Ki*DT;
if Yi>Ymax Yi=Ymax;             // opampdaki +Vcc  gibi davran
else if Yi<-Ymax Yi=-Ymax;    // opampdaki -Vee  gibi davran

Analog devrelerde integral alan opamp devresine hic bir ek onlem almasan bile zaten opamp cikisi besleme voltajinin ustune cikamayacagi icin saturasyon olayi kendiliginden gerceklesir. Verdigim ornek kod parcasi da aynen analog devredeki bu durumu simule eder.
Başlık: Ynt: pid motor kontrol
Gönderen: bulut_01 - 19 Ocak 2018, 13:49:40
Bülent abim tsk ederim eve gecince kodu ekleyip deneyecegim.
Başlık: Ynt: pid motor kontrol
Gönderen: bulut_01 - 23 Ocak 2018, 20:43:48
iyi aksamlar arkadaslar pid algoritmasının uzerinde ugrasıyorum asagıdakı algorıtmamda enerji ilk verdiğimde referans degerime motor ulasıyor burda sorun yok. problem motor calısırken referans degerini değiştirdiğimde motorun hızını değiştirmek için o zaman algoritma sacmalıyor motor ayarladıgım referans degerlerınde calısmıyor kodda nerelere değiştirmem gerekir ?

float kp=1;
float ki=0.5;
float kd=0.5;
float PID;

Hata = Ref - rpm ;                     //  Hata hesaplanıyor

HD = Hata - EHata;                    //Oransal kazanç hesaplanıyor
P = (Kp) * Hata;                     

D = (Kd) * (HD/0.02);                // Türevsel kazanç hesaplanıyor

PID = (P + I + D);                  // İstenilen değer hesaplanıyor
if(pid>1023) pid=1023;
if(pid<-1023) pid=-1023;

I = I +(Hata);                     // i_error başta ilk olarak 0 alındı

I = (Ki) * (I / 0.02);            // i_error'un yeni değeri hesaplanıyor

if(I<-255) I=-255;                // I sabitleniyor
if(I>255) I=255;

set_pwm1_duty(PID);
EHata = Hata;

}}
Başlık: Ynt: pid motor kontrol
Gönderen: foseydon - 23 Ocak 2018, 22:26:53
Kodun yanlış, okunaklı değil. Limitlemede kullandığın 'pid' tanımlı değil. 0.02 nedir bellidir değil. Neden limitlemede yaptıktan sonra integrali hesaplanıyorsun. Ustelik bunu sonraki cevrimde ekliyorsun. Vs vs. Derli toplu yazmaya çalış. Ayrıca daha önce yazmıştım. Önce sadece P kontrol yap, adım adım git. Bu şekilde çok debelenirsin, pek tadım edebilen de çıkmaz.
Başlık: Ynt: pid motor kontrol
Gönderen: ladybird - 23 Ocak 2018, 22:38:02
Hocam hangi mikro denetleyiciyi kullanıyorsunuz ?
Motor sürücü katınız nasıl devre şeması verebilir misiniz?
Başlık: Ynt: pid motor kontrol
Gönderen: bulut_01 - 23 Ocak 2018, 22:52:09
Alıntı yapılan: foseydon - 23 Ocak 2018, 22:26:53
Kodun yanlış, okunaklı değil. Limitlemede kullandığın 'pid' tanımlı değil. 0.02 nedir bellidir değil. Neden limitlemede yaptıktan sonra integrali hesaplanıyorsun. Ustelik bunu sonraki cevrimde ekliyorsun. Vs vs. Derli toplu yazmaya çalış. Ayrıca daha önce yazmıştım. Önce sadece P kontrol yap, adım adım git. Bu şekilde çok debelenirsin, pek tadım edebilen de çıkmaz.
hocam limitlemede pid tanımlı değil demişdiniz bunu açarmısınız anlamadım? 0.02 (dt) degerinin kat sayısı. "Limitleme yaptıkdın sonra integrali hesaplıyorsun ve bunu sonrakı cevrimde ekliyorsun" dediğniz kısmın dogrusunu kod uzerinden değiştirip gösterebilirmisiniz ?
Başlık: Ynt: pid motor kontrol
Gönderen: bulut_01 - 23 Ocak 2018, 22:58:23
Alıntı yapılan: ladybird - 23 Ocak 2018, 22:38:02
Hocam hangi mikro denetleyiciyi kullanıyorsunuz ?
Motor sürücü katınız nasıl devre şeması verebilir misiniz?

18F87K22 MCU H bridge sürücü

(https://i.hizliresim.com/p6oJbm.png)
Başlık: Ynt: pid motor kontrol
Gönderen: ladybird - 23 Ocak 2018, 23:19:25
Hocam arduino kullandınız mı ? Kullandıysanız hemen daha önceden yazdığım çizgi izleyen robot için pidi kodunu göndereceğim, pic bilmiyorum.
Başlık: Ynt: pid motor kontrol
Gönderen: ladybird - 23 Ocak 2018, 23:36:38
Hocam  pic'de milis fonksiyonunu oluşturmanız yeterli. Milis fonksiyonda ben daha güzel açıklıyor.
https://www.arduino.cc/reference/en/language/functions/time/millis/
http://www.elektrobot.net/arduino-ile-millis-kullanimi-ve-timer-uygulamalari/

class PID {
  public:

    double error;
    double sample;
    double lastSample;
    double kP, kI, kD;
    double P, I, D;
    double pid;


    double setPoint = 0;
    long lastProcess;

    PID(double _kP, double _kI, double _kD) {
      kP = _kP;
      kI = _kI;
      kD = _kD;
    }

    void addNewSample(double _sample) {
      sample = _sample;
    }

    void setSetPoint(double _setPoint) {
      setPoint = _setPoint;
    }

    double process() {
   
      error = setPoint - sample;
      float deltaTime = (millis() - lastProcess) / 1000.0;
      lastProcess = millis();

      //P
      P = error * kP;

      //I
      I = I + (error * kI) * deltaTime;
      I = constrain(I, -250, 250);  // Hocam burda sınırlıyorum.

      //D
      D = (lastSample - sample) * kD / deltaTime;
      lastSample = sample;

      pid = P + I + D;
     

      return pid;
    }
};
Başlık: Ynt: pid motor kontrol
Gönderen: bulut_01 - 23 Ocak 2018, 23:44:14
inceledim kodunu da benimkiyle farkı yok gibi mantık aynı algoritmada.
Başlık: Ynt: pid motor kontrol
Gönderen: Firzen - 23 Ocak 2018, 23:58:31
@bulut_01

Sistemin ne olduğuna dair bir denklem takımı ve olayın nasıl olduğunu gösteren formüller yazdım.


https://www.dropbox.com/s/1hpntjesplg29vp/kod.jpg?dl=0
Başlık: Ynt: pid motor kontrol
Gönderen: ladybird - 24 Ocak 2018, 00:01:22
Hocam en garantisi sensörden gelen veriyi kendiniz osiloskop bakarak yada debug yaparak bulabilirsiniz diye düşünüyorum. Benim kanaatim pid değerlerini bulamamış olmanız. yaptığım çizgi izleyen yola çıkarak söylüyorum değerleri bulmak haftalar ala biliyor. Ya da motorun ucunda yük fazla ise çabuk yavaşlamayıp pid iyice karışmasına daha fazla hata üretmesine yol açıyor olabilir.
Başlık: Ynt: pid motor kontrol
Gönderen: Firzen - 24 Ocak 2018, 00:19:57
Alıntı yapılan: ladybird - 24 Ocak 2018, 00:01:22
Hocam en garantisi sensörden gelen veriyi kendiniz osiloskop bakarak yada debug yaparak bulabilirsiniz diye düşünüyorum. Benim kanaatim pid değerlerini bulamamış olmanız. yaptığım çizgi izleyen yola çıkarak söylüyorum değerleri bulmak haftalar ala biliyor. Ya da motorun ucunda yük fazla ise çabuk yavaşlamayıp pid iyice karışmasına daha fazla hata üretmesine yol açıyor olabilir.
Değerleri Bulmak HAFTALAR almaz hocam. Sistem Tanımlama ile veya matematiksel model ile en fazla 15dk ya bulunur.
Başlık: Ynt: pid motor kontrol
Gönderen: ladybird - 24 Ocak 2018, 00:43:32
Cahillik hocam bizde onlar yok.   :D