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:
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?
Der beste Weg ist Offset und weniger Dämpfung.
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.
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:
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.
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:
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.
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
(Stückliste: 1x 100K, 3x 47K)
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
Ich drehte das um
Oder,
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
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.
(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
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
JRE
SDsolar
Jot