Picproje Elektronik Sitesi

DERLEYİCİLER => CCS C => Konuyu başlatan: bulut_01 - 01 Mayıs 2017, 22:16:24

Başlık: PID konusunda yardım
Gönderen: bulut_01 - 01 Mayıs 2017, 22:16:24
iyi aksamlar picproje ailesi pid kontrollü motor sürücüsü yapacagım girdiğim referans hız değeri ile dönmesini istiyorum elimdeki dc motor enkoder kısmı var 100 pulslık enkoder okuyorum asagıdaki pid kodlarını nasıl kullanabilirim bana anlatırsanız sevinirim böylelikle pid konusundaki kafaya takılan soru işaretlerini burda gidermiş oluruz bu kodları nasıl kullanacagız ?

typedef struct
{
  double dState;      // Last position input
  double iState;      // Integrator state
  double iMax, iMin; 
  // Maximum and minimum allowable integrator state
  double iGain,    // integral gain
        pGain,    // proportional gain
          dGain;      // derivative gain
} SPid;
double UpdatePID(SPid * pid, double error, double position)
{
  double pTerm,
dTerm, iTerm;
  pTerm = pid->pGain * error;   
  // calculate the proportional term
// calculate the integral state with appropriate limiting
  pid->iState += error;
  if (pid->iState > pid->iMax) pid->iState = pid->iMax;
  else if (pid->iState
<
pid->iMin) pid->iState = pid->iMin;
  iTerm = pid->iGain * iState;  // calculate the integral term
  dTerm = pid->dGain * (position - pid->dState);
  pid->dState = position;
  return pTerm + iTerm - dTerm;
}
Başlık: Ynt: PID konusunda yardım
Gönderen: tunayk - 02 Mayıs 2017, 00:21:19
Merhaba Elindeki kod parçası sana doğrudan sürücüye vereceğin set değerini üretiyor.  Fonksiyona işlem için gerekli parametreleri verirsen, sana doğrudan yeni set değerini üretiyor.  Sistemin tepki durumuna göre uygun sıklıkta bu fonksiyonu, periyodik olarak (Ör. 100ms) çağırıp yeni değeri ürettirirsin.Bu işlem öncesinde, Aktüel Hız bilgisini hesaplaman gerekiyor(Enkoderden gelen puls/sn değerini kullanabilirsin mesela). Sonrasında Set Hız - Aktüel Hız verisinden de Hata yı hesaplayacaksın.

Fonksiyonun işini yapabilmesi için, SPid tipinde (Ör. xPid) bir değişkenin ve fonksiyonun ürettiği değeri tuttuğun başka bir değişkenin olacak. Böylece;

SetDegeri = UpdatePID(xPid, Hata, SetDegeri);

Şeklinde fonksiyonu çağıracak ve SetDeğerini sürücüyü kontrol için kullanacaksın. xPid değişkeni içindeki P,I,D Katsayılarına(Gain) ve Integral Sınırlarına  uygun değerler atamayı unutma.


Başlık: Ynt: PID konusunda yardım
Gönderen: bulut_01 - 02 Mayıs 2017, 06:59:46
@tunayk hocam öncelik tşk ederim ilginiz için o zmn enkoderden gelen pulslar/60 deyip dakikada kaç rpm döndüğünü hesaplıyacaz rpm bilgisi elimizde oldukdan sonra set hız ayarını ve diğer anlattıgınız değerleri kod üzerindn biraz daha detaylı anlatırsanız daha makbule geçecek bu PID konusuna baya yabancıyım anlamaya çalışıyorum simdiden saolun.
Başlık: Ynt: PID konusunda yardım
Gönderen: tunayk - 02 Mayıs 2017, 23:28:12
Merhaba Aslında kod içinde yeterli açıklama var zaten.   Nasıl kullanacağın kısmını da kod olarak da açıklamıştım. Geriye kalan sadece kendi algoritmanıza göre ilgili değişkenlerin içini doldurmak.  "xPid->iGain  = xx" gibi.

PID'nin ne olduğu konusunda biraz araştırma yaparsan oldukça detay var zaten. Çok fazla teoriye boğulmana gerek yok.  Kontrol ettiğin bir değişkenin var (Sürücüye verilen set değeri),  Ulaşmak istediğin hız değerin var (Proses Set Hız Değeri) ve Proses Aktüel değerin var (Aktüel Hız). PID nin görevi sistemin tepki hızı ile bağıntılı olarak sürücüye gidecek set değerini ayarlayarak Aktüel Hız Değerini, Set Hız değerinde tutmak. 
PID katsayıları (pGain,iGain, dGain ) senin sisteminin tepki hızına göre seçilecek katsayılar. Elinde sistemin matematik modeli varsa, bundan hareket ile katsayılar hesaplanabilir. Yoksa, deneme yanılma yoluyla kendin bulacaksın.  Keyfi olarak hepsine 0.5 verirsin, sistemin çalışmasına bakarsın. Yavaş kalıyorsa arttırırsın. Hızlı geldiyse azaltırsın.  Hatta ilk olarak tek tek değer verip diğer katsayıları 0 vererek sistemin tepkisini izlersen daha çok şey anlarsın.
En önemli konu sistemin hız/zaman grafiğini takip edeceğin bir aracın olmalı. Katsayılar ile oynarken, hızın zamana göre değişimini bir grafik ile takip edersen çok daha iyi anlarsın.  Değilse biraz zahmetli olabilir.
Başlık: Ynt: PID konusunda yardım
Gönderen: bulut_01 - 21 Mayıs 2017, 02:10:34
iyi günler picproje ailesi pid calısmalarıma devam ediyorum lakin asagıdaki pid algoritmasını tam anlamadım bana bunu anlatacak arkadaslara simdiden tşk ederim dc motor enkoder hız ve yön bilgisini elde ediyorum elde ettiğim değerleri asagıdaki algoritmaya nasıl yerlestireciğim yardımcı olursanız sevinirim.
Girdiğim referans değerinde dönmesini istiyorum motorun asagıdakı kodda referans hız bilgisi hangi satırdaki oluyor?

typedef struct

{
  double dState;                                     
 
  double iState;                                   
 
  double iMax, iMin; 
                                                     
 
   double iGain,                       
        pGain,                       
          dGain;                       

} SPid;
double UpdatePID(SPid * pid, double error, double position)

{
  double pTerm,iTerm,dTerm;
 
  pTerm = pid->pGain * error;                     
 

  pid->iState += error;                         
 
if (pid->iState > pid->iMax) pid->iState = pid->iMax;
 
    else if (pid->iState < pid->iMin) pid->iState = pid->iMin;

  iTerm = pid->iGain * iState;                   
  dTerm = pid->dGain * (position - pid->dState);
  pid->dState = position;
  return pTerm + iTerm - dTerm;
}
Başlık: Ynt: PID konusunda yardım
Gönderen: Tagli - 21 Mayıs 2017, 09:57:51
Kod epey garip yazılmış. Aradığın şey büyük ihtimalle position değişkeni, ama yine de emin olmak için error değişkeninin hesaplandığı yere bakmak lazım. Tavsiyem daha anlaşılır ve düzgün yazılmış bir örnek üzerinden gitmen.
Başlık: Ynt: PID konusunda yardım
Gönderen: bulut_01 - 21 Mayıs 2017, 10:10:51
@taglı hocam anlaşılır pid algoritması varmı bildiğiniz paylaşırsanız makbule geçer nettediki örnekler hep buna benzer bu konuda yardımcı olursanız tsk ederim.
Başlık: Ynt: PID konusunda yardım
Gönderen: skara1214 - 21 Mayıs 2017, 10:53:40
Hız kontrolü için sadece p yi kullanmak yeterli yalnız dikkat etmeniz gereken sample rate i olabildiğince yüksek tutmak
Başlık: Ynt: PID konusunda yardım
Gönderen: bulut_01 - 21 Mayıs 2017, 12:27:48
@skara hocam sadece hız kontrolü deil devir ve tork sabit olması lazım düşük devirlerde bile yüksek tork elde etmem lazım dısarda güc uygulandıgında referans devirin dışında hızlı dönmemeside lazım gerekirse frenlemede yapması lazım sistemin sabit devir ve torkda dönmesi için pid şart.
Başlık: Ynt: PID konusunda yardım
Gönderen: skara1214 - 21 Mayıs 2017, 13:10:04
Hocam istediğiniz ne olursa olsun istediğiniz devirde dönmesi degilmi? Eğer öyleyse p yeter i ve d ye gerek yok yalnız bir önceki mesajimdada belirttiğim gibi sample rateniz 1 khz gibi seçerseniz güzel sonuç alirsiniz( deneyip de performans almazsanız o zaman pid yi denerseniz illa i ve d yi eklemeye gerek yok)
Başlık: Ynt: PID konusunda yardım
Gönderen: Tagli - 21 Mayıs 2017, 13:21:16
Alıntı yapılan: skara1214 - 21 Mayıs 2017, 10:53:40
Hız kontrolü için sadece p yi kullanmak yeterli yalnız dikkat etmeniz gereken sample rate i olabildiğince yüksek tutmak
Konum kontrolü sadece P ile de olur ancak hız kontrolü için I (integratör) da gerekir. Yoksa sürekli rejim hatası kalır.

Aşağıda hız kontrolü için yazdığım koddan bir parça var. Buradaki DT, kontrolörün çalışma periyodu (benim sistemde 0.005 saniye idi, yani 200 Hz). Burada aslında D teriminin hesaplanması pratik olarak yanlış, çünkü bunu filtrelemeden kullanmamak gerekir. Ben zamanında üşendiğim için uğraşmamıştım. İnternette muhtemelen filtreli D terimi ile ilgili kod bulunabilir. Özellikle integratör için bir limit koymak önemli.
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);
Başlık: Ynt: PID konusunda yardım
Gönderen: skara1214 - 21 Mayıs 2017, 13:28:16
Gerekmez tagli hocam. Target ilerletme ile deneyin goreceksiniz
Başlık: Ynt: PID konusunda yardım
Gönderen: Tagli - 21 Mayıs 2017, 13:49:22
"Target ilerletme" nedir? Daha önce hiç duymadım.

DC motorlar bir miktar ihmal ve basitleştirme ile modellendiklerinde giriş gerilimi ve açısal hız arasındaki transfer fonksiyonu [latex=inline]\frac {\omega (s)}{V (s)} = \frac{K}{\tau s + 1}[/latex] biçiminde birinci mertebe bir sistem çıkar. Bu sistem kendi içinde bir integratör olmaması sebebiyle "Tip 0" sistem olarak anılır. Bu sistem eğer sadece P ile kapalı çevrim kontrol edilirse bir sürekli rejim hatası kalır. Bu sonuca hata sinyali s domain'de hesaplanarak ve bulunan değere son değer teoremi uygulanarak da ulaşılabilir. Sürekli rejim hatası, yüksek bir Kp değeri verilerek azaltılabilir ancak tam sıfırlanamaz. Yüksek Kp değeri ise sistemde salınıma sebep olabilir, hatta sistemi kararsızlığa da götürebilir.

İşin teorisi böyle.

Pratikte konum kontrolünde dahi integratör gerekebilir.
Başlık: Ynt: PID konusunda yardım
Gönderen: Zoroaster - 21 Mayıs 2017, 14:10:45
Sistemlerin derecesine gore hata durumlari (http://www.cncdesigner.com/wordpress/?p=4508)
Başlık: Ynt: PID konusunda yardım
Gönderen: skara1214 - 21 Mayıs 2017, 14:15:35
Pozisyonlamayi nasıl yapıyorsunuz? TrPezoidal move u nasıl hesapliyorsunuz mesela?
Başlık: Ynt: PID konusunda yardım
Gönderen: skara1214 - 21 Mayıs 2017, 14:18:46
İşin uzmanı teşrif etmis benim sözlerim burada son bulur :)
Başlık: Ynt: PID konusunda yardım
Gönderen: Zoroaster - 21 Mayıs 2017, 14:21:38
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.
Başlık: Ynt: PID konusunda yardım
Gönderen: skara1214 - 21 Mayıs 2017, 14:24:13
Tagli hocam sorduğum sorunun cevabını bekliyorum sizden
Başlık: Ynt: PID konusunda yardım
Gönderen: Tagli - 21 Mayıs 2017, 14:46:50
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.
Başlık: Ynt: PID konusunda yardım
Gönderen: bulut_01 - 21 Mayıs 2017, 14:58:10
@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?
Başlık: Ynt: PID konusunda yardım
Gönderen: bulut_01 - 22 Mayıs 2017, 12:02:54
Arkadaslar bi el atsanızda şu pid olayını bir çözsem  :)
Başlık: Ynt: PID konusunda yardım
Gönderen: Zoroaster - 22 Mayıs 2017, 12:19:42
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.

Başlık: Ynt: PID konusunda yardım
Gönderen: bulut_01 - 22 Mayıs 2017, 13:23:11
@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;
    }

}   
Başlık: Ynt: PID konusunda yardım
Gönderen: skara1214 - 22 Mayıs 2017, 13:41:06
@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?
Başlık: Ynt: PID konusunda yardım
Gönderen: Zoroaster - 22 Mayıs 2017, 14:04:33

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.

Başlık: Ynt: PID konusunda yardım
Gönderen: skara1214 - 22 Mayıs 2017, 14:10:47
açıklama için teşekkür ederim hocam...
Başlık: Ynt: PID konusunda yardım
Gönderen: bulut_01 - 22 Mayıs 2017, 18:23:04
Pid algoritmasındaki terimler için yardımmm  :) enkoder bilgisini akım bilgilerini nerelere giriyoz bi el atın millet  :)
Başlık: Ynt: PID konusunda yardım
Gönderen: skara1214 - 22 Mayıs 2017, 21:04:46
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...
Başlık: Ynt: PID konusunda yardım
Gönderen: bulut_01 - 22 Mayıs 2017, 22:56:14
Ü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.
Başlık: Ynt: PID konusunda yardım
Gönderen: Tagli - 22 Mayıs 2017, 23:06:20
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.
Başlık: Ynt: PID konusunda yardım
Gönderen: bulut_01 - 10 Haziran 2017, 17:02:43
@taglı hocam verdiğiniz kodu kullanmak istiyorum anlamadıgım noktalar var örnek ben encoder aldıgım bilgiyi rpm cinsine ceviriyorum verdiğiniz kodda bu encoder bilgisini nereye girecegim rpm cinsinden girersem olur mu ayrıca kodda case swich bölümünde mode pwm ve abs bölümleri tam olarak neyi ifade ediyor yardımlarınız olursa pid inş halledecegim.

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;
Başlık: Ynt: PID konusunda yardım
Gönderen: bulut_01 - 10 Haziran 2017, 17:10:21
ayrıca case swich kullanmasak ne olur ?