Hallo, ich bin es mal wieder...
Nachdem ich hier im Wiki auf der Seite Sensorarten auf den AS5040 Winkelsensor gestoßen bin, wollte ich mir damit ein großes Servo selber bauen.
Also habe ich mir einen RB-35 Getriebemotor geschnappt und diesen über zwei Zahnräder mit der Welle (mit Magnet) des AS5040 verbunden.
Nun kann ich schon Werte des Sensors auf dem PC ausgeben. (Das war ja mal ne Arbeit den So16 per hand zu löten )

Jetzt folgt jedoch erst der schwierige Teil mit der Regelung !

Dazu habe ich mich im Wiki auf der Seite Regelungstechnik belesen und habe danach erstmal mit einem PD-Regler angefangen. Dieser funktioniert jetzt auch schon ganz ok (ohne Schwingung um die Nulllage) doch überschreitet mein Motor die Nulllage dank Massenträgheit (glaube ich) noch um etwa 10° und bleibt dann da wegen nur geringer PWM stehen.

Dann habe ich den PID-Regler ausprobiert und musste feststellen, dass dieser zwar versucht, die Nullposition anzusteuern, jedoch endlos um diese schwingt.

Meine Frage ist nun, wie ich es schaffen kann, dass mein PID-Regler doch funktioniert (also die Massenträgheit berücksichtigt) ?
Außerdem : wie macht ihr das mit der Regelung, wenn ihr große Motoren benutzt ?

Ich hoffe ihr Profis könnt mir helfen

Hier ist mein Code (Arduino) (nur der Teil mit dem Regler):
Code:
int pwm_pin = 3;  //Motor pwm
int in_1 = 4;   //Motor Richtung
int in_2 = 5;   //Motor Richtung
String msg;
char a;
int soll_wert;
int ist_wert;
int e;
float esum;
int ealt;
float y;
float r;
float s;
int yaus;
int y_max = 255;
int y_min = 0;
int s_max = 50;
float Kp = 1.0;  //P
float Ki = 0.5;  //I0,001
float Kd = 1.05;  //D0,01
float Ta = 1.0;  //Abtast
int esum_max = 150;


void regler()  {
  
  if(soll_wert >= 10)  {
    if(soll_wert <= 350)  {
      e = soll_wert - ist_wert;
      e = abs(e);            
      esum = esum + e;
      s = float(esum) * Ta;
      s = s * Ki;
      if(int(s) > s_max)  {
        s = float(s_max);
      }
      r = float(e) - float(ealt);
      r = r / Ta;
      r = r * Kd;
      if(esum > esum_max)  {
        esum = esum_max;
      }
      
      y = Kp * float(e);
      y = y + s;
      y = y + r;
      
      yaus = int(y);
      Serial.println(y);
      ealt = e;
      
      if(yaus > y_max)  {
        yaus = y_max;
      }
      
      if(yaus < y_min)  {
        yaus = y_min;
      }
      
      if(ist_wert > soll_wert)  {
        digitalWrite(in_1, HIGH);  
        digitalWrite(in_2, LOW);
        analogWrite(pwm_pin, yaus);
      }
      
      if(ist_wert < soll_wert)  {
        digitalWrite(in_1, LOW);  
        digitalWrite(in_2, HIGH);
        analogWrite(pwm_pin, yaus);
      }
      
      if(ist_wert == soll_wert)  {
        digitalWrite(in_1, LOW);  
        digitalWrite(in_2, LOW);
        analogWrite(pwm_pin, 0);
        esum = 0;
      }
      
    }
  }
  
  
  
}