www.mikrocontroller.net

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


Autor: Peter M (Gast)
Datum:

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 Buchegger (kbuchegg) (Moderator)
Datum:

Schaltung?
Program?
Autor: Peter M (Gast)
Datum:

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:

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




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 erkennst du die Nutzungsbedingungen an.

webmaster@mikrocontroller.netImpressumNutzungsbedingungenWerbung auf Mikrocontroller.net