ACS 712 sketch

Hallo,
Ich hab einen ACS 712 Strommesser (20A) geholt.(s.Bild)
Ich wollt fragen ob den auch jemand hat und mir nen einfachen sketch geben kann damit ich mit ihm Ampere messen kann?

Mfg

strohhirn

Auf Seite 7 des Datasheets findest Du das Diagramm "Output Voltage versus Sensed Current". Wie Du daraus ersehen kannst, ist der Output 2.5V bei 0A, 0.5V bei -20A und 4.5V bei +20A. Somit

float a =((float) analogRead(A0) / 512.0 - 1.0) * 2.5 / 2 * 20;

Auf Seite 5 ist auch noch aufgeführt, dass der Wert von 100mV/A im Range von 96mV - 104mV liegt. Somit hast Du in etwa eine Genauigkeit von +/- 4%.

Ich hab hier mal eine seite gefunden dort ist alles gut erklärt:
http://www.lucadentella.it/en/2011/11/29/sensore-di-corrente-con-arduino/

Daher habe ich auch meine jetztige formel:

#include <LiquidCrystal.h>

LiquidCrystal lcd(22, 23, 24, 25, 26, 27, 28);
int backLight = 29;
void setup() {
  pinMode(backLight, OUTPUT);
  digitalWrite(backLight, HIGH);
  lcd.begin(20, 4);
}
 
void loop() {
 
  float average = 0;
  for(int i = 0; i < 1000; i++) {
    average = average + (0.048875855327468 * analogRead(A0) -25) / 1000;
    delay(1);
  }
  float watt;
  for(int i = 0; i < 1000; i++) {
    watt = 220 * average;
    delay(1);
  }
  
  lcd.setCursor ( 0, 0);
  lcd.print(average);  
  lcd.print("A       ");
  
  lcd.setCursor ( 0, 1);
  lcd.print(watt);  
  lcd.print("W       ");
}

Natürlich habe ich die formel meinem 20A sensor angepasst.
Ich habe auch noch eine formel zum umrechnen in Watt aufgestellt.
Eig. klappt es relativ genau. Wenn kein strom fließt wird mir meißt 0.04A angezeigt, doch in Watt sind das 8,8W und das ist ja doch schon ziehmlich ungenau.
Kann ich denn Sensor noch irgendwie genauer trimmen?

Desweiteren habe ich ein paar tests durchgeführt:
Ich habe eine kleine 6V 0,1A glühlampe angeschloßen und es wure mir 0,12-0,15A angezeigt. Diese lampe wurde mit gleichstrom betrieben.
Denn habe ich eine 220V, 40W glühlampe angeschloßen, d.h. sie müsste ca. 200mA verbrauchen, doch diese werden nicht angezeigt, stattdessen wird als wär nichts 0,04-0,08A gezeigt. Diese lampe wurde mit wechlesstrom betrieben.

Ist der Sensor bei wechselstrom ungenauer ? Oder brauche ich für wechselstrom eine andere formel?

Wenn Du die Meßwerte eine Wechselspannung über eine oder mehrere Periode summierst erhälst Du null (der positive Teil entspricht dem negaiven Teil). Du mußt die Absolutwerte (bzw die Differenz zum Offset) vorzeichenlos summieren.

Bei kleinen Strömen ist der Sensor und die AD-Wandlung ungenau. 1-2 digit fehler ist dabei fisiologisch (das sind Deine 0,04A weil 1 digit 0,0488A entspricht).
Grüß Uwe

Sorry, ich kaper hier einfach mal den Thread. Wie sieht es eigentlich mit der Dauerbelastbarkeit bei diesen ACS712-modulen aus? Ich hab mir überlegt einige direkt im Sicherungskasten an den Phasen einiger Stromkreise unterzubringen, um zu sehen, welcher Stromkreis wieviel Strom verbraucht...

Ich entkapere mal den tread.
Die Spezifikationen stehen im Datenblatt.
2.1 kVRMS minimum isolation voltage from pins 1-4 to pins 5-8

The internal resistance of this conductive path is 1.2 mΩ typical, providing low power
loss. The thickness of the copper conductor allows survival of the device at up to 5× overcurrent conditions.

Also kann der Sensor dauernd mit 20 A und 230V beaufschlagt werden.

Grüße Uwe

Vielen Dank fürs entkapern Uwe. XD
Das heißt, ich könnte das so umsetzen, ohne alle paar tage den ACS auszutauschen.

Gruß
Marcus

Hallo,

Wenn Du die Meßwerte eine Wechselspannung über eine oder mehrere Periode summierst erhälst Du null (der positive Teil entspricht dem negaiven Teil). Du mußt die Absolutwerte (bzw die Differenz zum Offset) vorzeichenlos summieren.

Ich versteh nicht richtig wie ich das vorzeichenlos summieren soll. Könntest du mir das näher erläutern?

Mfg

strohhirn

Ich versteh nicht richtig wie ich das vorzeichenlos summieren soll. Könntest du mir das näher erläutern?

Wenn Du als Werte 2, 8, 3, -1, -5, -9, -6 kriegst, dann musst Du 2 + 8 + 3 + 1 + 5 + 9 + 6 ausrechnen.

Ahh, ok, jetzt verstehe ich besser.
Aber wie summiere ich vorzeichen los? Gibt es da irgend einen befehl?

Die Funktion abs() entfernt ein allenfalls vorhandenes negatives Vorzeichen.

Danke,
hab das so umgesetzt:

average = abs(average) + abs((0.048875855327468 * analogRead(A0) -25) / 1000);

Jetzt wird auf jeden fall schon mal annähernd was angezeigt.

