Forum: Mikrocontroller und Digitale Elektronik ADC-Ergebnis immer rund +35 AD-Werte zu hoch


von Makke (Gast)


Lesenswert?

Vielleicht kann mir jemand weiter helfen, ich weiß nicht mehr weiter.
Mein AD-Wandler spielt verrückt. Er zeigt immer ein um rund +35
AD-Werte zu hohes Ergebnis an.
Prozessor: ATMega16
AVref: extern 2,56 (intern hat zu sehr gerauscht)
AVcc: 5,02 V
Conversion-Time: 8MHz:64 => 125kHz

Spule und Kondensatoren wie im Datenblatt auch vorhanden.
Beispiel: Spannung am AD-Eingang PortA0: 1,639Volt
Anzeige: AD-Wert 692
Nach meinen Berechnungen müsste aber der AD-Wert((1,639V*1024)/2,56)
656 sein.

Hat irgendjemand eine Idee woran das liegen könnte oder ähnliche
Erfahrungen gemacht?
Danke schon mal für eure Tipps...

von emil (Gast)


Lesenswert?

"AVref: extern 2,56 (intern hat zu sehr gerauscht)" ???

wieso denn das?

und wie ist das ergebnis mit dem internen AVref?

von TravelRec. (Gast)


Lesenswert?

Wechselst Du zwischendurch die A/D-Eingänge? Ist Deine Eingangsspannung
niederohmig genug? Die interne Referenz rauscht nicht, konnte ich
jedenfalls noch nicht feststellen. Sie ist lediglich recht weit
toleriert, dabei aber ziemlich genau und auch stabil.

von Makke (Gast)


Lesenswert?

als ich die interne Vref angeschlossen habe, hatte ich nicht berechnet
was theoretisch herauskommen müsste. Da ist mir nur aufgefallen, dass
der AD-WErt +/- 5 geschwankt hat, obwohl ich eine konstante Spannung am
Eingang angelegt habe.
Deswegen bin ich auf extern umgestiegen und der Wert ist jetzt auch
sehr viel stabiler: +/-2

von Makke (Gast)


Lesenswert?

Hab jetzt noch mal die interne Vref 2,56 Volt ausprobiert. Ergebnis ist
jetzt ca 10 AD-Werte zu niedrig. Wäre allerdings immer noch besser als
30 zu viel. Kann ich mir aber immer noch nicht den Grund dafür erkären.
Vielleicht hat ja jemand noch eine Idee...

von Mika (Gast)


Lesenswert?

sind die nicht verwendeten AD Eingänge auf Masse ?
Das hilft meistens.

von Makke (Gast)


Lesenswert?

Nein, die sind offen. In der Software hab ich sie als Eingänge definiert
und die internen Pullup aktiviert. Ist es sinnvoller sie als Ausgänge zu
definieren?

von Mika (Gast)


Lesenswert?

Versuch mal als Eingang und dann fest auf Masse klemmen.

von TravelRec. (Gast)


Lesenswert?

Wie genau ist denn Deine externe VRef, mit welchen Meßmöglichkeiten
arbeitest Du, mit denen Du den Ausgabewert des ADCs vergleichst? Hast
Du an VRef mal einen 100nF-Kondensator nach Analog-Masse angeschlossen,
so wie´s im Datenblatt steht? Genau so einen Kondensator mal vom
ADC-Eingang nach Analog-Masse angeschlossen?

von Makke (Gast)


Lesenswert?

Meine externe Referenzspannung erzeuge ich mir durch einen
LDO-Regler(LF33CV) 3,3V und einem nachgeschalteten Poti(5k) auf genau
2,56 Volt. Meine Messmittel sollten schon ausreichen, vernünftiges
Multimeter und Oszilloskop sind vorhanden.Vref hab ich mit 100n und 1n
auf Analogmasse schon beschaltet. Allerdings den Eingang nicht mit
100n. Aber spielen die anderen Eingänge wirklich eine Rolle?
Schließlich multiplexe ich die Kanäle doch nicht, sondern benutze immer
nur den einen(PortA0)!

von Flo (Gast)


Lesenswert?

Hmm, das ist nicht wirkl. genau. Man sollte beim Multimeter nicht darauf
bauen, dass die 2.stelle hinterm komma so exakt stimmt. Desweiteren hat
der adc auch nen eigenen drift. Und Spannungsquelle aus regler und poti
ist schon gar nicht. Da hat der Regler nen eigene drift + rauschen. Das
Poti hat je nach temperatur nen drift.

Also lieber die interne oder eine gescheite externe.
Mfg Flo

von Gast ein Anderer (Gast)


Lesenswert?

Jo Flo seh ich auch so.
und im Datenblatt steht zur internen Ref.: Vint 2,3V ... 2,9 V !

von Profi (Gast)


Lesenswert?

