Forum: Mikrocontroller und Digitale Elektronik Motor dreht ungenau ?


von Christoph M. (Gast)


Angehängte Dateien:

Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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
von rmu (Gast)


Lesenswert?

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.

von Felix A. (madifaxle)


Lesenswert?

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
von Christoph M. (Gast)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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.

von Felix A. (madifaxle)


Lesenswert?

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
von Felix A. (madifaxle)


Lesenswert?

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
von Christoph M. (Gast)


Lesenswert?

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

von MaWin (Gast)


Lesenswert?

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.

von gatsby (Gast)


Lesenswert?

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

von Thomas K. (joshua314)


Lesenswert?

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
von Christoph M. (Gast)


Lesenswert?

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

von Christoph M. (Gast)


Lesenswert?

OK, ich nehme die Abschaltung mal raus.

Danke erst einmal !

von Christoph M. (Gast)


Lesenswert?

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

von gatsby (Gast)


Lesenswert?

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

von Christoph M. (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.