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