Hi ehenkes!
... kannst Du dies bitte mal näher erläutern, ...
Gerne!
(zu meiner Frage #3!)
Die ISP (Interrupt Service Routine) SIGNAL (SIG_ADC) läuft im Hintergrund 'fleissig' weiter!
Zwischen der Abfrage des Wertes für "tot_count" in der Zeile "tot_count += encoder[LEFT];"
und dem Zurücksetzen der beiden (Array-)Variablen "encoder[0/1]" mit der Zeile "EncoderSet(0,0);"
vergeht einige Zeit, in der sich der Inhalt sowohl von "encoder[LEFT]" als auch von
"encoder[RIGHT]" verändert haben kann! Und das bemerkt unser Programm überhaupt nicht: Also
können doch einige Tic's verloren gehen.
Wenn aber die Variable "enc_count" anstatt mit "tot_count" mit "encoder[LEFT]" verglichen
würde, gehen KEINE Tic's verloren und wir sparen uns noch den (Assembler-)Code der Zeile "EncoderSet(0,0);" und last not least brauchen wir auch die Var. "int tot_count" nicht!
Code:
void Go (int distance, int speed)
{
uint32_t enc_count;
int tot_count = 0;
int diff = 0;
int l_speed = speed, r_speed = speed;
// calculation tics/mm
enc_count=abs(distance)*10000L;
enc_count/=MY_GO_ENC_COUNT_VALUE;
EncoderSet(0,0); // reset encoder
MotorSpeed(l_speed,r_speed);
if (distance<0) MotorDir(RWD,RWD);
else MotorDir(FWD,FWD);
while (tot_count<enc_count)
/*++++++++++++++++++++++++++*/
{
tot_count += encoder[LEFT];
/***************************/
diff = encoder[LEFT] - encoder[RIGHT];
if (diff > 0)
{ //Left faster than right
if ((l_speed > speed) || (r_speed > 244)) l_speed -= 10;
else r_speed += 10;
}
if (diff < 0)
{ //Right faster than left
if ((r_speed > speed) || (l_speed > 244)) r_speed -= 10;
else l_speed += 10;
}
EncoderSet(0,0); // reset encoder
/****************/
MotorSpeed(l_speed,r_speed);
Msleep(1);
}
MotorDir(BREAK,BREAK);
Msleep(200);
}
Gibt es auch 'ne Meinung/Antwort zu meiner Frage #2?
cu Helmut
Lesezeichen