Schrittmotor: Ansteuerung plus Positionskontrolle

Hallo, ich bin neu hier im Forum.
Ich war lange stiller Mitleser und konnte durch viele kompetente Beiträge schon eine Menge lernen.
Nun stehe ich aber vor einem Problem, zu dem ich im Internet wenige Informationen finde.

Zur Vorgeschichte:

Es geht um eine Mechanikbaugruppe in einer ausgedienten Industriemaschine.
Ein Auslöser wird über einen Schrittmotor an einer Linearführung über ein
Trapezgewinde bewegt, nachdem er betätigt wurde, um Platz für die zu verrichtende Arbeit zu machen. Nach dem Arbeitsschritt wird er zurück in Ausgangsposition gefahren.

Die Technik war leider nie sehr Präzise und Fehleranfällig. Durch Verschmutzungen und einen Mieserablen Schrittmotor kam es oft zu Fehlstellungen des Triggers. Deshalb habe ich alles komplett umgebaut. (Hiwin MGN05 Führungen, Nema8 Schrittmotor, kapazitiver Trigger, Kapazitiver Endschalter usw.

Leider kommt es immer noch zu Schrittverlusten durch Verschmutzungen.
Der Schrittmotor kann aus Platzgründen nicht größer dimensioniert werden. Der Motorstrom ist ca 100mA über Vorgabe.

Nun möchte ich einen Encoder benutzen um die Motorwelle auf ihren Drehwinkel zu überwachen. Habe mich für den AS5048 entschieden, welcher über ein Spi kommuniziert...
Funktioniert auch alles, ich kann die Position auslesen, jedoch z.Z noch mit einem seperatem Arduino.

Nu zur Frage: Hat jemand schon einmal eine Closed loop Stepper Regelung mit einem Arduino realisiert?

Der Motor dreht mit max. 750 RPM, was 150KHZ ausgangstakt für den Schrittmotor Treiber bedeutet. (Die Pins des Arduinos werden über direkte Portmanipulation angesprochen um Zeit zu sparen)

Mein Bauchgefühl sagt mir nun, dass der Prozessortakt trotzdem nicht auseichen wird, um den Schrittmotor vernünftig anzusteuern und gleichzeitig mindestens 4 mal pro Umdrehung die Position über Spi abzufragen + die nötige Arithmetik anzuwenden um die Daten zu verarbeiten...

Hat jemand irgendwelche Erfahrungen in die Richtung sammeln können?

(Ich hoffe ihr könnt meiner wirren Beschreibung überhaupt folgen :D)

Achja, es handelt sich um einen Atmega 328P.
16 Mhz externer Oscilator und CH340.
Quasi ein Arduino, nur auf einem anderen PCB.

Grüße

150 kHz ist jenseits von gut und böse für einen 16 MHz Arduino
Und ein Schrittmotor Baugröße Nema 8 ist ja nun auch eher schmächtig.

Für 150 kHz Schrittfrequenz würde ich einen Teensy 4.0 nehmen. (CPU 600 MHz)
https://www.reichelt.de/teensy-4-0-usb-mit-header-teensy-4-0-h-p318653.html

Wenn ich mich recht erinnere hat der Teensy 4.0 auch schon microcontroller interne Hardware zum Auswerten von encodern.

100 mA Strom ist ja nun auch nicht gerade üppig Strom. Nicht mal für einen Nema 8 Schrittmotor.

Gibt es denn um den Schrittmotor herum nur hinten 10 mm Luft und das war's?
Oder
hast du etwas mehr Platz zur Verfügung?

Wenn du Bilder postest wie die gesamte Mechanik aussieht, dann könnte das Forum mit überlegen wie man das lösen kann.

Schon mal hier geschaut ob einer dabei ist der "reinpassen" würde?
https://www.reichelt.de/schrittmotor-nema-08-1-8-0-6-a-4-26-v-nema08-03-p335318.html?CCOUNTRY=445&LANGUAGE=de&&r=1&PROVID=2788&gclid=Cj0KCQiA4Y-sBhC6ARIsAGXF1g7Vp0rwDiG_Agy-qDcVwAofgg3K1A6m4msJoXvWEN94HYI_Ys3vfoEaAtJyEALw_wcB

Schrittmotoren werden mit Stromtreiber betrieben. Man kann durch höhere Spannung das Drehmoment etwas erhöhen.

Was für ein Schrittmotortreiber ist da dran?
Es gibt von Trinamic Schrittmotortreiber die eine Funktion Stallguard haben
Habe ich selbst noch nicht getestet aber es geht darum ohne Encoder Schrittverluste zu erkennen.

vgs

Na dann würde es ja auch reichen ein paar IO-Signale auszutauschen.

Schrittmotoren haben im Profibereich immer eine Möglichkeit eine Referenzfahrt zu machen. Hast du eine Referenzfahrt?
Könnte man die nach jeder Bewegung machen?
Wie wird Referenzposition detektiert?
Könnte man dieses Signal "steht auf Referenzposition" dem Enocder-Arduino einspeisen damit der sich nullen kann?

Wie du siehst man muss noch deutlich mehr Details wissen um eine gute Lösung zu finden

vgs

Danke für deine schnelle Antwort.

Tatsächlich ist das der Schrittmotor, den ich verbaut habe. Nur die Version mit der Hohlwelle. Ich meinte 100mA über Nennstrom. Also insgesamt 700mA. Die Spannung liegt bei 7V.

Durch die direkte Portmanipulation habe ich am Ausgang bis zu 975 Khz erreichen können.
(Mit Oszi gemessen). Die DigitalWrite() Kommandos verbraten halt unglaublich viel Zeit, weshalb ich die nicht benutze.
Damals hatte ich den encoder noch nicht im Hinterkopf und dachte es reicht.

Ja, das Problem mit der Baugröße ist folgendes: in der Länge habe ich noch ca 6mm, die aber der encoder jetzt beansprucht.
In der Baubreite liegt der Knackpunkt. So ist alles kein Problem, allerdings sitzt die Baugruppe an einem Schwenkarm. Am knappesten Punkt (Während der Bewegung des Armes) habe ich noch ca 2mm Platz. Die würde ich gern behalten, falls mechanische Schwingungen auftreten. Der Schwenkarm wird von einem Nema 23 mit 4 Motorspulen ( 2 Stepper Treiber, 2x 8A) betrieben. Der reißt mir den kleinen Nema8 aus seiner Halterung, wenn er kollidiert.

Hast du einen Link zu den Treiber? Hört sich sehr interessant an.

Ich poste gern ein Bild aus der CAD, wenn ich wieder zuhause bin.

Die Baugruppe ist zur Zeit komplett demontiert. Man würde das Problem nicht erkennen.

Trinamic TMC2209

Das Ziel soll sein, alles über einen uC laufen zu lassen.
Klar habe ich eine Referenzfahrt. Über einen kapazitiven Sensor. Der sitzt in der Führung der Mgn Rail und detektiert den Körper des Wagens. Funktioniert auch unglaublich präzise. (0,01mm, gemessen mit Messuhr).

Die Positionierung funktioniert ja auch. Nur nach mehreren (ca. 100) Auslöseprozessen weicht der Wert dann ab.

Nach jeder Fahrt ein Homing auszuführen dauert zu lange, da das Homing mit reduzierter Geschwindigkeit durchgeführt werden muss. Sonst schießt der Wagen durch die Masseträgheit des Motor-Rotors übers Ziel hinaus. Der Sensor würde trotzdem sagen "1"
und würde die falsche 0-Position annehmen.

Außerdem würde es den Schrittverlust nach dem Homing nicht erkennen. (Der Sensor sitzt am anderen Ende der Führung)

Also der TMC2209 kann bis 29V. Wenn du da statt 7V 24V drauf gibst dann wird das Drehmoment schon etwas größer. Durch die Stromregelung wird der Strom trotzdem korrekt eingestellt / eingehalten.

vgs

Ich werd das auf jeden Fall mal versuchen.

Kann sein, dass ich jetzt im Irrtum bin. :
Wird durch die Stromregelung nicht die Spannung beschnitten?

Die Versorgungsspannung meines Treibers liegt auch bei 15v. (Treiber is ein DRV8825)
Wenn ich bei Stillstand die Motorspannung Messe, sind es circa 7v. Ändere ich Vref am Treiber, ändert sich auch die Ausgangsspannung.

Nach dem ohmschen Gesetz macht das ja auch Sinn. Der Widerstand R der Motorwicklung ist ja (halbwegs) konstant.
Wenn ich den gewollten Strom I einstellen möchte, muss ich doch die Spannung anpassen.

Also z. B. 10 Ohm x 0,7 A = 7V.

Lasse mich aber gern eines besseren belehren. Ich hab bis jetzt einfach angenommen, dass es so ist.

Danke auf jeden Fall für den vielen Input.

Update:

Habe mich geirrt. :smiley:
Was ich gemessen habe ist nur der Mittelwert.
Die Spannung scheint gepulst zugeführt zu werden. Immer wenn der Nennstrom an der Spule erreicht ist, wird die Spannung kurz abgeschaltet.
Durch die höhere Spannung wird der Nennstrom an der Wicklung aber schneller erreicht, was den Drehmomentzuwachs bedeutet.

Genau so ist es. Und dieses Steuerverhalten nennt man Stromregelung.
Die Spannung wird immer nur so lange eingeschaltet damit sich aus der Einschaltdauer ein bestimmter Mittelwert des Stromes ergibt.

vgs

@derbleibtgeheim,

:warning:
Im englischen Teil des Forum müssen die Beiträge und Diskussionen in englischer Sprache verfasst werden.
Deswegen wurde diese Diskussion in den deutschen Teil des Forums verschoben.
mfg ein Moderator.

Vielen Dank fürs verschieben. Als es mir aufgefallen war, war es schon zu spät.

Na dann habe ich ja mal wieder was dazu gelernt :smiley:
Sehr gut. Ich dachte bei Stromregelung immer an eine Konstantstromquelle vor ner H-Brücke. Is ja doch ne anspruchsvollere Schaltung.

Whatever. Der DRV8825 scheint den Strom ja genau so zu regeln. Das mit dem TMC2209 werd ich trotzdem mal ausprobieren wegen dem Stallguard.
Wäre nun interessant, ob der Treiber auch eine Rückmeldung an den uC geben kann wenn die Positionierung nicht erfolgreich war.
Sonst komme ich um den Encoder trotzdem nicht herum.

Hier mal noch ein Bild aus dem CAD-Programm:
Den Auslöser und einige andere Teile sind ausgeblendet, sonst erkennt man nix.



Wenn Du ein wenig genauer wissen willst, wie die Stromtreiber funktionieren: Vor längerer Zeit hatte ich mal ein Thema dazu aufgemacht. Tommy56 hat das dann zusammengefasst und auf seinem Server gehostet. Ist in der Tat etwas komplexer als es im ersten Moment aussieht.
Bei den Stepraten, die Du da vorhast braucht es auch unbedingt Beschleunigungs- und Bremsrampen. Ist das in deinem Sketch vorgesehen?

Au Watte schrägwinklig geschossenes Handyfoto vom Bildschirm.
Wiest du wie man direkte Screenshots auf dem PC macht?

Jetzt musste zu den Bildern aber trotzdem noch was erklären.

Man sieht einen Schrittmotor mit einer ziemlich langen Achse.
An dem Ende der Achse das dem Schrittmotor gegenüberliegt ist ein hellgraues Bauteil
wird das hellgraue Bauteil durch die Drehung der Schrittmotorachse vor/zurückbewegt?

Wo ist der Referenzsensor?

750 rpm = 750 / 60 = 12.5 Umdrehungen pro Sekunde

Die meisten Schrittmotoren haben 200 Vollschritte pro Umdrehung
macht dann 12.5 * 200 = 2500 Vollschritte pro Sekunde

150 kHz = 150000 Hz = Schritte pro Sekunde
Ein DRV8825 kann maximal 1/32 Microsteps
das macht dann
2500 * 32 = 80000 Impulse pro Sekunde.
Immer noch extrem hohe Frequenz für einen Arduino Uno
Und wenn ich das richtig verstehe dann fährt der Schrittmotor aus dem Stillstand an soll das bewegliche Teil verdammt schnell nach vorne bringen und auf den ca. 80 Millimetern auch wieder abbremsen.

Wenn das bisher ohne Beschleunigung / Abbremsen gemacht wird wundert es mich gar nicht das das Schritte verloren genen.

vgs

Okay, wo fangen wir an...

Doch, ich weiß, wie man Screenshots macht. Das war eher eine Frage der Bequemlichkeit, weil ich auf dem Handy im Forum angemeldet war.

Wie gesagt, es sind einige Komponenten ausgeblendet, um die Einsicht zu erleichtern.
Das Graue Teil wird nicht von diesem Schrittmotor bewegt, sondern von einem anderen. Der ist auf der Zeichnung nicht zu sehen. An der Hiwin-Führung (das rot/grüne Teil da) ist allerdings etwas angeschraubt, was bewegt wird und den Sensor beherbergt.

Die lange Motorwelle ist eigentlich ein Trapezgewinde. T3,5x2,4. Da es für das Modell nicht ausschlaggebend ist, hab ich einfach nur eine Welle modelliert.

Der Referenz-Sensor ist auch nicht im Modell zu sehen. Er befindet sich vor dem Motor in dem braunen Teil. Ich male es mal im Bild ein.

Mit der Frequenzangabe habe ich mich ein wenig doof ausgedrückt. War auch ein Fehler. Es wären theorethisch 160.000.
Ich muss den Pin ja high und danach auf low schalten. Der Treiber reagiert aber nur auf steigende Flanken, nicht auf fallende.
Richtig, er läuft mit 1/32 Microstepping. Heißt ja nun, dass er 80.000 steigende und 80.000 fallende Flanken brauch.

Dazu kommt noch ein mills() - Timer zwischen den Takten.
Über die Timer habe ich die Acceleration und die Drehzahlbegrenzung umgesetzt.... Der Sollwert der Zeit zwischen den Flanken wird im Loop immer weiter vermindert, bis die Maximale Drehzahl erreicht ist oder wieder abgebremst werden muss. Bei der Umsetzung hatte ich mich glaube ich an der Accelstepper lib orientiert.

Ich vermute, ohne Beschleunigungskontrolle würde der Stepper gar nicht beschleunigen.

750RPM sind auch nur der maximal zulässige Wert. Der wird nicht erreicht. Der Motor macht nur 17 1/2 Umdrehungen (42mm), danach muss er schon wieder stehen.

Da er es aber in knapp einer Sekunde schafft, sind die 750 RPM aber vielleicht gar nicht so abwegig. Wäre mal wieder eine Aufgabe fürs Speicheroszi.

Kann man in diesem Forum per PN Videos verschicken? Dann könnte ich dir zeigen worum es geht. Darf es halt nur nicht öffentlich machen.

Der rote Zylinder vor dem Motor ist der Endstopp für die Ref-Fahrt

Ja und eine steigende und eine fallende Flanke zusammen ergeben einen Wechsel(= eine Rechteck"welle".)

Also nennen wir es die Wiederholfrequenz für das Umschalten HIGH-LOW muss 160 kHz sein damit sich einer Schrittfrequenz von 80 kHz ergibt.

1 / 160000 = 6.25 Mikrosekunden.
Mit millis() = tausendstel Sekunden ist da schon lange nichts mehr.
also kann das höchstes micros() sein aber nicht millis()

Wenn ich mich recht entsinne dann wird micros() alle 4 µs um 4 erhöht.
Das würde heißen die Zeit beträgt entweder 4 µs oder 8µs.

Aus dem, dass du den Referenzsensor eingezeichnet hast weiß man jetzt wo der Referenzsensor sitzt. Ansonsten kann ich nur mutmaßen, dass auf der Trapezgewindespindel eine Mutter sitzt die etwas bewegt was da nicht dargestellt ist.

Ich habe Referenzfahrten immer so programmiert: Fahre auf den Referenzsensor zu bis der Referenzsensor umschaltet. Dann fahre in langsamem Tempo wieder vom Referenzsensor herunter bis der Referenzsensor zurückschaltet und dieser Punkt an dem der Referenzsensor zurückschaltet wird als Referenzpunkt benutzt.

Diese Vorgehensweise ermöglicht, dass man mit hoher Geschwindigkeit zum Referenzsensor hinfährt und nur eine ganz kurze Strecke vom Referenzsensor mit kleiner Geschwindigkeit herunterfährt. Dadurch ist die Referenzfahrt schnell erledigt.

vgs

Ja, wie gesagt, mit der Frequenz habe ich mich ungünstig ausgedrückt.

Blockzitat
1 / 160000 = 6.25 Mikrosekunden.
Mit millis() = tausendstel Sekunden ist da schon lange nichts mehr.
also kann das höchstes micros() sein aber nicht millis()
Wenn ich mich recht entsinne dann wird micros() alle 4 µs um 4 erhöht.
Das würde heißen die Zeit beträgt entweder 4 µs oder 8µs.

Gutes Argument. Ich habe tatsächlich nur mills benutzt. Für die Beschleunigungssteuerung erfüllt es aber seinen Zweck.
Das werde ich ändern. Fraglich ist dabei, wie lange die "If" Bedingung mit Abfrage und Vergleich der beiden Zeitvariablen dauert.

Blockzitat
Aus dem, dass du den Referenzsensor eingezeichnet hast weiß man jetzt wo der Referenzsensor sitzt. Ansonsten kann ich nur mutmaßen, dass auf der Trapezgewindespindel eine Mutter sitzt die etwas bewegt was da nicht dargestellt ist
.

Als Referenzsensor wird dieser induktive Näherungssensor eingesetzt (kein kapazitiver) :
https://www.reichelt.de/induktiver-naeherungssensor-0-6-mm-pnp-schliesser-dwad-603-m4-p151417.html?PROVID=2788&gclid=Cj0KCQiA4Y-sBhC6ARIsAGXF1g4e-x1A0yqZ-Xyi3o_RdKkdZlkkELe-H38O3vM4Lt2UrSm2fnEprgsaAr2MEALw_wcB&&r=1

Blockzitat
Ich habe Referenzfahrten immer so programmiert: Fahre auf den Referenzsensor zu bis der Referenzsensor umschaltet. Dann fahre in langsamem Tempo wieder vom Referenzsensor herunter bis der Referenzsensor zurückschaltet und dieser Punkt an dem der Referenzsensor zurückschaltet wird als Referenzpunkt benutzt.

Jup. So ähnlich funktioniert das erste Homing, wenn man die Maschine anschaltet.
Während der Produktion dauert das aber zu lange.

Die Maschine ist ein Halbautomat zum verarbeiten von Crimpkontakten.

Das Teil da ist die Abisoliereinheit. Das Kabel berührt einen Sensor. Der Sensor muss augenblicklich zurückfahren, da vorn in der Einheit 2 V-Messer sitzen, die die Isolierung der Litze einschneiden und durch die Bewegung des Schwenkarmes abziehen.
Würde der Sensor in Position bleiben, würden die V-Messer ihn zerschneiden.

Irgendwie klappt das mit den Zitaten nicht richtig :smiley:

OK. Es gibt sehr eng gesteckte und präzise einzuhaltende Zeitabläufe.
Dieses präzise Zeiten einhalten / sofortiges reagieren erfordert den Schrittmotor mit größtmöglicher Beschleunigung zu fahren.

Dabei treten durch Verschmutzungen = Spindelmutter lässt sich schwerer bewegen Schrittverluste auf. Das soll durch einen Encoder detektiert werden.

Da das ganze eine Produktionsmaschine ist würde ich jetzt ernsthaft darüber nachdenken statt eines 20 Euro Arduinos 16 MHz einen 45 Euro Teensy 4.0 600 MHz zu nehmen. Das sind doch keine Kosten! Du bastelst eine Stunde an der Arduino-Software rum kostet den Chef mehr.

Und ich würde sogar noch über etwas zweites nachdenken:
Änderung der Mechanik so das man einen kräftigeren Schrittmotor verwenden kann.
Es mag sein, dass das dann gleich tausende Euro sind. Das würde ich eben dem gegenüberstellen was für Kosten entstehen wenn ein gewisser Prozentsatz Ausschuss produziert wird.

Bei einer Amortisationszeit von Monaten wäre das für mich überhaupt keine Frage diese Investition zu tätigen.

Wenn ich das jetzt wirklich im Detail verstehen können soll, dann müsstest du ein Video und jede Menge ergänzende Erklärung posten.
Das geht auch in PM-Nachrichten. Das würde ich aber selbst wenn es eine PM-Nachricht ist mit dem Chef absprechen.

vgs

Gute Zusammenfassung.

Die Verschmutzungen treten nicht mal an der Spindelmutter auf, sondern einfach durch herumliegende Isolationsreste. Diese werden dann beim Verfahren irgendwo eingeklemmt. Im Prozess wird das ganze Teil zwar automatisch mit Druckluft gespült aber das begünstigt nur, dass sich die Isolationsreste an anderen Stellen in der Führung festsetzen.
Deshalb wäre ein größerer Motor nur bedingt eine Abhilfe. Auch der kann die Verschmutzung nicht auf 0 komprimieren.

Blockzitat
Da das ganze eine Produktionsmaschine ist würde ich jetzt ernsthaft darüber nachdenken statt eines 20 Euro Arduinos 16 MHz einen 45 Euro Teensy 4.0 600 MHz zu nehmen. Das sind doch keine Kosten! Du bastelst eine Stunde an der Arduino-Software rum kostet den Chef mehr..

Tatsächlich is es nur ein SMD Atmega für 2€. Die Platine hatte ich herstellen lassen und hab sie bestückt, samt Treiber, Spannungsregler usw.
Jeder Schrittmotor hat seinen eigenen uC.
In meiner grenzenlosen Ignoranz dachte ich, das reicht auf jeden Fall. Theoretisch tut es das ja. Bloß beim Encoder bin ich mir nicht sicher. Der Reiz an dem Ding mit dem Encoder ist ja, dass es eine Rückmeldung zur Steuerung geben kann, genauso wie ein Versuch des Freifahrens, bevor die Steuerung den Produktionsablauf stoppt.
Im Orginal und im Ist-Zustand kann man halt munter weiter produzieren, bis man alles in Ausschuss verwandelt hat.
Die uC interpretieren zur Zeit nur die Anweisungen der orginalen Steuerung und setzen sie in Step/Dir-Signale um.
Geplant ist irgendwann, die Uralt-Steuerung durch einen Esp32 o.ä. mit HMI zu ersetzen.

Blockzitat
Wenn ich das jetzt wirklich im Detail verstehen können soll, dann müsstest du ein Video und jede Menge ergänzende Erklärung posten.
Das geht auch in PM-Nachrichten. Das würde ich aber selbst wenn es eine PM-Nachricht ist mit dem Chef absprechen.

Ich löse diese Aufgabe privat, weil ich Freude an sowas habe und auf Arbeit noch anderen Kram machen muss.
Das einzige Slow-Motion Video was ich vom orginalen Bewegungsablauf habe, ist allerdings in der Firma gedreht. Deshalb möchte ich es nicht online stellen. Hab auch versucht, es dir zu senden. Allerdings ist das Dateiformat nicht erlaubt.

Meistens reicht es ein .txt anzuhängen... :wink:

Hm... :

Die Schnipsel nicht wegpusten sondern wegsaugen ?

Blockzitat
Die Schnipsel nicht wegpusten sondern wegsaugen ?

Ist schon von Werk aus so gebaut.
Über dem Trigger wird gepustet, unten wird abgesaugt.