Benötigen Sie Hilfe beim Kalibrieren des ADC-Eingangs mit einem Spannungsteiler

Ich habe den analogen Eingang von Arduino Nano verwendet, um Spannungen im Bereich zwischen 22 und 30 Volt zu messen. Der ADC des Nano erwartet einen Bereich von 0-5 Volt und hat 0-1023 als Ausgang.

Befolgen Sie die Anweisungen, die Sie hier finden:

Analoge Spannung lesen (www.arduino.cc)

Was im Grunde besagt, dass alles, was ich brauche, dieser Code ist:

int sensorValue = analogRead(A0);
float voltage= sensorValue * (5.0 / 1023.0);

5,0/1023 = 0,004888 Volt pro Inkrement in analogen Messwerten. Umgekehrt sollte der Spannungseingang geteilt durch diesen Wert den Sensorwert ergeben.

Mein Spannungsteiler ist 1 MOhm (R1) zwischen dem Spannungseingang und A2, dann 200 K (R2) von A2 nach Masse

30 Volt werden als 4,2 Volt gemessen. 22 Volt werden als 3,1 Volt gemessen.

Ich denke, der Bereich zwischen 22 Volt und 30 Volt bietet dem ADC nicht genug Variation - jede einstellige Änderung im analogRead macht wirklich einen großen Unterschied.

Das Ergebnis ist, dass es mir einige verrückte Messwerte gibt. Es ist definitiv nichtlinear, daher habe ich große Probleme, es an beiden Enden meines Messbereichs genau zu machen. Jedes kleine ADC-Inkrement macht einen zu großen Unterschied in der gemessenen Spannung, da ich nicht den vollen Eingangsbereich von 0-5 V verwende.

Also habe ich 10 Messwerte hintereinander in 500-ms-Intervallen genommen und dann gemittelt.

Und doch funktioniert es nicht gut genug.

Eine Sache, die wirklich wichtig zu sein scheint, ist die Stromversorgung. Wenn ich 4,97 in den Vin stecke, werden andere Messwerte angezeigt, als wenn ich mich darauf verlasse, Strom von der USB-Verbindung zum Raspberry Pi 3B zu erhalten.

Erst gestern habe ich es endgültig ans Netzteil angeschlossen - war die ganze Zeit auf den Pi angewiesen. Aber es gibt immer noch keine genauen Messwerte.

--EDIT from Answers (Danke, dass Sie mir gezeigt haben, wo ich suchen muss)

Eingangsimpedanz: Ich versuche 147/23,5 für den nächsten Versuch. Erhalten Sie 3,0-4,1 für den Bereich 22-30. Im Grunde wie 1M/100K, aber niedrigere Widerstände.

Das Referenzspannungsproblem: Es misst 4,36 Volt am 5-V-Ausgang des Nano. Vin ist genau 5V.

Hier ist ein Artikel, den ich gefunden habe, der besagt, dass die 5/1023-Formel diesen tatsächlichen Wert verwenden sollte:

Messen von Gleichspannung mit Arduino

Und noch eine, die es bestätigt:

Analog-Digital-Wandlung

SO JETZT ist das unmittelbare Problem, wie ich 22-30 Volt auf 0-4 oder so abbilden kann, wodurch die Nutzung von mehr als nur ein paar Prozent der zulässigen Werte ermöglicht wird?

Cross-posted at Wie kann ich ADC-Spannungsmesswerte mit Arduino Nano ernsthaft kalibrieren?

Ich würde einen Spannungsteiler mit niedrigeren Widerständen verwenden. Der analoge Eingang des Arduino zieht etwas Strom, während er die Spannung misst. Ihr Teiler kann nicht wirklich genug Strom liefern. Versuchen Sie es mit 100k und 20k oder 10k und 2k.
Ich bin mir nicht sicher, was schief gelaufen ist - vielleicht meine Verkabelung, also verwende ich jetzt 147/23,5, was mir einen Bereich von 3 bis 4 Volt gibt. Wenn ich jetzt nur 22-30 auf 1-4 abbilden könnte, könnte ich es einen Tag nennen.
Sie haben die Frage zweimal gestellt, ohne einen Link zur anderen, jetzt antworten wir auf beide, ohne die Antworten des anderen zu kennen. arduino.stackexchange.com/questions/38845/…

