-
        

Ergebnis 1 bis 5 von 5

Thema: NiboBee analog_getValue() braucht Zeit?

  1. #1
    Erfahrener Benutzer Roboter Genie Avatar von Rabenauge
    Registriert seit
    13.10.2007
    Ort
    Osterzgebirge
    Alter
    49
    Beiträge
    1.241

    NiboBee analog_getValue() braucht Zeit?

    Anzeige

    Hallöle.
    Ich mal wieder...

    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?
    Grüssle, Sly
    ..dem Inschenör ist nix zu schwör..

  2. #2
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    54
    Beiträge
    5.781
    Blog-Einträge
    8
    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 einschieben
    Eine 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

    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  3. #3
    Erfahrener Benutzer Roboter Genie Avatar von Rabenauge
    Registriert seit
    13.10.2007
    Ort
    Osterzgebirge
    Alter
    49
    Beiträge
    1.241
    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?
    Grüssle, Sly
    ..dem Inschenör ist nix zu schwör..

  4. #4
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    54
    Beiträge
    5.781
    Blog-Einträge
    8
    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.

    Code:
    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.

    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  5. #5
    Erfahrener Benutzer Roboter Genie Avatar von Rabenauge
    Registriert seit
    13.10.2007
    Ort
    Osterzgebirge
    Alter
    49
    Beiträge
    1.241
    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.
    Grüssle, Sly
    ..dem Inschenör ist nix zu schwör..

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •