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...
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 | }
|
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?
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.
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.
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.
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.
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
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.
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.
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.
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
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
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
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.
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.
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.
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
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....
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.
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
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.
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
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
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.