PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : NiboBee analog_getValue() braucht Zeit?



Rabenauge
10.06.2010, 04:56
Hallöle.
Ich mal wieder... :-b

Bei meinen Spielereien mit dem Sharp-IR-Sensor benutze ich, um den Sensor auszuwerten, folgendes:

sharpTemp=analog_getValue(ANALOG_EXT3); // ADC-Wert holen

Funktioniert auch, aber ich bekomme nur Werte bis max. ungefähr 600.
Ich weiss (mittels einer anderen Methode funktioniert das auch!) aber, dass der Sharp bis 1023 _kann_.
Offenbar habe ich mit o.g. Vorgehensweise eine niedrigere Auflösung und grübele schon ein Weilchen, wieso...
Nachdem ich eben mein Pfadfinder-Programm die halbe Nacht beäugt habe, fiel mir auf, dass z.B. bei der Spannungsüberwachung (eine andere Vorgehensweise, aber auch ADC-Abfrage) ein delay() eingebaut ist.

Sollte ich nach oben genannter Zeile vielleicht auch mal 5 ms Pause einschieben, damit der Wert richtig ermittelt wird?

radbruch
10.06.2010, 09:27
Hallo

Was wird denn gemessen wenn du anstelle des Sharp nur eine Brücke zwischen Vcc und dem ADC-Pin machst?


Sollte ich nach oben genannter Zeile vielleicht auch mal 5 ms Pause einschiebenEine zusätzliche Wartezeit sollte nicht nötig sein. Mit analog_getValue() verwendest du den Einlesemechanismus aus analog.c Der ADC wandelt im Dauerlauf nacheinander alle ADC-Kanäle und speichert die jeweiligen Werte im Array analog_samples[]. Aus diesem Array kann man mit analog_getValue(x) immer den letzen Wert von ADC-Kanal X auslesen und verarbeiten.


mittels einer anderen Methode funktioniert das auch!Verwendet die andere Methode zufällig die interne 2,56V-Referenz?

Gruß

mic

Rabenauge
10.06.2010, 10:29
Deine erste Frage kann ich so jetzt nicht beantworten, dazu müsste ich das Bienchen erst auseinander nehmen (Vollverkleidung halt).

Und ja, die Spannungsmessung benutzt die interne Referenz, weil sich herausgestellt hat, dass sie die einzig zuverlässige an Bord ist.

Ähem...kann es sein, dass der ADC-Wert des Sharp _deswegen_ nicht stimmt?
Die Bienenbücherei benutzt doch auch für die Akkuspannungsmessung eben nicht die interne Referenz des Atmega?

radbruch
10.06.2010, 11:09
Der Sharp liefert knapp 3V (5V/1023*600) als Maximalwert, bei interner 2,5V Referenz gibt es deshalb einen ADC-Überlauf! Bei der Batteriemessung wird die Bordspannung über den Spannungsteiler R43/R44 gemessen.


static inline void analog_setupNext(uint8_t pos) {
switch (pos) {
case 0: ADMUX = _BV(REFS0) | 1; break;
case 1: ADMUX = _BV(REFS0) | 2; break;
case 2: ADMUX = _BV(REFS0) | 3; break;
case 3: ADMUX = _BV(REFS0) | 5; break;
case 4: ADMUX = _BV(REFS0) | 6; break;
case 5: ADMUX = _BV(REFS0) | 7; break;
case 6: ADMUX = _BV(REFS0) | 4; break;
case 7: ADMUX = _BV(REFS0) | 5; break;
case 8: ADMUX = _BV(REFS0) | 6; break;
case 9: ADMUX = _BV(REFS0) | 7; break;
case 10: ADMUX = _BV(REFS0) | 0; break;
}
}


ISR(ADC_vect) {
analog_storeResult(analog_pos);
if (++analog_pos>10) {
analog_pos=0;
}
analog_setupNext(analog_pos);
}

(Aus analog.c der Library)

Analog.c setzt intern in der ADC-ISR mit analog_setupNext() neben der Kanalnummer auch die Reverenz. REFSO=1 im ADMUX-Register steht für "AVCC with external capacitor at AREF pin". Das bedeutet, alle ADC-Kanäle verwenden eine 5V-Referenz.

Rabenauge
10.06.2010, 13:50
Super, da die externe Spannung beim Nibobee ja eben _nicht_ hinhaut.
Mit normalen AAA hat er sowieso ständig eine andere Spannung, und bei meinem Lipo sinkt sie, wenn der unter 7V kommt, auch, da die Spannungsstabilisierung dann die 5V nicht mehr halten kann.
Wieder ein Problem.

Naja, mal schauen, wie sich das auswirkt.