Forum: Mikrocontroller und Digitale Elektronik ESP32 - ADS1115 - ACS712 - Strom und Spannung messen


von Chris N. (fellpower)


Lesenswert?

Moin

Ich plane, eine Solaranlage mit etwas mehr Gehirn auszustatten.

Dazu möchte ich gern 2 Ströme messen, jeweils den Ladestrom zu den 2 
Akkus und den von Panel. Weiterhin möchte ich beide Spannungen an den 
Akkus messen.

Als Hardware habe ich mich für einen ESP 32 als uc, einen ADC1115 zur 
Spannungsmessung und jeweils 2 ACS712 (30A) als Strommesser entschieden. 
Das Ganze auf ARduino Basis, denn dort gibt es teilweise fertige 
Libarys, die ich auch nutzen muss, da ich nicht soo viel Ahnung vom 
Coden habe.

Nun ergeben sich aber einige Probleme, welche wohl auf fehlendem Wissen 
beruhen. Und dazu habe ich ein paar Fragen an euch.

Der ESP hat nur einen Analog Eingang, darum hab ich mich für einen 
ADS1115 entschieden. Mit seinen 4 Kanälen kann ich wunderbar die 
Spannungen messen und die Werte per I²C an den MCU übertragen. Dazu 
nutze ich die Adafruit ADC1115 Libary für Arduino.

Dazu nutze ich folgenden Code:
1
adc1 = ads.readADC_SingleEnded(1);             
2
 Volt2 = (adc1 * 0.1875) / 1000;

Damit komme ich soweit klar und die Auflösung reicht eigentlich auch, 
mit 2 Stellen nachm Komma.

Das Gain vom ADC würde ich noch anpassen, mit einem Spannungsteiler, um 
die Auflösung / Genauigkeit noch etwas zu verbessern. Aber aktuell messe 
ich nur aufm Breadboard mit 5V als Eingangsspannung, weshalb ich diese 
Gain Einstellung vom ADC nutze und erstmal keinen Spannungsteiler habe:
1
ads.setGain(GAIN_TWOTHIRDS);  // 2/3x gain +/- 6.144V  1 bit = 0.1875mV (default)

Dass ist erstmal ein Proof of Concept, das ich des Programmierens nicht 
so mächtig bin.

Nun möchte ich jedoch auch den Strom messen und da fangen die Probleme 
an.

Der Stromsensor misst ja von -30A bis +30A. Bedeutet im Umkehrschluss, 
das ich bei 0A Strom ca 2,5V am Sensorausgang anliegen habe.

Ich scheitere aktuell total daran, den Stromsensor zu "nullen", also das 
0A angezeigt werden, wenn kein Strom fließt. Weiterhin verhält sich mein 
Stromsensor irgendwie total anders, als alle Tutorials zu diesem.

So messen viele Leute immer einen Wert von 512 als Mittenpunkt, bei mir 
zeigt der ADC aber ungefähr 3500 an, wenn er nicht beschaltet ist, bzw 
12850, wenn die 2,5V anliegen - also kein Strom fließt, der Sensor aber 
an den ADC angeschlossen ist.

Ich bin da nicht so fit, aber hat es etwas damit zu tun, das der ADC1115 
16bit AUflösung hat?

Mein Code sieht aktuell so aus:
1
adc2 = ads.readADC_SingleEnded(2);
2
  AmpereL = ((((adc2 - 12840) * 0.1875) * 1.612) / 100);

Die 12540 ziehe ich vom ADC Eingang ab, um zu "nullen", was aber auch 
nicht wirklich funktioniert. Der Sensor zeigt trotzdem immer 400mA 
an....

Habt ihr dafür vielleicht mal ein einfaches Beispiel, wie das 
funktionieren könnte? Ich komme einfach nicht weiter.

Weiterhin skaliert die Messung mit der Eingangsspannung, also der vom 
MCU  ADS  ACS. Ich bekomme vollkommen unterschiedliche Werte, jeh nach 
VCC. Sollte der ADS1115 sich nicht auf irgendwas referenzieren? Ich kann 
ja nicht immer garantieren, das die MCU auch wirklich 3,3V perfekt 
bekommt. Somit wären die Messwerte voll für die Tonne, da sie an VCC 
gekoppelt sind - und sich damit möglicherweise ständig ändern würden.

Klar könnte man einen 3,3V Spannungsregler dazu nehmen, aber ich dachte, 
der ADS würde unabhängig von der VCC arbeiten.

Wäre erfreut, wenn ihr mir mal einen Denkanstoß geben könntet, ich bin 
aktuell echt soweit, das ich nicht mehr weiterkomme.

Liebe Grüße
Chris

von Wolfgang (Gast)


Lesenswert?

