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:
Das sind die orginalen Kommentare. Vermutlich gibt es deshalb die Kalibrierfunktion die ich allerdings noch nie genauer untersucht habe.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); } }
Gruß
mic







Zitieren

Lesezeichen