Gemessene Spannung ungleich ADC-Wert

OP #1149305
Lesenswert?

Hey

ich benutze eine Atmega32 mit dem Funk Evulation Board von Pollin.
Habe ein LCD Display vom S65 angeschlossen. Die 10,und Volt für die 
Hintergrundbeleuchtung mache ich mittels Hochsetzsteller (PWM, Spule, 
Diode, Transistor).
Soweit zur Hardware.

Ich habe einen LM335 Temperatursensor an ADC0 Eingang gelegt und benutze 
AVCC als AREF. Achso es handelt sich um einen 10Bit ADC. Ich messe mit 
dem Multimeter 2.882V am ADCO Pin konstant. Ich lasse mir den Wert vom 
ADC auf dem Display darstellen. Und sehe immer einen Wert zw. 682 - 689. 
Woran kann das liegen das der so schwankt.

Anbei der Code

Vielen Dank für die Hilfe
Angehängte Dateien:
OP #1149351
Lesenswert?

Es macht keinen Unterschied ob ich 10 100 oder 1000 Werte nehme und 
diese mittel. Der Wert schwankt immer noch. Das Problem ist ja wenn ich 
den Wert umrechne auf die Spannung ergibt sich ja bei einer kleinen 
Änderung am Wert ein große Änderung als Wert der Spannung. Siehe Formel

Umrechung auf die Spannung:

Wenn nun ein Änderung auftritt ergibt sich

Das bedeutet das bei einer Referenzspannung von 5.0V = 5000 (Um die 
Kommastellen ohne float mitzunehemen) sich das dx um ein Faktor von ca. 
5 letztendlich auswirkt.
Persönliche Seite #1149382
Lesenswert?

Matthias Laubnitz wrote:
> @Olli
>
> stochastisch gesehen hast du Recht.
> Hilft mir nur leider nicht weiter.

Verstehe ich aber immer noch nicht. Du schreibst:

"Und sehe immer einen Wert zw. 682 - 689"

Wenn ich ueber 100 solcher Werte mittele, schwankt da nichts mehr.

Einfach die ADC-Werte mitteln und den gemittelten Wert dann in eine 
Spannung umrechnen.

Wenn die Schwankungsbreite wie von Dir angegeben 1% ist, was willst du 
mehr?

Olli
Persönliche Seite #1149413
Lesenswert?

Du mittelst ueber 4 (vier) Werte. Da ist doch eine Varianz von 1% im 
Ergebnis nicht schlecht.

ich kenne das Pollin-Board zwar nicht genau, aber das ist sicher nicht 
fuer ADC-Messungen optimiert. Da wackeln halt ein 1,2 Bits.

Mittel doch mal ueber 100 statt nur ueber vier Messwerte. Oder hast Du 
das schon versucht und dann schwankt es immer noch genauso?

Olli
Persönliche Seite #1149450
Lesenswert?

Hier die fragliche Schleife:

  result = 0;
  result2 = 0;
  for( i=0; i<4; i++ )
  {
    ADCSRA |= (1<<ADSC);            // eine Wandlung "single conversion"
    while ( ADCSRA & (1<<ADSC) ) {
    ;   // auf Abschluss der Konvertierung warten
    }
    result2 = ADCL;
    result2 = result2 + (ADCH<<8);
    result =result+result2;
  }

Ich kann da keinen Fehler erkennen, der das beschriebene Verhalten 
erklaeren wuerde, hm :(

Olli
#1149479
Lesenswert?

Oliver Rother wrote:
> Justus Skorps wrote:
>> kann es sein, dass der Pin "Aref" in der Luft hängt?
>
> Im Eingangsposting schreibt er, das AREF an VCC haengt.
>
> Olli

nicht direkt:

> Ich habe einen LM335 Temperatursensor an ADC0 Eingang gelegt und benutze
> AVCC als AREF.

das habe ich jetzt so interpretiert, dass er die Ref-Spannung per 
Register auf Avcc gestellt hat...und ich glaub , in seinem Code steht 
das auch so:

ADMUX = (1<<REFS0) | (0<<REFS1);

=

AVCC with external capacitor at AREF pin
#1149496
Lesenswert?

Oliver Rother wrote:
>> Habe ich an VCC angeschlossen. Mit Anschluss oder ohne macht auch keinen
>> Unterschied.
>
> Das kann nicht sein. Wie willst du denn ohne Referenz eine Spannung
> messen, wenn AREF nicht beschaltet ist? Das floatet dann ja nur.
Lies mal das Datenblatt! Die Referenzquelle wird intern ausgewählt. 
AVCC hat an dem AREF-Pin nichts zu suchen. AVCC kann intern über die 
REFS-Bits in ADMUX als Referenz gewählt werden. An AREF kommt im 
Normalfall nur ein 100 nF-Kondensatörchen, es sei denn, es soll eine 
Referenzspannung verwendet werden, die der µC intern nicht zur 
Verfügung stellen kann!

Wenn das Kondensatörchen allerdings fehlt, kann es auch zu Störungen 
kommen...
Gast #1149502
Lesenswert?

>Die Referenzquelle wird intern ausgewählt.
>AVCC hat an dem AREF-Pin nichts zu suchen. AVCC kann intern über die
>REFS-Bits in ADMUX als Referenz gewählt werden. An AREF kommt im
>Normalfall nur ein 100 nF-Kondensatörchen, es sei denn, es soll eine
>Referenzspannung verwendet werden, die der µC intern nicht zur
>Verfügung stellen kann!

Druckt euch das aus, und hängt es übers Bett!


>Ohne Filterung? Du meinst ohne Mittelwert?


Ja. als etwa so:
1
_u16Result = ADCW;
2
itoa ( _u16Result, ... );
#1149515
Lesenswert?

Matthias Lipinsky wrote:
> Druckt euch das aus, und hängt es übers Bett!
Überm Bett nützt es in den wenigsten Fällen...;-)

