Pascal Schnabel Posted January 18, 2024 at 02:41 PM Posted January 18, 2024 at 02:41 PM Hallo zusammen, ich habe ein kleines Problem bei der Programmierung der Steuerung eines Schrittmotors. Zur Programmierung nutze ich C# mit dem Net Framework 4.8. Des Weiteren habe ich auf meinem Rechner den Brick Viewer 2.3.16 installiert. Folgendes soll mein Programm können: Beim Drücken von „Button1“ soll der Motor zunächst mit Geschwindigkeit v_SVS (Schnellvorschub) einen bestimmten Weg drehen und danach mit reduzierter Geschwindigkeit v_NV (Normalvorschub) weiterdrehen Beim Drücken von „Button2“ soll der Motor gestoppt werden und anschließend mit einer Geschwindigkeit v_SRZ (Schnellrückzug) einen bestimmten Weg in die entgegengesetzte Richtung drehen bis er stoppt Anbei findet Ihr ein Diagramm des skizzierten Geschwindigkeitsverlaufs Die Programmierung für „Button1“ funktioniert bislang. Allerdings macht die Programmierung für Button2 Probleme. Bei Klick auf „Button2“ habe ich folgendes programmiert: stepper1.Stop(); stepper1.SetMaxVelocity(398); System.Threading.Thread.Sleep(2); stepper1.SetSteps(10000/2); Leider funktioniert die Programmierung bislang nicht erwartet. Der Schrittmotor stoppt, aber dreht nicht die vorgegebenen Schritte (1000) zurück. Eine Abfrage von GetRemainingSteps() gibt 0 zurück. Nach vielem Probieren habe ich festgestellt, dass wenn ich die Ausführung des Programmcodes ausreichend lange pausiere (Thread.Sleep) die Programmierung funktioniert. Das heißt, dass der Motor gestoppt wird und im Anschluss einen gewissen Weg in die entgegengesetzte Richtung dreht. In meinem Fall soll der Übergang aus der Phase Normalvorschub in den Schnellrückzug ohne Unterbrechung erfolgen. Aus diesem Grund wollte ich fragen, wie ich die Programmierung abändern kann, um ein Pausieren der Anwendung zu vermeiden und einen schnellen Übergang vom Normalvorschub in den Schnellrückzug zu ermöglichen? Über eure Hilfe wäre ich dankbar. Geschwindigkeitsverlauf.svg Quote
Pascal Schnabel Posted January 19, 2024 at 04:47 PM Author Posted January 19, 2024 at 04:47 PM Hallo zusammen, nach längerem rumprobieren habe ich eine Lösung über einen kleinen Umweg gefunden. Diese möchte ich anhand meinem Pseudocode veranschaulichen. Beim Start von „Button1“ wird der Schnellvorschub mit ‚Set_Steps‘ und ‚stepper1.SetMaxVelocity()‘ aktiviert und ein Callback beim erreichen der Zielposition gesetzt (‚PositionReachedCallback‘). In der Callback-Funktion wird erneut die maximale Geschwindigkeit gesetzt und der Motor in Vorwärtsrotation gesetzt: private void btnStart_Click(object sender, RoutedEventArgs e) { stepper1.SetMaxVelocity(Convert.ToInt32(v_SVS / proSchritt)); stepper1.SetSteps(Convert.ToInt32(s_SVS / proSchritt)); stepper1.PositionReachedCallback += SVS_finished; //setzen des Callbacks } void SVS_finished(BrickSilentStepper sender, int position) //Callback { stepper1.PositionReachedCallback -= SVS_finished; //detach Callback stepper1.SetMaxVelocity(Convert.ToInt32(v_NV / proSchritt)); stepper1.DriveForward(); } Beim Drücken von Button2 (Cancel) wird erneut die maximale Geschwindigkeit gesetzt und dem Motor gesagt, dass er in die entgegengesetzte Rotationsrichtung drehen soll. Danach wird die Zielposition berechnet und in einer while Schleife überprüft, ob die Zielposition erreicht wurde. Im Anschluss stoppt der Motor. private void btnCancel_Click(object sender, RoutedEventArgs e) { int target = Convert.ToInt32(-s_SRZ / proSchritt); //target position in steps stepper1.SetMaxVelocity(Convert.ToInt32(v_SRZ / proSchritt)); stepper1.DriveBackward(); stepper1.SetCurrentPosition(0); int i = 0; while (stepper1.GetCurrentPosition() <= target && i < 1000000) { i++; } stepper1.Stop(); } Ich finde die Lösung zwar nicht schön, aber Sie ist erstmal funktionsfähig. Sollte jemand wissen, warum mein erster Ansatz nicht funktioniert würde ich mich über eine Rückmeldung freuen. 1 Quote
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.