mikrocontroller.net

Forum: Compiler & IDEs Gemessene Spannung ungleich ADC-Wert


Autor: Matthias Laubnitz (mcl024)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Εrnst B✶ (ernst)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Matthias Laubnitz (mcl024)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Olli R. (omr) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Matthias Laubnitz (mcl024)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Olli

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

Autor: Olli R. (omr) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Matthias Laubnitz (mcl024)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Olli R. (omr) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Matthias Laubnitz (mcl024)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Olli R. (omr) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Olli R. (omr) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Olli R. (omr) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Aber versuch doch mal den 16-bit-Zugriff mit

result2 = ADCW;

anstatt High- and Low-Byte einzeln einzulesen.

Olli

Autor: Matthias Laubnitz (mcl024)
Datum:

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

Autor: Matthias Lipinsky (lippy)
Datum:

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

Autor: Justus Skorps (jussa)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
kann es sein, dass der Pin "Aref" in der Luft hängt?

Autor: Olli R. (omr) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Justus Skorps (jussa)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Matthias Laubnitz (mcl024)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@lippy
Ohne Filterung? Du meinst ohne Mittelwert?

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

Autor: Olli R. (omr) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Justus Skorps (jussa)
Datum:

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

dann ist imo aber deine Einstellung falsch...

Autor: Olli R. (omr) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Matthias Lipinsky (lippy)
Datum:

Bewertung
0 lesenswert
nicht 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:
_u16Result = ADCW;
itoa ( _u16Result, ... );

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht 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:
>
> _u16Result = ADCW;
> itoa ( _u16Result, ... );
> 
Oh là là, bitte keine Bezeichner mit Unterstrichen am Anfang benutzen! 
Das darf nur die Bibliothek...

Autor: Matthias Lipinsky (lippy)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Matthias Lipinsky (lippy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Nichtsdestotrotz gilt obige Regelung...

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Olli R. (omr) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Justus Skorps (jussa)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Matthias Lipinsky (lippy)
Datum:

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

Hm.. Na ok. Wieder was gelernt..

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Matthias Lipinsky (lippy)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Matthias Laubnitz (mcl024)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Justus Skorps (jussa)
Datum:

Bewertung
0 lesenswert
nicht 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..

Autor: Matthias Laubnitz (mcl024)
Datum:

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

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
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
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 bestätigst du, die Nutzungsbedingungen anzuerkennen.