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


von Peter M (Gast)


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.

von Karl H. (kbuchegg)


Lesenswert?

Schaltung?
Program?

von Peter M (Gast)


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 
!

von Stefan B. (stefan) Benutzerseite


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 
:)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.