Problem mit der Odometrie Hardwarefehler? [gelöst]
Hallo Leute ich hab ein Problem mit der Odometrie. Wenn ich follgendes Programm flash, aus Mehr Spaß mit ASURO Band II etwas modofieziert:
Code:
#include "asuro.h"
/*Schwellwert für die Hell-/Dunkel-Unterscheidung. Eventuell muss damit etwas variiert werden.*/
#define TRIGGERLEVEL 600
#define HYSTERSIS 10
#define LOW 0
#define HIGH 1
#define SPEED 255
int main(void)
{
unsigned int data[2];
signed int status[2] = {0, 0};
signed int difference = 0;
Init();
MotorDir(FWD, FWD);
MotorSpeed(SPEED, SPEED);
while(1)
{
OdometrieData(data);
if ((status[0]==LOW) && (data[0]>TRIGGERLEVEL+HYSTERSIS)) /*Wenn linker Sensor von niedrig auf hoch wechselt*/
{
status[0]=HIGH;
difference++;
}
if ((status[0]==HIGH) && (data[0]<TRIGGERLEVEL-HYSTERSIS)) /*Wenn linker Sensor von hoch auf niedrig wechselt*/
{
status[0]=LOW;
difference++;
}
if ((status[1]==LOW) && (data[1]>TRIGGERLEVEL+HYSTERSIS)) /*Wenn rechter Sensor von niedrig auf hoch wechselt*/
{
status[1]=HIGH;
difference--;
}
if ((status[1]==HIGH) && (data[1]<TRIGGERLEVEL-HYSTERSIS)) /*Wenn rechter Sensor von hoch auf neidrig wechselt*/
{
status[1]=LOW;
difference--;
}
PrintInt (difference);
if (difference<-SPEED) /*Sicherheitsabfragen*/
{
difference=-SPEED;
}
if (difference>SPEED)
{
difference=SPEED;
}
if (difference>0)
{
MotorSpeed(SPEED-difference, SPEED); /*Motoren einstellen*/
}
else if (difference<0)
{
MotorSpeed(SPEED, SPEED+difference);
}
if (SPEED-difference<=100)
{
difference=0;
}
}
}
Wenn ich dann die Daten abfrage kommt folgendes:
Code:
00000011111.....206206206206.......
und wenn 206 kommt bleibt das rechte Rad stehen. Könnte es ein Hardwaredefekt sein oder ist im Programm ein Fehler?
Vielen Dank im vorraus.
Liste der Anhänge anzeigen (Anzahl: 1)
Lass dir zuerst mal deine Werte für die Odometrie ausgeben.
Im Anhang als Beispiel meine Werte.
Du brauchst dir nur in Excel von beiden Odometriereihen den Mittelwert bilden lassen und fertig.
Die Hysterese kannst du dir sparen da es sich ja eh nur um ungefähre Mittelwerte handelt. Außerdem sind die Amplituden der Sinuswellen so groß dass die +-10 der Hysterese nicht ins Gewicht fällt.
Hier ein Beispiel wie du den links und rechts zurückgelegten Weg bekommst. Die von dir gewünschte Differenz ist halt dann einfach counter_l-counter_r
Übrigens entspricht 1 Tick 3mm Fahrstrecke bei der 8er Odometriescheibe.
Code:
//alle folgenden Variablen sind vom typ int
OdometrieData(odata);
if(odata[0]<ODOMETRIE_L && flag_l==0)
{
counter_l++;
flag_l=1;
}
else if(odata[0]>ODOMETRIE_L && flag_l==1)
{
counter_l++;
flag_l=0;
}
if(odata[1]<ODOMETRIE_R && flag_r==0)
{
counter_r++;
flag_r=1;
}
else if(odata[1]>ODOMETRIE_R && flag_r==1)
{
counter_r++;
flag_r=0;
}