Chris N. schrieb:
> So messen viele Leute immer einen Wert von 512 als Mittenpunkt, bei mir
> zeigt der ADC aber ungefähr 3500 an, wenn er nicht beschaltet ist, ...

"Nicht beschaltet" ist für einen Eingang, der Spannung messen soll, also 
hochohmig ist, ein ganz übler und beliebig undefinierter Zustand. Es ist 
sehr damit zu rechnen, dass die 3500 eine Hausnummer ist und sich schon 
dramatisch ändert, wenn du auch nur mit dem Finger in die Nähe kommst.

> ... bzw. 12850, wenn die 2,5V anliegen - also kein Strom fließt, der
> Sensor aber an den ADC angeschlossen ist.
> ...
> Die 12540 ziehe ich vom ADC Eingang ab, um zu "nullen", was aber auch
> nicht wirklich funktioniert. Der Sensor zeigt trotzdem immer 400mA
> an....

Klar, wenn du ohne Strom 12850 misst, aber als Nullpunktskorrektur einen 
Wert von 12540 abziehst, muss etwas über bleiben. Die von dir 
genannten 400mA habe ich jetzt allerdings nicht nachgerechnet.

von Chris (Gast)


Lesenswert?

Hallo

Ja, ich habe die Zahlen falsch geschrieben. Natürlich ziehe ich das ab, 
was dort steht, also ungefähr 12850. Darum wunderte es mich ja auch, das 
dann trotzdem 400mA gemessen werden.

von Uwe N. (ulegan)


Lesenswert?

Der ADS1115 hat eine interne Referenz, sollte also unabhängig von der 
Versorgungsspannung arbeiten.
12840 als Nullwert hört sich nicht ganz falsch an, denn
12840/32768*6,144V = 2,4075V   oder anders gerechnet:
12840*0,1875mV = 2,4075V
32768 weil der ADS1115 im single ended modus nur 15 Bit auflöst.
Wenn dein Sensor bei Null Strom wirklich halbe Versorgungsspannung 
liefert, besorge dir zwei gleiche Widerstände oder ein Trimmpoti und 
teile damit die Versorgungsspannung auch durch zwei. Die geteilte 
Spannung legst du auf den zweiten Eingang des ADS und verwendest den 
differential modus.
Das hat zwei Vorteile:
1. Du subtrahierst schon analog den Nullpunkt
2. du kannst auch negative Ströme messen
Aber Achtung: Du kannst keine Spannung messen, die höher ist als die 
Versorgungsspannung des ADS1115 oder kleiner 0 Volt. Die 
Versorgungsspannung des ADS dürfte bei dir 3,3V sein, wegen des ESP32.
Somit kannst du nur den Bereich zwischen 2,5 und 3,3V nutzen.
Im differential mode nutzt du besser den Bereich zwischen 2,5 und 0 
Volt, falls du keine negativen Stöme messen willst.

von Wolfgang (Gast)


Lesenswert?

Chris schrieb:
> Darum wunderte es mich ja auch, das dann trotzdem 400mA gemessen werden.

Dann solltest du als nächstes prüfen, ob bei der Operation (adc2 - 
12840) wirklich irgendetwas in der Nähe von 0 herauskommt. Je nach dem, 
welchen Datentyp du für adc2 verwendest, kann das auch anders sein.

Zerlege deine Rechenoperation und gucke nach, wo die 400mA her kommen. 
Ist das ein Wert in irgendeiner Anzeige oder wie "misst" du die 400mA?

von Uwe N. (ulegan)


Lesenswert?

Kleine Korrektur:
Negative Ströme kannst du natürlich auch im single ended mode messen, 
die Messwerte sind dann halt kleiner als das, was du bei 0A misst.
Der differential mode braucht zwei Eingänge, also könntest du nicht mehr 
alle Signale mit einem Wandler messen.
Also vielleicht doch den Nulloffset in der Software abziehen, aber dann 
dafür sorgen, dass der konstant ist (theoretisch 13333 bei exakt 5V 
Versorgung).
Also solltest du eventuell in einen 5V-Regler für den Sensor 
investieren.
Die 5V, die aus einem USB-Port kommen, sind alles andere als präzise und 
konstant.

von Wolfgang (Gast)


Lesenswert?

Uwe N. schrieb:
> Also vielleicht doch den Nulloffset in der Software abziehen, aber dann
> dafür sorgen, dass der konstant ist (theoretisch 13333 bei exakt 5V
> Versorgung).

Auf den absoluten Wert der Versorgungsspannung sollte man sich tunlichst 
nicht verlassen, wenn der ADC die Spannung gegen seine interne 
Referenzspannung misst. Da ist es besser, die Versorgungsspannung 
zusätzlich zu messen und den Offset-Wert daraus zu bestimmen.

von Chris N. (fellpower)


Lesenswert?

Also erstmal herzlichen Dank für die schnellen Antworten.

Doch leider führt mich das alles noch nicht zum Ziel. Die 
Spannungsmessung am 1115 funktioniert soweit. Ich messe damit aktuell 
meine VCC, also die Spannung, die das ganze System versorgt. Problem 
hierbei jedoch: Ich messe mit meinen Multimetern was anderes. Der MCU 
sagt, ich habe 5.24V anliegen. Ich messe jedoch mit allen Multimetern 
jeweils 5,07V. Das ist schon mal soweit nicht richtig. Mir ist aber 
nicht klar, warum das so ist.

Liegt das möglicherweise am gewählten Gain? Sollte ich auch jetzt, im 
Testbetrieb mit 5V doch die Spannung noch teilen und 2 Gain Stufen höher 
gehen?

Weiterhin werde ich später zur Spannungsmessung natürlich einen 
Spannungsteiler nutzen. Ich wollte jetzt aber erstmal ohne arbeiten, da 
ich ja locker noch im Bereich bin, was der 1115 messen "darf". Später 
werde ich dann bis zu 14-15V haben, jeh nach Zustand des Akkus.

Wie gesagt, erstmal Proof of Concept.

Nur leider kann ich einfach meinen Stromsensor nicht nullen. Wie das mit 
dem Dif Mode funktioniert, hab ich zwar gelesen, aber nicht verstanden, 
wie ich das in den Arduino Code bringen muss.

Wenn der 1115 unabhängig von der VCC misst, wieso soll ich dann die 
halbe VCC messen?

von Christoph1024 (Gast)


Lesenswert?

Die ACS sind nicht besonders genau und rauschen. Die 5A-Version so etwa 
80mA, die 30A entsprechend deutlich mehr.

Dazu teniert schon die 5A Version dazu, sich bei Vollast auf 55°C 
aufzuwärmen und dann läuft der Meßwert weg. Bei 30A sollte das 
wesentlich krasser sein.

D.H. das Ding im Betrieb sauber zu Nullen ist kaum möglich. Die 5A 
Version läuft 80mA weg, da die 30A im selben Gehäuse mit gleicher 
Wärmeableitung steckt und einen noch krasseren Faktor hat dürfte das 
Weglaufen deulich stärker ausfallen. Meß mal eine Weile ordentlich 
Strom, dann auf 0 und warte 2 Minuten. Dann dürfte der ACS wieder 0 
liefern.

Mehr Info:
Beitrag "Re: Stromstärke per uC messen"

Ausserdem: Rechne bei dem ACS mit einem Fehler von 5% bei den ca. 55°C 
Betriebstemperatur, das steht auch so im Datenblatt. Bei dem Rauschen 
und der Genauigkeit macht der 16Bit ADC keinen Sinn, 10Bit sind da 
angemessen. Die zusätzlichen 6 Bit bringen bei der Qualität des 
Messignals nicht mehr viel.

Wenn du es genauer und wesentlich eleganter haben willst, dann nimm Ina 
226. Das spart auch den ADC, die sind von Hause aus 16bit und sehr 
genau. Der IC liefert dazu auch direkt die Powerwerte. Das hat grade bei 
Solar und den schwankenden Werten noch einen anderen Vorteil: der IC 
bestimmt Spannung und Strom selbst sehr kurz hintereinander für den 
Powerwert. Ich habe einen Effizienzmessr gebastelt für meine Laderegler, 
und der Unterschied der Effienzmeßwerte des Ina gegenüber selbst 
ermittelten Werten mit nacheinander erfassten U und I mit mehr 
zeitlicher Differenz ist erstaunlich. Selbst berechnete Werte liefern im 
Moment eines starken Spannungs/Stromabfall völligen Unsinn.


Falls du bei den ACS bleiben willst noch einen Tipp: Um die ungünstige 
Ausnutzung der Meßwertspanne bei 5V ohne Spannungsteiler oder Opamp zu 
verbessern pole den Sensoreingang einfach um und gehe auf 3,3V AD-Spanne 
und 5V Spannungsversorgung des ACS, falls du negative Ströme nicht 
brauchst.

Dazu auch nicht zu verachten: Die ACS genehmigen sich 10mA, also in 
deinem Fall holst du dir 40mA permanenten Verbrauch in das System, nur 
um deine Neugierde zu befriedigen. Mit den Ina bleibst du unter 1mA.

von Uwe N. (ulegan)


Lesenswert?

Wie misst du die 5V mit dem ADS1115, die liegen zumindest bei 3,3V 
Versorgung über der erlaubten Eingangsspannung?
Versuchs mal mit nem Spannungsteiler, ob dann der Vergleich mit dem 
Multimeter passt. Bei meinen ADS1115 stimmt es eigentlich immer ganz 
gut.

von Chris N. (fellpower)


Lesenswert?

Hey Chrisoph

Du hast wohl Recht. Das Gebastel ist echt schwierig. Ich bin da nicht 
festgelegt, den 1115 und den VCS712 hatte ich noch liegen. Du meinst 
also der INA würde besser funktionieren, da er gleich die Spannung / 
Strom mit misst?

Also bekomm ich aus dem per I²C schneller und genauer den Strom und die 
Spannung? Also kann ich diese Werte auch direkt abfragen?

Und n Shunt brauch ich dann auch wieder, der den Strom abkann. ;)

Hmm, so langsam wirds wirklich Gebastel.


@Uwe

Ich habe die komplette Schaltung aufm Breadboard. Dabei habe ich eine 5V 
Versorgung (UBEC vom Modellbauhobby) an das Board geklemmt. Mein MCU hat 
einen 3,3V Spannungsregler drauf, somit kann ich am VIN Pin bis zu 5,5V 
anlegen. Diese 5,24V liefert das UBEC und da hängt der ADS und der VCS 
dran.

: Bearbeitet durch User
von Christoph1024 (Gast)


Angehängte Dateien:

Lesenswert?

Chris N. schrieb:
> Du meinst
> also der INA würde besser funktionieren, da er gleich die Spannung /
> Strom mit misst?
>
> Also bekomm ich aus dem per I²C schneller und genauer den Strom und die
> Spannung? Also kann ich diese Werte auch direkt abfragen?

Ja genau. Das ist alles ziemlich einfach mit dem Teil. Du konfiguriertst 
den Shunt im Register und kannst eben nicht nur Spannung und Strom, 
sondern auch direkt die Leistung abfragen, die berechnet der selbst.
Wenn du nacheinander Spannungs-, Strom und Leistungswerte abfragst, hast 
du durch den zeitlichen Verzug schon Unterschiede. S.Bild.

>Und n Shunt brauch ich dann auch wieder, der den Strom abkann. ;)
Der Ina kommt gut mit 10mOhm klar. Bei 30A gehen auch 5mOhm. Brauchst du 
also nur einen 4,5W Shunt, oder eben zwei Parallel. Das ist machbar.

von Wolfgang (Gast)


Lesenswert?

Chris N. schrieb:
> Wenn der 1115 unabhängig von der VCC misst, wieso soll ich dann die
> halbe VCC messen?

Weil dein Stromsensor seinen Nullpunkt bei VCC/2 liegen hat.

von Chris N. (fellpower)


Lesenswert?

Wolfgang schrieb:
> Chris N. schrieb:
>> Wenn der 1115 unabhängig von der VCC misst, wieso soll ich dann die
>> halbe VCC messen?
>
> Weil dein Stromsensor seinen Nullpunkt bei VCC/2 liegen hat.

Natürlich. ;)

Okay. Ich denke, ich werde mal testen. Ich melde mich.

Danke schon mal für eure Antworten ;)

von Uwe N. (ulegan)


Lesenswert?

Ich habe bisher den ADS immer mit den 3,3V versorgt, damit die I²C-Pegel 
zum ESP passen. Gerade probiert, es geht auch mit 5V.

Bei einer Versorgung von 3,3V aus dem Regler auf dem ESP32-Modul erhalte 
ich eine Ausgabe von 17576.

17576*0,1875 = 3,2955V das Multimeter zeigt 3,308V

Wenn ich den ADS1115 aus USB versorge, messe ich 25769 enstsprechend 
4,831V das Multimeter schwankt zwischen 4,83 und 4,84V

Das dürfte im Rahmen des Messtoleranz des Multimeters liegen.

Verwendet habe ich das singlended-Testprogramm aus der Adafruit 
Arduino-Bibliothek.

von Chris N. (fellpower)


Lesenswert?

Ja, die Spannung misst er eigentlich gut. Ich glaube, ich hab mich da 
mit den Werten etwas verzettelt....

Hab jetzt auch endlich die Strommessung hinbekommen. Ich rechne einfach 
am ADC schon den Nullpunkt raus. Für meine Zecke reicht das vollkommen 
aus.
1
adc2 = ads.readADC_SingleEnded(2);
2
AmpereLast = ((((adc2 - 8550) * 0.1875) * 1.612) / 100);

So hatte ich das ja schon, aber durch das Verständnis welcher Wert was 
ist, hab ich mich jetzt ausreichend angenährt an den Strom, der wirklich 
fließt. (nachgemessen mitm Multimeter)

Ich glaube, eine noch höhere Auflösung bei der Strommessung übersteigt 
meine Fähigkeiten. (Differental Mode und INA229 - allein schon vom 
Arduino Code) ;)

Ich war also schon nah dran, aber habs halt nicht verstanden.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.