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
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.
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.
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
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 --
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
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.