Atemga AD Wandler - Verhalten bei 0V

Gast #1585068
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.
Gast #1585083
Lesenswert?
• ▲
▼
Hi,

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

4
    uint8_t i;
5
    uint16_t result = 0;
6

7

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

11
    ADMUX=admux;
12

13
    // Den ADC initialisieren und einen sog. Dummyreadout machen
14
    ADCSRA |= (1<<ADSC);
15
    while(ADCSRA & (1<<ADSC));
16
  
17
    // Jetzt 3x die analoge Spannung and Kanal channel auslesen
18
    // und dann Durchschnittswert ausrechnen.
19
    for(i=0; i<3; i++) {
20
      // Eine Wandlung
21
      ADCSRA |= (1<<ADSC);
22
      // Auf Ergebnis warten...
23
      while(ADCSRA & (1<<ADSC));
24
    
25
      result += ADCW;
26
    }
27
  
28
    // ADC wieder deaktivieren
29
    ADCSRA &= ~(1<<ADEN);
30
  
31
    result /= 3;
32
        
33
    
34

35
    return result;
36
  }

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 
!
Persönliche Seite #1585915
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

Eine eigene Frage? Dieser Thread ist über 16 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.