5A Strom Sensor ACS 712 mit dem Arduino auslesen

Der Stromsensor ACS712 soll an den Arduino angeschlossen werden.

Er ist preiswert und hat ein paar nette Features :
– Hall-Effekt Sensor
– 1,2 mOhm Widerstand im Strompfad
– 2,1 kV effektiv Isolation zwischen dem Arduino und dem Strompfad
– Spannungsausgang entsprechend dem Stromfluss und damit Arduino AD-Wandler geeignet
– DC bis 80kHz Bandbreite

Hardware

Arduino Uno, ein Steckbrett, den Stromsensor ACS712 5 Ampere, 4 Drähte, ein stromgeregeltes Labornetzteil mit 3A und ein Multimeter mit einem 20A Messbereich.

ACS712 am Uno

Ich habe den ACS Stromsensor für +- 5A an den Arduino angeschlossen und bin von der Messgenauigkeit wirklich enttäuscht. Ein halbes Ampere Abweichung! Bei einer 3A Messung werden nur ca. 2,5 A angezeigt. Das sind 18% Fehler und kann so nicht bleiben.

Überlegungen

Also das Datenblatt lesen.
Seite 4: Die Nichtlinearität ist mit 1,5% angegeben und die Symmetrie über den Bereich mit 2%, das kann es also nicht sein.
Zero Current Output Voltage: 0A bei Vcc*0,5 ist ein guter Tip. Also VCC messen wie hier bereits beschrieben. Eine Brücke von 3,3V auf einen AD Wandler Eingang und siehe da, ich habe nur 4,8V am USB Stecker. Also ist Vcc * 0,5 nur 2,4 V. Das legt den 0-Punkt ziemlich exakt fest. Das ist ein Schritt vorwärts.

Seite 6: Hier wird im Datenblatt viel auf die Temperatur eingegangen. Da nehme ich hier mal 25°C an und die Kurven sind alle gutmütig. Das kann ich später ggf. hinzufügen.

Magnetische Beeinflussung? Das Stromkabel, dass ich inzwischen für den Arduino genommen habe sollte nicht zu dicht an den Sensor gelegt werden, das beeinflusst die Messwerte deutlich.

Und bei den jetzt konstanten 5,0 V Vcc bekomme ich ganz ordentliche Ergebnisse. Die variieren vom Messung zu Messung ein wenig, da hilft Mitteln. Also wird eine Mittelung eingebaut. 100 Mittlung geben ganz gute Ergebnisse, wenn im Programm später nicht die Zeit dafür ist muss ich mich mit weniger zufrieden geben. Das wird ein Funktionsparameter.

Ein Kondensator am Sensorausgang gegen Masse glättet die Messspannung zusätzlich. Ich habe hier einen 10uF Tantal Kondensator eingesetzt, da ich Gleichstrom messen möchte.

Das Problem mit der Vcc, die an USB bei mir 4,8V ist oder mit meinem langen USB Kabel auch auf 4,6V fallen kann, muss ich einmal genauer untersuchen. Also werden ein paar Kurven aufgenommen für die 3 Fälle.

ACS 712 Messungen für VCC

Das Ergebnis ist linear, das vereinfacht die Sache. Gut sieht man, alle Kurven gehen durch den selben 0-Punkt, laufen dann aber deutlich auseinander. Bei 4,6V Vcc (gelb) werden bei einem Strom von  3 A nur noch 2,7A gemessen und bei 4,4V Vcc (rot) nur noch 2,5A.

Im Datenblatt (Seite 2) ist die Sensitivity mit typisch 185 mV/A angegeben. Das ist die Steigung der Kurven. Das heisst also mit sinkender Vcc nimmt die Steigung ab. Aus diesen Kurven wird durch eine lineare Annäherung ermittelt dass die Sensitivity mit ca. 39 abnimmt mit jedem Volt weniger Vcc. Die Sensitivity wird noch auf 186 angepasst für meinen Sensor.

Wenn das beides auch noch in die Routine integriert wird ergibt sich eine Abweichung von ca. 30mA bei 3A Stromfluss. Das ist ca. 1% Fehler.

Damit ist das Ziel erreicht. Ein kleinerer Messfehler als 1% ist bei den anderen Toleranzangaben auch nicht zu erwarten.

Die fertige Routine für den Sensor.

// ACS 712 5 Ampere Strom Sensor
//
// Matthias Busse 15.5.2014 Version 1.0

// Die Verbindungen
// 3,3V > A5 
// 5V > ACS VCC
// GND > ACS GND
// A1 > ACS Out

void setup(void) {
  Serial.begin(38400); // Serielle Ausgabe
}
 
void loop(void) {
  Serial.println(ACS712read(100),3);
  delay(500);
}

float ACS712read(int mitteln) {
// Den ACS712 Stromsensor auslesen
// Sens ist im Datenblatt auf Seite 2 mit 185 angegeben.
// Für meinen Sensor habe ich 186 ermittelt bei 5.0V Vcc.
// Sens nimmt mit ca. 38 pro Volt VCC ab.
//
// 3,3V muss zu Analog Eingang 5 gebrückt werden.
// Der Sensoreingang ist Analog 1
//
// Parameter mitteln : die Anzahl der Mittlungen
// 
// Matthias Busse 9.5.2014 Version 1.0

float sense=186.0;           // mV/A Datenblatt Seite 2
float sensdiff=39.0;         // sense nimmt mit ca. 39/V Vcc ab. 
float vcc, vsensor, amp, ampmittel=0;
int i;
  
  for(i=0;i< mitteln;i++) {
    vcc = (float) 3.30 / analogRead(5) * 1023.0;    // Versorgungsspannung ermitteln
    vsensor = (float) analogRead(1) * vcc / 1023.0; // Messwert auslesen
    vsensor = (float) vsensor - (vcc/2);            // Nulldurchgang (vcc/2) abziehen
    sense = (float) 186.0 - ((5.00-vcc)*sensdiff);  // sense für Vcc korrigieren 
    amp = (float) vsensor /sense *1000 ;            // Ampere berechnen
    ampmittel += amp;                               // Summieren
  }
  return ampmittel/mitteln;
}

Für 100 Mittlungen benötigt diese Routine ca. 40 ms.

Fazit

Für einfache Mess- oder Schaltaufgaben ist dieser Chip geeignet, eine hohe Genauigkeit lässt sich damit aber nicht erreichen.
Der Temperatureinfluss und die Nichtlinearität der Steigung von Sense könnte noch genauer untersucht werden.
Die Entkopplung des Strompfades kann sehr hilfreich sein, da kein Bezug zur Board Spannung besteht und so auch Ströme bei hohen Spannungen gemessen werden können bis hin zu 50Hz Wechselströmen im 220V Netz.

von Matthias Busse

22 Gedanken zu „5A Strom Sensor ACS 712 mit dem Arduino auslesen

  1. JR

    Hallo,
    ein sehr interessanter Artikel.
    Ich kämpfe auch mit einem ACS 712. Bei mir scheint der Fehler ähnlich gross zu sein.
    Was ich in Ihrer Rechnung nicht verstehe ist die Berechnung des DeltaVCC.

    Für mich habe ich eine Sens von 137mv/A bei Vcc=5,14 ermittelt. ( Ich versorge den Sensor extern)
    Das deckt sich m.E. nicht mit dem Datenblatt.
    Aber die gefunden Messdaten zeigen, dass der Sensor linar arbeitet.
    Haben Sie eine Erklärung?

    Vielen Dank für eine Antwort
    JR

    Antworten
    1. Simon

      Ich habe gerade genau das gleiche Problem:

      5A-Variante vom ACS712 (Bezeichnung …-05B auf dem Chip), das Boardlayout sieht genau aus wie auf deinen Bildern, aber ohne Schriftzug auf der Rückseite. Ist eines der billigen Boards aus Shanghai.

      Mein Aufbau ist nicht am Arduino sondern mit zwei Multimetern, eins für den Strom in Reihe mit dem ACS712 und eins das die Ausgangsspannung des ACS712 misst. Der ACS712 bekommt Vcc=5,10V.

      Messwerte:
      Ip=0A Vout=2,547V (Kabel war abgezogen)
      Ip=1,01A Vout=2,684V
      Ip=-1,01A Vout=2,409V

      Das sind ca. 137mV/A, weshalb ich auch den Kommentar von JR bei Google gefunden hab. Genau gerechnet ist es natürlich 1% weniger, aber ich lass 5 mal gerade sein, denn sonst hätte Google es ja auch nicht gefunden!

      Ein stärkeres Netzteil hab ich gerade nicht zur Hand um die Linearität mit höheren Strömen zu prüfen, aber symmetrisch um den 0-Punkt ist es schon mal und der 0-Punkt bei Vcc/2 stimmt auch.

      Erscheint mir aber seltsam, dass zwei ACS712 die gleiche Sens von 137mV/A aufweisen, die aber deutlich von den 185mV/A im Datenblatt abweicht.

      Hat sonst noch jemand eine abweichende Sens festgestellt? Oder hat sich der „falsche“ Sens aufgeklärt? Zumindest weiß ich, dass ich damit nicht allein bin. Ich werd da jetzt mal etwas danach suchen…

      MfG
      Simon

      Antworten
    2. Aat Schouten

      I have also ordered 3 CS712 -5 Amp modules in China and they all have a sensitivity of 133 mV/Amp at Vss=5Volt. The explanation is that the chips are incorrectly stamped AC712T ELC-05B and they are in fact ACS704 or ACS706. You can also measure that pin 6 and 7 are internally connected which is only the case for ACS704 and 706. The PCB is designed for ACS712 where pin 6 is the filter pin and pin 7 is the output. with the consequence that now the filter capacitor (100nF ?) is connected to the output. So remove the filter cap and you can use the module with 133mV/Amp sensitivity at full bandwith

      Antworten
  2. Manfred

    Von dem Stromsensor habe ich doch schon mal irgendwo gelesen, lange her. Gleich eine Bestellung beim Aliexpress rein, 1,43 US$ für die komplette Platine. Mal gucken, was die für mein aktuell angedachtes Projekt taugen.

    Wenn ich jetzt noch irgendwo im Regal meine MU-Metall-Abdeckungen finde, wird das sicher chic.

    Antworten
    1. Manfred

      Heute kam Post aus Malaysia, drei 5A-Sensoren auf Platine. Mal schnell Labornetzteil und DVMs dran, bestimme ich 199 – 204 – 202 mV pro Ampere. Meine Versorgung war dabei 5,3 Volt.

      Mit der Beschreibung von Matthias „39 pro Volt“ sind das bei 5,3 V 12 mV Aufschlag. Zusammen mit dem Nennwert 185 mV/A passt das verdammt gut.

      Betrachte ich noch die Meßbedingungen, Amperemeter mit nur zwei Nachkommastellen und Spannung mit drei Stellen hinter dem Komma, bewegen sich die Abweichungen innerhalb meiner Meßgenauigkeit!

      Dazu kommt ein Offsetfehler am Ausgang, anstatt halbe Betriebsspannung habe ich 12 .. 14 mV mehr – egal, im fertigen Gerät muß der Stein eh kalibriert werden.

      Eine andere Platine mit 20A-Typ habe ich unter gleichen Bedingungen mit 108 mV/A bestimmt, die zweite 20A-Platte wurde leider defekt geliefert – aber auch diese 108 mV @ 5,3 V passen sehr gut zum Datenblatt

      Antworten
  3. Wlada

    Hallo, ich habe folgendes Problem:

    Ich habe 8 stück stromsensoren für Strommessung meine Lampen gekauft. Ich habe Stromsensor mit arduino Mega angeschlossen und es zeigt 2,4 V, habe ich auch mit Voltmetter gemessen, zeigt das gleiche. Das wert ändert sich gar nicht, egal was ich anschalte zum stromsensor und wie ich anschalte. Wo ist das problem?

    Antworten
  4. Juergen

    Servus,

    Danke erstmal für deine Ideen rund um die Vcc und Strom-Messungen per ACS712.
    Verwende dieses Konstrukt für ein simples DC Wattmeter, zusammen mit einem billigen Arduino Nano Clone aus CN. Dabei hat sich gezeigt, dass wohl meine 3.3V Versorgung am Nano nicht sonderlich (temperatur?) stabil ist, und daher wohl als Referenzspannung ungeeignet ist.
    Habe daher beschlossen mir beim Elektronikhändler meines Vertrauens eine 4.096V Spannungsreferenz zu organisieren (MCP1541, kostet 1,5EUR) und diese über deine Funktion zur Ermittlung der Vcc zu verwenden, mal sehen ob das die Situation verbessert.

    Mein ACS712 Platinchen (ACS712TELC-20A) gibt Vcc/2+100mV/A am Vout aus (auch ein billiges Trimmerl aus China), geeignet bis +/-20A.

    lg,
    Jürgen

    Antworten
    1. Manfred

      Juergen –

      warum fährst‘ den Nano bei 3,3 Volt – die Dinger mit dem AT328 sind doch für 5 V ausgelegt, haben sogar ein Spannungsreglerchen drauf. Übrigens Vorsicht mit dem, viel mehr als den nano sollte er nicht speisen, sonst wird ihm das schnell zu warm 🙂

      Oder meinst Du die 3,3 V aus dem CH-340, die habe ich nie angefasst, habe bis heute kein ordentliches Datenblatt zu dem CH340 gefunden.

      Ansonsten benutzt Du mal die interne Referenz des AT-Mega, scheint kaum jemand zu wissen. Im Setup _eine_ Quelle wählen:

      analogReference(INTERNAL); // min 1.0 / typ 1.1 / max. 1.2 Volt
      analogReference(EXTERNAL);
      analogReference(DEFAULT); // Betriebsspannung

      Antworten
      1. Juergen

        Hallo Manfred,

        Also ich habe die 3.3V verwendet, die beim 3.3V Pin rauskommen, versorgt wird der Nano über den USB Port 🙂
        Nehme schwer an, dass diese von dem Linearregler an der Unterseite der Platine kommen. Wie auch immer, die ist als Referenz unbrauchbar.

        Dass der AT328 auch eine interne Referenz hat ist mir bekannt, diese hat aufgrund der 1.1V aber folgenden gravierenden Nachteil: wenn du die analogReference(INTERNAL) setzt, können die ADCs auch maximal nur 1.1V messen! D.h. zusätzlicher Spannungteiler für ACS712 (dieser gibt ja ~ 0..5V aus) und damit zusätzlicher Fehler.
        Auch die Spannungsmessung würde in meinem Fall vermutlich etwas an Genauigkeit verlieren, und da ich an der Leistung interessiert bin multiplizieren sich die Fehler 😉

        lg,
        Jürgen

        Antworten
    2. Juergen

      Hi,

      Also mit der MCP1541 Referenz funktioniert das ganze deutlich genauer, vor allem die scheinbar „willkürlichen“ hohen Abweichungen sind gänzlich verschwunden!

      lg,
      Jürgen

      Antworten
  5. Torsten

    Hallo,

    ich bekomme bei mir immer minus Werte raus. Nach etwas suchen habe ich festgestellt nach der Zeile

    vsensor = (float) vsensor – (vcc/2);

    ich immer -0,01 bzw. -0,00 raus bekomme. Wer hat das selbe „Problem“ und wie habt ihr dies gelöst? Ansonsten stimmen die Werte ziemlich genau mit meinen Multimeter überein.

    Ich freue mich über jeden Tipp

    Viele Grüße
    Torsten

    Antworten
  6. Uwe Wensauer

    Hallo,
    Ihr habt mich neugierig gemacht.
    Könnte ich mehr davon erfahren ?
    Möchte den Stromverbrauch von 2 Geräten gleichzeitig überwachen.

    Hilfe erwünscht
    Gruß Uwe

    Antworten
  7. Volker

    Ich möchte den acs712 als überwachung einer Batterie 6v 12ah die
    wiederum den Arduino über einen Stepdownwandler versorgt nutzen.
    Geht das oder wird das Ergebniss durch den abnehmenden Strom
    beeinflusst.

    Antworten
    1. Manfred

      Der ACS hat den Strompfad von der Versorgung galvanisch getrennt, damit ist erstmal egal, wo Du misst, es gibt keinen Konflikt.

      Wenn Du Ladung / Entladung billanzieren willst, macht es doch Sinn, den Verbrauch Deiner Meßschaltung mit einzubeziehen, letztendlich wird diese ja auch aus der Batterie gespeist.

      Antworten
  8. Alex

    Hallo, was muss ich im Code ändern/hinzufügen wenn ich einen Relais Schalten möchte?
    Ich verwende das 30 Amp Modul, mit gleichem Chip (ACS712).

    Also ich möchte dass wenn mehr als 0.5 AMP durch laufen, dass
    dann der/das Relais geschaltet wird.

    lg Alex

    Antworten
  9. Lou

    Der Chip hat eine Spannungsfestigkeit von 2.4 kV, die abgebildete Leiterplatte des Moduls hat diese sich nicht. Also bitte nicht am 230V Netz betreiben, wenn einem eigene Gesundheit und Leben lieb sind.

    Antworten
  10. Sebi

    Hallo, coole Anleitung und funktioniert bei mir auch wunderbar.
    Doch ich wollte das Skript noch um eine Funktion erweitern, bekomme es aber nicht hin.
    Wie müsste man den Code erweitern um eine LED (zB. An Pin D2) bei Erreichen eines bestimmten Ampere-Wertes (z.B. bei 1 A) zu aktivieren?
    Ich habe es so versucht:
    Versuch 1:
    if (ACS712read(100) <= 1.000){ digitalWrite(2, HIGH);}
    else { digitalWrite(2, LOW);}

    Doch leider passiert nix.

    Versuch 2:
    if (amp <= 1.000){ digitalWrite(2, HIGH);}
    else { digitalWrite(2, LOW);}

    Hier geht die LED zwar an, aber bei einem anderem Ampere-Wert als ich es mir wünsche .
    ( Zusätzlich tritt noch ein blöder Effekt auf das sie manchmal flackert oder blinkt.)

    Viele Grüße Sebi

    Antworten
    1. Manfred

      Du hast einen grundlegenden Denkfehler:

      „analogRead (PortNummer);“ liefert einen Wert zwischen 0 und 1023 entsprechend Null Volt bis volle Betriebsspannung.

      Der ACS712 liefert ohne Strom die halbe Betriebsspannung, also 2,5 Volt.
      Dein Arduino wird etwa 512 liefern, wenn kein Strom fließt.

      Der ACS712-5 liefert etwa 185 Millivolt pro Ampere, also kannst Du bei 1A mit 2,685 Volt rechnen. 2,685 / (5/1023) gibt 549, auf diesen Wert musst Du testen. Falls der Strom in die andere Richtung fließt, wären es 475.

      Befasse DIch mit Grundlagen, es gibt jede Menge Beispiele zu finden, wie man ein Drehpoti am Analogeingang eines Arduino abfragt. Baue das auf, schicke die Meßwerte per serial.print zum PC und verstehe danach, was ich Dir gerade beschreibe. Wenn das sitzt, den ACS712 dran und wieder am PC gucken, welche Werte Du tatsächlich bekommst, die Bauelemente haben deutliche Toleranzen = Abweichungen vom theoretischen Wert.

      Dass die LED im Grenzbereich flackern wird, ist klar, da fehlt die Hysterese. Heißt, einen kleinen Bereich zu definieren, wo sie nicht schaltet: Bei 549 Ein, aber erst bei 545 wieder aus.

      Antworten
      1. Kduino

        Im Artikel sollte vielleicht nochmal angemerkt werden, dass sich wie beschrieben nur Gleichspannungen messen lassen. Für Wechselspannungen ist es notwendig die Amplitude des ACS-Signals zu ermitteln, da der ACS eine Wechselspannung ausgibt, die proportional zum gemessenen Strom ist.
        Mitterwertberechnung führt da nur zur Ermittlung von VCC/2.

        Antworten

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.