Forum: Mikrocontroller und Digitale Elektronik ADC funktioniert nur mit Spannungsteiler?


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Luca S. (chababo)


Angehängte Dateien:

Lesenswert?

Hallo,

Ich arbeite gerade an einer Ersatzlösung, falls alle Stricke reißen, da 
ich ein Projekt habe, was bis Ende Woche fertig werden sollte.

Ich muss eine Eingangsspannung messen und an ein Mainboard übertragen.
Dazu habe ich eine Sensorplatine mit Spannungsteiler aus Widerstand und 
LDR.

Diese möchte ich als externen ADC betreiben und das Resultat per UART an 
das Mainboard übertragen.

Das Problem ist, mit dem Spannungsteiler bekomme ich korrekte Resultate, 
je nach Licht, ich möchte aber jetzt direkt auf den Eingang eine 
Spannung geben und diese messen.

Ich stehe aber gerade auf dem Schlauch, ich bekomme immer Resultate nahe 
0 als Output, obwohl ich 3.2V am ADC Pin anlege.

Übersehe ich etwas?

Habe das Originalschema mit LDR und das 2. mit direkter Verbindung zur 
Messspannung angehängt. Wahrscheinlich ist es ein simpler Zusammenhang, 
den ich gerade nicht sehe...

von Luca S. (chababo)


Lesenswert?

Hier der Code (Kommunikation funktioniert, nur das Resultat stimmt bei 
direkter Eingangsspannung nicht):
1
/*Begining of Auto generated code by Atmel studio */
2
#include <Arduino.h>
3
4
/*End of auto generated code by Atmel studio */
5
6
//#include <NeoSWSerial.h>
7
//Beginning of Auto generated function prototypes by Atmel Studio
8
//End of Auto generated function prototypes by Atmel Studio
9
10
const int sensorPin = A0;
11
12
void setup() {
13
  // put your setup code here, to run once:
14
  Serial.begin(9600);
15
}
16
17
void loop() {
18
  // put your main code here, to run repeatedly:
19
    if(Serial.available() > 0){
20
      int data = Serial.read();
21
      if (data == 20){
22
        int value =~ analogRead(sensorPin) / 4;
23
        Serial.write(value);
24
      }
25
  }
26
}

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


Lesenswert?

Luca S. schrieb:
> Übersehe ich etwas?
Kann man nicht sicher sagen, weil Vcc unbekannt ist.

In welchem Bereich bewegt sich denn die Spannung mit dem 
funktionierenden Spannungsteiler?

> obwohl ich 3.2V am ADC Pin anlege.
Woher kommen diese 3.2V? Du kannst diese Spannung auch mit dem 
Multimeter zwischen A0 und GND vom uC messen?

von Luca S. (chababo)


Lesenswert?

Lothar M. schrieb:
> Kann man nicht sicher sagen, weil Vcc unbekannt ist.

Vcc = 3.3V, im Moment kommen diese vom Serial Interface, mit dem ich 
teste.

Lothar M. schrieb:
> Woher kommen diese 3.2V? Du kannst diese Spannung auch mit dem
> Multimeter zwischen A0 und GND vom uC messen?

Diese kommen auch von Vcc vom Serial Interface. (normaler China UART - 
USB Converter). Ich kann die Spannung über dem Pin zu Ground messen.

Lothar M. schrieb:
> In welchem Bereich bewegt sich denn die Spannung mit dem
> funktionierenden Spannungsteiler?

Kann ich morgen nochmals testen.

von Bruno V. (bruno_v)


Lesenswert?

Hast Du ein Multimeter? Messe die Spannung am Eingang und beobachte die 
rohwerte.

Bei 1V, 2V und 3V sollten die proportional sein.

Du "invertierst" Dein Signal mit ~.

Dann sollte es nahe Vref auch etwa 0 sein.

von Luca S. (chababo)


Lesenswert?

Bruno V. schrieb:

> Du "invertierst" Dein Signal mit ~.

Besten Dank für den Tipp, ich glaube das Problem ist gelöst!
Auf Vcc bekomme ich jetzt 255 und auf GND 0.

von Rainer W. (rawi)


Lesenswert?

Luca S. schrieb:
> Das Problem ist, mit dem Spannungsteiler bekomme ich korrekte Resultate,
> je nach Licht,

Wie kann das sein? Wenn du die selbe Software verwendet hast, müsste bei 
der Originalschaltung mit abnehmendem Licht die Spannung steigen und der 
Wert sinken  - genauso, wie wenn du direkt deine Spannung anschließt.

von Thorsten S. (thosch)


Lesenswert?

Er meinte mit "korrekte Resultate" sicher, daß er mit zunehmender 
Beleuchtung des LDR zunehmende Werte erhält.
Das paßt natürlich zum beschriebenen Verhalten, daß mit Vcc am Pin Werte 
um 0 kommen.

