eine motorische Bewegung glätten

7

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?

Geben Sie hier die Bildbeschreibung ein

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?

nkint
quelle
Benötigen Sie Hilfe? Kann ich den vollständigen Arbeitscode erhalten, bei dem Sie eine Rampenschritt-Dir-Ausgabe auf zwei Pins haben? Ich bin an dem ersten Code interessiert, den Sie gepostet haben. Ich kann den Rest wegen meiner schlechten Programmierkenntnisse nicht herausfinden. oder nur die Rampenteile mit allen Erklärungen vollständig, damit ich ein Verständnis bekommen kann. Ich fahre ein Dugong DC-Laufwerk mit einem Arduino Uno.
Ich spreche über Schrittmotor .. nie einen Gleichstrommotor verwendet
nkint

Antworten:

7

Was Sie suchen, wird als Trapezgeschwindigkeitsprofil bezeichnet .

Trapezgeschwindigkeitsprofil

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.

S-Kurvenprofil

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.

Raketenmagnet
quelle
Wow, ja, es ist genau das, wonach ich gesucht habe. Haben Sie auch einige Links zur Implementierung?
Nkint
Ich bezweifle wirklich, dass das Video die Trapezgeschwindigkeit gegenüber der Geschwindigkeit der S-Kurve zeigt. Es sieht aus wie überhaupt keine Beschleunigung gegenüber linearer Beschleunigung.
Connor Wolf
Ich denke, sie bedeuten, dass ein lineares Beschleunigungsprofil ein s-gekrümmtes Verschiebungsprofil erzeugt .
Connor Wolf
@FakeName - Ja, jetzt, wo ich es wieder sehe, ist es schwer zu sehen, dass eine Beschleunigung stattfindet. Es kann sein, dass die Beschleunigungsphase so kurz ist, dass sie im Video nicht erkannt werden kann. In diesem Fall ist es auch kein fairer Test.
Raketenmagnet
@Rocketmagnet - Oh, ich sehe sicherlich Beschleunigung , aber ich sehe nicht , rampen Beschleunigung. Es sieht für mich nach einer geraden linearen Beschleunigung aus.
Connor Wolf
0

Anstatt Ihre Rampenwerte in einem Array zu platzieren, berechnen Sie sie einfach im laufenden Betrieb, wenn Ihr Arduino über genügend Leistung verfügt:

function ramp (int i)
{
    return 1000 - sin(t * i) * 900;
}

Sie können die Gleichung nach Bedarf anpassen.

Robert Harvey
quelle
Nein, dieser Kompromiss Die Bewegung des Motors ist keine geeignete Lösung
nkint