Schrittmotor mit Positions Feedback

Moin,

gibt es eine Library, die Schrittmotoren ansteuern kann unter Berücksichtigung eines Positionsfeedbacks?
Kann Accelstepper das vielleicht sogar?

Ich habe einen Schrittmotor auf dessen Achse ein magnetischer Positionssensor innerhalb von 360° die absolute Positions zurückmeldet.
Dadurch wird es möglich, dass der Schrittmotor ohne Referenzfahrt sofort absolute Positionen anfahren kann.
Da dies möglichst schnell passieren soll ist eine Anfahr- und Bremsrampe sinnvoll.

Leider hab ich sowas bisher noch nicht gefunden. (Vielleicht auch falsch gesucht?!)

Lieben Gruß,
Chris

themanfrommoon:
Ich habe einen Schrittmotor auf dessen Achse ein magnetuscher Positionssensor innerhalb von 360° die absolute Positions zurückmeldet.

ein Link auf das Datenblatt könnte den Helfern helfen.

Moin,

Wozu braucht man ein Datenblatt?
Es geht doch nur um die Frage, ob es eine Stepper Bibliothek mit Berücksichtigung einer Ist-Position als Absolut-Encoder gibt.

Der Schrittmotor wird wie jeder Schrittmotor mit STEP und DIR angesteuert.

Der Positionssensor stellt irgendeinen Wertebereich zur Verfügung die man mit dem MAP Befehl auf jeden beliebigen Wertebereich für die Library modifizieren kann.

Nun gut, für diejenigen die ein Datenblatt brauchen, ich bin gerade mobil unterwegs und kann auf die Schnelle nicht die Datenblätter verlinken.

Ich habe die Teile jetzt auch nicht hier, aber aus dem Kopf sind es:
Der Motor ist einer mit 0,8° pro Schritt.
Der Treiber ist ein DRV8825
Der Sensor ein AS5600

Lieben Gruß,
Chris

Für die Stepper-Position braucht man keine Bibliothek, es reicht doch die Steps mitzuzählen, die man ausgegeben hat - die meisten Bibliotheken machen das sogar und bieten eine Position Eigenschaft an. Wenn ein Schritt 0,8° weit ist, dann hat sich der Stepper nach 10 Schritten um 8° bewegt. Für andere Winkel/Positionen muß man die Schrittzahl entsprechend abändern.

themanfrommoon:
Ich habe einen Schrittmotor auf dessen Achse ein magnetischer Positionssensor innerhalb von 360° die absolute Positions zurückmeldet.
Dadurch wird es möglich, dass der Schrittmotor ohne Referenzfahrt sofort absolute Positionen anfahren kann.
Da dies möglichst schnell passieren soll ist eine Anfahr- und Bremsrampe sinnvoll.

Hallo Chris,
eine solche Lib wird es nicht geben, da das Merkmal eines Steppers ja gerade ist, dass man ihn ohne Rückmeldung definiert verfahren kann.
Was Du mit deinem Positionsmelder natürlich machen kannst, ist die Referenzfahrt zu ersetzten. Vor der Bewegung liest Du den aus, berechnest entsprechend deinen Referenzpunkt, und ab da geht es ganz normal weiter und die anzufahrende absolute Position wird über die ausgegebenen Steps bestimmt. Die Lib muss von deiner 'virtuellen Referenzfahrt' gar nichts wissen.

Moin,

leider reicht dass nicht, denn ihr habt einen entscheidenen Punkt noch nicht gewusst (ich betreibe gerade rubberduck debugging. Das was ich später antreiben will kann naturgemäß leider verklemmen, und dann ist die Position weg, ohne das das Programm dies merkt. Daher brauche ich zwingend eine IST-Positions-Rückmeldung.

Wenn das Programm nun feststellt, dass SOLL und IST nach einer gewissen Zeit immernoch eine Mindestdifferenz hat, kann eine andere Prozedur in Gang gebracht werden. Z.B. Drehrichtung kurzzeitig umdrehen oder losrütteln. Wenn nun nach dem 3. Losrüttelversuch das immer noch nicht geklappt hat kann eine Fehlermeldung ausgegeben werden.

Lieben Gruß,
Chris

themanfrommoon:
Wozu braucht man ein Datenblatt?
Es geht doch nur um die Frage, ob es eine Stepper Bibliothek mit Berücksichtigung einer Ist-Position als Absolut-Encoder gibt.

meine Annahme ist, dass es sowas nicht fertig gibt - und wenn doch, es dann zu deinem Encoder passen muss. Ohne dass man deinen Encoder kennt, wird man nichts finden können.

themanfrommoon:
Moin,

gibt es eine Library, die Schrittmotoren ansteuern kann unter Berücksichtigung eines Positionsfeedbacks?
Kann Accelstepper das vielleicht sogar?

Ich habe einen Schrittmotor auf dessen Achse ein magnetischer Positionssensor innerhalb von 360° die absolute Positions zurückmeldet.
Dadurch wird es möglich, dass der Schrittmotor ohne Referenzfahrt sofort absolute Positionen anfahren kann.
Da dies möglichst schnell passieren soll ist eine Anfahr- und Bremsrampe sinnvoll.

themanfrommoon:
Moin,

leider reicht dass nicht, denn ihr habt einen entscheidenen Punkt noch nicht gewusst (ich betreibe gerade rubberduck debugging. Das was ich später antreiben will kann naturgemäß leider verklemmen, und dann ist die Position weg, ohne das das Programm dies merkt. Daher brauche ich zwingend eine IST-Positions-Rückmeldung.

Wenn das Programm nun feststellt, dass SOLL und IST nach einer gewissen Zeit immernoch eine Mindestdifferenz hat, kann eine andere Prozedur in Gang gebracht werden. Z.B. Drehrichtung kurzzeitig umdrehen oder losrütteln. Wenn nun nach dem 3. Losrüttelversuch das immer noch nicht geklappt hat kann eine Fehlermeldung ausgegeben werden.

  1. Der Sensor gibt dir die Position innerhalb einer Umdrehung an. Also damit die absolute Position bekannt ist muß der Motor eine weiteren Sensor oder einen mechanischen Endpunkt haben um zu erkennen wo er ist. Kann sich der Motor nur um max 360° Drehen?
  2. Mi ist kein 0,8° Schrittmotor bekannt. Es sind entweder 1,8° oder 0,9° oder ein Getriebe das ein krummes Übersetzungsverhältnis hat und darum keine so geraden Schrittwinkel herauskommen.
  3. Du kannst natürlich den Motor einen Schritt machen lassen und dann den Sensor auslesen und die Übereistimmung berechenen. Bedenke aber die Winkelungenauigkeiten durch das Microstepping und durch das krumme Verhältnis zwischen Schrittmotorwinkel pro Schritt und Sensorauflösung. Das mußt Du aber programmieren.

Erklähr uns mal das gesamte Projekt und nicht tröpfchenweise. Ich habe den Verdacht daß Du einen groben Denkfehler in Deiner Planung hast und das nicht funktionieren wird.

Grüße Uwe

noiasca:
meine Annahme ist, dass es sowas nicht fertig gibt - und wenn doch, es dann zu deinem Encoder passen muss. Ohne dass man deinen Encoder kennt, wird man nichts finden können.

Den Encoder hat er ja genannt: AS5600 ein magnetischer 12 bit Winkelsensor.

Grüße Uwe

uwefed:
Den Encoder hat er ja genannt: AS5600 ein magnetischer 12 bit Winkelsensor.

richtig - nachdem er nachgefragt hat warum ich das wissen wollte.
Und diese Frage wollte ich nicht unbeantwortet lassen (er hat es als Frage formuliert!).

Hmm, ich gebe zu, wohl nicht alle Fragestellungen bedacht zu haben die bei dem Thema aufkommen könnten

Der Schrittmotor ist ein völlig normaler Standard Schrittmotor mit der üblichen Schrittzahl. Dann sind es wohl 1,8° anstatt der angegebenen 0,8°. (Allerdings spielt das doch für die Idee oder die Bibliothek erstam gar keine Rolle).

Angetrieben wird ein Sortierrad, bei dem die absolute Position innerhalb 360° interessant ist. Es müssen also nur 360° unterschieden werden können. Bedeutet, dass z.B. 40° und 400° oder 70° und 430° für das Programm keinen Unterschied macht.
Es interessieren nur Positionen von quasi 0° bis 359,9°.

Wenn das Sortierrad durch das Fördergut mal blockiert werden sollte und das Programm feststell das der IST Wert nicht mehr den SOLL Wert erreichen kann soll halt was anderes passieren, aber das ist erstmal Nebensache. Die Genauigkeitsanforderungen sind nicht besonders hoch, sagen wir Größenordnung 2-3°.

Die Schwierigkeit, die ich sehe, ist die Beschleunigungs und Bremsrampe im Zusammenspiel mit einem quasi gleichzeitigen IST Positionsvergleich

Lieben Gruß,
Chris

Dieser Abgleich der Positionierung eines Schrittmotors mit dem Drehgeber kann und muss doch keine Bibliothek erfüllen, das ist Aufgabe des Programmierers, diesen seltenen Anwendungsfall im Sketch umzusetzen.

Abseits davon stellt sich die Frage, warum du überhaupt einen Schrittmotor verwenden willst, wenn die tatsächliche Position ausschließlich über den Drehgeber ermittelt werden kann. Dann tut es doch auch ein DC-Getriebemotor?

Weil die Hardware fertig ist und ich auch mal was mit Steppern machen wollte.
Tätsächlich ist das mein erstes Projekt mit Aktorik.
Der Sortiervorgang erfolgt zweistufig.
In der ersten Stufe ist ein DC Getriebemotor mis AS5600 in der zweiten Stufe ein Schrittmotor mis AS5600.

Also habe ich beide Fälle und kann dabei viel neues lernen darum geht es ja auch

themanfrommoon:
Weil die Hardware fertig ist und ich auch mal was mit Steppern machen wollte.

Insbesondere das hättest du gleich erwähnen und mit einem hochgeladenen Bild dokumentieren können. Hier freuen sich sämtliche Helfer über praxisnahe, bilddokumentierte Projekte.

Die weitere Herangehensweise mit dieser Hardware unterscheidet sich ja auch nicht von der mit einem von mir erwähnten DC-Motor: Motor in die entsprechende Richtung drehen lassen, bis die gewünschte Position erreicht ist. Währenddessen eine Abfrage machen, ob überhaupt eine Winkeländerung auftritt, während der Motor angesteuert wird. Damit erkennst du das Blockieren und verzweigst entsprechend in deine Rüttelroutine, woraufhin du wieder den Motor entsprechend der gewünschten Position drehen lässt.

Ob das nun das Takt- und Richtungssignal eines Schrittmotors oder die Ansteuerung einer H-Brücke für den DC-Motor ist, ist dabei nebensächlich.

Wenn ich das richtig sehe, musst Du - je nach aktuellem Sortiervorgang - einfach bestimmte Positionen anfahren. Das kannst Du doch ganz normal mit einer Stepperlib deiner Wahl machen. Wenn die Lib sagt 'angekommen' schaust Du mit deinem Positionssensor nach, ob das auch stimmt. Wenn ja ist alles gut.
Wenn nicht musst Du in eine Fehlerroutine springen. Aufgrund der Sensorinfo kannst Du deinen Referenzpunkt neu einstellen, und dann wieder dorthin fahren. Wenn's jetzt immer noch nicht stimmt, gibtst Du einen Fehler aus 'Verklemmt'.
Während die Stepperlib den Motor bewegt, brauchst Du doch gar keinen Soll/Ist Vergleich. Der reicht am Zielpunkt. Das Verklemmen sollte ja wohl nicht der Standard-Fall, sondern eher die Ausnahme sein.

Für einen solchen Einsatzbereich würde ich keinen Stepper nehmen. Da du sowieso die Position via Encoder kontrollieren musst, ist ein DC-Motor deutlich besser geeignet. Mit PWM-Ansteuerung kann man ihn genau dosiert fahren lassen.

So mussst du nur einen Start-Stop generieren anhand der Encoderwerte und das ganze Zeitlich überwachen. Wenn dein Encoderwert in 0,xx sec nicht um xy geändert hat, blockiert das System. Dann drehst vor und zurück bis es frei wird und dein Encoderpositionswert erreicht.

Stepper sind auch vom Drehmomentverlauf ungeeignet für sowas. Blockiert dir etwas, fehlt dir einfach das Drehmoment. Oder du musst stark überdimensionieren. Ich habe einen Kreuztisch von Isel, mit DC-Achsen mit Encoder die ich auf 0,03mm genau positionieren kann. Gleichzeitig aber mit mehr als 1m/sec schnell fahren kann. Die 70cm also in deutlich unter 1sec und trotzdem 3/100 genau positionieren. Ist zwar kein Arduino, aber soll zeigen was mit guter Programmierung alles machbar ist.

Stepper und Encoder sind eigentlich zwei Dinge die nicht zusammen passen. Der Stepper und seine Nachteile wurde gerade dafür entwickelt OHNE Encoder auszukommen.

MicroBahner:
Wenn ich das richtig sehe, musst Du - je nach aktuellem Sortiervorgang - einfach bestimmte Positionen anfahren. Das kannst Du doch ganz normal mit einer Stepperlib deiner Wahl machen. Wenn die Lib sagt 'angekommen' schaust Du mit deinem Positionssensor nach, ob das auch stimmt. Wenn ja ist alles gut. ...

Das sehe ich auch so.
Motor ansteuern und bei erreichen der Position mittels Sensor die korrekte Position kontrollieren.
Auch teile ich die Meinung da der Schrittmotor die falsche Wahl ist.
Grüße Uwe

Hi

Man kann ja auch während des Verfahren bereits die Position auslesen - Diese sollte halt 'ungefähr' zur aktuellen Soll-Position passen.
Verhaspel Dich nicht darin, daß SOLL und IST unterschiedlich sind - Du musst hier eine Art Hysterese ein'bauen', sonst bekommst Du IMMER Schlepp-Fehler (also Deine Erkennung, daß der Motor nicht den Befehlen folgt, obwohl Er eigentlich ganz gut dabei ist).

MfG

So, nun bin ich endlich an einem richtigen Rechner und kann auch ein paar mehr Fotos und Daten liefern.
Ich hätte nicht erwartet, dass ich mit meiner Anfrage so viele Gründe zum Schreiben gegeben habe, ich kam mit dem lesen mobil gar nicht hinterher.
Auf jeden Fall schonmal vielen Dank für die Beteiligung und die guten Ideen.
Ich hätte mit wesentlich einfacheren Antworten gerechnet, so ähnlich wie "Ja, kann die AccelStepper Library, da muss man nur xxxxx aufrufen" oder "Nein, geht nicht".

Also, ich bin dabei eine Bügelperlensortiermaschine zu bauen.
In meiner Idee soll etwa jede Sekunde die Farbe einer Bügelperle erkannt werden und in ein Fach geleitet werden.
Dazu ist es nötig die Bügelperlen in eine bestimmte Lage zu bringen und dann die Farbe auszulesen.
Das Weichenwerk für die Fächer ist noch nicht fertig konstruiert und muss auch noch gebaut werden. Dies hier ist nur ein Testaufbau für die Motoren und Sensoren, der folgendermaßen aussieht:

Hier sind verbaut ein DC Getriebemotor mit einem AS5600 (noch nicht montiert) in dem weißen Gehäuse um die Bügelperlen in die richtige Lage zu bringen und ein Standard Stepper mit einem AS5600 und ein Farbsensor in dem schwarzen Gehäuse.
Ob die Wahl der Komponenten jetzt perfekt ist oder nicht, oder ob es andere Ideen gibt, mit denen man das besser lösen kann sei mal dahingestellt. Hier geht es darum mit genau diesem Aufbau die Sache zum Laufen zu bringen.
Zunächst hatte ich keinen AS5600 vorgesehen, aber es wurde schnell klar, dass ich mit einem Stepper nicht weiß wann eine Bügelperle vor dem Farbsensor steht. Das Rad im inneren des schwarzen Gehäuses sollte auch immer in eine Richtung drehen und nicht vor und zurück um Zeit zu sparen. Also wurde einfach ein absoluter Drehgeber in Form des AS5600 hinzugefügt. Auch in dem weißen Gehäuse war kein AS5600 drin. Die ersten Tests zeigten aber, dass es passieren kann, dass eine Bügelperle das Rad blockieren kann. Der Getriebemotor zerquetscht die Bügelperlen. Auch mit einer Strombegrenzung war hier wenig bis gar nichts zu machen, dafür ist der Getriebemotor viel zu stark. Ohne Ist-Positions Rückmeldung erschien mir das schwierig, also habe ich diese einfach hinzugefügt. Gut nun könnte man den Stepper auch durch einen DC Getriebemotor ersetzen, ja, aber der Aufbau war schon fertig, und warum sollte es nicht mit einem Schrittmotor gehen?
Also bleibt die Hardware so wie sie ist.
Das Schöne daran ist, dass ich nun sehr viel Erfahrungen damit sammeln kann, da ich zum ersten Mal einen DC Getriebemotor, einen Stepper, zwei Positionsencoder und einen Farbsensor ansteuern und auslesen werde, was mir hoffentlich auch viel Freude bereiten wird.
Darum geht es ja letztendlich.

Für diejenigen, die absolut nicht die Kombination Stepper und Positionssensor verstehen und annehmen wollen habe ich unter dem Motto "Überlegt Euch, warum ihr das gut findet" eine neue Aufgabenstellung: Wir wollen die maximal möglichen Beschleunigungen ohne Schrittverlust bei einem Stepper messen.

Da ich mich nicht gleich mit den Bügelperlen im geschlossenen Gehäuse an den Stepper machen wollte, sondern erstmal die Ansteuerung, die Absolutpositionsmessung und das Blockierverhalten programmtechnisch umsetzen möchte, habe ich einen weiteren Testaufbau gebaut. Hier hat ein Stepper ein rotes offenes Gehäuse mit einem Laufrad bekommen, dass man mit den Fingern abbremsen und blockieren kann. Mit diesem kann man auch die maximal mögliche Beschleunigung ohne Schrittverlust bei einem Stepper ermitteln. Das sieht noch ohne montierten AS5600 so aus:

Der AS5600 sieht so aus:


Nun soll es also endlich losgehen.

Was ich bisher herauskristallisiert hat ist, dass es wohl keine Library für Stepper in Verbindung mit Encoder gibt.
Also muss das nun selber entwickelt werden.
Leider habe ich sowas noch nie gemacht und brauche daher eure Unterstützung.

Die erste Teilaufgabenstellung ist also folgende:

Der Schrittmotor soll unendlich weit drehen können, aber als Positionen sind nur 0-359,9° interessant. Es muss also nicht zwischen 1° und 361° unterschieden werden. Gleichzeitig soll ein Encoder feststellen, ob der Schrittmotor tatsächlich die Schritte ausführt. Da immer eine gewisse Hysterese auftritt muss diese toleriert werden.
Der Schrittmotor soll dabei immer weiter drehen können.
(Ich merke gerade das es gar nicht so leicht ist die Aufgabenstellung in Worte zu fassen. Vielleicht könnt ihr mir ja auch dabei helfen?)

Folgende Komponenten werden verwendet:
µC: nodeMCU ESP8266 v2
Schrittmotor Schrittmotor Nema 17 (bipolar, 200 Schritte, 2,55 V DC, 1,7 A) - 17HS4417P1-X4:

Schrittmotortreiber DRV8825:

Encoder AS5600-SO_EK_AB:
https://ams.com/documents/20143/36005/AS5600_UG000254_2-00.pdf/3b63b14e-6f29-4cc9-61d0-822068bcdef9

Ich baue also den Schrittmotor mit dem roten Gehäuse als erstes auf und denke es ist sinnvoll mich zunächst mit dem Encoder zu beschäftigen.
Ich kann an dem roten Rad drehen und schaue mir an welches Feedback vom Sensor geliefert wird.
Den Sensor möchte ich per I²C auslesen.

Lieben Gruß,
Chris