vklaffehn
11.06.2013, 23: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...
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...