> Ja. als etwa so:
>
1
> _u16Result = ADCW;
2
> itoa ( _u16Result, ... );
3
>
Oh là là, bitte keine Bezeichner mit Unterstrichen am Anfang benutzen! 
Das darf nur die Bibliothek...
#1149542
Lesenswert?

Matthias Lipinsky wrote:
>>mit Unterstrichen
>
> Ich dachte, Bibliothek hat zwei Unterstriche..?
Nö. Alles, was mit einem oder mehreren Underscores anfängt, ist für 
Compiler und Bibliothek reserviert.

> Ich hab das immer als Unterscheidung global (u16Text) und lokal
> (_u16Name) benutzt..
>
>
> Hat bisher immer funktioniert
Naja, die Wahrscheinlichkeit, dass irgendeine systemeigene Funktion 
exakt den von Dir vergebenen Namen benutzt, ist natürlich nicht sooo 
groß. Nichtsdestotrotz gilt obige Regelung...
#1149553
Lesenswert?

Das der ADC in den letzten Bits ein bischen wackelt, kann durchaus an 
einem fehlendem Kondi an AREF liegen.
Wie ist eigentlich die Beschaltung des LMirgendwas?

Was mir allerdings mehr Sorgen machen würde:
Dein ADC Wert stimmt nicht!
Wenn dein ADC 682 ausgibt, bei 5V Referenz, dann sind das keine 2.882 
Volt (682 sind nach meiner Rechnung 3.33). Dagegen ist das Bitgewackel 
in den letzten Stellen Peanuts.
#1149568
Lesenswert?

Matthias Lipinsky wrote:
>>Nichtsdestotrotz gilt obige Regelung...
>
> Ok. Ist das eine C-Festlegung, oder eher ein "ungeschriebenes GEsetz" ?
> Was sich so eingebürgert hat?

Nein, das ist schon so im C-Standard festgelegt.
Die genauen Regeln weiß ich auch nicht mehr auswendig. Wenn ich mich 
recht erinnere ist für einen Applikationsprogrammierer tabu:
* alles was mit 2 Unterstrichen anfängt
* alles was mit 1 Unterstrich gefolgt von einem Grossbuchstaben (oder 
wars ein Kleinbuchstabe?) anfängt.

Aber schlag mich nicht, wenn ich mich da jetzt falsch erinnere. Lass 
einfach die Finger von allem was mit einem Unterstrich anfängt und gut 
ists.
#1149607
Lesenswert?

Matthias Lipinsky wrote:
>>Lass einfach die Finger von allem was mit einem Unterstrich anfängt und gut
>>ists.
>
> Hm.. Na ok. Wieder was gelernt..

Der Sinn der Sache ist aber klar (hoffe ich mal).
Derjenige, der die Standard-Library implementiert, braucht sowas wie 
einen Namensraum, in dem er seine globalen Variablen bzw. 
Library-privaten Makros anlegen kann. Nur gibts in C keine Namespaces 
wie in C++, daher hat man sich auf eine derartige Namenskonvention 
geeinigt.
OP #1149658
Lesenswert?

Also:

AVREF habe ich nun mit VCC verbunden => keine Änderung immer noch 
leichtes zappeln

AVREF an 100nF an GND => keine Änderung immer noch leichtes zappeln

Den Wert vom ADC ohne Mittelwertbildung => keine Änderung immer noch 
leichtes zappeln

Was mich wundert ist das wenn ich doch über z.B. 1000 Werte mittel dann 
müsste sich doch etwas ändern. Es sind immer 3-4 int Werte die sich 
ändern egal ob ich 1 Mittelung oder 1000 mache.
#1149976
Lesenswert?

Matthias Laubnitz wrote:
> Also:
>
> AVREF habe ich nun mit VCC verbunden => keine Änderung immer noch
> leichtes zappeln
>
> AVREF an 100nF an GND => keine Änderung immer noch leichtes zappeln

bei deinen Einstellungen (ADMUX = (1<<REFS0) | (0<<REFS1);) soll man Vcc 
aber nicht an AVref anschliessen, sondern nur den 100nF zwischen Avref 
und Gnd..

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren