Moin zusammen,
ich würde gerne einen Schrittmotor mit einer Konstanten Beschleunigung
auf eine gewünschte Geschwindigkeit beschleunigen.
Da der zurückgelegte Weg aber leider nicht Linear zu Geschwindigkeit
steigt, würde ich hierfür gerne für jeden Schritt das Delay neu
berechnen.
Hier mal ein schneller Versuch.
Durch die Steps weiß ich, welchen Weg ich zurück gelegt habe. Da ich die
Beschleunigung kenne, kann ich mir die Zeit ausrechnen, welche ich für
die Strecke bei der konstanten Beschleunigung benötigt habe.
Über die Zeit kann ich mir dann die Geschwindigkeit ausrechnen, mit
welcher sich der Schrittmotor drehen muss.
Prinzipiell funktioniert die Routine. Aber die ist sehr rechenintensiv
(8289 Zyklen war ca. 518us entspricht).
Gibt es da eine schönere Lösung?
Die Beschleunigung und Geschwindigkeit will ich Variabel halten. Zwar
jetzt nicht während einer Positionierung ändern, aber eventuell zwischen
zwei Positionierungen.
1 | volatile uint32_t steps =0;
|
2 | volatile float Frequenz =0; // Herz
|
3 | volatile float Geschwindigkeit =40.0; // mm/s
|
4 | volatile float Beschleunigung =40.0; // mm/s²
|
5 | volatile float Steps_pro_mm =160; // Schritte Pro Millimeter
|
6 |
|
7 | int main(void)
|
8 | {
|
9 | while(1)
|
10 | {
|
11 | Frequenz=sqrt((steps/Steps_pro_mm)/0.5/Beschleunigung)*Geschwindigkeit*Steps_pro_mm;
|
12 | }
|
13 | }
|