Zitat von
HAWK-Matze
3.: In welchem Bereich sich die Werte bewegen ist egal, hauptsache, sie sind immer im gleichen bereich, dass sollte bei dir gewährleistet sein
Ich hab nen Programm geschrieben, da wird der Mittelwert der Odometrie-Werte immer wieder neu gebildet.
Ne kleine Hysterese von 10 hab ich auch eingebaut, dürfte aber auch ohne Funktionieren, hab ich aber noch nicht getestet.
Mit dem Programm fährt er ziemlich genau geradeaus.
Allerdings je langsamer mal ihn stellt, umso ungenauer wird die Geradeausfahrt.
Edit: Hier mal meine neue Version mit Tasterabfrage.
Code:
#include "asuro.h"
int main(void) {
unsigned int odo_max_l,odo_max_r,odo_min_l,odo_min_r,odo_mitte_l,odo_mitte_r,data[2];
unsigned char auf_l,auf_r,speed,speed_wert,speed_l,speed_r,zaehler_l,zaehler_r,schwing,rueckw,dreh_l,dreh_r,taste;;
unsigned long dauer1,dauer2;
Init();
MotorDir(FWD,FWD);
auf_r=auf_l=0;
zaehler_r=zaehler_l=rueckw=dreh_l=dreh_r=0;
odo_max_l=odo_max_r=odo_min_l=odo_min_r=300;
speed=120;
speed_l=speed_r=speed;
speed_wert=(speed/20);
MotorSpeed(speed_l,speed_r);
while(1) {
for(schwing=0;schwing<30;schwing++) {
dauer1=Gettime();
odo_max_l--;
odo_max_r--;
odo_min_l++;
odo_min_r++;
OdometrieData(data);
if (data[0]>odo_max_l) {odo_max_l=data[0];}
if (data[1]>odo_max_r) {odo_max_r=data[1];}
if (data[0]<odo_min_l) {odo_min_l=data[0];}
if (data[1]<odo_min_r) {odo_min_r=data[1];}
odo_mitte_l=(odo_max_l+odo_min_l)/2;
odo_mitte_r=(odo_max_r+odo_min_r)/2;
if ((auf_l==0) && (data[0]>(odo_mitte_l+5))) {
auf_l=1;
zaehler_l++;
}
else if ((auf_l==1) && (data[0]<(odo_mitte_l-5))) {
auf_l=0;
}
if ((auf_r==0) && (data[1]>(odo_mitte_r+5))) {
auf_r=1;
zaehler_r++;
}
else if ((auf_r==1) && (data[1]<(odo_mitte_r-5))) {
auf_r=0;
}
dauer2=Gettime();
while ((dauer1+5)>dauer2) {dauer2=Gettime();}
}
if (zaehler_l<speed_wert) {speed_l=speed_l+speed_wert;}
else if (zaehler_l>speed_wert) {speed_l=speed_l-speed_wert;}
if (zaehler_r<speed_wert) {speed_r=speed_r+speed_wert;}
else if (zaehler_r>speed_wert) {speed_r=speed_r-speed_wert;}
zaehler_l=zaehler_r=0;
if (PollSwitch()>0) {
taste=PollSwitch();
if (taste==1) {dreh_l=(800/speed);}
if ((taste==2) || (taste==4)) {dreh_r=(1200/speed);}
if (taste==31) {dreh_r=(800/speed);}
if ((taste==8) || (taste==16)) {dreh_l=(1200/speed);}
}
if (dreh_l>0) {
MotorDir(RWD,BREAK);
dreh_l--;
}
else if (dreh_r>0) {
MotorDir(BREAK,RWD);
dreh_r--;
}
else {
MotorDir(FWD,FWD);
}
MotorSpeed(speed_l,speed_r);
}
return 0;
}
Lesezeichen