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...
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.
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.
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.
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.
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?
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.
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.
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.
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....
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.
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.
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.
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
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.