Forum: Mikrocontroller und Digitale Elektronik schrittmotor schrittberechnungsproblem


von Tino K. (blumengiesser)


Lesenswert?

so, ich komme nicht mehr weiter. hoffentlich kann mir jemand helfen:

ich bewege mit einem schrittmotor eine kleine mechanik. Diese soll in mm 
(und 0.1mm) Schritten bewegt werden. Jetzt ist leider die Anzahl der 
Schritte des Schrittmotors für einen mm nicht ganzzahlig durch 10 
teilbar. in meinem fall sind es 214.4xxxxx schritte. Der Schrittmotot 
wird hierbei schon im 1/8 Schritt angesteuert (per IMT 901), was für das 
bewegen auch tadellos funktioniert. Jetzt kann ich dem IMT nur ganze 
Takte anbieten und die Mechanik würde sich nicht ganz 1 mm bewegen. 
Ähnlich sieht es für 0.1mm aus, das wären dann 21.44xxxx Schritte. Es 
gehen halt nur ganzzahlige Takte als Schrittimpulse und somit geht 
Information verloren. Ich habe folgendes asuprobiert: Den Fehler, bei 
1.0mm = 0.4, aufzuaddieren und wenn er größer 1 wird zu den 
Schrittimpulsen einer zuaddiert. Dies funktioniert nur bedingt, denn es 
handelt sich bei der Berechnung der Position wieder um Kommazahlen und 
irgendwann springt die Stelle einen Wert weiter und es steht im Display 
nicht mehr x.10 sondern x.11 (oder x.99).
Da ja schrittmotoren des öfteren hier behandelt werden und wurden muß 
dies doch auch schon mal jemanden beschäftigt haben.

danke fürs antowrten.
tino

von AS (Gast)


Lesenswert?

Rein mechanisches "Problem".

Ein 1.8° Motor, mit 1/8 Schritten angesteuert, ergibt an einer
Welle mit 1mm Steigung eine (theoretische) Positionierauflösung
von 625nm.
Für 0.1mm sind es exakt 160 Schritte.

Jede CNC Maschine arbeitet nach diesem Prinzip, warum nicht
auch Deine "kleine Mechanik"?

von Tino K. (blumengiesser)


Lesenswert?

genau, bei einer Steigung von 1600 Schritten / mm stimmt das. Ich habe 
aber durch eine etwas andere Mechanik (drehbewegung wírd in 
linearbewegung umgewandelt) 214.4xxx Schritte / mm. Das ist leider nur 
durch einen Mechanikumbau zu ändern, der aber nicht möglich ist. Ich 
habe ab er immer noch keine zündende Idee...

von Andreas G. (beastyk)


Lesenswert?

Kannst du da mit den Microsteps nichts machen?
Das is wirklich blöd mit der Linearführung/Steigung bei dir.

von AS (Gast)


Lesenswert?

Um eine Anpassung der Mechanik wirst Du wohl nicht herumkommen.

Selbst die 0.225°, bei Achtelschrittsteuerung, sind rein akademisch.
Nur ein paar µm mehr Abstand, Luft oder Metall im Motor und der
Schritt bei 45° ist doppelt so groß wie bei 30°.
Die mechanische Auflösung sollte mindestens 1/10 der geforderten
Toleranz betragen (mal etwas platt formuliert).

Differentielle Nichtlinearitäten gibts nicht nur bei ADCs oder
DACs, nein, auch bei Schrittmotoren.

Aber, reichen denn Deine ~21 Schritte pro ~0.1mm nicht?
Sind doch nur ~4.8% Fehler... ;-))

von Purzel H. (hacky)


Lesenswert?

Erst muss die Mechanik die Aufloesung dann auch bringen... In einer 
idealen Welt, mit reibungsfreier Mechanik mit belibig genauen 
Oberflaechen koennte man auch noch eine Schnecke an den Schrittmotor 
bauen. In der realen Welt ist man mit einer Umlaufspindel und einem 
Schrittmotor zufrieden.

Sonst gibt es dann noch Piezoantriebe..

von Tino K. (blumengiesser)


Lesenswert?

ja, da habe ich dann wohl mit der auslegung der mechanik geschlampert. 
ist es denn immer so, daß die steigung 1 mm beträgt oder so ausgelegt 
wird? dann ist das alles ziemlich einfach zu rechnen!
die Toleranzen des Systems lass ich hier in der rechnung einfach mal 
weg, ist in diesem Anwendungsfall nicht ganz so wichtig und auch mein 
erstes Projekt dahingehend. der fehler von 4,8% ist an sich nicht hoch, 
aber er tritt ja bei allen 0,1 schritten aus. Also wenn ich dem System 
sage mache 10 x 0.1mm, sind das knapp 40 schritte die fehlen. In summe 
dann knapp 0.2mm Fehler. Wenn ich dagegen mit einem mal 1mm bewege ist 
der fehler nur die 0.4 Schritte. Bewege ich mit 0.05, verdoppelt sich 
der Fehler da er ja aufsummiert wird...
Alles ziemlich kompliziert...

Trotzdem jemand eine Idee???

von Purzel H. (hacky)


Lesenswert?

Was soll's denn werden, ein AFM ?

von Sebel De Tutti (Gast)


Lesenswert?

Wenn ich Dich richtig verstehe ist das hier kein Problem mangelnder 
Auflösung sondern des Algorythmus.

Du kannst z.B. für jede Position die Anzahl Schritte ab einem 
definierten Ursprung berechnen. Wenn Du nun in Deinem Programm noch die 
Schritte vom Ursprung bis zu aktuellen Position speicherst muss Du nun 
nur noch eine Differenz bilden.....

von Bernadette (Gast)


Lesenswert?

Rechnet man mit 214 Schritten pro mm statt 214,4 ... so liegt der Fehler 
unter 0,2%.

Die ist bei jeder Strecke der gleiche prozentuale Fehler und nicht 4.8%.

Nach 5mm addiert man zwei Schritte und erhält somit im Schnitt 214,4 
Schritte. u.s.w.

Der Fehler liegt unter den Bauteilabweichungen, als kannst du ihn 
vergessen.


B.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

>>> Ich habe folgendes asuprobiert: Den Fehler, bei
>>> 1.0mm = 0.4, aufzuaddieren und wenn er größer 1 wird zu den
>>> Schrittimpulsen einer zuaddiert.
Diese Denkweise kommt von einem Herrn Bresenham:
http://de.wikipedia.org/wiki/Bresenham-Algorithmus

>>> Dies funktioniert nur bedingt, denn es handelt sich bei der Berechnung
>>> der Position wieder um Kommazahlen
Ich würde hier meine Koordinaten in µm in Long-Werten rechnen. Dann 
braucht es dazu keinerlei Fließkommazahlen, die übrigens auch nur 6-7 
signifikante Stellen haben...

>>> und irgendwann springt die Stelle einen Wert weiter und es steht
>>> im Display nicht mehr x.10 sondern x.11 (oder x.99).
Du könntest mit 21 Schritten pro 100um auf 4,7 µm auflösen. Da sollte 
eine solche Falschanzeige eigentlich nicht passieren...

1
#define PM_PER_STEP 4664179UL // Ausreichend genau: Picometer?
2
unsigned long akt_pos;   // in um
3
long fehler;             // in pm
4
5
  if (Step) {
6
     if (Richtung==HOCH)  { 
7
        akt_pos += 5; 
8
        fehler  += PM_PER_STEP-5000000UL;
9
     }
10
     else {
11
        akt_pos -= 5;
12
        fehler  -= PM_PER_STEP-5000000UL;
13
     }
14
  }
15
  if (fehler>500000) {
16
    akt_pos += 1;
17
    fehler  -= 1000000;
18
  }
19
  if (fehler<-500000) {
20
    akt_pos -= 1;
21
    fehler  += 1000000;
22
  }

von Tino K. (blumengiesser)


Lesenswert?

Danke vielmals an alle. Das ich hier den Herrn Bresenham nachahmen 
wollte ist ja toll. Jetzt habe ich auch gleich noch was gelernt.

Zum Problem selber habe ich den Lösungsvorschlag von  Sebel De Tutti 
umgesetzt. Das funktioniert echt super! Einfach die Schritte für die 
auktuelle Koordinate in mm berechnen und dann von den letzten Schritten 
abziehen. Damit ist der Fehler immer nur max. 1 Schritt auf die aktuelle 
Position gesehen. Perfekt!

Der Sinn des ganzen ist die Fokussteuerung von meinem neuen Teleskop. 
Dieser muß im 0.1 mm Bereich eingestellt werden. Mal sehen wie gut es 
klappt wenn ich hier fertig bin...

Danke, Tino

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.