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:
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
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.
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.
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.
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?
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.
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.
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?
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.
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.
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.
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.
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.
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 ;)
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.
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.
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.