ADC funktioniert nur mit Spannungsteiler?

OP #7497565
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...

Angehängte Dateien:
OP #7497567
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
}
OP #7497575
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.

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

OP #7497755
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.

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

#7497903
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?

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

OP #7497986
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.

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

Moderator (Firma: Titel) Persönliche Seite #7498154
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....

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

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

Gast #7498292
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.

#7498452
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

#7498495
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

Gast #7498502
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.

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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren