Hallo, ich habe ein Problem mit der Ansteuerung eines Schrittmotors. Im Anhang ein kleines BASIC-Programm, welches den Motor um 800 Schritte Vor und 800 Schritte zurückdrehen soll (800 Schritte = 2 volle Umdrehungen). Dies geschieht wiederholt und kann via Terminal verfolgt werden. Problem: Der Motor soll nach Abfolge der 1600 Schritte wieder in die Position 0 (= Ausgangsposition) zurückkehren, um von da aus wiederholt zu starten. Es tritt jedoch der Effekt ein, dass die O-Position langsam "wandert". Nach 8 Durchläufen ist diese um 7-8° verschoben. Ich habe das mit verschiedenen Geschwindigkeiten + Pausen ausprobiert. Immmer das gleiche Resultat. Was kann bzw. muss ich hier unternehmen, um den Fehler zu beseitigen und woher kommt das ? Hier die HW-Daten dazu: Mikrocontroller: ATmega8A Taktfrequenz: 8MHz Motor: Sanyo Denki 103-547-52500 (Bipolar), 1,8° Schritt +-0,09° Steuerung: myAVR Board MK2 Motortreiber: ST330-V3 von SainSmart Output: Motorimpuls an Port B,0 Output: Drehrichtung an Port B,1 Output: Motor Enable an Port B,2 Schon mal ein herzliches Dankeschön für Lösungsansätze ! MfG Christoph
Ich schätze mal, dein Motor hat das Problem aller Motoren: träge Masse. D.h. wenn du genügend schnell in eine Richtung drehst, dann kannst du nicht einfach so die Drehung in 0 Zeit stoppen und in die andere Richtung steppen und erwarten, dass der Motor das alles mitmacht.
1 | Routine_mov: |
2 | Steppertakt = 1 : Waitus 100 : Steppertakt = 0 : Waitms 1 |
du wartest nach jedem Schritt 1 Millisekunde. D.h. du möchtest eigentlich pro Sekunde 1000 Schritte machen (ein bischen weniger, weil der Puls ja auch Zeit benötigt). Dein Motor hat aber wie gesagt träge Masse. Du kannst den nicht aus dem Stand heraus auf volle Geschwindigkeit lossteppen lassen. Dein Auto fährt ja auch nicht aus der Parklücke heraus unmittelbar 100km/h. Selbst wenn du das Pedal bis zum Bodenblech durchtritts, beschleunigen musst du dein Auto schon lassen. D.h. du wirst dich wohl oder übel mit der Thematik "Beschleunigungsrampen" bzw. "Bremsrampen" befassen müssen, oder langsam genug steppen, so dass dein Motor noch mitkommt.
:
Bearbeitet durch User
Aus dem Stand gleich auf ca. 2U/s schafft der Schrittmotor anscheinend nicht, daher verliert er Schritte. Von der einen Richtung scheints ein bissl strenger zu gehen als von der anderen her, daher wandert die 0-Position. Nach dem Ändern der Richtung brauchen manche Controller ausserdem auch eine kleine Verschnaufpause bevor man den ersten Schritt schicken darf.
Eventuell ist beim Umkehren der Richtung auch ein Fehler beim Zustand der Step/Dir Pins vorhanden. Also sowas wie 800 Takte nach rechts, aber nur 798 (oder weniger) Takte in die andere Richtung. Dreht der Motor immer in eine Richtung zuviel oder ist das unterschiedlich? Ist der Winkel nach 8 Durchläufen immer etwa 7° bis 8°? Nachtrag: sieht wirklich nach zu schneller Taktung aus...
:
Bearbeitet durch User
Erst einmal vielen ank für alle Vorschläge !!! OK, das Thema Start- und Bremsrampen werde ich mir mal vornehmen. Zu Deiner Antwort, Felix: Ja die 0-Position wandert immer in die gleiche Richtung. Schnelle Taktung: ich weiss nicht, aber sooo schnell dreht der ja auch wieder nicht. Wie gesagt, die Abwanderung entsteht ja auch bei 2ms Pause.... Noch mal zum Rampenthema: müsste sich der fehler nicht aufheben, da er ja in beiden Richtungen auftritt...? MfG
Christoph M. schrieb: > Schnelle Taktung: ich weiss nicht, aber sooo schnell dreht der ja auch > wieder nicht. > Wie gesagt, die Abwanderung entsteht ja auch bei 2ms Pause.... geh mal in die vollen. 20 ms Pause oder noch länger > Noch mal zum Rampenthema: müsste sich der fehler nicht aufheben, da er > ja in beiden Richtungen auftritt...? Kommt drauf an, wie symetrisch die ganze Sache mechanisch ist.
Mit einer Rampe dürfte das Problem eher geringer werden, da diese ja dem Trägheitsmoment des Stators entgegen kommt. Nur muss diese Rampe auch recht genau in der Taktung sein, da hier zeitliche Abweichungen (Jitter, aann man das hier so nennen?) zum Abbremsen und stärker Beschleunigen führen.
:
Bearbeitet durch User
Wenn der Effekt des Verschiebens der Position/des Winkels beim Verdoppeln der Zeit immer noch in derselben Form auftritt, scheint das noch was anderes zu sein. Hast du mal Steppertakt = 1 : Waitms 1 : Steppertakt = 0 : Waitms 1 ausprobiert? Vielleicht wird die steigende Flanke auch als Takt genommen? Zugegeben, ich kenne deinen Steppertreiber nicht...
:
Bearbeitet durch User
OK, ich werde das mal ausprobieren und danacch (wenn es nichts gebracht hat) die Rampen einbauen. Muß erst einmal was essen ;-) Melde mich wieder mit hoffentlich guten Ergebnissen. Gruß Christoph
Karl H. schrieb: > du möchtest eigentlich pro Sekunde 1000 Schritte machen Christoph M. schrieb: > 800 Schritte = 2 volle Umdrehungen 400 STEP Impulse pro Umdrehung, macht 2 pro Schritt, also 2-Phase Excitation und grade mal 150 upm. Das ist langsam für den Motor, aber auch die blödeste Betriebsart. 30us Minimum clock pulse width wird eingehalten. Der Motor ist für 1A bei unipolarem Betrieb, 0.7Arms bei seriell verschalteten Spulen und 1.4Arms bei parallel verschalteten Spulen, also muss man auf dem Board 1A (seriell) oder 2A (parallel) einstellen. Warum er allerdings mit 2-Phase Excitation fährt, und nicht im Mikroschritt, wo er doch schon so einen passenden TB6560 dafür hat, ist schleierhaft, Mikroschritt verbessert das Resonanzproblem erheblich. Wenn der Motor ohne Last dreht, sollte er das schaffen. ABER: Ohne Last heisst auch, er schwingt über, weil er nicht gebremst wird. Halte man einen Streifen Filz auf die Motorachse um sie zu bremsen während er dreht, und schau, ob sich die Positioniergenauigkeit damit verändert. Wenn du zu sehr bremst, wird er Schritte verlieren, aber wenn man "ausreichend" bremst um Überschwinger zu verhindern, kann es sein, daß er die Schritte macht, auch mit deiner Beschleunigung. http://www.nmbtc.com/step-motors/engineering/vibration-and-resonance/ Ein Schrittmotor leidet - je nach Verhältnis von Drehmoment zu Rastmoment - unter demselben Problem wie ein BLDC.
Hallo, - Ich würde sagen, du machst keine 800 sondern nur 799 Schritte in deinem Programm. Wenn du wirklich 800 Schritte brauchst für 2 volle Umdrehungen, dann machst du je 2 Schritte zu wenig. - Zwischen Vor und Zurück schaltest du den Motor stromlos For I = 1 To 799 Gosub Routine_mov Next Motor_stop = 0 Print "Vor: " ; I Waitms 500 Motor_stop = 1 Richtung = 0 Das solltest du lassen, denn dadurch können wiederum Schritte verloren gehen. - Du sagst du machst 8 Durchläufe des Programms. Davon sehe ich nichts in deinem Programm. Wenn du das Programm 8 mal neu startest, dann hast du das gleiche Problem mit dem stromlosen Motor wie oben beschrieben. - Auch die fehlenden Anfahr/Bremsrampen können ihren Teil zum Problem beitragen. Viel Erfolg gatsby
Hallo Zusammen, ich arbeite im Bereich CNC. Also ohne Brems und Beschleunigungsrampen geht gar nichts. Takte aufzubauen mit Pausen... macht auch nicht gerade Freude. Was du machen kannst, das ganze in einem Timer Interrupt laufen zu lassen. Dabei würde ich aber von den 8 MHz weg auf 20MHz gehen. Dann einen 8-Bit Timer so einrichten, dass ca. 64khz erreicht werden(20MHz /128 und Vorlade 254) Dazu den https://de.wikipedia.org/wiki/Bresenham-Algorithmus nehmen. Den mit einem Puffer versorgen und gut ..... So rennt das bei uns ohne Probleme seit ca. 10 Jahren... Dann brauchst du nur noch die Strecke, was du haben willst, im Vorfeld in das Arry packen und der Interrupt macht den Rest. Ach ja: Der Interrupt ist zweiteilig. Der Erste löst immer den Takte aus, der Zweite löscht den Takte und macht dann den Bresenham. So kommst du auf ca 32Khz Takte. das sind bei 400 Takte pro Umdrehung 80U/sek --> 4800U/min was viel zu schnell ist .... Max 1000.. Dann verliert jeder Schrittmotor sein Drehmoment.... Also kann du das für deine Auflösung sogar um Faktor 4 nach unten scalieren, oder doch bei den 8MHz bleiben. Beim Basic würd ich aber 20 MHz nehmen um mehr Zeit für den Bresenham zu haben. Gruß Thomas
:
Bearbeitet durch User
Oh Mann.... ist das kompliziert. Hab' nicht promoviert ;-) Aber ist wohl eine sehr gute Lösung, die ja auch erprobt ist. Habe zwischendurch einfacherer Pausen eingefügt (mit For Schleifen). Brachte jedoch keine Änderungen in der Wiederkehrgenauigkeit. Ja, dann muß ich das Ganze wohl mit den timern realisieren. Gibt es eine einfache Basic-Version Deiner Lösung, die ich als Ansatz nehmen könnte ? Bin noch nicht so erfahren mit der Timer-Programmierung. Habe damit die ersten (erfolgreichn) Versuche unternommen, aber nicht in einem größerem Umfang. Vielen Dank schon mal für die Antwort ! MfG Christoph
Hallo Gatsby, besten Dank für die Anregungen ! Deine Antwort: - Ich würde sagen, du machst keine 800 sondern nur 799 Schritte in deinem Programm. Wenn du wirklich 800 Schritte brauchst für 2 volle Umdrehungen, dann machst du je 2 Schritte zu wenig. >> Stimmt, habe ich korrigiert - Zwischen Vor und Zurück schaltest du den Motor stromlos For I = 1 To 799 Gosub Routine_mov Next Motor_stop = 0 Print "Vor: " ; I Waitms 500 Motor_stop = 1 Richtung = 0 Das solltest du lassen, denn dadurch können wiederum Schritte verloren gehen. >> OK, Motorbefehl habe ich gelöscht - Du sagst du machst 8 Durchläufe des Programms. Davon sehe ich nichts in deinem Programm. Wenn du das Programm 8 mal neu startest, dann hast du das gleiche Problem mit dem stromlosen Motor wie oben beschrieben. >> Missverständnis: nach 8 Durchläufen ist der Fehler von 7-8° zu erkennen. Eine Begrenzung der Durchläufe ist im Testprogramm nicht vorgesehen. - Auch die fehlenden Anfahr/Bremsrampen können ihren Teil zum Problem beitragen. >> Stimmt ! Hier muß nachgebessert werden. Dazu hat ja Thomas K. einen ausführlichen Beitrag gepostet ;-) MfG Christoph
Hallo Christoph, da das Programm in einer Endlosschleife läuft, würde ich aber den Motor nie stromlos schalten. Ich würde noch eine For..Next Schleife einfügen, die z.B. 20 Durchläufe hat und dann 20mal vor und zurück fährt und den Motor ständig bestromt lässt. Nur am Anfang wird der Motorstrom eingeschaltet und am Ende der 20 Durchläufe wieder abgeschaltet. Berichte mal wie dann das Ergebnis aussieht. Viel Erfolg gatsby
Hallo Gatsby, ja, Deine Antworten sind soweit ok, aber das Teil findet seinen Einsatz in einer experimentellen Umgebung. Hier muß ich von Anfang an folgende Daten eigeben: a Geschwindigkeit b Anzahl der Durchläufe c Anzahl Umdrehungen pro Richtung Ich bin noch dabei den Prototyp zu erstellen. Bisher läuft das ganz gut. Da der Motor eine Übersetzung von 1:7 antreibt, können die Abweichungen vernachlässigt werden. Der Motor macht 7 Umrehungen um am Ende eine Umdrehung zu realisieren (Ventilsteuerung). Aber es werden noch weitere Projekte kommen, wo mehr Genauigkeit gefragt ist. Zwei Themen habe ich dafür mitgenommen: Rampensteuerung und Mikroschritte. MfG Christoph
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.