Aktelle Lib 2.7.1 und MY_MOTOR_DIFF
Moin
Da ich keinen passenden Thread zur Entwicklung der Lib finden konnte, mach ich mal nen Thread auf:
Mein Problem ist, dass in der Doku noch überhaupt nirgends die Implementierung von MY_MOTOR_DIFF zu finden ist. Ich wollte mir anschauen, wo dieses eigentlich einbezogen wird, aber kann es nicht finden, deswegen geh ich davon aus, das die tatsächlich LIB nicht konsistent zur Doku ist.
Ist dem so, oder bin ich zu blöd zum suchen?
mfg
Andun
Liste der Anhänge anzeigen (Anzahl: 1)
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.