pid motor kontrol

Başlatan bulut_01, 16 Ocak 2018, 22:46:46

bulut_01

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;

}}
YENİLMEZ..

foseydon

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.

ladybird

Hocam hangi mikro denetleyiciyi kullanıyorsunuz ?
Motor sürücü katınız nasıl devre şeması verebilir misiniz?
"Bana ait sözcükler olsun isterdim. Ama kullandığım bu sözcükler, bilmiyorum kaç bilinçte sürüklendi." Jean Paul Sartre

bulut_01

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 ?
YENİLMEZ..

bulut_01

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ü

YENİLMEZ..

ladybird

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.
"Bana ait sözcükler olsun isterdim. Ama kullandığım bu sözcükler, bilmiyorum kaç bilinçte sürüklendi." Jean Paul Sartre

ladybird

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;
    }
};
"Bana ait sözcükler olsun isterdim. Ama kullandığım bu sözcükler, bilmiyorum kaç bilinçte sürüklendi." Jean Paul Sartre

bulut_01

inceledim kodunu da benimkiyle farkı yok gibi mantık aynı algoritmada.
YENİLMEZ..

Firzen

#38
@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
Kararsız...

ladybird

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.
"Bana ait sözcükler olsun isterdim. Ama kullandığım bu sözcükler, bilmiyorum kaç bilinçte sürüklendi." Jean Paul Sartre

Firzen

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.
Kararsız...

ladybird

Cahillik hocam bizde onlar yok.   :D
"Bana ait sözcükler olsun isterdim. Ama kullandığım bu sözcükler, bilmiyorum kaç bilinçte sürüklendi." Jean Paul Sartre