Forum: Mikrocontroller und Digitale Elektronik Atmega ADC Impedance matching


von Paul G. (paul_g210) Benutzerseite


Lesenswert?

Hallo

Ich bastel immer noch an meinem UV-Messgerät und verwende einen 
Atmega328 und den ML8511 UV Sensor. Der Sensor gibt am OUT eine DC 
Spannung linear zur UV Bestrahlungsstärke.

OUT des UV Sensors hängt direkt an ADC1. VCC ist 3.3V. Im totalen 
Schatten liefert der Sensor exakt 1V an OUT, genauso wie im Datenblatt. 
Das habe ich auch am Multimter gemessen wenn ich den Sensor Standalone 
betreibe.

Wenn ich OUT nun aber über ADC1 messe bekomme ich den Wert 396, was
ja entschpricht 3.3V/1023 * 396 = 1,27V , also 0,27V mehr als direkt 
gemessen.

Ist das ganze nun ein Problem des "impedance-matching" zwischen Sensor 
und ADC? Im Datenblatt des Sensors steht:

"Load resistance of OUT port is recommended more than 100k"

Der Atmega ADC soll ja so um 1M haben (hab ich gelsesen), allerdings 
nicht wenn er gerade sampled und den internen Kondensator auflädt... 
(tschuldigung, alles halbwissen).

Im Datenblatt des Atmega steht außerdem das es sinnvoll ist das man nur 
Zeug mit <10k an den ADC hängt.

Was der Sensor für eine Ausgangsimpedanz hat steht leider nicht im 
Datenblatt...

Mein Gedanke wäre nun direkt "Opamp Impedanzwandler"... Aber muss ich 
das unbedingt?
Kann ich nicht einfach die 0,27V in meinen weiteren Rechnungen 
rausrechnen? Der Sensor arbeitet ja linear...

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Paul G. schrieb:
> Wenn ich OUT nun aber über ADC1 messe bekomme ich den Wert 396
Gegen welche Referenzspannung misst du das?

> Ist das ganze nun ein Problem des "impedance-matching" zwischen Sensor
> und ADC?
Vermutlich eher nicht. Ein Problem damit kommt nur zum Tragen, wenn du 
zwischen den Messungen den ADC-Kanal wechselst und eine andere 
Spannung misst.
Welche Spannung misst du denn mit dem Multimeter während der ADC-Messung 
am ADC-Pin?

> Mein Gedanke wäre nun direkt "Opamp Impedanzwandler"... Aber muss ich
> das unbedingt?
Häng einfach einen 10nF Kondensator zwischen ADC-Pin und GND. Dann ist 
der Eingang niederimpedant...

> Kann ich nicht einfach die 0,27V in meinen weiteren Rechnungen
> rausrechnen?
Ja, so macht man das heutzutage...
Ich würde aber einfach mal die Ursache suchen und finden. Das wird dir 
sonst noch öfter passieren.

> Wenn ich OUT nun aber über ADC1 messe bekomme ich den Wert 396, was
> ja entschpricht 3.3V/1023 * 396 = 1,27V , also 0,27V mehr als direkt
> gemessen.
Man könnte glatt meinen, dass alles passen würde, wenn da 2,56V statt 
3,3V stünden. Übrigens gehört da 1024 in die Rechung rein. Aber das ist 
weniger als 1 Promille Fehler...  :-/

: Bearbeitet durch Moderator
von soso (Gast)


Lesenswert?

Die Zahnspangenfraktion mal wieder, hehe.

Jeder ADC hat auch Nichtlinearitäten und Offset, den Du bei Deinen 
Messungen überprüfen musst. Die Impedanzen spielen hier keine große 
Rolle in dem Bereich. Du brauchst keine Leistungsanpassung.

Tip->>Leg noch zwei weitere Kanäle an, mess zwei fest definierte 
Widerstände mit und linearisiere so Deine Messkurve des ADC.
So kriegst Du DNL/INL und Offset einigermaßen in den Griff. Und sorge 
für eine vernünftige Referenzspannung.

von Reiner Gast (Gast)


Lesenswert?

Paul G. schrieb:
> Wenn ich OUT nun aber über ADC1 messe bekomme ich den Wert 396, was
> ja entschpricht 3.3V/1023 * 396 = 1,27V , also 0,27V mehr als direkt
> gemessen.

Pullup am ADC Pin eingeschaltet?

von Paul G. (paul_g210) Benutzerseite


Lesenswert?

Lothar M. schrieb:
> Gegen welche Referenzspannung misst du das?
Also ich "programmiere" den Atmega über ISP mit Arduino IDE
und dort mache ich einfach nur einen analogRead(A1), damit sollte
die Referenz ja VCC, also 3.3 Volt aus dem LDO sein. Der liefert auch 
ziemlich genau 3.3(27)V...

> Welche Spannung misst du denn während der Messung am ADC-Pin?
Mit dem Multimeter exakt 1.000V

> Häng einfach einen 10nF Kondensator zwischen ADC-Pin und GND. Dann ist
> der Eingang niederimpedant...
HAbe im Moment nur 100nF, damit ändert sich leider nix.
>> Kann ich nicht einfach die 0,27V in meinen weiteren Rechnungen
>> rausrechnen?
> Ja, so macht man das heutzutage...
Mach ich dann wohl auch
> Ich würde aber einfach mal die Ursache suchen und finden. Das wird dir
> sonst noch öfter passieren.

Ich schau nochmal Stück für Stück auf dem Steckbrett ob ich irgendwo was 
falsch habe oder irgendwelche Leckströme...

von Paul G. (paul_g210) Benutzerseite


Lesenswert?

soso schrieb:
> Jeder ADC hat auch Nichtlinearitäten und Offset, den Du bei Deinen
> Messungen überprüfen musst.

Ich habe übrigens auch schon den ADC1 direkt auf VCC hinter dem LDO 
gelegt und dort bekomme ich exact 3.3V (1023)...

von Paul G. (paul_g210) Benutzerseite


Lesenswert?

Reiner Gast schrieb:
> Pullup am ADC Pin eingeschaltet?

Muss ich das wenn ich anaologRead() mache?

von Karl M. (Gast)


Lesenswert?

Paul G. schrieb:
> Reiner Gast schrieb:
>> Pullup am ADC Pin eingeschaltet?
>
> Muss ich das wenn ich anaologRead() mache?

Nun, mache es direkt, schaue in's Datenblatt welche Register und Werte 
(Bits) dafür gesetzt, resp. gelöscht werden müssen.

von Falk B. (falk)


Lesenswert?

Paul G. schrieb:

> Lothar M. schrieb:
>> Gegen welche Referenzspannung misst du das?
> Also ich "programmiere" den Atmega über ISP mit Arduino IDE
> und dort mache ich einfach nur einen analogRead(A1), damit sollte
> die Referenz ja VCC, also 3.3 Volt aus dem LDO sein. Der liefert auch
> ziemlich genau 3.3(27)V...

VORSICHT! Da bin ich schon mal reingefallen! Mein AVR-Dragon hat 
irgendwelche Pull-Up-Widerstände! Wenn die Programmierung beendet ist, 
sind die ISP-Pins NICHT total hochohmig! Da liegen ein paar kOhm gegen 
VCC! Das hat mir eine Analogmessung verfälscht!

>> Häng einfach einen 10nF Kondensator zwischen ADC-Pin und GND. Dann ist
>> der Eingang niederimpedant...
> HAbe im Moment nur 100nF, damit ändert sich leider nix.

Zieh den ISP-Stecker ab.

>>> Kann ich nicht einfach die 0,27V in meinen weiteren Rechnungen
>>> rausrechnen?
>> Ja, so macht man das heutzutage...
> Mach ich dann wohl auch

NEIN! Finde das Problem und löse es!

von Falk B. (falk)


Lesenswert?

Paul G. schrieb:
> Reiner Gast schrieb:
>> Pullup am ADC Pin eingeschaltet?
>
> Muss ich das wenn ich anaologRead() mache?

NEIN! Du DARFST es nicht, wenn dein Sensor einen hochohmigen, sprich 
schwachen Ausgang hat! Normalerweise schaltet die der Arduino NICHT ein, 
es sei denn, du hast das irgendwo aus Versehen getan.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Paul G. schrieb:
> HAbe im Moment nur 100nF, damit ändert sich leider nix.
Dann ist wie erwartet nicht die Impedanz dein Problem.

Paul G. schrieb:
> Muss ich das wenn ich anaologRead() mache?
Nein. Das darfst du auch nicht.
Hast du aber auch nicht, denn du misst ja mit dem Multimeter während 
der ADC Messung tatsächlich 1V. Und dieses 1V muss jetzt deine 
ADC-Wandlung auch bringen.
Was passiert denn, wenn du eine niederimpedante Quelle wie z.B. eine 
1,5V Batterie oder einen 1,2V Akku an den ADC-Pin anschließt? Welche 
Spannung misst du dann mit dem Multimeter und welche mit dem ADC?

Am Rande: welche Spannung hat dein uC am Vref-Pin?

: Bearbeitet durch Moderator
von Falk B. (falk)


Lesenswert?

Lothar M. schrieb:
> Paul G. schrieb:
>> HAbe im Moment nur 100nF, damit ändert sich leider nix.
> Dann ist wie erwartet nicht die Impedanz dein Problem.

Doch, wenn gleich eher der Gleichstromwiderstand, nicht die HF-Impedanz.

von Paul G. (paul_g210) Benutzerseite


Lesenswert?

Lothar M. schrieb:
> Am Rande: welche Spannung hat dein uC am Vref-Pin?

Wenn du mit VREF AREF am Atmega328 meinst, den habe ich unbeschaltet 
weil mir hier:
Beitrag "Re: Power Taster und Menü Taster vereinen?"
jemand davon abgeraten hat AREF auf VCC zu legen.

Ich dachte dass als Referenz dann VCC am Atmega genommen wird wenn ich 
nichts anderes angebe.

Ich habe gerade mal spasseshalber doch AREV auf VCC direkt hinter den 
LDO gehangen und ab da bekomme ich am ADC1 auch "308" = ~1V...

Ich habe das mit der Referenz anscheinend noch nicht so ganz kappiert..

: Bearbeitet durch User
von adc24 (Gast)


Lesenswert?

Paul G. schrieb:

> Ich habe übrigens auch schon den ADC1 direkt auf VCC hinter dem LDO
> gelegt und dort bekomme ich exact 3.3V (1023)...

Sind es bei 3,2V auch noch 1023?

von Paul G. (paul_g210) Benutzerseite


Lesenswert?

Falk B. schrieb:
> Zieh den ISP-Stecker ab.

Das hat leider nichts gebracht.

von Falk B. (falk)


Lesenswert?

Paul G. schrieb:
> Lothar M. schrieb:
>> Am Rande: welche Spannung hat dein uC am Vref-Pin?
>
> Wenn du mit VREF AREF am Atmega328 meinst, den habe ich unbeschaltet
> weil mir hier:
> Beitrag "Re: Power Taster und Menü Taster vereinen?"
> jemand davon abgeraten hat AREF auf VCC zu legen.

Macht man auch nicht. Dort gehören 100nF gegen GND dran. Den Rest macht 
der AVR intern. Was hast du denn überhaupt für einen Aufbau? Ich dachte 
du hast einen Arduino?

> Ich dachte dass als Referenz dann VCC am Atmega genommen wird wenn ich
> nichts anderes angebe.

Wo denn? Welcher Quelltext?

> Ich habe gerade mal spasseshalber doch AREV auf VCC direkt hinter den
> LDO gehangen und ab da bekomme ich am ADC1 auch "308" = ~1V...

Aha! Also stimmt was mit deiner ADC-Beschaltung oder Konfiguration 
nicht.

> Ich habe das mit der Referenz anscheinend noch nicht so ganz kappiert..

Sieht so aus.

Zeig uns deinen Schaltplan und Quelltext.

von Einhart P. (einhart)


Lesenswert?

Wie hast du AVCC angeschlossen?

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Falk B. schrieb:
> Lothar M. schrieb:
>> Paul G. schrieb:
>>> HAbe im Moment nur 100nF, damit ändert sich leider nix.
>> Dann ist wie erwartet nicht die Impedanz dein Problem.
> Doch, wenn gleich eher der Gleichstromwiderstand, nicht die HF-Impedanz.
Mit einem 100nF Kondensator am ADC-Pin (und zudem ohne 
ADC-Kanalwechsel) ist der Gleichstromwiderstand/Innenwiderstand des 
Sensors irrelevant. Denn der Kondensator puffert ja während der 
Sample-Phese.
Bestenfalls die Reaktionsgeschwindigkeit wird dann eingeschränkt, weil 
der Sensor über seinen hohen Innenwiderstand erstmal den 
Pufferkondensator aufladen muss.

Paul G. schrieb:
> Ich habe gerade mal spasseshalber doch AREV auf VCC direkt hinter den
> LDO gehangen und ab da bekomme ich am ADC1 auch "308" = ~1V...
Und welche Spannung hast du dort, wenn du diesen (unerlaubten) 
Kurzschluss nicht machst? Gerade die von mir vermuteten 2,6V?

Einhart P. schrieb:
> Wie hast du AVCC angeschlossen?
Vermutlich gar nicht, das würde das Verhalten erklären...  ;-)

: Bearbeitet durch Moderator
von Paul G. (paul_g210) Benutzerseite



Lesenswert?

Einhart P. schrieb:
> Wie hast du AVCC angeschlossen?

Okay ich glaube das ist der Fehler...
Ich hatte AVCC in meinem Schaltplan an VCC. Auf dem Steckbrett aber 
garnicht angeschlossen.

Jetzt mit AVCC an VCC bekomme ich "308" 0.99V am ADC1.
Ich denke das war das Problem... Schusselfehler.

>Was hast du denn überhaupt für einen Aufbau? Ich dachte
>du hast einen Arduino?

Mjain :). Ich habe einem Arduino Nano sein Herz rausgerissen und 
verwende
nur den rohen Atmega328P-AU auf meinem selbst geätztem Dev-PCB. Wie 
gesagt verwende ich nur noch die Arduino-IDE, exportiere die hex Dateien 
und flashe die mit avrdude über Pegelwandler->ISP. Sieht im Moment 
schlimm verkabelt aus aber geht soweit... bis auf die dummen Fehler.

von Paul G. (paul_g210) Benutzerseite


Lesenswert?

Lothar M. schrieb:
> Einhart P. schrieb:
>> Wie hast du AVCC angeschlossen?
> Vermutlich gar nicht, das würde das Verhalten erklären...  ;-)

Sie haben gewonnen :)

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Paul G. schrieb:
> Einhart P. schrieb:
>> Wie hast du AVCC angeschlossen?
> Okay ich glaube das ist der Fehler...
Zur abschließenden Erklärung des Effekts: durch die fehlenden 3,3V an 
der ADC-Versorgung wurde der ADC nur parasitär durch interne 
Schutzdioden oder sonstige Siliziumstrukturen versorgt. Auf diese Art 
hattest du nur 2,6V am Vref-Pin und gegen diese 2,6V wurde dann der Wert 
vom ADC-Pin um 27% zu hoch gemessen.

Zur schnellen Fehlerfindung hätte dann die Messung der an der 
AD-Wandlung beteiligten Spannungen Avcc, Vref und der Spannung am 
ADC-Pin beigetragen...  ;-)

: Bearbeitet durch Moderator
von Arno (Gast)


Lesenswert?

Lothar M. schrieb:
> Paul G. schrieb:
>> Wenn ich OUT nun aber über ADC1 messe bekomme ich den Wert 396, was
>> ja entschpricht 3.3V/1023 * 396 = 1,27V , also 0,27V mehr als direkt
>> gemessen.
> Man könnte glatt meinen, dass alles passen würde, wenn da 2,56V statt
> 3,3V stünden.

Ja, das würde wunderbar passen :) Wäre allerdings bei einem ATMega328 
seltsam, der hat eine interne Referenz von 1,1V.

Also direkt am Controller nachmessen: VCC, AVCC und AREF. Ich gehe davon 
aus, dass du AGND angeschlossen hast?

Und wenn nur an der Spannung am AREF-Pin etwas komisch ist, ggf. noch 
analogReference() aufrufen: 
https://www.arduino.cc/reference/en/language/functions/analog-io/analogreference/

MfG, Arno

von Arno (Gast)


Lesenswert?

Okay, ich war zu langsam :)

MfG, Arno

von Falk B. (falk)


Lesenswert?

Lothar M. schrieb:

> Mit einem 100nF Kondensator am ADC-Pin (und zudem ohne
> ADC-Kanalwechsel) ist der Gleichstromwiderstand/Innenwiderstand des
> Sensors irrelevant.

Aber nicht, wenn irgendwo ein Pull-Up oder ähnliche Fehler sind!

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.