Der LDR ist ja vom ADC-Pin nach GND geschaltet und wird bei Beleuchtung 
niederohmiger, so daß mit zunehmender Beleuchtung die Spannung am ADC 
sinkt und nicht steigt.

: Bearbeitet durch User
von Luca S. (chababo)


Lesenswert?

Thorsten S. schrieb:
> Er meinte mit "korrekte Resultate" sicher, daß er mit zunehmender
> Beleuchtung des LDR zunehmende Werte erhält.
> Das paßt natürlich zum beschriebenen Verhalten, daß mit Vcc am Pin Werte
> um 0 kommen.
>
> Der LDR ist ja vom ADC-Pin nach GND geschaltet und wird bei Beleuchtung
> niederohmiger, so daß mit zunehmender Beleuchtung die Spannung am ADC
> sinkt und nicht steigt.

Genau, kann es auch nicht erklären, aber Hauptsache es funktioniert 
jetzt.

von Rainer W. (rawi)


Lesenswert?

Luca S. schrieb:
> Genau, kann es auch nicht erklären, aber Hauptsache es funktioniert
> jetzt.

Das solltest du nicht so hin nehmen, sondern verstehen.
Bei der Schaltung mit dem LDR steigt die Spannung mit abnehmender 
Helligkeit, weil der Widerstand steigt und bei Verwendung des gezeigten 
Codes sinkt dann der Wert. Du darfst dich dann nicht wundern, wenn bei 
maximaler Spannung ein Wert um 0 herauskommt.

von Luca S. (chababo)


Lesenswert?

Rainer W. schrieb:
> Bei der Schaltung mit dem LDR steigt die Spannung mit abnehmender
> Helligkeit, weil der Widerstand steigt und bei Verwendung des gezeigten
> Codes sinkt dann der Wert.

Schon, aber warum bei der 2. Variante der Wert immer 0 war, weiss ich 
immer noch nicht.

von Rainer W. (rawi)


Lesenswert?

Luca S. schrieb:
> Schon, aber warum bei der 2. Variante der Wert immer 0 war, weiss ich
> immer noch nicht.

Wie hoch sind denn deine Versorgungs- und deine Referenzspannung (AREF)?
Da fehlt übrigens ein Kondensator und für AVCC wäre das auch keine 
schlechte Idee (zusammen mit einem Ferrit), wenn du den ADC nutzt.

Und in welchem Bereich liegt bei dem Aufbau mit dem LDR die Spannung an 
ADC0, wenn er vernünftig misst?

: Bearbeitet durch User
von Rolf (rolf22)


Lesenswert?

Rainer W. schrieb:

> Wie hoch sind denn deine Versorgungs- und deine Referenzspannung (AREF)?
> Und in welchem Bereich liegt bei dem Aufbau mit dem LDR die Spannung an
> ADC0, wenn er vernünftig misst?

Genau das sind die entscheidenden Fragen.

Die interne Referenz des ATmega hat 1,1 V. Damit liefert der ADU bei 
Spannungen größer als 1,1 V immer 255.

Will man Spannungen > 1,1 V messen, muss das Register ADMUX speziell 
initialisiert werden, sodass Referenz und zu messende Spannung 
vertauscht werden. Die zu messende Spannung legt man dann an den 
AREF-Pin, nicht an den ADU-Eingang.

ADMUX  |= (1 << REFS0) | (1 << MUX3) | (1 << MUX2) | (1 << MUX1);

ADMUX  &= ~((1 << REFS1) | (1 << ADLAR));

Das macht analogRead() der Lib vermutlich nicht so.

: Bearbeitet durch User
von Luca S. (chababo)


Lesenswert?

Rolf schrieb:
> Die interne Referenz des ATmega hat 1,1 V. Damit liefert der ADU bei
> Spannungen größer als 1,1 V immer 255.

Beitrag "ATMEGA 328 - AREF wiedersprüchlich"

In diesem Thread steht, dass die Referenzspannung intern 2.56V ist.

Rainer W. schrieb:
> Wie hoch sind denn deine Versorgungs- und deine Referenzspannung (AREF)?

Vcc ist 3.3V, der AREF Pin ist offen.

: Bearbeitet durch User
von Luca S. (chababo)


Lesenswert?

Rainer W. schrieb:
> Das solltest du nicht so hin nehmen, sondern verstehen.
> Bei der Schaltung mit dem LDR steigt die Spannung mit abnehmender
> Helligkeit, weil der Widerstand steigt und bei Verwendung des gezeigten
> Codes sinkt dann der Wert. Du darfst dich dann nicht wundern, wenn bei
> maximaler Spannung ein Wert um 0 herauskommt.

Ev. war das Problem auch nur mit hterm, hatte gerade wieder komische 
Werte, bzw. immer nur 8-bit Werte in hterm, obwohl es ein 10-bit ADC 
ist. Im Arduino Serial Monitor bekomme ich korrekte 10-Bit Werte.

von Bruno V. (bruno_v)


Lesenswert?

Luca S. schrieb:
> aber warum bei der 2. Variante der Wert immer 0 war, weiss ich
> immer noch nicht.

Luca S. schrieb:
>> Du "invertierst" Dein Signal mit ~.
>
> Besten Dank für den Tipp, ich glaube das Problem ist gelöst!
> Auf Vcc bekomme ich jetzt 255 und auf GND 0.

Weisst Du, was "~" macht? Wenn nicht, dann frag ruhig. Oder schaue nach.

von Manfred P. (pruckelfred)


Lesenswert?

Luca S. schrieb:
> In diesem Thread steht, dass die Referenzspannung intern 2.56V ist.

Wer sich schon eigenständig die Schuhe zubinden kann, hat das im 
Testaufbau binnen zehn Minuten geklärt.

Eine andere Variante wäre, sich das Datenblatt vorlesen zu lassen.

von Rolf (rolf22)


Lesenswert?

Luca S. schrieb:

> In diesem Thread steht, dass die Referenzspannung intern 2.56V ist.

[Lebenshilfe ON]Erste Referenz ist IMMER das Datenblatt. Nur wenn man da 
etwas nicht versteht oder es falsch zu sein scheint, fragt man 
anderswo.[Lebenshilfe OFF]

Davon abgesehen: Selbst wenn die interne Referenz 2,56 V wäre, würde der 
ADU bei deiner Eingangsspannung von 3,3 V an die Grenze laufen. Wie ich 
bereits gesagt hatte.

Es kann nur so funktionieren, dass du dem ADC eine höhere Spannung (z. 
B. Vcc) als Referenz vorgaukelst und die echte interne Referenzquelle 
(1,1 V) auf den internen(!) Messeingang des ADU schaltest. Das geht über 
die Programmierung der ADC-Funktionen. Siehe Datenblatt. Dann musst du 
nur noch die Berechnungsformel umdrehen und schon kannst du Spannungen 
von 0 bis z. B. Vcc (siehe oben) messen.

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


Lesenswert?

Bruno V. schrieb:
> Weisst Du, was "~" macht?
Das ergibt das Einerkomplement. Eine arithmetisch richtige Negierung ist 
das Zweierkomplement. Von Einerkomplement zum Zweierkomplement kommt man 
per Addition +1.

Wenn man den Unterschied bzw. den Zusammenhang zwischen beiden nicht 
verstanden hat, wird man immer wieder "seltsames" Verhalten 
bemängeln....

von Bruno V. (bruno_v)


Lesenswert?

Lothar M. schrieb:
> Wenn man den Unterschied bzw. den Zusammenhang zwischen beiden nicht
> verstanden hat, wird man immer wieder "seltsames" Verhalten bemängeln...

Hier kommt noch viel mehr dazu:

Wären die Werte uint8, ergäbe y=~x genau das, was er möchte: y=255-x.

Hier haben wir zudem noch integral Promotion und die Operatoren 
Priorität ~ oder /4. Das ganze funktioniert m.E nur bei einem ganz 
bestimmten Format der read-funktion.

M.E ist die Gleichung ein fürchterlicher Hack.

von Rainer W. (rawi)


Lesenswert?

Luca S. schrieb:
> In diesem Thread steht, dass die Referenzspannung intern 2.56V ist.

Wie willst du dann deine U_Bat mit ihren 3.2V direkt messen?

> Vcc ist 3.3V, der AREF Pin ist offen.

Deshalb wird man doch wohl trotzdem nach der Spannung am AREF Pin fragen 
dürfen. Die Spannung an AREF kommt vom internen 
Referenzspannungsumschalter, solange du das nicht über das ADC 
Multiplexer Selection Register abschaltest (Datenblatt Figure 24-1. 
Analog to Digital Converter Block Schematic Operation, Table 24-3. 
Voltage Reference Selections for ADC) und legt deinen Messbereich für 
das ADC-Eingangssignal fest.

: Bearbeitet durch User
von Monk (roehrmond)


Lesenswert?

In den ersten beiden Beiträgen hat Luca Schaltplan und Quelltext 
gezeigt. Dann noch die Info "Vcc = 3.3V" nachgereicht. In der 
Dokumentation von Arduino steht, dass standardmäßig die 
Versorgungsspannung als Referenz verwendet wird.

Damit sollte die Frage nach der Referenzspannung geklärt sein.

: Bearbeitet durch User
von Manfred P. (pruckelfred)