Antworten (5)

Der beste Weg ist Offset und weniger Dämpfung.

Spez

  • ja wandle 20~30 in 0 bis 5 V mit 0,1 % Genauigkeit um, falls möglich.

Rev. A

  • 22~30 umgewandelt in 0~4 wird zu Vin * 0,5000 -11,00 V = Vout
    • 11,000 V = k* 4,380 V mit k = 2,5114
    • mit einem nicht-inv OpAmp mit Verstärkung 1+Rf/Rin
  • Einweg: V+/2 - 11,00 V mit Präzisions-Vref oder programmierbarem Zener.
  • Verwendung von R-Array mit angepasstem R auf <0,1 %
  • Dies ist eine 3-mal bessere Auflösung bei Verwendung von 1/2 statt 1/6 Dämpfung
  • Stellen Sie sicher, dass Ihre Verbindungen Twisted-Pair sind und mit einer niedrigen ESR-HF-Kappe gefiltert werden

Welche Vorräte sind verfügbar?

ps Ich bin mit Ehrfurcht vor Aurora aufgewachsen, jagte Rauchfahnen nach, die auf Bodenhöhe zu sein schienen, beobachtete nachts stundenlang Himmelswellen wie den Ozean und die feurigen Farben in Churchill Mb auf der NRC-Raketenforschungsanlage für Plasmaphysik.

Ja. Das wäre perfekt. Aber ich stecke bei deinem ersten Punkt fest, @Tony. Das ist der Heilige Gral. Abgesehen von der Genauigkeit, wie erstelle ich diese Konvertierung? Ich würde wirklich gerne die 22-30 idealerweise auf 0-4 abbilden. Meine Vref wird mit dem neuen Netzteil 4,38 betragen, gemessen am 5-V-Pin. Es misst direkt bei 5 V bei Vcc. Dafür sind meine Verbindungen sehr kurz. Der ADC befindet sich direkt an der Quelle und ist mit einem Raspberry Pi verbunden, der per WLAN an das Mutterschiff zurückmeldet.
8' Volt Delta bis 4 ist die gleiche Dämpfungsspezifikation wie ich sie angegeben habe. Welchen Teil können Sie nicht ausführen? die 11,00 Vref oder die Dämpfung von 0,5000.. Angepasste R-Arrays von sogar 0,01% sind billig. Vin/2-11.000 V = 0 bis 4 V
Okay, ich verstehe, was du meinst. Ich überprüfe meine Teilekiste. Ich weiß, dass ich eine 741 oder 10 habe, bin mir aber nicht sicher, wo sie sind. Widerstände sind hier jedoch in Ordnung.
Verwenden Sie keinen uA741, es sei denn, Sie interessieren sich nicht für Sättigungsfehler
OK. Nun, ich habe nicht viele analoge Geräte auf Lager, also muss ich mich erstmal mit dem begnügen, was ich habe. Und nein, ich kann die 11Vref nicht machen, weil die USB-Stecker an einen Raspberry Pi angeschlossen sind und sie sehr spezifisch in Bezug auf die Spannung sind. Der Nano alleine wäre in Ordnung, nur nicht so, wie ich ihn benutze. Sie nehmen Messwerte vor und der Pi ist als Nano-Programmierer eingerichtet, sodass ich dasselbe Kabel verwende, um auch die Messwerte zu erfassen. Der Pi macht auch scp und all das über WiFi. Zumindest genau gelernt, was mein Vref ist. Ich dachte, es wäre Vcc, aber es wird tatsächlich am 5-V-Pin gemessen. Das sollte bei der Linearität helfen, wenn nicht beim Rauschen.
Ein 5-V-Rail-to-Rail-Operationsverstärker ist billig. Wenn Sie Match-Rs mit Präzisions-Rs verwenden, können Sie die gleiche Formel mit Verstärkung erzielen, indem Sie alle stabilen Low-V-Referenz- und Präzisions-R-Verhältnisse verwenden. alle weniger als 5V. Wie 24V/8 in=Vin+ und 11V/3 = der invertierende Eingang R und dann Rf/Rin=3, also Av+=(3+1)/8= 0,5000, aber verwenden Sie keine 1% Widerstände, wenn diese Teile billig sind, machen Sie es richtig . Verfeinern Sie also die Spezifikation, bis sie funktioniert. und dann die richtigen Teile bestellen. Seien Sie nicht billig. !! (OK)
OK ich verstehe. Ich verwende 1% Widerstände - 2 Watt. Können Sie mir bitte eine Teilenummer nennen, nach der ich suchen soll? Dem möchte ich nachgehen. Darf ich Ihnen die gleiche Frage auch stellen, aber für die halbe Spannung? Ich muss auch 11-15 Volt messen. Ich habe eine verdammt gute Zeit, aber ich denke, das Problem im Moment könnte zu viel Widerstand sein. Ich verwende den gleichen Spannungsteiler: 147K/23,5K. Gleiche Hardwarekonfiguration. Rpi ist per WLAN mit mir verbunden und seriell mit dem Arduino Nano. Sowohl 12 Volt als auch 5 V verfügbar. Die 5V sind geregelt. Die 12 Volt sind die Batterie, die durch Solar aufgeladen wird. Ich verwende die gleiche Vref

