Hallo zusammen,
bei einem anderen größeren Projekt fiel mir auf, dass die Spannungsmessung recht ungenau ist. Zum Vergleich habe ich identische Hardware (Nano, Spannungs-Sensor) verwendet und mit zwei Sketches verglichen.
Version A ergibt mit der internen Referenz von 1,1 Volt eine hohe Genauigkeit, dass ich auf den geplanten Einsatz des LM4040 verzichten kann.
Version B hat eine Abweichung von 0,08 Volt; alles bezogen auf die Messung mit einem Multimeter. In meinem größeren Sketch ist Version B eingebaut und ich beabsichtige, alles auf Version A umzubauen. Kann das bitte jemand checken, ob die gleichen Werte herauskommen?
Vielen Dank.
Hier die beiden Sketches:
Version A:
/*
Arduino DC Voltage Demo 1
dc-voltage-demo.ino
Use Arduino A/D converter to measure voltage
Use external voltage divider with 30k & 7.5k resistors
Results displayed on Serial Monitor
DroneBot Workshop 2021
https://dronebotworkshop.com/dc-volt-current/
*/
// Define analog input
#define ANALOG_IN_PIN A0
// Floats for ADC voltage & Input voltage
float adc_voltage = 0.0;
float in_voltage = 0.0;
// Floats for resistor values in divider (in ohms)
float R1 = 30000.0;
float R2 = 7500.0;
// Float for Reference Voltage
//float ref_voltage = 5.0;
float ref_voltage = 1.1;
// Integer for ADC value
int adc_value = 0;
void setup() {
// Setup Serial Monitor
Serial.begin(9600);
Serial.println("DC Voltage Test");
analogReference(INTERNAL);
}
void loop() {
// Read the Analog Input
adc_value = analogRead(ANALOG_IN_PIN);
// Determine voltage at ADC input
adc_voltage = (adc_value * ref_voltage) / 1024.0;
// Calculate voltage at divider input
in_voltage = adc_voltage / (R2 / (R1 + R2));
// Print results to Serial Monitor to 2 decimal places
Serial.print("Input Voltage = ");
Serial.println(in_voltage, 2);
// Short delay
delay(2000);
}
Hast Du die Widerstandswerte ausgemessen? Die sind selten so genau, wie in Deinem Sketch angegeben.
Hast Du die 1,1 V interne Referenz ausgemessen? Die unterliegt auch Fertigungstoleranzen.
Der Sinn der folgenden Zeile erschließt sich mir nicht. Könnte es sein, dass da Wert und Kommentar nicht zusammen passen?
const unsigned int REF_VOLTAGE = 11; // entspricht 5,0 V
Die Werte weichen geringfügig ab (7,52K, 29,94K). Für beide Sketches wird die gleiche Hardware verwendet, so dass es zu vernachlässigen ist.
Die Referenzspannung weicht erst ab der zweiten Kommastelle ab und durch den Vergleich (Hardware s. o.) ist das nicht relevant.
Habe ich entfernt. Der Kommentar trifft bei Verwendung der Referenz nicht (mehr) zu.
Im Grunde sollte bei A und B das gleiche Ergebnis rauskommen; tut es aber nicht. Daraus schließe ich, dass Version A genauer ist. Warum, kann ich nicht beurteilen.
Wenn Du vom float weg willst, musst Du alles in integer/long umschreiben.
Ich hatte das doch gerade erst vor ein paar Tagen....
Ob das evtl. eine falsche Schlußfolgerung ist, kann ich nicht beurteilen.
Nur weil Dein Multimeter die selbe Rechengrundlage benutzt heisst das noch lange nicht, das Version b falsch ist.
Du musst nur eines berücksichtigen:
Wenn Du mit ganzzahlen bis vor die Ausgabe rechen willst, muss der Wertebereich das auch hergeben.
Ein float dazwischen oder eine verkürzte Zahl haut Dir alles weg.
Habe eben nochmal die Referenzspannung gemessen: 1,113 Volt.
Da in beiden Versionen die gleiche Spannung verwendet wird, kann es daran nicht liegen. Beim Einsatz des LM4040 gab es die gleichen Ergebnisse, weshalb ich für diesen Zweck darauf verzichten will.
Ich verstehe deine Gedanken, aber die haben wenig mit meiner Ansage zu tun.
Weder die Widerstandswerte, noch die absolute Referenzspannung würde ich in irgendeine der Berechnungen einfließen lassen.
Alles flüssiger als Wasser.... Überflüssig.
Aber ok, dem Menschen, sein Himmelreich, sind seine Gedanken.
Ich weiß. Nur beim weiteren Programmieren fiel mir der Unterschied auf, den ich mir nicht erklären kann.
Ich weiß es eben auch nicht. Bei meinen Tests lade ich Version A, notiere die Ergebnisse und lade direkt danach Version B. Da sollte doch das gleiche Ergebnis rauskommen. Kannst du bitte die beiden Sketches mal laden und vergleichen?
Ok, das war das Ding mit dem OLED und der Berechnung da drin. Es gab nach #66 irgendwie kein weiterkommen.
Hättest oben gleich dazu schreiben können; der interessierte Leser hätte dann
nachlesen können auf welchen Stand Du zurückgreifst.
Das Prinzip dort ist noch immer das gleiche.
Wenn Du mit Ganzzahlen rechnen willst, dann alles.
Für Divisionen brauchst Du genügend Stellen um zu vermeiden, das abgeschnitten wird.
Was erwartest Du denn für eine Genauigkeit?
Der ADC hat 10 bit Auflösung.
In welchem Bereich findet sich Deine Eingansspannung.
Das hängt zwar mit dem anderen Projekt zusammen, aber mir ging es um das Prinzip. Damit sich keiner in den anderen Thread einlesen muss, habe ich mir die Mühe gemacht und zwei identische Version, abgesehen von der Berechnungsmethode, erstellt. Damit kann jeder ohne großen Aufwand das Problem nachvollziehen.
Für die Genauigkeit reicht mir eine Stelle nach dem Komma. Wenn es also 4,68 Volt sind, werden (bei einer Kommastelle) 4,7 Volt angezeigt. Bei Version B sind es 4,6 Volt.
Der benötigte Spannungsbereich liegt zwischen 10,5 und 14,8 Volt. Um Schäden an den Accus zu vermeiden, will ich die Spannung recht genau wissen, um z. B. eine Überspannung zu vermeiden. Das würde den verschlossenen Blei-Accu zum Kochen bringen.
Auf die Ungenauigkeit des Ergebnisses bin ich beim Test mit dem LM4040 gestoßen und konnte es mir nicht erklären. Deshalb meine Fragen im Forum.
P.S.:
Wenn die Hardware im Schaltschrank eingebaut ist, kann ich mal ein Bild schicken. Ich bin schon seit Anfang Dezember 2021 an der Entwicklung, wobei sich auch die Hardware aufgrund neuer Erkenntnisse mehrfach geändert hat.
Dann liegt es wohl an der Methodik, dass unterschiedliche Werte angezeigt werden. Aus dem Bauch heraus neige ich zu Version A, auch wenn das wieder Umbauarbeiten bedeutet.
Könnte noch von dir sein. Habe ich aus meinem Projekt herauskopiert, aber auf eine Messung reduziert. Wenn ich es auskommentiere, wird keine Spannung mehr angezeigt.
Dank der Toleranzen der internen Referenz und auch der Toleranzen der Widerstände, ist die Steigung auf jedem AVR leicht anders, drum macht es Sinn, diese im EEPROM abzulegen.