Geschwindigkeitssteuerung eines Aktuators

Eine gutes neues Jahr Euch allen, ich hoffe Ihr seit gut rüber gerutscht.

Ich möchte an dieser Stelle eine eher allgemeine Diskusion starten. Es geht um einen Aktuator und dessen Steuerung.
Um sich einen Überblick zu verschaffen ist dieser Thread hier http://forum.arduino.cc/index.php?topic=207303.msg1526195#msg1526195 von Vorteil. Hier ist auch der gesammte Code zu finden.

Da aber diese Thematik hier nichts mit dem ursprünglichen Thread über Funktionen zu tun hat, und nicht gerade die Übersichtlichkeit fördert packe ich dieses Thema in einen neues Topic.

Ich habe mir Gedanken gemacht, wie man einen trägen Aktuator geschwindigkeitsabhängig steuern könnte. (Das Ding läuft nach) Laufen tut er.

Der “Error” beschreibt ganz allgmein den Abstand zwischen X_Soll und X_ist.

Ich habe verschiedene Ansätze ausprobiert und wollte man in die Runde fragen, was Eure Ideen so wären und was Ihr von meinen haltet. Der erste und sehr einfache Ansatz war:

if (error < 50 && error > 40)  
  {Speed=x1}
  
  if (error <= 40 && error > 30)  
  {Speed=x2}
  
  if (error <= 30 && error > 20)  
  {Speed=x2}
  
  usw...

Finde ich aber nicht sehr elegant, da die Spünge schlagartig auftreten. (Schlecht für den Aktuator) Und das einstellen ist mühsam.

Zweite Idee war, die Geschwindigkeit abhängig vom “Error” zu machen. Also je kleiner der Error, desto kleiner wird die Geschwindigkeit.

speed_m = (error *10)+50; //+50: braucht ja immer ne minimal Geschw. sond bleibt er vor dem Ziel stehen.

Wobei ich festellen muss, dass das auch nicht so brauchbar ist, da man eigentlich nur durch rumprobieren ein halbwegs passables Verhalten erreicht.

Dritte und letzte Idee, bitte das angehängte Bild betrachten:

Man macht es über eine Rampe. Also wirklich die Besschleunigung a Vorgeben. Dann sind natürlich verschiedene Randbedingungen und Fälle zu unterscheiden. Und wie ich eben auch feststellen muss, gar nicht so einfach zu Programieren…
Der erste Fall (pink) ist, das Pos 1 und 2 so nahe zusammen liegen, dass die Max.-Geschwindigkeit nicht erreicht wird. Fall 2 (grün)
wird sie erreicht. Was mir jetzt echt ein wenig Kopfzerbechen bereitet, wie der Code für so eine Rampe auszusehen hat.
Das Ding muss ja Zeitabhängig die Geschindigkeit erhöhen, ohne dealy()… Nach etwas 10 Seiten Gekritzel, Berechung und Codefetzten fehlt mir immer noch ein geeigneter Ansatz.

Nachtrag: Wenn ich nicht auf dem Holzweg bin, dann müßte eine Schleife ja nur folgendes machen:

Anfahren:
aktuelle_Geschwindigkeit = a(Rampe) * (Delta X)
mit Delta X = X_aktuelle Position - X_start

Bis Fall PI oder PII

Das ganze Rückwärts…

Die Zeit bräuchte ich ja dann gar nicht, weil wenn die ins Spiel kommt, muss man Integrieren.

Oder ist es einfach quatsch und ich sollte ganz nen anderen Ansatz wählen…
Vielen Dank schon mal!
Gruß Michl

Du bist schon auf dem richtigen Weg :slight_smile: Aber du musst einen komplexen Regler nicht per Hand schreiben. Es gibt einen fertigen PID Regler für den Arduino:
http://playground.arduino.cc/Code/PIDLibrary

Das ganze ist nur eine Frage der Paramter Auswahl für den P, I und D-Anteil, was natürlich nicht ganz trivial ist und von der Regelstrecke abhängt. Aber dafür gibt es fertige Verfahren. Wenn man den D-Anteil größer macht reagiert der Regler schneller (siehe Sprungantwort eines D-Glieds). Aber zu viel und der Regler schwingt glaube ich eher.

Siehe auch hier:

http://www.rn-wissen.de/index.php/Regelungstechnik

Das sieht da furchtbar kompliziert aus, aber erstens kann man das auch ohne Integrale und sonstiges rechnen und zweitens ist es in Software ganz, ganz wenig rechnen (einen Term pro Glied):

Für das Tuning gibt es zwei fertige Verfahren:

http://www.rn-wissen.de/index.php/Regelungstechnik#Dimensionierung_des_Reglers
Die PID Library hat auch eine Auto Tuning Funktionalität, aber damit kenne ich nicht aus

Du schreibst “läuft nach” - handelt es sich um ein mechanisches Stellglied? Das könnte man doch (im Gegensatz zu einer Heizung ohne Kühlkomponente) mit einem gegenläufigen Kommando stoppen (bremsen), statt es “ausrödeln” zu lassen. Quasi “Schubumkehr”, oder?

Vielen Dank für die ausführliche Antwort, sorry, dass ich erst jetzt antworte, ich war beruflich unterwegs.

@qualidat:
Das könnte man machen, aber der Aktuator ist ziemlich groß und stopt aufgrund der Trägheit von Getriebe und Mechanik nicht sofort. Ein Gegen-Impuls würde die Mechanik und auch die Kohlen des Motors stark in Mitleidenschaft ziehen, daher sollte man das unbedingt vermeiden.

@Serenifly:
Ja, die Idee mit PID Reglern hatte ich auch zuerst. Aber ich glaube, das es so aufwändig gar nicht sein muß. Ich bin dabei den Code von meiner Zeichung gerade umzusetzten. Das sind letztlich nur ein paar Zeilen. Der Teil mit dem auslaufen klappt auch schon, nur ein Problem habe ich noch.
Mein Delta X = X_aktuelle Position - X_start
x_start ist ein Problem, wo ich mir noch nicht ganz sicher bin, wie ich das löse. Was problematisch ist, wenn während der Akt noch anfährt ein Signal "drehe in die andere Richtung" bekommen sollte. Dann muss er erst auslaufen und dann umkehren. Das führt zu komischem verhalten.... Ich halte Dich auf dem laufenden...