Forum: Compiler & IDEs Gemessene Spannung ungleich ADC-Wert


von Matthias L. (mcl024)


Angehängte Dateien:

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

von Εrnst B. (ernst)


Lesenswert?

Ohne den Rest genau angesehen zu haben: Es ist normal, das die letzten 
Bits vom ADC rumwackeln. vor allem, wenn auf der selben Platine noch ein 
Schaltregler sein Unwesen treibt.

Einfach den Mittelwert über viele Messungen bilden, und den anzeigen.

von Matthias L. (mcl024)


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.

von Olli R. (omr) Benutzerseite


Lesenswert?

Matthias Laubnitz wrote:

> Es macht keinen Unterschied ob ich 10 100 oder 1000 Werte nehme und
> diese mittel. Der Wert schwankt immer noch.

Diese Aussage ist stochastischer Bloedsinn.

Olli

von Matthias L. (mcl024)


Lesenswert?

@Olli

stochastisch gesehen hast du Recht.
Hilft mir nur leider nicht weiter.

von Olli R. (omr) Benutzerseite


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

von Matthias L. (mcl024)


Lesenswert?

Ja habe ich ja bereits gemacht nur leider tut sich nicht. Hast du dir 
den Code mal angeguckt? Vielleicht ist ja irgendetwas falsch nur ich 
sehe es nicht.

von Olli R. (omr) Benutzerseite


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

von Matthias L. (mcl024)


Lesenswert?

Habe ich auch schon nur es ändert sich nichts und deshalb dachte ich 
hätte einen Fehler im Code.

Schaltpan Pollin-Board: http://www.pollin.de/shop/shop.php

von Olli R. (omr) Benutzerseite


Lesenswert?

Das muss wohl so sein, mit mehr Messwerten muss die Statistik besser 
werden. Hae den Code bisher nur ueberflogen, ich guck ihn mir mal 
genauer an.

Olli

von Olli R. (omr) Benutzerseite


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

von Olli R. (omr) Benutzerseite


Lesenswert?

Aber versuch doch mal den 16-bit-Zugriff mit

result2 = ADCW;

anstatt High- and Low-Byte einzeln einzulesen.

Olli

von Matthias L. (mcl024)


Lesenswert?

Erstmal vielen Dank für deine Mühe.
Nur leider ändert es auch nichts.

von Matthias L. (Gast)


Lesenswert?

gib doch einfach mal die original-adc werte ohne filterung aus. und 
gucke, ob die auch so schwanken..

von Justus S. (jussa)


Lesenswert?

kann es sein, dass der Pin "Aref" in der Luft hängt?

von Olli R. (omr) Benutzerseite


Lesenswert?

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

von Justus S. (jussa)


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

von Johannes M. (johnny-m)


Lesenswert?

> ADMUX = mux;                      // Kanal waehlen
> ADMUX = (1<<REFS0) | (0<<REFS1); // ADCVCC=ADCVREF
Du überschreibst hier mit der Referenzspannungskonfig den gewählten 
Kanal. Solange Du nur auf Kanal 0 misst, kein Problem, aber wenn 
nicht...

von Matthias L. (mcl024)


Lesenswert?

@lippy
Ohne Filterung? Du meinst ohne Mittelwert?

@jussa
Habe ich an VCC angeschlossen. Mit Anschluss oder ohne macht auch keinen 
Unterschied.

von Olli R. (omr) Benutzerseite


Lesenswert?

Bist du sicher, dass AREF an VCC haengt? Ich habe gerade mal in den 
Schaltplan des Pollin-Boards geguckt, da haengt AREF nur auf einer 
Steckerleiste. Den richtigen Pin mit VCC verbunden?

Olli

von Justus S. (jussa)


Lesenswert?

>
> @jussa
> Habe ich an VCC angeschlossen. Mit Anschluss oder ohne macht auch keinen
> Unterschied.

dann ist imo aber deine Einstellung falsch...

von Olli R. (omr) Benutzerseite


Lesenswert?

Matthias Laubnitz wrote:

> @jussa
> 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.

Olli

von Johannes M. (johnny-m)


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...

von Matthias L. (Gast)


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, ... );

von Johannes M. (johnny-m)


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...

von Matthias L. (Gast)


Lesenswert?

>mit Unterstrichen

Ich dachte, Bibliothek hat zwei Unterstriche..?

Ich hab das immer als Unterscheidung global (u16Text) und lokal 
(_u16Name) benutzt..


Hat bisher immer funktioniert

von Johannes M. (johnny-m)


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...

von Karl H. (kbuchegg)


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.

von Matthias L. (Gast)


Lesenswert?

>Nichtsdestotrotz gilt obige Regelung...

Ok. Ist das eine C-Festlegung, oder eher ein "ungeschriebenes GEsetz" ?
Was sich so eingebürgert hat?

von Karl H. (kbuchegg)


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.

von Olli R. (omr) Benutzerseite


Lesenswert?

Justus Skorps wrote:

> 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

Ah, das hatte ich uebersehen.

Olli

von Justus S. (jussa)


Lesenswert?

Oliver Rother wrote:
>
> Ah, das hatte ich uebersehen.
>
> Olli

er hat aber trotzdem auch Vcc direkt an Aref angeschlossen...kA ob das 
für das falsche Ergebnis verwantwortlich sein kann...

von Matthias L. (Gast)


Lesenswert?

>Lass einfach die Finger von allem was mit einem Unterstrich anfängt und gut
>ists.

Hm.. Na ok. Wieder was gelernt..

von Karl H. (kbuchegg)


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.

von Matthias L. (Gast)


Lesenswert?

Das ist mir alles schon klar, ich dacht nur bisher, dass Lib-eigene 
Namen immer zwei Unterstriche haben..
Ok. Lass ich das mal sein, ab dem nächsten PRojekt...

von Matthias L. (mcl024)


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.

von Justus S. (jussa)


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..

von Matthias L. (mcl024)


Lesenswert?

Ja ich weiss. Habe ich ja auch gemacht nur leider ändert sich nichts.
Ich verstehe es einfach nicht

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.