Hallo
Wie man im Diagramm oben schön erkennen kann ist der Werteverlauf annähernd sinusförmig.
Die Aufgabe besteht jetzt darin, sich einen Schwellenwert auszusuchen, an dem man den Übergang von schwarz auf weiß oder umgekehrt definiert.
Ohne Schwellwerte funktioniert es auch gut wenn man eine kleine Anzahl (3-7?) von Werten auf auf- oder absteigend prüft. Das kann man ungefähr so zusammenbasteln (nur links):
Code:
OdometrieData(data);
if ((data[0]<o1_l) && (o1_l<o2_l) && (o2_l<o3_l)) {
if (!odo_bit_l) {
count_l ++;
odo_bit_l=(1==1);
StatusLED(YELLOW);
}
}
if ((data[0]>o1_l) && (o1_l>o2_l) && (o2_l>o3_l)) {
if (odo_bit_l) {
count_l ++;
odo_bit_l=(1==0);
StatusLED(OFF);
}
}
o3_l=o2_l;
o2_l=o1_l;
o1_l=data[0];
(aus https://www.roboternetz.de/phpBB2/ze...=267922#267922)
o1_l bis o3_l sind die alten Odo-Werte, count_l der Segmentezähler und odo_bit_l ist der Merker für die letzte Flanke. Die IFs prüfen ob alle Werte aufsteigend bzw. abfallend sind. Die StatusLED() blinkt im Wechsel der Segmente (wenn man von Hand das Rad dreht). Das sieht leider etwas unübersichtlich aus :)
Gruß
mic
[Edit]
Als fertige Funktion könnte das dann z.B. so aussehen:
Code:
#include "asuro.h"
unsigned int count_l,count_r, data[2];
unsigned char odo_bit_l, odo_bit_r;
unsigned int odo_l_0, odo_l_1, odo_l_2, odo_l_3;
unsigned int odo_r_0, odo_r_1, odo_r_2, odo_r_3;
void count(void) {
OdometrieData(data);
odo_l_3=odo_l_2;odo_l_2=odo_l_1;odo_l_1=odo_l_0;odo_l_0=data[0];
if ((!odo_bit_l) && (odo_l_0<odo_l_1) && (odo_l_1<odo_l_2) && (odo_l_2<odo_l_3)) {
count_l ++; odo_bit_l=(1==1); StatusLED(YELLOW);
}
if ((odo_bit_l) && (odo_l_0>odo_l_1) && (odo_l_1>odo_l_2) && (odo_l_2>odo_l_3)) {
count_l ++; odo_bit_l=(1==0); StatusLED(OFF);
}
odo_r_3=odo_r_2;odo_r_2=odo_r_1;odo_r_1=odo_r_0;odo_r_0=data[1];
if ((!odo_bit_r) && (odo_r_0<odo_r_1) && (odo_r_1<odo_r_2) && (odo_r_2<odo_r_3)) {
count_r ++; odo_bit_r=(1==1); StatusLED(RED);
}
if ((odo_bit_r) && (odo_r_0>odo_r_1) && (odo_r_1>odo_r_2) && (odo_r_2>odo_r_3)) {
count_r ++; odo_bit_r=(1==0); StatusLED(OFF);
}
}
int main(void)
{
Init();
while(1) count();
return(0);
}
Lesezeichen