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.
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.
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...
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.
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...
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 machenChristoph 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
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