Habe mal den Code überarbeitet (ungetestet) - die if-Konstruktionen überarbeitet und ein LineData entfernt, da es ja sowieso bei jedem Schleifendurchlauf neu eingelesen wird.
Code:
#include "asuro.h" // Linienverfolgung auf die einfachste Art
#define tol 15
int main(void)
{
unsigned int data[2]; //Speicher bereitstellen
Init();
FrontLED(ON); // Linienbeleuchtung einschalten
MotorDir(FWD,FWD); // Beide Motoren auf vorwärts
while(1) // Endlosschleife, ASURO soll beliebig
{
LineData(data); // aktuelle Helligkeitswerte der
// Fototransistoren einlesen
if (data [0] > data [1] + tol )
{
MotorSpeed(140,80);
MotorDir(FWD,RWD);
}
else if (data [1] > data [0] + tol )
{
MotorSpeed(80,140);
MotorDir(RWD,FWD);
}
else
{
MotorSpeed(120,120);
MotorDir(FWD,FWD);
}
}
return 0;
}
Am Programm selber kann man nicht mehr viel Laufzeit optimieren.
Du kannst noch ein wenig mit den Geschwindigkeitswerten und der Toleranz spielen, dadurch lässt sich das noch optimieren.
Außerdem ist das Rückwärtsdrehen der Motoren kontraproduktiv. Du willst ja voran kommen. Wenn er oft die Drehrichtung FWD/RWD ändern muss, bleibt er eher auf der Stelle stehen. Also lieber den Motor, der bisher rückwärts fuhr in Vorwärtsrichtung drehen lassen, vielleicht mit geringer Geschwindigkeit.
Da musst du viel probieren. Aber Versuch macht klug 
Ansonsten stößt dieses Regelverhalten halt irgendwann an seine Grenzen. Ist ja ein Zweipunktregler. Man könnte es einmal mit einem P-Regler (Software) versuchen.
Auch eine andere Anordnung der Sensoren (Abstand) kann viel am Regelungsverhalten ändern. Frage ist eben: willst du der Linie sehr präzise und langsam folgen oder grob und schnell ? Je schneller man folgen will, desto weiter sollten die Sensoren auseinander.
Grüße,
Bernhard
Lesezeichen