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?
quelle
Antworten:
Was Sie suchen, wird als Trapezgeschwindigkeitsprofil bezeichnet .
Es besteht keine Notwendigkeit, Sündenwellen zu verwenden. Eine gleichmäßige Bewegung kann erreicht werden, indem die Geschwindigkeit einfach linear auf ihr Maximum erhöht, dort gehalten und dann wieder heruntergefahren wird. Viele CNC-Fräsmaschinen und -Roboter verwenden diese Art von Profil.
Wenn Sie eine super gleichmäßige Bewegung wünschen , können Sie sich für ein S-Kurven-Profil entscheiden.
Die Mathematik dafür ist erheblich schwieriger, aber die Bewegung ist wunderschön. In diesem Video zeigen sie, wie sich die beiden Bewegungsprofile auf ein Glas Wasser auswirken.
quelle
Anstatt Ihre Rampenwerte in einem Array zu platzieren, berechnen Sie sie einfach im laufenden Betrieb, wenn Ihr Arduino über genügend Leistung verfügt:
Sie können die Gleichung nach Bedarf anpassen.
quelle