Hallo
Fertigbausatz? Wenn's ein Bausatz war: Bauteile und Lötstellen kontrollieren. Testweise könntest du mal die ADCs tauschen. Hast du die Spannungen an den ADC-Pins schon mit einem Messgerät nachgemessen? Vielleicht ist es ein Problem des ADCs beim Umschalten des Kanals.
Da ich mein SnakeVision schon lange nicht mehr verwendet habe kann ich mich nicht mehr erinnern, wie sysmetrisch die Werte bei mir waren. Aber ein Blick in meine alten Programme zeigt erstaunliches:
Code:
// Teelichtlöschen mit SnakeVision 18.4.10 mic
#include "asuro-probot.h"
// Code für das SnakeVision stammt von hier:
// *******************************************
// * Snakevision für ASURO *
// * Verfolgt eine Wärmequelle *
// * *
// * *
// * *
// * *
// * (c) 2007 Robin Gruber *
// * Details zum Code in: *
// * "Mehr Spaß mit ASURO, Band II" *
// *******************************************
void SnakeData(unsigned int *data)
{
// ThermalData() funktioniert genauso, wie LineData(), ...
// ... nur dass dabei die interne Spannungsreferenz als ...
// ... AD-Wandlerreferenz verwendet wird.
// Prozessorinterne Referenz verwenden
// Multiplexer auf linken Sensor schalten
ADMUX = (1 << REFS0) | (1 << REFS1) | IR_LEFT;
// Wandlung starten
ADCSRA |= (1 << ADSC);
// Warten, bis Wandlung beendet
while (!(ADCSRA & (1 << ADIF)));
// ADCIF zurücksetzen
ADCSRA |= (1 << ADIF);
// ADC-Wert auslesen
data[0] = ADCL + (ADCH << 8);
// Prozessorinterne Referenz verwenden
// Multiplexer auf rechten Sensor schalten
ADMUX = (1 << REFS0) | (1 << REFS1) | IR_RIGHT;
// Wandlung starten
ADCSRA |= (1 << ADSC);
// Warten, bis Wandlung beendet
while (!(ADCSRA & (1 << ADIF)));
// ADCIF zurücksetzen
ADCSRA |= (1 << ADIF);
// ADC-Wert auslesen
data[1] = ADCL + (ADCH << 8)-100; // Korrektur der Seiten!
}
int main(void)
{
unsigned int data[2];
Init();
while(1)
{
SnakeData(data);
if(data[0]>data[1]) // Werte werden beim Einlesen korrigiert!
{
MotorDir(RWD,FWD);
MotorSpeed(150,150);
}
else
{
MotorDir(FWD, RWD);
MotorSpeed(150, 150);
}
PrintInt(data[0]);
SerPrint("-");
PrintInt(data[1]);
SerPrint("\n\r");
//Beep(300);
Msleep(300);
}
}
Das sind die orginalen Kommentare. Vermutlich gibt es deshalb die Kalibrierfunktion die ich allerdings noch nie genauer untersucht habe.
Gruß
mic
Lesezeichen