PID konusunda yardım

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

skara1214

İşin uzmanı teşrif etmis benim sözlerim burada son bulur :)
Herkes ölür ama herkes gerçekten yaşamaz

Zoroaster

DC motor ölü bölgeye sahiptir. Yani motora sıfıra yakın voltaj uygulandığında motor dönemez. Bu nedenle de integratör gerekir.

Çünkü motor omik dirence sahiptir. Düşük voltaj altında omik direnç sıfır olsaydı motor endüktansı nedeniyle akım tırmanışa geçip motorun konum hatasını sıfırlayacak konum değişimini sağlayabilirdi fakat motor direnci akımın artmasına engel olur ve motor dönemez ve hata da kalıcı olur.
Seytan deliginden kacti.

skara1214

Tagli hocam sorduğum sorunun cevabını bekliyorum sizden
Herkes ölür ama herkes gerçekten yaşamaz

Tagli

Konum kontrolü için yine aynı mantıkla bir konum kontrolörü yazılabilir. Ancak bu pratikte pek uygun olmaz. Konum referansını genelde basamak girişi olarak veririz, "motor şuraya gitsin" gibi. Bu durumda basamak girişi kontrol sinyalinde ani bir yükselmeye yani sisteme ani bir yüklenmeye sebep olur ki bunu istemeyiz. Senin de bahsetmiş olduğun gibi genelde sistemi istenilen konuma götürecek trapezoidal (veya daha yüksek mertebeden eğri şeklinde) bir hız referansı hesaplayıp sistemi bu hız referansına göre sürmek daha uygun olur. Örneğin 6 eksenli bir robot kolunu istenilen konuma götürmek için, her eklemin varması gereken açı hesaplandıktan sonra, eklemlerin izin verilen azami hız ve ivme değerlerine göre 6 motorun da hareketini aynı şekilde tamamlayacağı hız profilleri hesaplanır ve motorlar o şekilde sürülür.

Ben ise yine işin kolayına kaçtım ve hız profili hesaplama, takip etme ile uğraşmamak için konum kontrolörünü hız kontrolörü ile iç içe (kaskat) kullandım. Yani konum kontrolü modunda üretilen kontrol sinyali, altına çalışan hız kontrolörü için referans oluyor. Hız kontrolöründe kontrol sinyalinin ağırlığı integratörden geliyor zaten (verdiğim katsayılara bağlı olarak), bu sayede ani yüklenmelerden kaçınmış oluyorum.

Yukarıda ufak bir bölümünü vermiş olduğum kodun daha uzun hali şu şekilde idi:
void takeControlAction(void) {
    float effort, error, pTerm, iTerm, dTerm;

    switch (ctrlMode) {
        case CTRL_IDLE:
            return;
            break;
        case CTRL_PWM:
            setDuty(dutyRef);
            monitor.duty = dutyRef;
            break;
        case CTRL_POS_ABS:
            error = posRef - monitor.posAbs;
            if (fabs(error) < 0.03) {
                spdRef = 0;
            } 
            else {
                posInteg += (DT * error * posPid.ki);
                posInteg = limit(posInteg, -limits.spdMax, limits.spdMax);
                pTerm = error * posPid.kp;
                iTerm = posInteg;
                dTerm = error * posPid.kd / DT;
                spdRef = limit(pTerm + iTerm + dTerm, -limits.spdMax, limits.spdMax);
            }
            // No break here, it's not a bug.
        case CTRL_SPEED:
            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);
            monitor.duty = effort;
            break;
    }

}


Burada motor sürücü çalışma moduna göre kontrol sinyali üretiyor. Elbette aslında hız profilini dışarıdan vermek daha doğru ve ileride bu özelliği de eklemeyi düşünüyorum. Ancak hız profilini dışarıdan belli aralıklarla hız referansı olarak vermek mi, yoksa sürücü içinde hesaplatıp uygulamak mı daha doğru olur emin değilim. Öyle sanıyorum ki profili izlerken bir yandan o anda olması gereken konum da hesaplanıp ona göre bir düzeltme uygulamak da gerekecektir. Daha okulda bir ders projesi kapsamında Staubli marka endüstriyel robotları dışarıdan hız referansı vererek sürerken, robota zamana bağlı hem hız hem konum verisini beraber veriyorduk. Emin değilim ama galiba bu konum hatası kontrolü için kullanılıyordu. Yoksa her şey mükemmel zamanlama ile yapılırsa sadece hız referansının yeterli olması gerekir ama tabi bu mümkün değil.
Gökçe Tağlıoğlu

bulut_01

@taglı hocam verdiğiniz kçk kodda pid sanırım simdi benim elimdeki veriler yön bilgisi hız bilgisi ve motor akım bilgisi var bu degerleri kod nerelere yazacagım ayarladıgım refarans hız degerde dönmesini istiyorum bu kodda dısardan motor güç uygulandıgında frenlemede yapıyor mu?
YENİLMEZ..

bulut_01

Arkadaslar bi el atsanızda şu pid olayını bir çözsem  :)
YENİLMEZ..

Zoroaster

Timer ile peryodik int üretip her defasında PID hesapalama yapacaksın.

Motor harici etkilerle zorlandığında mesela devir sayısı düştüğünde PID regülatör motora uyguladığı voltajı artırarak zorlamanın üstesinden gelecek. Ya da tersine harici etki ile motor hızlı dönmeye zorlandığında bu kez regülatör voltajı azaltacak hatta ters voltaj verecek ve motoru yavaşlatmaya çalışacak. Fakat;

Burada güç katının H bridge yapısında olması ve besleme hattı üzerinde enerjiyi harcayacak yükün de olması gerekiyor. Eğer yük yoksa motor milinin olması gerekenden daha yüksek devirde dönmesi motorun dinamo olarak çalışması anlamına geleceğinden  dinamo voltajı, besleme voltajını artırmaya çalışacaktır ve eğer bu voltaj bir yükte harcanmazsa frenleme olmaz.

Bu amaçla fren direnci beslemeye  mos vs üzerinden bağlanabilir. Bu durumda bunun kontrolünü de PID kontrolcüye yaptırman gerekir.

Eğer küçük bir motor ile çalışıyorsan regenaratif enerjiyi H bridge mosları üzerinde harcayabilirsin. Fakat bunun için H bridge'de mosların komutasyonu önemli hale gelir.

Bu konu basit gibi görünse de bir sürü detay var.

Locked Anti Phase Pwm, Sign Magnitede Pwm, ya da fast decay slow decay gibi konulara da bakman gerekir.

Seytan deliginden kacti.

bulut_01

#22
@Bülent hocam öncelikle tşk ederim H köprü olacak sistemdeki motor 100 watt çok büyük değil frenleme olayını gnd hattındaki moslarla yapabilirim lakin örneklerde pid algoritmasını tam anlayamadım bütün dediğiniz işleri bu algoritma yapmaz mı pwm duty oynayarak motor hız kontrol yapmayı istiyonorum voltaj sabit 24 volt frekans olarakta 16 khz ideal diye düşünüyorum pid algoritmasını satır satır detaylı anlatabilseniz hem ben hem burdaki arkadaslar pid konusunda daha ayrıntılı bilgiye sahip oluruz.
Örnek olarak @taglı hocamın paylastıgı pid algoritmasını ele alabiliriz.

   void takeControlAction(void) {
    float effort, error, pTerm, iTerm, dTerm;

    switch (ctrlMode) {
        case CTRL_IDLE:
            return;
            break;
        case CTRL_PWM:
            setDuty(dutyRef);
            monitor.duty = dutyRef;
            break;
        case CTRL_POS_ABS:
            error = posRef - monitor.posAbs;
            if (fabs(error) < 0.03) {
                spdRef = 0;
            } 
            else {
                posInteg += (DT * error * posPid.ki);
                posInteg = limit(posInteg, -limits.spdMax, limits.spdMax);
                pTerm = error * posPid.kp;
                iTerm = posInteg;
                dTerm = error * posPid.kd / DT;
                spdRef = limit(pTerm + iTerm + dTerm, -limits.spdMax, limits.spdMax);
            }
            // No break here, it's not a bug.
        case CTRL_SPEED:
            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);
            monitor.duty = effort;
            break;
    }

}   
YENİLMEZ..

skara1214

@Zoroaster  hocam locked anti phase pwm ye baktım ama burada normal pwm dir kombinasyonundan ne farkı var? ne sağlıyor? dir e pwm uygulamanın avantajı nedir?
Herkes ölür ama herkes gerçekten yaşamaz

Zoroaster


Hangi pwm tekniginin kullanilacagi off peryodunda,  enduktansda depolanan enerjinin ya da generator enerjisinin kaynaga mi iade edilecegini yoksa moslar uzerinde isiya mi donusecegini belirliyor.

Bu ayni zamanda akimin dusme hizini da belirliyor. Moslar uzerinde sirkulasyon yaparsan akim cok az egimle azaliyor. Bu da sabit akim kaynagi uygulamalarinda daha ripilsiz akim anlamina geliyor. Yok enerjiyi kaynaga geri verirsen akim cok buyuk egimle dusme egilimine giriyor. Bu da akimin ripil degerinin yuksek olmasina neden oluyor fakat moslardaki kayip dusuyor.

Avantaj ya da dezavantaj bakis acisina gore cok degisken. Mesela ripil nedeniyle saclarin daha az isinmasini istiyorsan sign magnitude avantajli.
Step motorlarda oldugu gibi yuksek hiz icin yuksek frekansli akim gerektiginda locked anti phase avantaj sagliyor cunku akimin egimi daha dik.

Fakat tersine cok dusuk hizlarda bu kez sign magnitude avantajli hale geciyor. Step motor genis devir araliginda calisacaksa bu kez her ikisinin de secilebilecegi mixed decay sart oluyor.

Locked anti phase suruste akim olcumunde kullanilan analog devreler basitlesiyor daha siradan opamplar kullanilabiliyor.

Daha da fazla detaya girmeyeyim.

Seytan deliginden kacti.

skara1214

açıklama için teşekkür ederim hocam...
Herkes ölür ama herkes gerçekten yaşamaz

bulut_01

Pid algoritmasındaki terimler için yardımmm  :) enkoder bilgisini akım bilgilerini nerelere giriyoz bi el atın millet  :)
YENİLMEZ..

skara1214

kardeş şimdi öyle bir soru soruyorsunki insanların cevap verme şevki kalmıyor ;@Tagli hoca sana kullandığı algoritmayı yazmış sende bir zahmet internetten bak pid nedir?  p , i ve d neymiş ondan sonra buradaki bilgiler hayli hayli senin işini görür...
Herkes ölür ama herkes gerçekten yaşamaz

bulut_01

Üstad pid ögrendik ama kod karışık elimizdeki verileri kodda nerelere girecegim aslında her satırı anlatsaydı burdaki üstadlarımız benim gibi bilmeyenler daha iyi ögrenirdi.
YENİLMEZ..

Tagli

Ben halihazırda çalışan bir sistemimdeki kodu referans olması için verdim. Bu elbette ki senin sisteminde doğrudan kullanılabileceği anlamına gelmiyor. Sisteminde encoder değerinin nasıl okunacağını veya motorlara ne şekilde PWM verileceğini biz bilemeyiz. Bu zaten PID algoritması ile ilgili bir durum değil. Verdiğim kodda anlamadığın bir satır varsa açıklayabilirim, ancak diğer konulara tatmin edici bir cevap vermem mümkün değil.

Bu arada, PWM yöntemleri ve frenleme olayı benim de hep kafamı karıştırıyor. O yüzden bu konudaki sorularına cevap verecek bilgi ve deneyimim zaten yok. Üzerinde çalıştığım ve iyi kötü çalıştırmayı başardığım sistem bilgisayar bağlantılı bir BLDC sürücüsü. Zoroaster konu ile ilgili bazı anahtar kelimeler önermiş ama bunlar BLDC için de uygulanabilir mi bilmiyorum. Konuyla ilgili kaynak önerilerinize açığım.
Gökçe Tağlıoğlu