Hallo
Schön, dass es funktioniert. Der Grundgedanke war, dass nach dem ersten Umschalten vor der ADC0-Lesung die Referenz noch nicht komplett umgeschaltet ist, bei der ADC1-Lesung dies dann aber abgeschlossen ist.
Ja, man könnte die Referenz auch selbst aktiv umschalten. Die Referenz wird mit REFS0 und REFS1 im ADMUX-Register festgelegt. Nur REFS0 gesetzt bedeutet externe Referenz, beide gesetzt bedeutet interene Referenz. Spannenderweise wird in PollSwitch() nach dem Setzen der Referenz kurz gewartet und erst dann die Wandlung gestartet:
Code:
/* function to read out switches */
unsigned char PollSwitch (void)
{
... ADMUX = (1 << REFS0) | SWITCH; // AVCC reference with external capacitor
Sleep(10);
ADCSRA |= (1 << ADSC); // Start conversion
...
}
(Auschnitt aus asuro.c v3.2)
Möglicherweise würde eine entsprechende Wartezeit in ThermalData() das Problem der Referenzumschaltung lösen.
Warum werden bei den Funktionen unterschiedliche Referenzen verwendet? Bei PollSwitch() wird ein Spannungsteiler verwendet der mit der Batteriespannung gespeist wird. Auch wenn sich die Akkuspannung ändert bleiben die Verhältnisse zwischen den Tastenwiderständen gleich, die Messung wird nicht beeinflußt. Anders das Snake-Vision. Um mit den Wärmesensoren gute Ergebnisse zu erzielen wurde auf der Platine ein 5V-Spannungsregler (getrieben über die Ladungspumpe um OCR2) zur Versorgung eingebaut. Deshalb schwanken die Ausgangsspannungen des Moduls nicht mit der Akkusspannung und deshalb muss man diese Spannungen mit der internen 2,56V-Referenz des ADC messen.
Über die Umschaltprobleme der Referenz bin ich kürzlich schon mal gestolpert, dabei ging es um die Akkuspannungsmessung bei der bee:
http://www.roboter.cc/index.php?opti...Itemid=20#1784
Gruß
mic
Lesezeichen