Du musst auch bedenken, dass beim Messen durch den Innenwiderstand des
Messgerätes eine Belastung entsteht.
30 ADCs sind ja nicht gerade sooo viel, 75mV.
Dem Eingang unbedingt auch einen C spendieren. Auch die Wandelrate
spielt eine Rolle, mach sie mal langsamer.

Ist der Fehler konstant oder linear mit der Eingangsspannung?
Welche Impedanz hat die Mess-Quelle?

von Makke (Gast)


Lesenswert?

Auf welcher Seite des Datenblatt steht denn, dass die interne
Referenzspannung von 2,3...2,9V reicht? Und welche externe sinnvolle
Referenzspannung baut ihr denn auf, die keine Drift und Rauschen hat?
Mit der Wandelrate hab ich auch schon experimentiert, aber ohne erfolg.
Habe sämtliche Wandelraten zwischen 50 und 200kHz erzeugt.
@Profi
der Fehler ist konstant mit der Eingangspannung des ADC

wie gesagt, ich weiß auch nicht mehr weiter

von Dennis Kleine-Beck (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

poste doch mal deinen Code. Evtl. gibst Du dem ADC nicht genug Zeit zum
Stabilisieren, nach Umschalten des ADC-Kanals? Ich warte nach Umschalten
erst immer etwa 200 Clocks, mache dann eine einzelne "Dummy"
ADC-Register-Lesung und lese erst dann 8 gültige ADC-Werte, die
anschließend gemittelt werden. Damit steht der Wert bombenfest und gibt
auch das, was ich als Wert erwarten würde (z.B. bei
Versorgungsspannung-Messungen, kontrolliert mit Multimeter).

Im Anhang der C-Source.

Gruß,
Dennis

von Simon K. (simon) Benutzerseite


Lesenswert?

Seite 298 im Mega16 Datasheet(10/04)

von johnny.m (Gast)


Lesenswert?

> Auf welcher Seite des Datenblatt steht denn...

Datenblatt Seite 298 (ADC Characteristics), Internal Voltage Reference

von Makke (Gast)


Angehängte Dateien:

Lesenswert?

Ich  mache ja gar keine Umschaltung der Kanäle...ich wandle immer nur
PORTA0!
Im Anhang findet ihr meinen Code!

von johnny.m (Gast)


Lesenswert?

> adwert=((ADCH<<8)+ADCL);  //ADC-Wert berechnen

Dass da Murks rauskommt ist u.U. vorprogrammiert. Es sollte mich
wundern, wenn der ADC nicht immer den selben Wert ausgibt. Das Auslesen
der ADC-Datenregister muss unbedingt in der richtigen Reihenfolge
geschehen, und zwar erst ADCL und dann ADCH. Sonst wird das Register
nicht wieder freigegeben und Du kriegst bei jedem Auslesen denselben
Wert! Schreib doch einfach
adwert=ADC; //Einlesen 16-Bit-Register
Dafür hat Dein Compiler extra die 16-Bit-Zugriffe, damit Du Dir um die
Reihenfolge keinen Kopf machen musst.

von Makke (Gast)


Lesenswert?

Ist das nicht eine Anweisung die von rechts nach links gelesen werden
muss? Dann wäre es doch genau richtig! Außerdem gibt mir der AD-Wandler
ja eben nicht immer den gleichen Wert aus, aber ich werde es gleich mal
ausprobieren, ob sich was verändert!

von Karl heinz B. (kbucheg)


Lesenswert?

> Ist das nicht eine Anweisung die von rechts nach links gelesen
> werden muss?

Wenn schon, dann wäre es logisch dass die Abarbeitung von
links nach rechts erfolgen würde, so wie wir das normalerweise
lesen. Aber auch diese Garantie hast du nicht, der C-Compiler
kann das machen wie er will.

von Dennis Kleine-Beck (Gast)


Lesenswert?

> Schreib doch einfach adwert=ADC; //Einlesen 16-Bit-Register

Ja, kann ich mich nur anschließen. Komischerweise taucht genau dies
min. 1 / Woche hier auf ;-)

Also, ADC einschalten, direkt auslesen und wieder ausschalten wird -
ohne Zeit zum Stabilisieren - nicht klappen. Evtl einmal initialisieren
und dann einfach immer aktiv lassen. Die höhere Stromaufnahme fällt
nicht wirklich ins Gewicht.

Dennis

von johnny.m (Gast)


Lesenswert?

Ich weiß jetzt nicht, was für Signale Du einlesen willst, aber wenns
nicht auf Geschwindigkeit ankommt (also Signale erfasst werden sollen,
deren Änderungsgeschwindigkeit wesentlich langsamer ist als die
Wandlungsrate des ADC), sollte man sowieso mehrere Wandlungen machen
und dann eine Mittelwertbildung.

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.