İHA Pitch Kontrolü

Katılım
27 Aralık 2021
Mesajlar
30
Bir İHA'nın pitch kontrolünü yapmak için sistemin transfer fonksiyonunu elde ettim fakat sistemin kazancı çok düşük çıkıyor. Sisteme PID kontrolcü tasarladığımda asıl sistemin kazancı düşük olduğu için kontrolcü kazanç değerleri ise çok yüksek çıkıyor. Bu durum ise motorları doğrudan doyuma sokuyor. Bu duruma nasıl bir çözüm geliştirebilirim yardımcı olursanız çok sevinirim.
 
Merhaba hocam,

Eğer PID kazanç değerlerini düşürürsem sistemin geçiçi durum cevabı çok kötüye gidiyor. Normalde İHA'nın kendini 3-4 saniye içinde stabilize etmesi gerekirken PID değerleri düştüğünde 170-180 saniyelere çıkıyor. MATLAB'de pidtune fonksiyonu kullanarak sürekli zamanlı PID katsayılarıyla oynadım, bu durumda bile en düşük değerler 100'lü geliyor. Birkaç internet sitesinde "gain scaling" diye bir kavram ile karşılaştım fakat onun hakkında da yeteri kadar bilgi bulamadım.
 
Zaten isin can alici kisimlarindan birisi burasi.

Hata sinyalini isleyip duzeltici sinyal degeri urettikten sonra bunu voltaja cevirirken arada bir kazanc blogun olacak. Bu blogu es gecmis olabilirsin. Kazanc birden buyuk de olabilir kucuk de.

Iste burda "gain scaling" islemi yapman gerekiyor. (Scale isleminde katsayin 1 den kucuk te olabilir buyuk de) Bu kisimda hata yaparsan ya da es gecersen tum kazanclar olmasi gereken yuzlerce hatta binlerce katiymis yada 1/100 1/1000 gibi olur.

Besleme voltajim su atiyorum duty belirleyen registere 1024 degeri yazarsam duty %100 olmus oluyor. O halde PID cikisinda elde ettigim sayisal degerin karsiligi duty degerine gecerken katsayim ne olacak hesabini yapman gerekiyor.

Ozellikle de fix point islem yapiyorsam burada cok kolay hata yapilabilir.
 
Son düzenleme:
Peki bu işlemi nasıl yapacağıma dair bir kaynak öneriniz var mı hocam? Ayrıca olaya hiç register açısından bakmamıştım. Bunlar hakkında yeteri kadar bilgi sahibi de değilim. Bunları nereden öğrenebilirim hocam?
 
Kodu nasil yazdin bilmiyorum. Duty yukleme isini bir fonksiyon ile yapiyor olabilirsin.

PID nin ozu her kitapta 3 satirdir. Diger konularin farkinda oldugun varsayilir.

Mesela Kp=10, Ki=0, Kd=0 ornegini ele alalim.

Bunun anlami y[n]=10*e[n] demektir.

Eger floating verilerle calisiyorsan e[n] dizisi zaten scale edilmistir. Yani e=0.4 gibi bir deger hatanin 0.4v oldugunu soyler.
Yok scale islemini en sona birakacaksan bu kez ADC vb bir uniteden gelen degerle hatayi e=100 gibi bir deger elde eder ve bunu PID ile islersin.

PID cikisinda 10*0.4=4 degeri elde ettiginde bu actuatore 4V verececegin anlamina gelir. Eger surucu beslemesi 5v ise
PWM ya da DAC icin yapacagin scale islemi 5v max duty ederse 4v icin kazanc ne olmalidir hesabindan bir katsayi bulman gerekir.

Yok taa en bastan ADC cikisindan itibaren scale edilmemis verilerle calisiyorsan bu kez 100*10=1000 degeri uretilir.
Bu durumda 1000 sayisindan ayni sonuca ulasacak katsayiyi hesaplaman gerekir.

Kullandigin cip ureticisinin PID orneklerine bak. Orda bu islemleri bir iki satirda gorebilirsin.

Integratorde saturasyon kontrolu yapman ya da integratoru degiskenin tasiyabilecegi max degerinde altinda limitlemen de gerekebilir. Ayrica integratoru hangi degerde limitleyecegin de onemli bir konudur.
 
Son düzenleme:
Hocam dediğinizi dünden beri okuyup araştırdım ve dediğinizi şimdi anladım. Şimdi ilk yaptığım hatayı Euler'in 2. Yasası'nda açıyı radyan cinsinde verirken ben onu açıya çevirmediğim için sistem kazancı çok düşük çıkıyordu. Çıkışı açıya çevirdiğimde ve PID'yi tune ettiğimde PID parametreleri yaklaşık 100 kat küçüldü. Bu sorunu bu şekilde aştım. Şimdi karşılık gelen değeri de bulmak için pid'nin output'u ile motorun alt çalışma aralığını toplayarak elde edeceğim değil mi? Örnek olarak ESC30a kullanıyorum çıkış 1000-2000us arasında. Motora girecek sinyal 1000us + pid_output olmalı değil mi?
 
PID cikisindaki verinin boyutuna gore gerekli scale islemi yapacaksin.

Mesela cikis -1...+1 araliginda geliyorsa 1 degeri 500 ile carpilacak.

Sifir pozisyonu tam ortaya gelecekse 1500 + Scale edilmis deger.

Yok sifirdan kucuk pozisyon olmayacaksa o zaman 1000 + 1000* PID
 
Son düzenleme:
Tamamdır hocam şimdi anladım. Bu işlemden sonra da integral antiwindup ekleyeceğim. Çalışmayı tamamladıktan sonra tekrar bilgilendirme yapacağım. Bu arada değerli vaktinizi ayırıp cevap verdiğiniz için teşekkür ederim.
 
Hocam kodun PID ile ilgili olan kısmı yazdım fakat donanımla alakalı olan kısım arkadaşımda. İlk defa PID'yi entegre etmeye çalıştığım için bu kadar zorlanıyorum. Sizce kodumda bir problem var mı veya eklemem gereken bir şey yoksa bu şekilde dümdüz sisteme entegre edebilir miyim?
 

Ekler

  • 1745772613972.png
    1745772613972.png
    55.4 KB · Görüntüleme: 21
Bu rutini timer interrupta bagladiysan sorun yok.

Sadece turev islemi sorun olusturabilir. Sensor cozunurlugun yuksek degilse

Count++;
if (Count >15) { Count=0; turev=Hata - EskiHata; EskiHata=Hata;}

gibi duzenleme gerekebilir.

Ya da sensor asiri gurultu iceriyorsa

a, 0.01...0.1 araliginda kucuk bir katsayi olmak uzere

d/dt x(t)=α×(x(t)−x(t−Δt))+(1−α)×d/dt x(t−Δt)

benzeri sahte turev alman gerekebilir.

s ile carparak turev almak yerine asagidaki islemi yapacaksin.

[math]\frac{s}{1+as}[/math]
 
Bağladım hocam. Dediğiniz gibi sensörün çıkışına da alçak geçiren filtre ekledim. Sanırım oldu, salı günü proje üstünde direk deneyini yapacağım. Sonuçları salı günü paylaşırım.
 
Hocam PID çalışıyor, yalnızca ESC power supply'dan beslediği için motorlar kesime gidiyor, power supply yeterince besleyemiyor. Onun yerine li ion pil kullanıldığında sorun çözülmüş olacak. Yardımlarınız için teşekkür ederim.
 

Çevrimiçi personel

Çevrimiçi üyeler

Forum istatistikleri

Konular
7,702
Mesajlar
128,239
Üyeler
3,111
Son üye
alpego

Son kaynaklar

Son profil mesajları

Python Geliştirmeye eklediğim yapay zeka sunucusu, yeni başlayanlar için roket etkisi
Bir insanın zeka seviyesinin en kolay tesbiti, sorduğu sorulardır.
yapay zeka interneti yedi bitirdi, arama motoru kullanan, forumlara yazan kaldı mı ?
Freemont2.0 herbokolog Freemont2.0 wrote on herbokolog's profile.
nick iniz yakıyor
:D
az bilgili çok meraklı
Back
Top