Hallo,
eine erste Alpha-Version der MobaToools mit Stepperrampe steht zur Verfügung.
Wie schon oben angedeutet, geht dies erstmal nur für einen vollständigen Weg: Anfahren, konstant drehen, Abbremsen. Die Parameter während der Bewegung ändern funktioniert noch nicht. Allerdings funktioniert es auch, wenn der zu fahrende Weg zu kurz für die vollständige Rampe ist. Dann wird die Anfahrrampe verkürzt, und der Bremsvorgang vorzeitig eingeleitet. Die Endgeschwindigkeit wird dann nicht erreicht.
Die Definition der Anfahrrampe läuft etwas anders als bei der Accelstepper. Das Ganze ist nicht zeitbasiert, sondern Step- bzw weg-basiert. Zur Definition der Beschleunigung gibt man die Rampenlänge in Steps an. Nach dieser Anzahl von Steps ( vom Stillstand aus ) wird dann die eingestellte Endgeschwindigkeit erreicht.
Da im IRQ alles mit maximal 16-Bit Integer berechnet wird, und ich grundsätzlich float vermeiden will, gibt es ein paar Einschränkungen, die aber meiner Meinug nach nur in selten Fällen relevant sein sollten:
- Die kleinste Schrittgeschwindigkeit ist 1 Step in 10sec. Kleinere Geschwindigkeiten müssen mit Einzelsteps im Sketch realisiert werden. ( war aber bisher auch schon so )
- Die höchte Schrittgeschwindigkeit sind 1250 Steps/sec. Das ist ähnlich wie bei der Accel-Stepper, bei der auch Stepraten über 1kHz als unzuverlässig angegeben sind. Hier ist die Grenze aber fix. Wird eine höhere Geschwindigkeit eingestellt, wird intern auf dieses Maximum begrenzt. Auch das ist nicht neu.
- Die maximale Länge der Rampe ist von der Schrittgeschwindigkeit abhängig.
Dabei gilt ca. : Rampenlänge/Steps < ( 13 * Schrittgeschwindigkeit in Steps/sec ) - Rampenoffset
Dabei ist 'Rampenoffset' eine Konstante, die derzeit auf '16' steht, und das Verhalten am Anfang (beim Beschleunigen) bzw. am Ende ( beim Bremsen) der Rampe beeinflusst. Der Wert steht in MobaTools.h, und wer will kann da auch mal ein bisschen mit spielen :1
2
#define RAMPOFFSET 16 // startvaue of rampcounter
Die maximale Rampenlänge bis Höchstgeschwindigkeit sind dann 16000 Steps, was aber eigentlich eh keinen rechten Sinn mehr macht.
Bei sehr kleinen Schrittgeschwindigkeiten ist gar keine Rampe mehr möglich, meiner Meinung nach aber auch da nicht wirklich sinnvoll.
Natürlich gibt es nun ein paar neue Methoden, um die Rampe einzustellen:
1
2
3
4
5
void setSpeedSteps( uint16_t speed10 ); // set speed withput changing ramp
void setSpeedSteps( uint16_t speed10, int16_t rampLen ); // set speed and ramp
void setRampLen( uint16_t rampLen ); // set new ramplen in steps without changing speed
void rotate(int8_t direction ); // rotate endless until 'stop',
- setSpeedSteps
setzt die Geschwindigkeit in Steps/10sec. Optional kann als 2. Parameter auch gleich die Rampenlänge in Steps mitgegeben werden - setRampLen
Setzt die Rampenlänge ohne die Geschwindigkeit zu verändern. - rotate(0)
Mit diesem Befehl wird sofort eine Bremsrampe eingeleitet. Derzeit funktioniert das nur richtig, wenn bereits die Zielgeschwindigkeit erreicht ist. - stop
Der Stop-Befehl führt wie bisher zum sofortigen Stop ohne Rampe ( Nothalt )
Wird nur die Geschwindigkeit verändert, ändert sich die Rampenlänge nicht. D.h. damit ändert sich die effektive Beschleunigung.
Bei den Beispielen ist auch ein Sketch (TestStepRamp) dabei, mit dem man die Steppermethoden über den Seriellen Monitor aufrufen kann. Zum Testen ist das vielleicht ganz nützlich.
In dieser Alpha-Version ist noch das Debugging aktiv. D.h. es werden ein paar Ausgaben auf dem seriellen Monitor gemacht, und A2/A3 sind für LA-Messungen reserviert. Abschalten lässt sich das mit diesen Zeilen in MobaTools.cpp:
1
2
3
//#define debugTP
//#define debugPrint
Bei Fragen oder Problemen - nur her damit
Ich freue mich auf euer Feedback