So, da habe ich es nun geschafft nach Hause zu kommen.
Hier erst einmal der Code für die Funktion MotorSpeed()
Wer es selber einbauen möchte, findet die Funktion je nach LIB-Version in unterschiedlichen Dateien.
- Asuro-Original-CD in asuro.c
- Asuro-LIB bis Version V02.70rc2 in motor.c
- Asuro-LIB ab Version V02.70rc3 in motor_low.c
- In der nächsten Asuro-LIB dann auch vorhanden.
Code:
inline void MotorSpeed (
unsigned char left_speed,
unsigned char right_speed)
{
int l_speed;
int r_speed;
if (MY_MOTOR_DIFF != 0)
{
/*
Das Ganze macht nur Sinn, wenn mindestens ein Motor fahren soll.
*/
if (left_speed > 0 ||
right_speed > 0)
{
/*
Bei positivem MY_MOTOR_DIFF wird der rechte Motor verstaerkt.
Bei negativem MY_MOTOR_DIFF wird der linke Motor verstaerkt.
*/
l_speed = left_speed - MY_MOTOR_DIFF / 2;
r_speed = right_speed + MY_MOTOR_DIFF / 2;
/*
Wertebereich von 0 bis 255 pruefen.
Unterscheiden nach positiver, bzw. negativer Vorgabe.
*/
if (MY_MOTOR_DIFF > 0)
{
/*
Bei positivem MY_MOTOR_DIFF kann nur die rechte Seite > 255 werden.
*/
if (r_speed > 255)
{
/*
Um die Differenz von MY_MOTOR_DIFF weiterhin zu erhalten, wird nun
die linke Seite noch weiter reduziert, und die rechte Seite auf
das zulaessige Maximum gesetzt.
*/
l_speed -= (r_speed - 255);
r_speed = 255;
}
if (l_speed < 0)
{
/*
Die linke Seite ist nun unter dem zulaessige Minimum von 0.
Auch dies muss korrigiert werden.
*/
l_speed = 0;
}
}
else
{
/*
Bei negativem MY_MOTOR_DIFF kann nur die linke Seite > 255 werden.
*/
if (l_speed > 255)
{
/*
Um die Differenz von MY_MOTOR_DIFF weiterhin zu erhalten, wird nun
die rechte Seite noch weiter reduziert, und die linke Seite auf
das zulaessige Maximum gesetzt.
*/
r_speed -= (l_speed - 255);
l_speed = 255;
}
if (r_speed < 0)
{
/*
Die rechte Seite ist nun unter dem zulaessige Minimum von 0.
Auch dies muss korrigiert werden.
*/
r_speed = 0;
}
}
left_speed = l_speed;
right_speed = r_speed;
}
}
OCR1A = left_speed;
OCR1B = right_speed;
}
Keine Bange vor der Länge der Funktion.
Ist der Define für MY_MOTOR_DIFF mit 0 angegeben, wird gar kein zusätzlicher Code erzeugt. Sonst werden gerade mal um 45 Byte zusätzlich benötigt.
Gruß Sternthaler
P.S.: Ich habe mal mit verschiedenen Geschwindigkeiten die Wirkung getestet. Natürlich bekommt man keine gerade Fahrt über alle Geschwindigkeiten, allerdings sind die Abweichungen sehr gering.
Lesezeichen