Steppermotoren eignen sich bekanntlich hervorragend für Positioineraufgaben. Das folgende Code-Snippet entlält eine Beispiel wie die Accelstepper Bibliothek zur Umsetzung des Vorhabens verwendet kann. Zum sanften Anlaufen und Stoppen des Motors, wurde wegen des erhöhten Rechenaufwands des Microcontrollers auf die Verwendung der Accelstepper-Methode setacceleration() verzichtet und anstattdessen mit An- und Abfahrtrampen realisiert.
void moveStepper(long steps, int speed, int accelerationSteps, int decelerationSteps) {
int currentSpeed = 0;
int speedIncrement = speed / accelerationSteps; // Geschwindigkeitsinkrement pro Schritt während der Anfahrrampe
int speedDecrement = speed / decelerationSteps; // Geschwindigkeitsabnahme pro Schritt während der Bremsrampe
unsigned long lastStepTime = millis(); // Zeitpunkt des letzten Schrittes
// Anfahrrampe
for (int i = 0; i < accelerationSteps; i++) {
currentSpeed += speedIncrement;
stepper.setSpeed(currentSpeed);
stepper.run();
while (millis() - lastStepTime < (1000 / currentSpeed)) {} // Warten bis die Schrittrate erreicht ist
lastStepTime = millis(); // Zeitpunkt des letzten Schrittes
}
// Hauptbewegung mit voller Geschwindigkeit
stepper.setSpeed(speed);
stepper.move(steps - (accelerationSteps + decelerationSteps)); // Schritte für die Hauptbewegung
stepper.run();
while (stepper.distanceToGo() != 0) {}
// Bremsrampe
for (int i = 0; i < decelerationSteps; i++) {
currentSpeed -= speedDecrement;
stepper.setSpeed(currentSpeed);
stepper.run();
while (millis() - lastStepTime < (1000 / currentSpeed)) {} // Warten bis die Schrittrate erreicht ist
lastStepTime = millis(); // Zeitpunkt des letzten Schrittes
}
stepper.stop();
}
Beschreibung des Codes
Die Funktion moveStepper()
nimmt die Anzahl der Schritte, die Geschwindigkeit, die Anzahl der Schritte für die Anfahrrampe und die Anzahl der Schritte für die Bremsrampe als Argumente entgegen. Sie führt den Steppermotor mit einer Anfahrrampe, einer Hauptbewegung mit voller Geschwindigkeit und einer Bremsrampe aus. Die Geschwindigkeit wird in Schritten angepasst, wobei die Anzahl der Schritte für die Anfahr- und Bremsrampe sowie die Geschwindigkeit als Argumente übergeben werden. In jedem Schritt wird gewartet, bis die gewünschte Schrittrate erreicht ist, bevor der nächste Schritt ausgeführt wird. Nach Abschluss der Bewegung wird der Steppermotor gestoppt.
Die Funktion werden zwei Argumente übergeben:
„steps“ (die Anzahl der Schritte, die der Steppermotor machen soll) und „speed“ (die Geschwindigkeit, mit der der Steppermotor laufen soll).
Innerhalb der Funktion werden mehrere Variablen deklariert:
„currentSpeed“ ist die aktuelle Geschwindigkeit des Steppermotors und beginnt bei 0.
„speedIncrement“ ist das Geschwindigkeitsinkrement pro Schritt während der Anfahrrampe. Es berechnet sich aus der maximalen Geschwindigkeit (maxSpeed), die Sie vorgeben, und der Anzahl der Schritte, die für die Anfahrrampe benötigt werden (accelerationSteps).
„speedDecrement“ ist die Geschwindigkeitsabnahme pro Schritt während der Bremsrampe. Es berechnet sich aus der maximalen Geschwindigkeit (maxSpeed) und der Anzahl der Schritte, die für die Bremsrampe benötigt werden (decelerationSteps).
„lastStepTime“ ist der Zeitpunkt des letzten Schrittes und wird anfangs mit „millis()“ initialisiert (die aktuelle Zeit seit dem Arduino gestartet wurde).
Die Funktion beginnt dann mit einer Anfahrrampe. Sie verwendet eine Schleife, die die Anzahl der Schritte für die Anfahrrampe durchläuft (accelerationSteps). In jedem Durchlauf wird die aktuelle Geschwindigkeit um „speedIncrement“ erhöht, die Geschwindigkeit des Steppermotors mithilfe der Methode „setSpeed()“ auf die aktuelle Geschwindigkeit gesetzt und der Steppermotor mit der Methode „run()“ gestartet. Danach wird eine while-Schleife verwendet, um sicherzustellen, dass der Steppermotor die korrekte Schrittrate einhält, indem sie prüft, ob die Zeit seit dem letzten Schritt (lastStepTime) kleiner als die Zeit, die für einen Schritt bei der gewünschten Geschwindigkeit (speed) benötigt wird. Wenn ja, wird die Schleife erneut ausgeführt und wartet, bis der Steppermotor bereit ist, den nächsten Schritt auszuführen. Wenn nicht, wird die aktuelle Zeit als „lastStepTime“ gespeichert und die Schleife geht zum nächsten Schritt.
Danach wird die Hauptbewegung mit voller Geschwindigkeit ausgeführt. Die Geschwindigkeit wird auf die gewünschte Geschwindigkeit (speed) gesetzt und der Steppermotor wird mit der Methode „move(steps – (accelerationSteps + decelerationSteps))“ um die Anzahl der Schritte für die Hauptbewegung bewegt. Dann wird der Steppermotor mit „run()“ gestartet und es wird eine while-Schleife verwendet, um zu prüfen, ob der Steppermotor noch Schritte zu machen hat, indem sie die Methode „distanceToGo()“ aufruft. Wenn ja, wird die Schleife erneut ausgeführt und wartet, bis der Steppermotor die Hauptbewegung abgeschlossen hat.
Nach der Hauptbewegung folgt eine Bremsrampe, die ähnlich der Anfahrrampe funktioniert, aber diesmal die Geschwindigkeit in jedem Schritt um „speedDecrement“ reduziert. Diese wird dann in ähnlicher Weise durchgeführt, indem die Geschwindigkeit in jeder Iteration des durchlaufen der Schleife um speedDecrement verringert wird. Die Bewegung des Steppermotors endet, wenn Distanz stepper.distanceToGo() = 0 ist.
Am Ende der Funktion wird der Schrittmotor mit stepper.stop() gestoppt und die Funktion endet.