Strom messen mit dem ACS712

Hallo,
ich plage mich gerade mit dem ACS712 ab, um Strom zu messen. Die Messergebnisse schwanken stark und sind nur ab und zu annähernd richtig. Im Forum habe ich mir alles durchgelesen und soweit möglich ausprobiert, aber es ist nicht besser geworden. Momentan setze ich auf diesem Sketch auf. Einen Widerstand von 10K gegen Masse habe ich bereits an den Eingang gelegt. Wenn alles fertig ist, sollen 3 Exemplare des ACS712 verschiedene Ströme vom mA-Bereich bis zu max. 15 A messen. Für die Anzeige ist außer dem Monitor ein OLED-Display vorgesehen. Integriert wird die Funktion in ein größeres Projekt, welches bis auf die Stromsensoren fertig ist.
Hier mein verwendeter Sketch:

int Sensor = A0; // Der Stromstärkesensor wird am Pin A0 (Analog "0") angeschlossen.
int VpA = 185; // Millivolt pro Ampere (100 für 20A Modul und 66 für 30A Modul)
int sensorwert= 0;
int Nullpunkt = 2500; // Spannung in mV bei dem keine Stromstärke vorhanden ist
double SensorSpannung = 0;
double Ampere = 0;

void setup()
{ 
Serial.begin(9600); // Serielle Verbindung starten, damit die Daten am Seriellen Monitor angezeigt werden.
}

void loop()
{
sensorwert = analogRead(Sensor);
SensorSpannung = (sensorwert / 1024.0) * 5000; // Hier wird der Messwert in den Spannungswert am Sensor umgewandelt.
Ampere = ((SensorSpannung - Nullpunkt) / VpA); // Im zweiten Schritt wird hier die Stromstärke berechnet.

// Ausgabe der Ergebnisse am Seriellen Monitor
Serial.print("Sensorwert = " ); // Ausgabe des reinen Sensorwertes
Serial.print(sensorwert); 
Serial.print("\t Sensorspannung in mV = "); // Zeigt die Sensorspannung an
Serial.print(SensorSpannung,3); // Die "3" hinter dem Komma erzeugt drei Nachkommastellen
Serial.print("\t Ampere = "); // shows the voltage measured 
Serial.println(Ampere,3); // Die "3" hinter dem Komma erzeugt drei Nachkommastellen
delay(1000); 
}

Für Hilfe wäre ich wie immer dankbar, da ich selbst nicht weiter komme.

Warum machst Du da Klammern?
Soll es 1024.0 oder 1023.0 heissen?
Und dann heisst es nicht einen absolutWert zu nehmen, sondern das delay da raus und einen Mittelwert bilden.

Es sind HAL Sensoren und die sind sehr empfindlich auf fremde Magnetfelder im Endeffekt habe ich INA219 genomen nur im deinem Fall ist komplizierter den der eingebauter Shunt Widerstand ist ausgelegt bis max 2.5A

1024 ist schon richtig!

Es ist Beispiel aus Wolles oder Wolters Seite da dran kann ich mich erinnern :wink:

Laut Beschreibung bis 3,2 A, aber nur bis 26 Volt. Es kann in einem Fall eine Spannung bis über 42 Volt geben. Dann habe ich von ACS712 fünf Stück bestellt und rumliegen. Die Teile würde ich gerne nach Möglichkeit verwenden.

Das war in der verlinkten Vorlage so drin.

Delay kommt später raus, wenn ich alle drei Sensoren in einer Funktion abfrage. Momentan will ich erst mal stabilere Werte für einen Sensor bekommen. Gibt es einen besseren Sketch, auf dem ich aufsetzen kann?

Ist hier beschrieben. Weiß aber noch nicht, ob ich das richtig übernehmen kann. Kenn mich mit Schleifen nicht so aus.

Ne, aus funduino, wie oben verlinkt.

Ja nur bei 3,2A neigen die zu "selbst aus Lötung" so heiß werden die.

Ein interessanter Beitrag, um die Versorgungsspannung zu messen. In meinem Fall 4,62 Volt.