Ich habe den ACS an einen spiral Wasserkocher angeschlossen, auf dem steht 1kw. Also ca. 4,5 A.
Bei mir wird angezeigt 3,7A und 800W .

Wieso ist das so ungenau?

Woher kommt das 25 in

average = abs(average) + abs((0.048875855327468 * analogRead(A0) -25) / 1000);

?

Kein Strom bedeutet einen Ausgang von 0,5* Versorgungsspannung.

Grüße Uwe

http://www.lucadentella.it/en/2011/11/29/sensore-di-corrente-con-arduino/

2,5 V ist die offset spannung. Da dieses in der Formel durch 0,1 geteilt wird, weil ich ja die 20A version habe mit einer sensivity von 100, ergibt das 25.

Hab gerade mit nem Messgerät nachgemessen. Da wurde 4,3A angezeigt, der auf dem Arduino LCD stand 3,3A.
Das sind 1A unterschied, aber ich seh den fehler nicht.

Dein Messgerät und das Typenschild beziehen sich auf den Effektiv-Wert

Theoretisch müsstest du erstmal mit (analogread(A0) - 512) einen ausgewogenen Wert -512 ... + 511 nehmen und den skalieren , quadrieren , wurzelziehen (der arme Arduino).

Vielleicht reicht es dir auch, zu versuchen den Scheitelwert zu erwischen und den ( Annahme Sinus-Schwingung ) mit ca. 0.7 zu multiplizieren.

Ok, danke.
Wie skaliere ich einen Wert , wie meinst du das?
Und wozu soll ich den Wert quadrieren und denn die wurzelziehen? Kann ich denn nicht auch die abs() Funktion nutzen?
Oder wie soll ich den Scheitelwert erwischen?
Könntest du das ganze vielleicht etwas genauer oder simpler erklären?

Mfg

strohhirn

Egal was ich mache es klappt nicht und im Internet steht auch nicht wirklich viel darüber. :frowning:

Hallo,
ich habe jetzt mal im internet einen sketch gefunden :

#include <LiquidCrystal.h>

#define MEDIAN   512
#define MEAS_INT 1000  // 1sec
#define ACS_ADC  A0
#define K_ACS    0.1   //für 20A version

LiquidCrystal lcd(22, 23, 24, 25, 26, 27, 28);
int backLight = 29;

void setup() {
  pinMode(backLight, OUTPUT);
  digitalWrite(backLight, HIGH);
  lcd.begin(20, 4);
  lcd.setCursor(0, 0);
  lcd.print("I=");
  analogReference(DEFAULT);
  analogRead(ACS_ADC);
}
 
void loop() 
{
  uint32_t sum2=0;
  uint16_t n=0;
  uint32_t StartTime, StopTime;
  int16_t adc;
  uint32_t avrg=0xFFFF;
  float I; 
  
  StartTime=millis()+1;
  StopTime=StartTime+MEAS_INT;
  while(StartTime>millis());
  while(StopTime>millis())
  {
    adc=(MEDIAN-analogRead(ACS_ADC));
    sum2+=(uint32_t)adc*adc;
    n++;
  }
  if (n>0)
  {
    avrg=sqrt(sum2/n);
  }

  I=(float)avrg*5/(K_ACS*1024);
  lcd.setCursor(2, 0);
  lcd.print(I);
  lcd.print("A   ");
}

Leider verstehe ich nicht ganz wie der sketch funkioniert.
Ich habe ihn wieder an der 1kW Heizspirale (54 Ohm) ausprobiert. Die Messergebnisse sind auf jedenfall schon mal besser mir wird jetzt 4,00 A angezeigt. Das Messgerät zeigt 4,193 A an.
Der Offset Analogwert liegt nicht wie gewollt bei 512 sonder immer unterschiedlich drüber(z.B. 518,516)., dadurch liegt auf der Wert des Stroms auf immer bei ca. 0,25 A.

Wie kann ich die genauigkeit des sensors erhöhen?

Ja, das ist die Effektiv-Wert Berechnung:
(Vielleicht helfen meine Kommentare zum Verständnis)

StartTime=millis()+1;
  StopTime=StartTime+MEAS_INT;
  while(StartTime>millis());  // Wir warten bis eine neue Millisekunde anfängt...
  while(StopTime>millis())    // Dann summieren wir bis zur StopTime
  {
    adc=(MEDIAN-analogRead(ACS_ADC));  // die Differenz zum Mittelwert
    sum2+=(uint32_t)adc*adc;                 // wird quadriert und aufsummiert
    n++;
  }
  if (n>0)
  {
    avrg=sqrt(sum2/n);      // ... und am Ende die Wurzel aus dem Durchschnitt der Quadrate 
  }

Zur Genauigkeit:
analogReference(DEFAULT); könnte man evtl. durch analogReference(EXTERNAL); und Anschluss der Versorgungsspannung am AREF Pin ersetzen.
Aber nach meinem Verständnis müsste das dasselbe ergeben ?

Mehr als ein Bit sollte der Wert bei 0 eigentlich nicht schwanken.
Was passiert wenn du aus MEDIAN eine Variable machst und sie bei 0A kalibrierst ? ( Zur Not also auf 517 statt 512 setzt ) ???

Ansonsten, den Max-Wert ermittelt man mit [b]if (adc > max ) max = adc;[/b] 
Min entsprechend ... :wink:

50 Hz ist langsam genug, sie in deiner Schleife ohne delays gut zu erwischen.
analogRead braucht etwa 120 µs : In einer Halbwelle ( 10ms ) finden also etwa 80 Messungen statt. Der Scheitelwert ist da ziemlich genau dabei.