Accelstepper - Probleme in einer Funktion

Hi Leute,

ich bastle gerade an einem kleinen Projekt, bei dem ich mit einem Stepper verschiedene Positionen mit verschiedenen Geschwindigkeiten anfahren möchte. Dazu verwende ich die Accelstepper-Library.

Nun habe ich mir verschiedene Funktionen geschrieben.
Die Funktionen für das Finden der Homeposition, das "manuelle" Anfahren an des oberen Totpunkts, des unteren Totpunkts und der Startposition funktionieren einwandfrei.

Die Funktion für den Dauerbetrieb leider nicht. Dabei soll der Stepper den oberen Totpunkt mit einer übergebenen Geschwindigkeit anfahren, dort eine übergebene Zeit verweilen, dann eine gewisse Strecke mit der übergebenen Geschwindigkeit zurückfahren, dort auf eine langsamere Geschwindigkeit umstellen, den unteren Totopunkt anfahren und dann auf die Startposition zurückkehren.

Leider überspringt er das Verfahren auf den oberen Totpunkt und fährt nur bis zu dem Punkt, wo er die Geschwindigkeit wechseln sollte. Von dort aus dann zum unteren Totpunkt und dort verweilt er.

Ich füge den Code der geschriebenen Funktion ein und hoffe, dass ihr mir helfen könnt.

Schonmal vielen Dank für eure Hilfe.

void dauerbetrieb(int Bewegungsgeschwindigkeit, int Verweildauer) {
Serial.print("Dauerbetrieb mit Speed: ");Serial.print(Bewegungsgeschwindigkeit);Serial.print(" und Verweildauer: ");Serial.print(verweildauer);
  stepper.setMaxSpeed(Bewegungsgeschwindigkeit);
  while (stepper.isRunning())
  { stepper.moveTo(HomeBisOT);
    stepper.run();
  }
  delay(Verweildauer);  
  //Fahren auf 35 mm dann bremsen
  stepper.setMaxSpeed(Bewegungsgeschwindigkeit);
  stepper.setSpeed(Bewegungsgeschwindigkeit);
  while (stepper.isRunning())
  { stepper.moveTo(BeginnSteuerkurve);
    stepper.run();
  }
  stepper.setMaxSpeed(SpeedSteuerkurve);
  stepper.setSpeed(SpeedSteuerkurve);
  while (stepper.isRunning())
  { stepper.moveTo(HomeBisUT);
    stepper.run();
  }
  delay(100);
  while (stepper.isRunning())
  { stepper.moveTo(0);
    stepper.run();
  }
  Serial.println(" beendet!");
}

Wenn ich mir die Beispiele anschaue, dann hat Dein Code damit wenig zu tun. Woher stammt denn diese seltsame Abfolge von Befehlen? Wieso wird MaxSpeed ständig neu gesetzt, und wieso wird die Zielposition nicht angegeben, bevor der Motor losläuft?

So wie ich die Library verstehe, muss man mit moveTo() die gewünschte Position vorgeben und das run() ausführen. Da run() nur einen Step pro Aufruf generiert, habe ich run() in einer while-Schleife laufen lassen, bis der Stepper die gewünschte Position erreicht hat. mit maxSpeed() lege ich die maximale Geschwindigkeit fest, mit der der Stepper bei der jeweiligen Positionsänderung fahren darf. Ich möchte es so haben, dass er mit "Volldampf" nach oben fährt, dann die Richtung ändert und wieder mit "Volldampf" bis zu einer bestimmten Position runterfährt. Ab dieser Position soll er dann mit verminderter Geschwindigkeit bis ganz unten fahren. Daher habe ich die maxSpeed so oft aufgerufen. Wobei ich jetzt gerade sehe, dass ich mir das zweite maxSpeed(Bewegungsgeschwindigkeit) auch hätte sparen können...

Mein Problem ist auch eher, dass er die erste und die letzte while-Schleife scheinbar nicht ausführt.

... Manchmal fehlt einem nur einer, der die richtigen Fragen stellt... Mir fiel es wie die Schuppen von den Augen. Habe den Code etwas umgebaut und jetzt läuft es perfekt. Ich danke dir.

void dauerbetrieb(int Bewegungsgeschwindigkeit, int Verweildauer) {
Serial.print("Dauerbetrieb mit Speed: ");Serial.print(Bewegungsgeschwindigkeit);Serial.print(" und Verweildauer: ");Serial.print(Verweildauer);
  int Zeit = millis();
  stepper.setMaxSpeed(Bewegungsgeschwindigkeit);
  stepper.moveTo(HomeBisOT);
  while (stepper.isRunning())
  {stepper.run();}
  
  delay(Verweildauer);  
  
  //Fahren auf 35 mm dann bremsen
  stepper.moveTo(HomeBisUT);
  while (stepper.isRunning())
  {if (stepper.currentPosition() == BeginnSteuerkurve){stepper.setMaxSpeed(SpeedSteuerkurve);stepper.setAcceleration(BeschleunigungSteuerkurve);}
  stepper.run();}
  stepper.setAcceleration(NormaleBeschleunigung);

  delay(10);
  stepper.moveTo(0);
  while (stepper.isRunning())
  {stepper.run();}
}

Wenn das alles ist, dann reicht auch runToNewPosition(). Siehe Blocking Beispiel.

Dann rate mal, worin sich setSpeed() und setMaxSpeed() unterscheiden.

Nennt sich Mäeutik :slight_smile: