Schrittmotor Beschleunigung Berechnung

Gast #4469946
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.
#4469971
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.
Gast #4470025
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?
#4470090
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...
(Firma: mechapro GmbH) Persönliche Seite #4470597
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
Gast #4470664
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
Angehängte Dateien:

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren