Hallo,

ich habe einen Modellbaumotor mit Regler, an dem ein Encoder (360 incremente) angeschlossen ist.
Das lesen der incremente klappt soweit, ich erfasse von beiden Spuren je steigende und fallende Flanke, so das ich je Umdrehung auf 1440 impulse komme.
Die werden entweder positiv oder negativ erfasst.

Ich habe eine einfache Routine erstellt, welche es ermöglicht eine bestimmte Strecke abzufahren. z.B. 400mm.
Wenn das erreicht ist, stoppt der Motor. Soweit klappt das.

Jetzt hätte ich gern, das wenn das Fahrzeug auf einer schrägen steht, oder von mir verschoben wird, die letzte Position versucht zu halten.

1. Geht das überhaupt mit einem gewöhnlichen Rc-Regler, oder ist der schon zu träge?
2. Ich bekomme keinen vernünftigen Code hin der das sauber schafft. Ich habe immer das Problem das sich der Regelkreis "aufschaukelt".
Das ist nur verständlich, da das Fahrzeug zum Reaktionszeitpunkt schon über das Ziel hinaus geschossen ist und dann immer heftiger gegensteuern muss um zum gewünschten Punkt zurückzukommen.

Wer kann mir da ein bisschen helfen?

Hier mal mein Haltemodus:
Ich habe es versucht halbwegs gut zu kommentieren.




Code:
if (holdmodus){
  full_cycl=15000;  //Zykluszeit verringern, um schneller zu reagieren
if (!proc){    //Wenn gerade KEIN PWM-Signal generiert wird
  
//Reaktion wenn das Fahrzeug sich außerhalb der Sollposition befindet
if (negativeDir){   //Wenn die Zielposition negativ ist
  if (position_k>holdpos-50)  switch_len--; 
  if (position_k<holdpos+50)  switch_len++;
  }
  else  //Wenn die Zielposition positiv istist
  {
  if (position_k>holdpos-50)  switch_len++; 
  if (position_k<holdpos+50)  switch_len--;
  }

 //Begrenzung der maximalen Geschwindigkeit beim regeln
//1500 ist neutral=kein Gas
 if (switch_len>1550) switch_len=1550;
 if (switch_len<1450) switch_len=1450;

  //Reaktion wenn das Fahrzeug sich innerhalb eines zulässigen Fensters um die Sollposition herum befindet
  if ((position_k>holdpos-50)  &&  (position_k<holdpos+50)) {   //wenn mitte erreicht

     //WEnn ich in diesem Bereich das gas ganz wegnehme (switch_len=MV) , schaukelt er sich nicht auf, 
     //aber auf einer Schrägen fährt er dann immer ein stück runter und dann wieder hoch :-(

     if (ticks_real==0){ //wenn eine bewegung stattfindet, dann gas langsam wegnehmen  
                              //-> ticks_real wird bei feststellen einer bewegung auf 0 gesetzt, sonst zählt es hoch 
                              //(Das hat nix mit den geberincrementen zu tun)
     if (switch_len>MV)  switch_len= switch_len-((abs(switch_len)-abs(MV))/2);  
     if (switch_len<MV)  switch_len= switch_len+((abs(switch_len)-abs(MV))/2); 
     }

  }
}
}
 
    
}