Die sind ein bisschen tricky auszulesen, wenn man etwas Genauigkeit erreichen möchte.

Der wichtigste punkt ist, dass sie angeschlossen werden, als wäre es eine ratiometrische Messung. So ergibt sich auch der Nullpunkt.
Dabei ist die Messung selber absolut.
Und an absoluten Messungen, darf man neben nicht ratiometrisch herangehen.
Ein Dilemma.

Wenn man die Versorgungsspannung als 5V annimmt, hat man schon die ersten ca 10% Fehler in der Rechnung drin.

Wie geht s richtig? Ohne groß Schaltungsaufwand?

Ja, an 5V klemmen, die braucht es.
Aber eben auch die 5V genau ausmessen, immer wieder.
Das geht ohne zusätzliche Bauteile.

Der Rest ist im Grunde wieder die Geradengleichung, plus der Skalierung von mV zu A

Das habe ich gemäß dieser Anleitung ausgemessen und eingestellt. Trotzdem springt die Anzeige hin und her.

Du hast also einen Mega!
Warum nicht sofort?
Der Mega hat einen differenziellen Input, das erlöst einen von vielen Sorgen.
(macht aber neue)

Zudem halte ich das Tutorial für eher seltsam.
Erstens die 1023
Zweitens kann auch der Mega Vcc gegen die interne messen, genau wie ein UNO

Noch ein Beispiel aus der Bibliothek, was aber auch seltsame Werte anzeigt:

//
//    FILE: ACS712_20_DC_DEMO.ino
//  AUTHOR: Rob Tillaart
// PURPOSE: demo to set midpoint and mVperAmpere for class.
//    DATE: 2020-03-18


#include "ACS712.h"


// Arduino UNO has 5.0 volt with a max ADC value of 1023 steps
// ACS712 5A  uses 185 mV per A
// ACS712 20A uses 100 mV per A
// ACS712 30A uses  66 mV per A


ACS712  ACS(A0, 5.0, 1023, 185);
// ESP 32 example (requires resistors to step down the logic voltage)
// ACS712  ACS(25, 5.0, 4095, 185);


void setup()
{
  Serial.begin(9600);
  Serial.println(__FILE__);
  ACS.autoMidPoint();
}


void loop()
{
  int mA = ACS.mA_DC();
  Serial.println(mA);

  if (Serial.available() > 0)
  {
    char c = Serial.read();
    if (c == '+') ACS.incMidPoint();
    if (c == '-') ACS.decMidPoint();
    if (c == '0') ACS.setMidPoint(512);
    Serial.println(ACS.getMidPoint());

    if (c == '*') ACS.setmVperAmp(ACS.getmVperAmp() * 1.05);
    if (c == '/') ACS.setmVperAmp(ACS.getmVperAmp() / 1.05);
    Serial.println(ACS.getmVperAmp());
  }
  delay(1000);
}


// -- END OF FILE --

Warum?

Stell mal das Modul samt Mega so weit weg vom PC oder Laptop wie es geht danach ist die Hopserei ein wenig kleiner. Wen Du Wechselstrom messen willst dann Glückwunsch :wink:

Weils so richtig ist!

Und:
Weil es so, und nicht anders, im Datenblatt steht.

Könnte man sogar selber drauf kommen....
Denn es sind ja schließlich 1024 Werte, welcher der ADC liefern kann, nicht 1023.

Tipp:
Jedes Tutorial in die Tonne kloppen, wo sich die 1023 finden.

Ich habe zwar Uno, Due und Mega, benutze aber dafür einen Nano. Guter Hinweis. Ich lade den Sketch mal in den Mega rein und berichte wieder. Im Uno kann ich es zum Vergleich auch probieren.

Ne, ist Gleichstrom meiner Solaranlage.

Von 0 bis 1023 sind für mich 1024 Werte.
Vref=5000 maxSensorWert=1023 entspricht Vref

SensorSpannung = 1023 / 1024.0 * 5000

Wo ist mein - und Rob Tillaarts - Denkfehler?