Abgesehen von der Reduzierung der Spannungsteilerwiderstände, die notwendig, aber nicht ausreichend ist, müssen Sie die Referenz berücksichtigen, wenn Sie genaue Messwerte wünschen. Für den Teiler ist 10K ein gutes Maximum. Wenn Sie also einen 49,9K 1% Widerstand und einen 10,0K 1% Widerstand verwenden, kommen Sie dem gewünschten Verhältnis ziemlich nahe und die Impedanz vom Eingang des ADC sieht aus wie 8,3K. Eine 10n-100n-Keramikkappe über die 10K schadet nicht.

Der Arduino hat keine ADC-Spannungsreferenz, daher wird der Messwert ratiometrisch zur Versorgungsspannung sein. Ein Unterschied von 5 % in der Versorgungsspannung bedeutet einen Unterschied von 5 % im Messwert. Es gibt eine Bandgap-Referenz auf dem ATmega-Chip, sie ist jedoch lose spezifiziert (+/-10 %), hat eine relativ niedrige Spannung (1,1 V nominal) und kann nur als Eingang für den ADC verwendet werden. Wenn Sie auch mit dem ratiometrischen Messwert eine genaue Spannung messen können, können Sie die Versorgungsspannung mit Berechnungen korrigieren, wenn die Versorgungsspannung konstant genug bleibt.

Oder Sie könnten einen externen Präzisions-ADC anbringen und auf den Arduino verweisen. `


Wenn Sie eine Offset-Null durchführen möchten, können Sie eine Schaltung wie diese verwenden:

schematisch

Simulieren Sie diese Schaltung – Mit CircuitLab erstellter Schaltplan

Verwenden Sie einen RRIO-Operationsverstärker wie den Microchip MCP6001 .

Wenn Ihnen meine Wahl der Eingangs- / Ausgangsspannungen nicht gefällt, können Sie R1-R5 neu berechnen, um das zu bekommen, was Sie wollen, es ist nur einfache Algebra, die jeder mit etwas Geduld machen kann.

R1/R5 sind zwei Widerstände und nicht einer, um das 9:1-Verhältnis mit Standard-Widerstandswerten der E96-Serie zu erhalten. R6 ist nicht kritisch - es stellt nur sicher, dass genügend Strom zu D1 gelangt, um die Regulierung aufrechtzuerhalten. Die anderen sollten Präzisionstypen sein.

Da eine ziemlich genaue und sehr stabile Spannung von der Eingangsspannung subtrahiert wird, kann die Verwendung der Versorgungsspannung als Referenz akzeptabel sein, je nachdem, was Ihre tatsächlichen Anforderungen sind. Die Reduktion der Empfindlichkeit beträgt in diesem Fall 3:1.

1-4? oder 0~4?? welche? Bleiben Sie zuerst bei den Spezifikationen, nicht beim Design.
OK, ich verwende jetzt eine bekannte Referenz (5 V auf Vcc gibt mir 4,6 auf dem 5-V-Pin, der die Referenzspannung für die ADCs ist. Ich werde 4,6 für die Gleichung verwenden. Plus ging auf 147/23,5 für den Teiler. So weit, so gut. TNX. Ich bekomme immer noch 3-4 Volt, wenn ich wirklich 0-4 Volt will. Der ursprüngliche Spannungsbereich beträgt 8 Volt, also ein 4-Volt-Bereich für den ADC.
Ich habe nach dem 6001 gesucht. Wenn ich ein DIP-Paket finden könnte, würde ich es sofort kaufen. Selbst mit meinem Lupenlicht werde ich zu alt für SMT. Ich erinnere mich an Operationsverstärker aus der Schule. Ich bin mir sicher, dass ich die Werte herausfinden kann, wenn ich einen Chip in der Hand habe und ein Datenblatt auf dem Bildschirm.
Sowohl Arduino Nano als auch Uno haben eine eingebaute Referenz. Es ist nicht sehr genau, aber es existiert.

Wie JRE in den Kommentaren sagt, schlägt Atmel (jetzt Microchip :-( ), der die Prozessoren in Arduinos herstellt, im Allgemeinen vor, auf den meisten seiner Prozessoren keine Schaltkreise mit einer Ausgangsimpedanz von mehr als 100 kOhm zu verwenden.

Tatsächlich schlagen sie bei einer Impedanz von 100 kOhm oft vor, auch einen Kondensator wie folgt hinzuzufügen:

schematisch

Simulieren Sie diese Schaltung – Mit CircuitLab erstellter Schaltplan

Weil der Prozessor eine Eingangsimpedanz hat, die die Lesespannung nach unten zieht (oder in einigen Fällen möglicherweise nach oben?), was wahrscheinlich mehr als 10 MOhm ist. Aber es hat auch eine kleine Kapazität im Inneren, die es verwendet, um die Spannung zu "halten", während es eine Umwandlung durchführt.

Wenn es diese Kapazität verbindet, fließt eine kleine Menge zusätzlichen Stroms, was wahrscheinlich der Grund für Ihren Spannungsverlust ist. Wenn Sie 10k und 2k verwenden, ist dieser Strom nicht groß genug, um mehr Fehler zu erzeugen, als bereits im ADC vorhanden sind, aber bei größeren Widerständen werden Sie dies bemerken. Mit 1 MOhm an der Spitze bin ich mir nicht sicher, ob Sie es mit einem Kondensator vollständig reparieren können (die interne Leckage macht sich wahrscheinlich bereits bemerkbar), also ist die goldene Mitte vielleicht 100 k und ein kleiner Kondensator.

Der zusätzliche Kondensator im Falle einer Impedanz von 100 k puffert die Spannung die ganze Zeit, in der der ADC nicht mit Ihrem Netzwerk verbunden ist, und wenn der ADC dann kurz Ihre Spannung mit seinem Haltekondensator abtastet, liefert der von Ihnen hinzugefügte Kondensator viel Energie um diesen internen Haltekondensator aufzuladen, so dass der Fehler viel geringer ist.

Vielen Dank für die Einführung in die Widerstandswerte. Mein nächster Versuch wird so sein, wie Sie es zeigen: 100K und 20K. An Kondensatoren habe ich auch schon gedacht. Ich dachte eher an 10 uF - ich sehe jedoch, dass Sie 22 nF anzeigen. Dies sind Spannungsmesswerte, die sich in der Größenordnung von ein paar Minuten ändern.

Danke für eure Antworten - da steckt viel kollektives Wissen drin. Es half mir, einen Weg zu finden, dieses System mit dem, was ich zur Hand hatte, zu stabilisieren und zu kalibrieren. Die Arduino-Leute haben mir mit einigen Konzepten zu dem jeweiligen Gerät geholfen, aber hier sehe ich die Antworten, die ich wirklich brauche.

(Das größte Problem war, dass die Referenzspannung und die Auflösung mit 5/1024 angenommen wurden, was völlig falsch ist. Wenn ich die Nanos nicht direkt an den 5-V-Pin fütterte, der noch auf dem Tisch liegt, wie jemand darauf hingewiesen hat, dann wäre es so 5/1023)

Ich änderte mein Widerstandsnetzwerk zu sein

147 K / 23.5 K

(Stückliste: 1x 100K, 3x 47K)

R 1 = 47 K 47 K = 23.5 K

R 2 = 100 K + 47 K = 147 K

Außerdem wurde ein 100-uF-50-V-Elektrolyt über den Eingang der von mir überwachten Batteriebank hinzugefügt.

Ich füttere Vin mit 5 V. Und habe herausgefunden, dass die Referenz am 5-V-Pin nach dem Regler als 4,6 V messbar ist.

Wissend, dass

R e S Ö l u T ich Ö N v R e F = A D C v ich N

Ich drehte das um

v ich N = ( A D C v R e F ) R e S Ö l u T ich Ö N

Oder,

v ich N = A 2 4.6 1023

Mit einem Labornetzteil konnte ich bestätigen, dass bei diesen Einstellungen 22 Volt bei 3 Volt und 29,98 bei 4 Volt genau ankamen.

So

v B A T = A 2 ( 4.6 / 1023 ) / ( R 2 / ( R 1 + R 2 ) )

v B A T = A 2 ( 4.6 / 1023.0 ) ( 147000 / 170500 )

Es funktioniert jetzt einigermaßen gut.

--UPDATE-- Widerstände für den Teiler auf 100K/20K geändert und den 5V-Pin mit Strom versorgt, wobei der Regler als Referenz umgangen wurde. Es misst bei 5,02 und ist stabil.

Es verfolgt ziemlich gut mit dem Messwert auf dem Bildschirm des Ladereglers.

Geben Sie hier die Bildbeschreibung ein

(Gelb bedeutet, dass der Wechselrichter eingeschaltet ist)


In ähnlicher Weise ging ich für den 11-15-Volt-Stromkreis auf 147K/47K und verlegte ein höherwertiges P/S auf den 5V-Pin, wo es 5,03V misst; dort sind die ergebnisse auch besser.


Wie auch immer, ich werde das aufheben, bis ich eine Operationsverstärkerschaltung herausfinden kann.

Vielen Dank für Ihre Hilfe

Für das, was es wert ist, haben Texas Instruments (und andere OEMs für elektronische Komponenten) kostenlose Web-Apps auf ihren Websites, die Ihnen beim Entwerfen von Operationsverstärkerschaltungen, Stromversorgungsschaltungen usw. helfen. Gehen Sie zu ti.com und suchen Sie nach ihren WEBENCH Designer Center-Tools. IIRC müssen Sie sich für ein kostenloses Benutzerkonto anmelden, wenn Sie ein fertiges Design speichern oder sich selbst zusenden möchten.

Erstens, schalten Sie Ihr Arduino nicht über 5 Volt in den VIN-Pin. Verbinden Sie 5 V mit dem 5 V-Pin (wenn Sie sicher sind, dass es 5 V sind) oder versorgen Sie es mit einer höheren Spannung über den VIN-Pin. Zweitens würde ich empfehlen, den Teiler so zu ändern, dass er mit der 1,1-Volt-Bandlücken-Spannungsreferenz arbeitet (Ziel: 0-1 V). Es ist wahrscheinlich die genaueste Referenz (bei ähnlichen Produkten hat es einen Temperaturkoeffizienten von 90 ppm ) und Sie können die 10 % Unsicherheit mit einem Multimeter kalibrieren. Drittens kann die Zuordnung des Werts von 0 bis 1024 zu 0 V bis 30 V mithilfe der integrierten Zuordnungsfunktion erfolgen:map(value, 0, 1024, 0, 30000)/1000.0

Okay, geschafft. Es misst 5,02 - Teiler ist jetzt 100k/20k
Ausgezeichneter Punkt. Tatsächlich denke ich, dass ich herausgefunden habe, dass ein großer Teil der Instabilität, die ich gesehen habe, darin besteht, dass ich das Board überhaupt mit 5 V versorgt habe. Ich bin auf 12-auf-9-V-Konverter umgestiegen und jetzt sind sie viel stabiler. Ich bin es in den Vin. Auf jeden Fall bleiben die Kalibrierungen jetzt hängen, anstatt zu wandern, während der 5-V-Eingang wanderte. Diese 9-V-Wandler können eine Vielzahl von Eingängen aufnehmen und geben immer 9 V aus, mit Eingängen von etwa 11 bis 20. Das war also ein großartiger Tipp. Ich verwende jetzt den 5-V-Pin für Dinge wie LCD-Displays und das RTC-Modul.