Lesenswert?

Steve van de Grens schrieb:
> In der
> Dokumentation von Arduino steht, dass standardmäßig die
> Versorgungsspannung als Referenz verwendet wird.

Und es steht bestimmt auch dabei, wie man sie umschaltet. Dann muß man 
sie aber nachmessen, weil sie von IC zu IC erhebliche Abweichungen hat.

Wenn die Referenz die Versorgung ist, wird immer 1023 kommen, weil mit 
der Ub auch die Referenz sinkt - was man für z.B. NTC-Messungen gerne 
nutzt.

Der TO hat in "original.png" einen LDR gemalt, geht es vielleicht 
garnicht um die eigene Betruebsspannung?

Es gibt noch einen anderen Weg, der ohne externen Spannungsteiler 
klappt. Frage ich mal G* "arduino eigene spannung messen" und lande 
dort:

https://www.arduinoforum.de/arduino-Thread-Messen-der-eigenen-Betriebsspannung-mit-dem-Arduino

von Rainer W. (rawi)


Lesenswert?

Manfred P. schrieb:
> Wenn die Referenz die Versorgung ist, wird immer 1023 kommen, weil mit
> der Ub auch die Referenz sinkt - was man für z.B. NTC-Messungen gerne
> nutzt.

Luca S. schrieb:
> obwohl ich 3.2V am ADC Pin anlege.

Luca S. schrieb:
> Vcc ist 3.3V

Mit der Versorgung als Referenz muss damit der ADC einen Wert von nahe 
0x3E0 liefern und zusammen mit der an dieser Stelle etwas eigenwilligen 
Komplementbildung

Luca S. schrieb:
> int value =~ analogRead(sensorPin) / 4;

ergibt das eben

Luca S. schrieb:
> immer Resultate nahe 0

Das Problem liegt wohl nicht beim Arduino, sondern tief in den 
Grundlagen von C und ADC, i.e. zwischen Stuhl und Monitor.
Mit Wischi-Waschi Aussagen wie "nahe 0" (+ oder - ?), Spannung = "AREF 
offen" und keiner Antwort zum vernünftig messbaren Bereich wird die 
Diagnose nicht einfacher und das Verständnis bleibt auf dem Niveau 
"geht"/"geht nicht".

Elegante Methoden wie die Messung der internen Referenz mit AVCC als 
Referenzspannung des ADC mit anschließender Umrechnung sind ganz anderer 
Level, kosten allerdings etwa 1.6 Bit (VCC=3.3V) bzw. 2.2 Bit (VCC=5V) 
in der Auflösung und gehen am Ziel vorbei, solange die zu messende 
Spannung echt kleiner als die als Referenz benutzte Versorgungsspannung 
ist ;-)
Der Unterschied zwischen absoluter und ratiometrischer Messung ist damit 
noch gar nicht angesprochen.
Die stillschweigende Voraussetzung, das VCC ausreichende 
Referenzspannungsqualität hat und fehlende Filterung zwischen AVCC und 
VCC ist noch so ein Thema, wo schaltungstechnische Grundlagen noch Luft 
nach oben haben.

Schönen Sonntag

: Bearbeitet durch User
von Monk (roehrmond)


Lesenswert?

Manfred P. schrieb:
> geht es vielleicht garnicht um die eigene Betriebsspannung?

Aufmerksamer lesen! Er misst nicht die Betriebsspannung. Das steht in 
den ersten Beiträgen des TO.

Luca S. schrieb:
> Vcc = 3.3V, im Moment kommen diese vom Serial Interface, mit dem ich
> teste.

Luca S. schrieb:
> ich bekomme immer Resultate nahe 0 als Output, obwohl ich 3.2V
> am ADC Pin anlege.

U_bat im Schaltplan weist wohl auf eine Batterie hin.

: Bearbeitet durch User
von Manfred P. (pruckelfred)


Lesenswert?

Steve van de Grens schrieb:
>> geht es vielleicht garnicht um die eigene Betriebsspannung?
> Aufmerksamer lesen! Er misst nicht die Betriebsspannung.

Ja, aufmerksam kesen hilft:

Luca S. schrieb:
> ich möchte aber jetzt direkt auf den Eingang eine
> Spannung geben und diese messen.

In seinem Plan "modifiziert.png" ist das die Batterie. Ist natürlich 
unzulässig oder gar für den µC tödlich, wenn die höher als Vcc ist.

von Rainer W. (rawi)


Lesenswert?

Manfred P. schrieb:
> Ist natürlich unzulässig oder gar für den µC tödlich, wenn die höher
> als Vcc ist

Durch einen Serienwiderstand und eine ausreichende Last an VCC ließe 
sich die tödliche Wirkung vermeiden.

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.