Forum: Mikrocontroller und Digitale Elektronik Schrittmotor Beschleunigung Berechnung


von Osccon (Gast)


Lesenswert?

Hi,
ich möchte einen Schrittmotor linear beschleunigen.
Dafür habe ich mir folgende Gleichungen zur Berechnung der 
Zeitintervalle zwischen den einzelnen Schritten überlegt:

Das funktioniert soweit in der Theorie wunderbar und ich bekomme auch 
realistische Werte heraus, wenn ich das in C++ auf dem PC probiere.

Beispiel Werte bei w = 1000 und w' = 1000:
0,0010000000
0,0009990010
0,0009980050
0,0009970119
0,0009960219
0,0009950347
0,0009940505
0,0009930692
0,0009920909
0,0009911154

Jetzt habe ich auf dem Mikrokontroller(PIC18F46K80) ja nur begrenzte 
Möglichkeiten und das Rechnen mit Festkommazahlen ist deutlich einfacher 
und schneller als mit Fließkommazahlen.
Zudem habe ich nur einen 16 Bit Timer zur Verfügung, der mit 1MHz zählt.
Deshalb habe ich mir gedacht, dass ich die Einheiten etwas anpasse:

Beispiel Werte bei w = 1000 und w' = 1000:
65,5360000000
00,9849705423
00,9706021622
00,9568476443
00,9436643724
00,9310137675
00,9188608093
00,9071736237
00,8959231283
00,8850827252

Wie man unschwer sehen kann, gibt es einen großen Sprung nach dem ersten 
Wert und die restlichen Werte sind kleiner als 1.
Wo liegt mein Denkfehler?
Ich habe eigentlich erwartet Werte über 1 zu erhalten und den großen 
Sprung kann ich mir überhaupt nicht erklären.

von Pandur S. (jetztnicht)


Lesenswert?

Und das Ganze wird als 32 bit gerechnet ? Nein, 16 bit ?
Schau mal nach den einzelnen Zahlen, was die als Integer bedeuten. 
65536/0 wird nicht so gut sein denk ich.

Die ganze Rechnung wird man stark umformen muessen, dass sie rechenbar 
bleibt.

Also Simulator anwerfen und jeden Schritt vergleichen.

von Osccon (Gast)


Lesenswert?

Oder D. schrieb:
> Und das Ganze wird als 32 bit gerechnet ? Nein, 16 bit ?
> Schau mal nach den einzelnen Zahlen, was die als Integer bedeuten.
> 65536/0 wird nicht so gut sein denk ich.
>
> Die ganze Rechnung wird man stark umformen muessen, dass sie rechenbar
> bleibt.
>
> Also Simulator anwerfen und jeden Schritt vergleichen.

Das ganze wurde mit 64 Bit Fließkommazahl gerechnet.
Außerdem habe ich geprüft ob es zu einer Division durch 0 kommt was aber 
nicht zutrifft.
Ich verstehe aber nicht, warum ich nicht die Einheit 1 Sekunde in 32768 
Mikro Sekunden austauschen kann?
Warum geht das nicht so, wie ich mir das denke?

von Joe F. (easylife)


Lesenswert?

Bisschen kompliziert, oder?
Wenn du linear beschleunigen willst, reicht es doch, dass du von deinem 
Zeitintervall in jedem Durchgang einen festen Betrag abziehst...

In deinem Fließkomma-Fall wäre das ca. -0,000000999
Wenn du deine Fließkommaberechnung mit 65536 multiplizierst, müsstest du 
in jedem Durchgang 0,065470464 abziehen...

Passt noch nicht wirklich zu Integer...

: Bearbeitet durch User
von Wolfgang A. (Gast)


Lesenswert?

Guck dir mal die Atmel AppNote AVR446 "Linear speed control of stepper 
motor" an. Da steht einiges zur Berechnung und Beispielcode in C.

von Thorsten O. (Firma: mechapro GmbH) (ostermann) Benutzerseite


Lesenswert?

Hallo Joe,

> Bisschen kompliziert, oder?
> Wenn du linear beschleunigen willst, reicht es doch, dass du von deinem
> Zeitintervall in jedem Durchgang einen festen Betrag abziehst...

Nein, dass ist falsch. Dann beschleunigt man nicht linear:

v=s/t. s ist beim Schrittmotor konstant, eine lineare Änderung von t 
führt zu einer Hyperbel-förmigen Beschleunigung. Was sehr ungünstig ist, 
weil ein Schrittmotor bei hohen Drehzahlen ohnehin weniger Drehmoment 
aufbringt als bei niedrigen Drehzahlen.

Es gibt aber Verfahren zur Rampenberechnung, die mit einer Tabelle und 
einer einfachen Festkomma-Multiplikation auskommen. Vermutlich ist das 
auch in der Appnote von Atmel so beschrieben.

Mit freundlichen Grüßen
Thorsten Ostermann

von Pieter (Gast)


Angehängte Dateien:

Lesenswert?

moin moin,

als Beschleunigungskurve nehme ich für die Schrittmotore an meiner Fräse 
eine SIN^2-Kurve. Die Beschleunigung hat dann eine Glockenform, erst 
langsam anfahren und abbremsen am Ende. Bei linearer Beschleunigung 
ergibt sich am Anfang und Ende jeweils ein Sprung in der Bewegung.
Anbei eine Excel-Tabelle mit der Berechnung.

Mit Gruß
Pieter

von Lötpunkt (Gast)


Lesenswert?

Hallo Osccon,

wenn Du den Bruch im Divdenten um 65536 erweiterst, dann mußt Du das 
auch (für alle Summanden) des Divisors machen.

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.