Moin Allerseits!
Ich bin gerade auf der Suche nach einen Algorithmus zur Ansteuerung eines Nema17 Schrittmotors mit einen Poti. Für Lösungsvorschläge möchte ich mich herzlichst bei euch im Voraus bedanken!
Worum gehts?
Bei meinem Nema17 Schrittmotor kann man die Umdrehungsgeschwindigkeit per integer-Wert steuern. Nur leider ist das so, das man die Umdrehunggeschwindigkeit nicht linear ändern kann.
Was könnt ihr euch darunter genau vorstellen?
Sagen wir (als Beispiel), dass die maximale Umdrehungsgeschwindigkeit dem Wert 35 entspricht und eine sehr langsame (der Motor stopt quasi) 5000 enstpricht. Dann gibt es zwischen dem Max.-Wert und den Min.-Wert keinen linearen Zusammenhang. Die Umdrehungsgeschwindigkeit nimmt quasi logarithmisch, bez. exponential ab. Ab dem Wert 35 sehr schnell und zum Wert 5000 hin immer langsamer. Bis quasi gar nicht mehr.
Mein Vorhaben:
Ich möchte jetzt gerne die Motor-Umdrehungsgeschwindigkeit per Poti steuern können. Mein Poti liefert mir Werte zwischen 0 und 1021 (das sind geglättet Wert, daher nicht wie üblich von 0 bis 1023 = 10-Bit). Wenn das Poti den Wert 1021 liefert, dann möchte ich den Motor mit dem Wert 35 ansteuern. Und wenn das poti den Wert 0 liefert, dann den Motor halt mit dem Wert 5000 ansteuern.
Und jetzt die große Frage an euch: wie kann man elegant so eine Funktion programmieren!?!
Gruß
Algorithmus für Ansteuerung Schrittmotor mit Poti gesucht
-
- Beiträge: 4
- Registriert: Mo Mär 28, 2022 2:43 pm
- Xin
- nur zu Besuch hier
- Beiträge: 8862
- Registriert: Fr Jul 04, 2008 11:10 pm
- Wohnort: /home/xin
- Kontaktdaten:
Re: Algorithmus für Ansteuerung Schrittmotor mit Poti gesucht
Klingt für mich für den Einstieg erstmal nach einem Dreisatz.
vMotorMax = 5000;
vMotorMin = 35;
vPotiMax = 1021;
vMotor = vMotorMax - vPoti / vPotiMax * (vMotorMax-vMotorMin);
Jetzt würde der Motor über das Poti nicht linear die Umdrehungsgeschwindigkeit ändern. Um das Linear zu machen, müsste man halt die Funktion kennen, die da zu berücksichtigen wäre.
vMotorMax = 5000;
vMotorMin = 35;
vPotiMax = 1021;
vMotor = vMotorMax - vPoti / vPotiMax * (vMotorMax-vMotorMin);
Jetzt würde der Motor über das Poti nicht linear die Umdrehungsgeschwindigkeit ändern. Um das Linear zu machen, müsste man halt die Funktion kennen, die da zu berücksichtigen wäre.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.
Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.
Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.
- cloidnerux
- Moderator
- Beiträge: 3125
- Registriert: Fr Sep 26, 2008 4:37 pm
- Wohnort: Ram (Gibts wirklich)
Re: Algorithmus für Ansteuerung Schrittmotor mit Poti gesucht
Was du suchst ist eine Funktion, die einen Wert "x"(dein Poti), auf einen Wert "y" mappt(dein Servo).
Wer in Mathe mal aufgepasst hat versteht hier: f(x)=y
Du suchst also keinen "Algorithmus", sonderen eine Mathematische funktion.
Du hast erwartest einen exponentiellen, aber "invertierten" zusammenhang zwischen x und y
f(x)=a+e^(b*(c-x))
a, b und c sind freie Variablen. Du hast als Randbedingungen
f(0)=5000
f(1021)=35
Aus letzterer lässt sich ableiten: a=34, c=1021 da e^(b*(1021-x)) für x=1021 1 entspricht, daher ist a=35-1
Parameter b lässt sich über umstellung finden:
b=ln(5000-a)/c
Ergibt dann folgenden zusammenhang:
https://www.wolframalpha.com/input?i=pl ... +0+to+1021
Mit den gefundenen Parametern kann man das dann direkt in Code packen.
Wichtig für sowas ist eine gewisse Fehlerbereinigung. Die mathematische Funktion kennt weder die Anwendung noch die Limits. Sollte mal ein Eingabewert kleiner 0 oder größer 1021 eingegeben werden, so wird natürlich auch eine Ausgabe passieren. Damit aber kein Unfug passiert, solltest du mit entsprechenden if-stamemnts prüfen, ob Eingabe und Ausgabe-Wertebereiche sich im erlaubten Bereich befinden.
Wer in Mathe mal aufgepasst hat versteht hier: f(x)=y
Du suchst also keinen "Algorithmus", sonderen eine Mathematische funktion.
Du hast erwartest einen exponentiellen, aber "invertierten" zusammenhang zwischen x und y
f(x)=a+e^(b*(c-x))
a, b und c sind freie Variablen. Du hast als Randbedingungen
f(0)=5000
f(1021)=35
Aus letzterer lässt sich ableiten: a=34, c=1021 da e^(b*(1021-x)) für x=1021 1 entspricht, daher ist a=35-1
Parameter b lässt sich über umstellung finden:
b=ln(5000-a)/c
Ergibt dann folgenden zusammenhang:
https://www.wolframalpha.com/input?i=pl ... +0+to+1021
Mit den gefundenen Parametern kann man das dann direkt in Code packen.
Wichtig für sowas ist eine gewisse Fehlerbereinigung. Die mathematische Funktion kennt weder die Anwendung noch die Limits. Sollte mal ein Eingabewert kleiner 0 oder größer 1021 eingegeben werden, so wird natürlich auch eine Ausgabe passieren. Damit aber kein Unfug passiert, solltest du mit entsprechenden if-stamemnts prüfen, ob Eingabe und Ausgabe-Wertebereiche sich im erlaubten Bereich befinden.
Redundanz macht wiederholen unnötig.
quod erat expectandum
quod erat expectandum
-
- Beiträge: 4
- Registriert: Mo Mär 28, 2022 2:43 pm
Re: Algorithmus für Ansteuerung Schrittmotor mit Poti gesucht
Moin cloidnerux,
vielen lieben Dank für deine Hilfestellung, bez. ja eigentlich Lösung für mein Problem!
Genau so eine Funktion habe ich gesucht und diese habe ich auch schon ausprobiert. Mit deiner Berechnung klappt das Liniarieren und damit quasi konstnet Geschwindigkeitregelung des Nema-Stepper-Motors.
Wen die Werte immer kleiner werden, dann nimmt der Stepper auch an Umdrehunggeschwindigkeit von Wert zu Wert etwas zu. Aber das macht überhaupt nichts aus. Mein Problem war ja, dass die Umdrehungsgeschwindigkiet in einem sehr kleinen Wertebereich sprunghaft zugenommen hat. Und dem Problem wird mit der Funktion entgegengewirkt.
Nochmal herzlichen Dank an der Stelle für deine Anteilnahme und Hilfestellung!
Ich wäre so schnell nicht auf die Lösung gekommen.
Gruß
Sebastian
vielen lieben Dank für deine Hilfestellung, bez. ja eigentlich Lösung für mein Problem!
Genau so eine Funktion habe ich gesucht und diese habe ich auch schon ausprobiert. Mit deiner Berechnung klappt das Liniarieren und damit quasi konstnet Geschwindigkeitregelung des Nema-Stepper-Motors.
Wen die Werte immer kleiner werden, dann nimmt der Stepper auch an Umdrehunggeschwindigkeit von Wert zu Wert etwas zu. Aber das macht überhaupt nichts aus. Mein Problem war ja, dass die Umdrehungsgeschwindigkiet in einem sehr kleinen Wertebereich sprunghaft zugenommen hat. Und dem Problem wird mit der Funktion entgegengewirkt.
Nochmal herzlichen Dank an der Stelle für deine Anteilnahme und Hilfestellung!
Ich wäre so schnell nicht auf die Lösung gekommen.
Gruß
Sebastian