- Akku Tests und Balkonkraftwerk Speicher         
Ergebnis 1 bis 5 von 5

Thema: NiboBee analog_getValue() braucht Zeit?

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Robotik Einstein Avatar von Rabenauge
    Registriert seit
    13.10.2007
    Ort
    Osterzgebirge
    Alter
    55
    Beiträge
    2.198

    NiboBee analog_getValue() braucht Zeit?

    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
    61
    Beiträge
    5.799
    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
    Bild hier  
    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 Robotik Einstein Avatar von Rabenauge
    Registriert seit
    13.10.2007
    Ort
    Osterzgebirge
    Alter
    55
    Beiträge
    2.198
    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
    61
    Beiträge
    5.799
    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.
    Bild hier  
    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 Robotik Einstein Avatar von Rabenauge
    Registriert seit
    13.10.2007
    Ort
    Osterzgebirge
    Alter
    55
    Beiträge
    2.198
    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
  •  

MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad