PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Beschleunigungsrampe für Schrittmotor (ohne Timer bitte!)?



vklaffehn
11.06.2013, 22:50
Moin!

Ich bin immer noch im Optimierungswahn und habe eine Weile recherchiert, wie man denn so eine Beschleunigungsrampe umsezt, allerdings finde ich hauptsächlich Lösungen, die mit zwei Timern arbeiten. In meinem Fall sind aber keine Timer nínvolviert, sondern einfach eine Schleife mit Verzögerung nach jedem Step. Ich habe dazu folgenden Code (c, aber eigentlich leicht zu durchschauen):


for (cnt=0;cnt<steps;cnt++)
{
step_x(dir);

//accelerate
if (cnt < 64)
{
delay=speed + pgm_read_byte(&(ramp[cnt]));
}

//brake
if (steps-cnt < 64)
{
delay = speed + pgm_read_byte(&(ramp[64-(cnt & 31)]));
}

//topspeed
if ( (cnt>= 64) & (steps-cnt <= 64))
{
delay = speed + pgm_read_byte(&(ramp[63]));
}
_vdelay_us(delay);


delay=speed + pgm_read_byte(&(ramp[cnt]));
liest den We an Stelle cnt aus

unsigned char ramp[64]PROGMEM =
{
255,170,128,102,85,73,64,56,51,46,42,39,36,34,32,3 0,28,26,25,24,23,22,21,20,19,18,18,17,17,16,16,15, 15,14,14,13,13,13,12,12,12,11,11,11,11,10,10,10,10 ,10,9,9,9,9,9,8,8,8,8,8,8,8,8,7
};
aus.

Nun der Knackpunkt : wie kriege ich da vernünftige Werte rein, um eine lineare Rampe (oder auch gleichmäßige Beschleunigung) über die ersten 64 Schritte zu bekommen? Irgendwie reicht mein Mathe dafür nicht aus.
Und ja, bei weniger als 128 Schritten gehts im Moment schief, aber das kommt später :-)

Danke an Euch Genies!!!

- - - Aktualisiert - - -

Achso, im Anhang mal meine bisherigen Überlegungen in éinem Diagramm festgehalten.....

Jetzt habe ich aber wieder das Problem, das meine Rampe nicht abhängig von der Zeit sein soll, sondern über z.B. die ersten 64 Schritte gehen soll....
irgendwie steh ich auf dem Schlauch...

indeas
12.06.2013, 14:16
Hi,
ich mache es immer so:
void move_steps()
{
output_low(Driver_dir); // Links oder rechts
step16=0; // Variablen mit Startwerten besetzen
step_delay=step_delay_max; // Pause für low speed
while (step16<steps_to_go) // X Schritte gehen
{
output_high(driver_step); // Schritteingang des Treibers
delay_us(step_delay);
output_low(driver_step);
if (step_delay > step_delay_min) step_delay--; // step_delay_min= Pause für max speed
}
}

Funktioniert prima!

Joe23
19.06.2013, 22:57
Hi,

ganz anderer Ansatz ohne Timer: Schittmotor in Kombination mit einem Drehgeber ansteuern!

Der eingehende Puls des Gebers wird dazu verwendet den nächsten Schritt auszugeben. -> Hardwarebasierte Rampe -> Lastunabhängig!!!

Wurde bei alten Druckern so gemacht!

Gruß Joe

indeas
20.06.2013, 08:49
Ganz so einfach ist es nicht. Funktioniert theoretisch nur dann, wenn die Anzahl der Pulse des Drehgebers identisch mit der Anzahl der (Mikro-) Schritte des Steppers sind (und dazu die Phasenlage passt), bei 3200 Steps pro Umdrehung wird die Auswahl der Drehgeber sehr gering.
In der Praxis wird ein anderer (komplexerer) Algorithmus bei einem geschlossenen Regelkreis mit Stepper und Encoder verwendet.

Joe23
20.06.2013, 22:54
Hi Indeas,

da hast du vollkommen recht, Impulse müssen natürlich zu den Schritten passen...sollten am besten Fall aber sogar deutlich mehr als Schritte am Motor sein (Phasenlage).

3200 Steps ist jetzt nicht die Herausforderung. Impulsgeber mit 2500 Impulse/Umdrehung gibts es gebraucht für 10-20 Euro. Mit Quadraturauswertung kann ich hier schon 10000 Steps bedienen!

Klar gibt es diverse unterschiedliche Algorithmen: Stichwort "Close-Loop-Regelung" von Schrittmotoren.

Aber so viel geht ja aus der Anfrage von Klaffe auch nicht hervor...

Mir fehlen hier entscheidende Hinweise zur benötigten Auflösung, Kostenramen, Anwendungszweck...der Klassiker halt!

Gruß