www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Atemga AD Wandler - Verhalten bei 0V


Autor: Peter M (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

Habe mit dem Atmega16 eine kleine Messstelle für meine Solarzellen 
gebaut.

Dabei messe ich an einem single ended Ad Eingang die Solarzellenspannung 
und an 2 differentiellen AD Eingängen Lade- und Verbrauchstrom.

Wenn am single ended Eingang keine Spannung anliegt bekomme ich wie 
erwartet als ad Ergebnis 0.  Die beiden anderen Eingänge liefern bei 0V 
(Spannungsabfall an den Shunts) jeweils den Wert 1021 !?

Bei anliegender Spannung liefern beide korrekte Werte !

Sollte ich bei 0V nicht auch 0 als Ergebnis bekommen ???


Peter M.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schaltung?
Program?

Autor: Peter M (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

Also die Funktion mit der ich die Werte auslese:
  uint16_t gainedMeasure(uint8_t admux)
  {

    uint8_t i;
    uint16_t result = 0;


    // Den ADC aktivieren und Teilungsfaktor auf 8 stellen
    ADCSRA = (1<<ADEN) | (1<<ADPS1) | (1<<ADPS0) ;

    ADMUX=admux;

    // Den ADC initialisieren und einen sog. Dummyreadout machen
    ADCSRA |= (1<<ADSC);
    while(ADCSRA & (1<<ADSC));
  
    // Jetzt 3x die analoge Spannung and Kanal channel auslesen
    // und dann Durchschnittswert ausrechnen.
    for(i=0; i<3; i++) {
      // Eine Wandlung
      ADCSRA |= (1<<ADSC);
      // Auf Ergebnis warten...
      while(ADCSRA & (1<<ADSC));
    
      result += ADCW;
    }
  
    // ADC wieder deaktivieren
    ADCSRA &= ~(1<<ADEN);
  
    result /= 3;
        
    

    return result;
  }

Als Argument übergebe ich 0b110001001
Referenz 2.5 V intern und gain 10x

Wie gesagt das Ganze liefert auch richtige Werte, nur bei 0V eben nicht 
!

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Peter M schrieb:

>     // Den ADC initialisieren und einen sog. Dummyreadout machen
>     ADCSRA |= (1<<ADSC);
>     while(ADCSRA & (1<<ADSC));

Hier ADCW 1x auslesen nicht vergessen, sonst ist es kein Dummyreadout! 
Und wenn dabei result benutzt wird, result anschliessend wieder auf 
0 setzen.

>     // Jetzt 3x die analoge Spannung and Kanal channel auslesen
>     // und dann Durchschnittswert ausrechnen.
> ...
> Als Argument übergebe ich 0b110001001
                            ^^^^^^^^^^^

Das passt nicht, weil es 9 Bits sind. Kontrolliere das bzw. benutze die 
Makroschreibweise im Aufruf.

Mit dem differentiellen ADC habe ich selbst noch nicht experimentiert. 
Dein Beitrag ist aber ein willkommener Anlass, das in Angriff zu nehmen 
:)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.