PI dc motor hız kontrol - grafik üzerinde bi sorum olucak

Başlatan zamzam23, 26 Ağustos 2010, 17:33:35

zamzam23



grafiklerde kırmızı ile işaretlediğim yükselme zamanlarını kontrol etmek istiyorum nasıl bir algoritma kullanmalıyım?
PI algoritmasını direk uyguadıgım zaman yapabildiği en kısa sürede yükseliyor sinyal. ama ben benim istediğim belirli süre içinde yükselmesini istiyorum.yani dicemki örneğin, 5 sn içerisinde referans voltajına eriş. yada dicem ki 10sn içerisinde referans voltajına eriş.

picusta

Daha önce sormussun ve cevaplanmis :
https://www.picproje.org/index.php/topic,29451.msg201855.html#msg201855
Ayni konuya ait her soru için forumda ayri ayri konu açma, derli toplu olsun.

zamzam23

o konuyu kilitlemeseydin dediklerinden bişi anlamadıgı mı yazardım. müsade et insanlar cvp yazsın atlama her konuya.

z

Basamak fonksiyonu sinyalini servo sistemlerine uygulayip sistem cevabına bakarak sistem davranışı hakkında çok faydalı bilgiler ediniriz. Ancak bu tehlikeli bir islemdir.

Sistemler test aşaması hariç gerçek uygulama şartlarında asla basamak sinyaline maruz bırakılmazlar. Aksi halde büyük ivmeli hareketler mekanizmalarda onarımı pahalı hasarlara neden olur.

Senin yanlışın, basamak cevabında yükselme zamanını yayvanlaştırarak sistemi yavaşlatmaya çalışman.

Halbuki yapman gereken şey, sistemi kararlı kilacak, en hızlı tepkiyi verecek şekilde parametreleri ayalamak.

Daha sonra da girişe S şeklinde pozisyon sinyali girmek.

Aşağıdaki sinyalleri sıra ile integre edersen posizyon sinyali elde edersin.

Jerk -> Ivme -> Hız -> Posizyon

Iyi ayarlanmis bir servo sistemde cikis girisi takip edeceginden senin giris sinyali ile cikisi yonlendirmen gerekiyor.

Kontrol kitaplarina goz atmadan once lise fizik kitaplarindan dogrusal hareket bilgilerini tazelemelisin.

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

picusta

Bu dahil olmak üzere PID hakkinda açtigin konular, hepsi 48 saat içinde.

PI motor kontrolünde cevap süresi
https://www.picproje.org/index.php/topic,29461.msg201879.html#msg201879

arkadaşlar PID olayını çözmeye çalısıyorum soru
https://www.picproje.org/index.php/topic,29461.msg201879.html#msg201879

PID motor kontrolü soru
https://www.picproje.org/index.php/topic,29450.msg201772.html#msg201772

PID geribeslemeli dc motor kontrolünde limitör kullanılmıs. bu ne işe yarar?
https://www.picproje.org/index.php/topic,29448.msg201765.html#msg201765

PID kontrollü dc motor sürmek istiyorum.sorum şu
https://www.picproje.org/index.php/topic,29444.msg201750.html#msg201750

ccs #include komutunu çalıstıramadım
https://www.picproje.org/index.php/topic,29442.msg201740.html#msg201740

arkadaslar h-bridge ile dc motor kontrol etmeye calısıyorum.hız problemı var
https://www.picproje.org/index.php/topic,29440.msg201699.html#msg201699


Ben mod degilim o yüzden konulari kilitleyemiyorum. Konu açma furyasini durdurmak için blöf yaptim sen de yedin.
(Sonrasinda mod arkadaslar gerçekten kilitlemis).

Bilginin derli toplu olmasi senin sadece sana fayda saglamaz, senden sonra ugrasanlara veya seninle bu konuyu kesfedenlere faydasi olur.
Sana yardim edenlerle tam iletisim kurarsin, neyi anlayip anlamadigini bilirlerse ona göre anlatirlar.

Bu forumda 64 sayfa olan konular da var. Nereden baslanip (hangi bilgilerle), neler nasil ögrenilmis ve son olarak ne duruma gelinmis anlatiliyor.


Konuya dönersek, PID komut (referans) girisine niye "rampa" verilecegini anladin mi ?

zamzam23

PID nin girişine rampa vereceğimi zaten biliyorum ama bun rampanın enini boyunu ben tayin etmek istiyorum mesele bu.

picusta

Daha önce dedigim gibi, rampayi hafizada tutacaksin ve zamani geldiginde o diziden deger alip PID referans girisine göndermelisin.
Anlaman için transfer grafigini çizmelisin.
Kontrol mantigi -----> Rampa -----> PID----> Sistem.

Iyide ben bunu biliyorum ama nasil yapilir bilmiyorum diyecek olursan buyur
örnek kod :
char Rampa[256] = {4,4,4,5,5,6,8,10 .... , 190, 195, 200, 200};

//.....

//Her 10 ms'de çagrilan fonskyon
// PID hesaplama yapiyormuyuz?
if (Mantik.PIDOn)
	{
	// Bulunan konuma göre rampadan veri aliniyor
	RampaSayaci = Sensor.KapiKonumu;
	// PID referansina gönderiliyor
	PID.Referans = Rampa[RampaSayaci];
	// PID hesaplaniyor
	PIDHesapla(&PID);
	// Motora komut gönderiliyor
	Motor.Komut = PID.Cikis;
	Motor.YeniKomut = 1;
	}




zamzam23


zamzam23

problemi çözemediğim için konuya devam nteliğinde bir mesaj daha atmak istedim. arkadasın dediği rampayı değişkene kaydet sonra PIDye gir.bunu yaptım calısıyor ama sorun su ki; bu rampayı kullanıcı belırleyecek. mesela diyecekkı kapı tam 20cm de iken hızlanmasını tamamlamıs olsun.max hıza ulassın. ama kımıde diyebılır kı yine aynı max hıza bu sefer 30cm gitmişken ulassın. yani biri diyecekkı 10 sanıyede hızlanmasını tamamlasın öbürü diyecekki 20snde. bunu asmak ıcın de rampa fonksıyonunu olusturacak fonksıyonu yazamadım.bi fonsıyon yazdım ama bu sadece belırlı max hıza belırlı sürede ulasması ıcın işe yarıyor. yani rampa degerlerını ben kendım yazmıyorum da fonksıyona yazdırıyorum. fonksıyon soyle:
#separate
void rampa_hesap(float m,int xus)
{
            x1=x_bas;y1=y1temp;
            for(x_bas=x_bas,y_bas=y_bas;x_bas<xus+0.1;y_bas=y_bas+1,x_bas=x_bas+0.1)
            {
            rampa[y_bas]=(m*(x_bas-x1))+y1;
            y1temp=rampa[y_bas];
            }          
}

rampayı olusturan kod da bu sekılde:
//rampa hesap
x_bas=0;y_bas=0;y1temp=0;
rampa_hesap(0.4,1);  // bu satır sunu yapıyor:kapı 1cm gitmişken ulasacagı hız degerlerını 0.1 
//aralıklarla ramp[] değişkenıne atıyor
rampa_hesap(0.6,2);  bu satır da yukardakının kaldıgı yerden tıbarek ramp[] diziini doldurmaya 
//devam ediyor
rampa_hesap(1,3);    
rampa_hesap(1,4);    
rampa_hesap(2,5);   
rampa_hesap(3,6);   
rampa_hesap(7,7);    
rampa_hesap(7,8);    
rampa_hesap(3,9);    
rampa_hesap(2,10);   
rampa_hesap(1,11);   
rampa_hesap(1,12);   
rampa_hesap(0.6,13);
rampa_hesap(0.4,14);
//rampa hesap sonu


bu kodları kullanarak motor, tam 14cm gittiğinde, adım adım ıstenılen eğimlerde arta arta 26cm/sn hıza ulasıyor. bu kodda nasıl bir değişiklik yapmalıyım kı kullanıcının verdıgı maxhız ve yükselme süresinde rampa[256] değilkenleri dolsun? daha sonra bu diziyi kullanarak motoru hızlandırabılırım.

zamzam23

problemi hala çözemedim. belki biri ilgilenir diye ara ara konuyu hareketlendiriyorum.

muhittin_kaplan

#10
Kalman Filtresi ile istediğini yapabilirsin
Fitredeki Q değişkeni ile Ref e ulaşma hızını ayarlayabiliyorsun.
Konuyla ilgili olarak bir program hazırlıyorum Kısmese P.Tesi buraya eklerim.
ama illa PID ile lacak diyorsan onu bilemem.

muhittin_kaplan


zamzam23

hocam programınız calısmadı. tam bitince yollarsınız ben bu arada da kalman filter neymıs onu arastırayım. cok saolun.


muhittin_kaplan

Private Function Kalman(ByVal Zk As Single) As Single
        Pk = Pk + Qsabit
        KK = Pk / (Pk + Rsabit)
        Xk = Xk + KK * (Zk - Xk)
        Pk = (1 - KK) * Pk
        Kalman = Xk
    End Function

Aşağıdaki değişkenlerin hepsi Global Olacak
    Qsabit As Single
    Rsabit As Single
    Pk As Single = 1
    KK As Single
    Xk As Single = 0