Hi,
ich messe Spannungen mit Hilfe eines ADS1015. Einmal ohne Spannungsteiler im Bereich von 0-VCC. Diese Messwerte stimmen, soweit es die Auflösung des ADS1015 zulässt, perfekt mit meinem Multimeter überein. Ich gehe deshalb davon aus dass die Referenzspannung des ADS1015 exakt ist und die angegebene Auflösung von 1bit=3mV stimmt.
Probleme habe ich allerdings mit einer Spannung die ich über einen Spannungsteiler messen möchte. Diese weicht im Bereich von 200-300mV ab.
Ich hatte die Widerstände einzeln gemessen bevor ich sie verlötet habe:
R1= 201.1kOhm
R2=47.06kOhm
Nachdem ich sie verlötet habe sieht ein kompletter Satz Messwerte meines Multimeters wie folgt aus:
U0=11.68V
U1=9.42V
U2=2.208V
R1=200.03kOhm
R2=19.5kOhm (Bogus, ich messe halt den parallelen ADC mit.)
Aus den restlichen Werten rekonstruiert müsste tatsächlich R2=46.69kOhm sein.
Nachdem ich diese Widerstandswerte in die Rechnung des Arduino eingesetzt habe zeigt dieser für U0=11.50V. Ich brauche kein super exaktes Ergebnis, aber das finde ich doch etwa weit daneben.
Über den ganzen Messbereich sieht es so aus dass der Arduino bei 3V exakt stimmt, und immer mehr falsch geht je höher U0 ist. Ich habe versucht die Widerstandswerte per try & error zurecht zu biegen, um bei 12V einen exakten Wert zu bekommen, aber dann bekomme ich unter 12V zu niedrige und über 12V zu hohe Werte.
Hier mein Code zur Berechnung:
void readAnalogInput() {
for (int i = 0; i < 9; i++) {
voltage[i] = voltage[i+1];
}
voltage[9] = adc.readADC_SingleEnded(VOLTAGEIN);
}
uint16_t getVoltage() {
float a = 0.0;
for (int i = 0; i < 10; i++) {
a = a + voltage[i]; //addiere die letzten 10 Messungen
}
a = a*3.0/10.0; //1bit=3mV, durch 10 Messvorgänge
a = a * ((R1+R2)/R2); //Spannungsteiler
return (uint16_t) a;
}
Gibt es eine gute Methode das in Software zu kalibrieren? Ich könnte eine Tabelle der Abweichungen anlegen, und diese auf den Messwert mappen. Aber das erscheint mir nicht sonderlich sinnvoll.
Edit:
Lasse ich die Spannung U2 ausgeben, liegt diese über den ganzen Messbereich nur um 5-10mV daneben. Das über den Spannungsteiler hoch gerechnet sollten 25-50mV Abweichung zu erwarten sein. Sie liegt aber um 200-300mV.
Also wenn Du die Eingänge des Arduinos verwendest nicht das ADS1015 würde ich Dir vorschlagen die interne Referenzspannung zu verwenden (1,1 Volt).
Auf dem Ding sehe ich aber nur Alert und Addr. Die Adresse ist für I2c Bus, klar. Der Alert? <- Interrupt?
Ich denke die Referenzspannung = Versorgungspannung. Ist die Versorgungspannung stabil?
Ich bin mir nicht sicher ob das Toleranzfrei überhaupt möglich ist. Evtl. einen Durchschnittswert von 5-10 Messungen sollte die Toleranz senken.
Grüße,
Donny
PS: Kabeln und Leiterbahnen sind auch Widerstände. Da musst Du eigentlich den Widerstand vom µC bis zum 'Versorger' messen.
gsezz:
Ich hatte die Widerstände einzeln gemessen bevor ich sie verlötet habe:
R1= 201.1kOhm
R2=47.06kOhm
Das sind ja eher hohe Werte. Hat es einen bestimmten Grund, warum du genau diese genommen hast?
Ich frage deshalb, weil ADCs meist mit dem zu messenden Eingangssignal einen (kleinen) Kondensator laden und mit dieser Ladung erst eine Auswertung erfolgt.
Wenn dein Spannungsteiler aber recht hochohmig ist, dann kann sich dieser Kondensator nicht schnell genug aufladen und das Messergebnis wird verfälscht. Im Datenblatt zum ADS1015 stehen Werte für den Eingangswiderstand zwischen 700kOhm bis 22MOhm (je nach Verstärkung).
Ich würde versuchen einen Spannungsteiler mit kleineren Widerstandswerten zu nehmen und die Messungen zu wiederholen. Ich vermute, dass die Abweichungen dann geringer sind.
ich habe erst verg. Woche mit einem ADS1115, also dem großen Bruder hier rumgespielt, und dabei erstmal Erkenntnisse gesammelt:
Einen Spannungsteiler mit 1k / 25kOhm davor, und das Ding misst Mist, also eine Bananenflanke nichtlinear. Ich dachte auch, erst mal das Einfache ausprobieren. Es muss also entweder zwischen GND und Betriebsspannung gemessen werden, oder zwingend ein Spannungsfolger davor.
Bei folgendem Satz bin ich erst beim Xten mal lesen drüber gestolpert, und beschreibt die ganze Problematik, warum man nicht einfach einen Spannungsteiler davorbasteln kann:
The common-mode input impedance changes depending on the full-scalerange, but is approximately 6 MΩ for the default full-scale range .In Figure 26, the common-mode input impedance is ZCM.
Evtl. hilft Dir die Sektion 9.3.2 Analog Inputs, da ist die Eingangsimpedanz näher beschrieben.
Da das ganze bei mir ein eher universelles Messgerät werden soll, kommt auch gleich noch ein Level-Shifter davor, damit ich bipolar messen kann.
ich habe an einem ADS1115 2 Teiler mit 30k/10k und einen 100k/10k, für Spannungen bis 20 V bzw. 50 V. Mit Widerständen 1% lag es schon recht gut am Ergebnis des DVM.
Ich habe dann die Formel zum Berechnen der Spannung (R1+R2)/R1 nach der tatsächlich gemessenen Spannung angeglichen. Statt 30+10=40 musste ich 39.92 und 39.8 und statt 110 109.8 nehmen, dann hatte ich an allen 3 Eingängen bei gleicher Spannung auch gleiche Anzeigen. Aber es ging mir mehr ums Prinzip, es ging tatsächlich irgendwie um die 2.Stelle nach dem Komma (10 mV) bei 12 V Messspannung. Da sollte auch das DVM recht genau sein.... Linearität habe ich nicht geprüft, mir ging es um die 12 V. Werde ich aber mal prüfen....
Die Ergebnisse waren auch recht stabil und nachvollziehbar, auch egal ob die Stromversorgung von USB oder dem 5-V-Regler der Arduinio-Platine kam.
Ich hatte mich wohl zu kompliziert ausgedrückt. Was der ADS1015 für U2 misst stimmt eigentlich mit meinem Multimeter überein. Bis auf 5-10mV, was ich in Ordnung finde. Der Fehler entstand beim berechnen von U0, weil meine Widerstandswerte einfach nicht ganz korrekt waren.
Mein Problem war dass die Widerstände verbaut und aufgewärmt natürlich etwas abgewichen sind, ich sie aber nicht mehr messen konnte. Ich habe echt lange auf der Leitung gestanden, bis ich auf die offensichtliche Lösung gekommen bin:
Die Werte der einzelnen Widerstände brauchen mich doch gar nicht mehr zu interessieren, die stellen ja nur das Verhältnis aus U2 zu U0 dar. Letzteres kann ich mir ja einfach ausrechnen wenn ich U0 und U2 mit dem Multimeter messe. Ich habe die Widerstände komplett aus dem Quellcode geworfen, und stattdessen dieses Verhältnis von 5.141 fest in die Gleichung eingesetzt. Und schon stimmen die Werte die der Arduino liefert.
@uxomm
Nein, die Widerstände haben keinen bestimmten Grund. Ich wollte welche mit niedriger Toleranz verwenden, von denen ich aber nur eine kleine Auswahl da hatte. Das war dann die einfachste Kombination mit der ich auf meinen Messbereich gekommen bin.
Was der ADC für U2 misst stimmt eigentlich sehr gut mit dem überein was mir mein Multimeter an dessen Anschlüssen ausgibt. Niedrigere Widerstände sind aber trotzdem eine gute Idee, die sollten ja auch den Einfluss von Kabeln, Klemm- und Lötstellen verringern. Ich habe momentan nämlich noch eine recht hohe Abweichung zwischen den Eingängen des ADC und den Polklemmen meines Gehäuses.
Ja, streichen wir meinen letzten Satz. Zum Glück habe ich nur zweimal Widerstände aus- und wieder eingelötet bis ich gemerkt habe dass ich den Spannungsteiler natürlich aus größeren Widerständen bauen muss, wenn ich weniger Einfluss durch die in Reihe liegende Leitungswiderstände möchte. Ich bin etwas Urlaubsreif.
Mit höheren Widerständen klappt das alles viel besser. Ich benutze jetzt 680k und 150k, und bekomme richtig gute Ergebnisse.