Ich habe einen Schrittmotor (gesteuert von einem Arduino), der einige Gänge und eine Riemenscheibe bewegt. Das Problem ist, dass die Riemenscheibe stark ruckelt: Die Bewegung beginnt und stoppt zu plötzlich. Um die Bewegung flüssiger zu machen, denke ich, dass ich eine Art Rampe verwenden kann: Die erste Bewegung ist langsam, wenn die Motoren die Geschwindigkeit erreicht haben, die sie weiterlaufen, und verlangsamt sich dann sanft.
Ich habe versucht, eine Sinuswelle auf diese Weise zu verwenden:
// generate ramp
float t = 0;
float deltat = PI/(200+1)
for(int i=0; i<200; i++) {
ramp[i] = 1000 - sin(t)*900;
t += deltat;
}
Jetzt habe ich eine Rampe mit 200 Elementen, die nach einer Sinuswelle von 1000 (sehr langsam) auf 100 (sehr schnell) geht. Jetzt bewege ich den Motor mit diesem Code:
for(int i=0; i<200; i++) {
int delay_velocity = ramp[i];
digitalWrite(STEP_PIN, HIGH);
delayMicroseconds(delay_velocity);
digitalWrite(STEP_PIN, LOW);
delayMicroseconds(delay_velocity);
}
Das funktioniert ganz gut: Die Riemenscheibe ruckelt nicht so stark und ich habe die Kontrolle darüber, wie viele Schritte zu tun sind.
Diese Umgehung hat aber auch Probleme:
- Ich kann keine Rampen sehr lang machen (aufgrund eines Überlaufs in atmega) - sagen wir, ein Array darf nicht länger als 400 Elemente mehr oder weniger sein (es hängt davon ab, wie lang die Arduino-Skizze ist).
- Ich habe die Kontrolle darüber, wie viele Schritte, aber ich habe keine Ahnung, wie lange es dauert, bis es fertig ist (ich denke, ich kann es mit einer Summe oder einem Integral berechnen, aber es ist nicht so praktisch).
Also suche ich nach einem anderen Weg, um meine Bewegung zu glätten. Ich denke, ich kann eine andere Kurve anstelle einer Sinuswelle haben. so etwas mehr?
Bis jetzt habe ich nicht daran gedacht, die Rampe in einem Computer zu generieren und sie dann an Arduino weiterzugeben, könnte aber eine Möglichkeit sein.
ein Ratschlag? Gedanken?