ACS712 Stromsensor

Über den Beitrag

Wenn ihr die Begriffe „Stromsensor“ und „Arduino“ in Google sucht, werdet ihr vor allem auf den ACS712 treffen. Nachdem ich über die Stromsensormodule INA219, INA226 und den Eigenbau Stromsensor  berichtet habe, möchte ich mich jetzt diesem wahrscheinlich populärsten Stromsensor widmen.

Bei Stromstärken von unterhalb einem Ampere stößt der ACS712 in Kombination mit dem A/D-Wandler des Arduino UNO an seine Grenzen. Auf diesen Punkt gehe ich besonders ein und zeige wie ihr bessere Ergebnisse erhalten könnt. Zum Schluss erkläre ich dann noch, wie ihr den ACS712 als Leistungssensor einsetzen könnt.

Eigenschaften des ACS712 (Moduls)

Das Messprinzip des ACS712

ACS712 Modul

Der ACS712 bzw. das ACS712 Modul misst Ströme auf Basis des Hall-Effekts. In einem früheren Beitrag hatte ich schon einmal über Hall-Sensoren berichtet. Diese werden benutzt um Magnetfelder zu detektieren, bzw. um mithilfe von Magneten kontaktlose Schalter zu realisieren. Im ACS712 hingegen erzeugt der zu messende Strom ein Magnetfeld, das in eine Spannung umgewandelt wird, die ihr dann am Pin „Out“ abgreifen könnt.

Durch sein Messprinzip beeinflusst der ACS712 den zu messenden Strom noch weniger als die shuntbasierten Module aus meinen vorherigen Beiträgen. Der ohmsche Widerstand beträgt lediglich 1,2 Milliohm. Allerdings ist dafür die Empfindlichkeit nicht besonders hoch, außerdem verbraucht der ACS712 erheblich mehr Strom.

Je nach Beschaltung liefert der ACS712 IC eine Spannung zwischen 66 und 185 Millivolt pro Ampere. Auf dem Modul ist die Beschaltung vorgegeben. Die meisten Module, die ich in Online-Shops gesehen habe, haben die maximale Empfindlichkeit von 185 Millivolt pro Ampere implementiert. Es gibt aber auch andere. Mit dem blanken ACS712 IC seid ihr diesbezüglich freier. Ein weiterer Vorteil des blanken ICs ist, dass ihr die Filterfunktion (Pin 6 des ICs, siehe Datenblatt) kontrollieren könnt.

Technische Daten (Modul)

Hier die wichtigsten technischen Daten:

  • Spannungsversorgung an VCC/GND: 4.5 – 5.5 V.
  • Stromverbrauch des ACS712 ICs: ca. 10 mA.
    • Bedingt durch seine LED ist der Stromverbrauch des Moduls etwas höher: ca. 12 mA.
  • Empfindlichkeit des Moduls: 185 mV / A.
    • Alternativ sind Module mit einer Empfindlichkeit von 100 bzw. 66 mV / A erhältlich.
  • Linearitätsabweichung: 1.5 % (lt. Datenblatt).
  • 5 Ein-/Ausgänge:
    • VCC/GND Spannungsversorgung.
    • OUT: Signalspannung.
    • IN+ (oben rechts) / IN- (oben links): Ein- bzw. Ausgang für den zu messenden Strom.
  • Spannung an OUT bei 0 Ampere: VCC/2.

Die Signalspannung VOUT beträgt damit bei einer Versorgungsspannung VCC in Abhängigkeit vom zu messenden Strom I: 

    \[ V_{OUT}\,[\text{mV}]=185\,[\text{mV/A}]\cdot I\,[\text{A}]+\frac{VCC\,[\text{mV}]}{2} \]

Aufgelöst nach I:

    \[ I\, [\text{A}]=\frac{V_{OUT}-\frac{VCC}{2}}{185} \]

Besitz ihr ein Modul mit einer anderen Empfindlichkeit, müsst ihr einfach nur die 185 durch 100 bzw. 66 ersetzen.

Der ACS712 „Quick and Dirty“

Wenn ihr den ACS712 mit dem Arduino auslesen wollt, dann könnt ihr ihn wie folgt anschließen:

Der ACS712 am Arduino UNO
Der ACS712 am Arduino UNO

Das ist die High-Side Konfiguration, d.h. der ACS712 sitzt an der V+ Seite des zu messenden Verbrauchers. Ihr könnt den ACS712 aber auch hinter dem Verbraucher auf die GND Seite setzen (Low-Side).

Dann habe ich mich zunächst um den Nullpunkt gekümmert, sprich die Spannung an OUT (im Fritzing Schema oben als Vo bezeichnet) bei null Ampere Stromfluss. Theoretisch sind das 2,5 Volt, d.h. ein analogRead(A0) sollte 1024/2 = 512 liefern. Praktisch werdet ihr wahrscheinlich etwas weniger messen. Selbst unter der geringen „Last“ des ACS712 geht die durch den Arduino bereitgestellte Spannung schon um ein paar Millivolt herunter. Damit ist auch der Nullwert an OUT etwas geringer. Ich habe 510 ermittelt, allerdings um bis zu +/-3 Einheiten schwankend.

Da der Arduino eine Referenzspannung von 5 Volt hat und sein A/D-Wandler eine Auflösung von 10 Bit, gilt für die Spannung am Pin A0:

    \[ V_{\text{A0}}[\text{V}]=analogRead(\text{A0})\cdot\frac{5}{1024} \]

Eingesetzt in die Gleichung für die Stromstärke weiter oben ergibt sich folgender einfacher Sketch:

const int ACS712_Pin = A0;
const int zeroCurrentValue = 510;

void setup() {
  Serial.begin(9600);
  Serial.println("ACS712 - Basissketch");
}

void loop() {
  int rawValue= analogRead(ACS712_Pin);
  float current = (rawValue - zeroCurrentValue)*5.0/1.024/0.185; // für Module mit 185 mV/A
  Serial.print("Strom [mA]: ");
  Serial.println(current);
  delay(2000);        
}

 

Damit erhielt ich bei null Ampere typischerweise Ergebnisse wie das folgende:

Ausgabe von ACS712_Quick_And_Dirty.ino

Das Ausmaß des Rauschens wäre selbst für Messungen im Ampere Bereich nicht gerade befriedigend. Die schwankenden Ergebnisse sind allerdings nicht nur dem ACS712 anzulasten. Was hier vor allem schwankt, ist der A/D-Wandler des Arduino UNO.  Nehmt einmal eine stabilisierte Stromquelle oder schlicht eine unbelastete Batterie und messt die Spannung über analogRead(). Ihr werdet feststellen, dass die ausgelesenen Werte um +/-2 bis 3 Einheiten schwanken. Eine Einheit entspricht 5000/1024 = ~4,883 Millivolt und das entspricht immerhin 4,883/0,185 = 26,39 Milliampere.

Verbesserung 1: Mittelwertbildung

Es liegt auf der Hand, dass man bei rauschenden Messergebnissen viele Werte misst und dann mittelt. Dazu habe ich zunächst den Nullwert genauer ermittelt (510.8). Dann habe ich den Sketch so verändert, dass  jeweils 50 Messergebnisse gemittelt werden:

const int ACS712_Pin = A0;
const float zeroCurrentValue = 510.8;  
void setup() {
  Serial.begin(9600);
  Serial.println("ACS712 - Stromsensor, Basissketch verbessert");
}

void loop() {
  long rawValue = 0;
  for(int i=0; i<50; i++){
    rawValue += analogRead(ACS712_Pin);
  }
  float rawVoltage = rawValue/50.0;
  float current = (rawVoltage - zeroCurrentValue)*5.0/1.024/0.185; // für Module mit 185 mV/A
  Serial.print("Strom [mA]: ");
  Serial.println(current);
  delay(2000);        
}

 

Das Ergebnis sieht schon viel besser aus. Schwankungen lagen im Bereich von +/-10 Milliampere:

ACS712 - ACS712_with_averaging.ino bei null Ampere
Ausgabe von ACS712_with_averaging.ino bei null Ampere

Bei Stromfluss bleibt die Schwankung bei ca. +/- 10 Milliampere, d.h. bei steigenden Strömen kommt sie prozentual weniger zum Tragen. Hier die Ergebnisse für einen Strom, den mir mein Multimeter und mein Labornetzteil als konstant 305 Milliampere angezeigt haben:

ACS712 - Ausgabe von ACS712_with_averaging.ino bei 305 mA
Ausgabe von ACS712_with_averaging.ino bei 305 mA

Und hier die Ergebnisse für tatsächliche 536 Milliampere:

ACS 712 - Ausgabe von ACS712_with_averaging.ino bei 536 mA
Ausgabe von ACS712_with_averaging.ino bei 536 mA

Tendenziell lagen die so ermittelten Messwerte im Durchschnitt etwas höher als der tatsächliche Strom. Der Faktor von 185 mV/A müsste entsprechend ein wenig nach oben korrigiert werden. Wegen der Schwankungen hatte ich aber keine Lust mehr, da eine Wissenschaft draus zu machen.

Verbesserung 2: Ein besserer A/D-Wandler

Im nächsten Schritt habe ich anstelle des Arduino A/D-Wandlers einen ADS1115 eingesetzt. Den ADS1115 und meine zugehörige Bibliothek habe ich hier beschrieben. Deshalb gehe ich in diesem Beitrag nicht noch einmal auf alle Details ein.

Der ADS1115 ist ein A/D-Wandler mit einer Auflösung von 16 Bit, er hat 4 Kanäle (A0 – A3) und einen internen Verstärker. Darüber hinaus bietet er die Möglichkeit, Spannungsdifferenzen zwischen den Kanälen zu messen. Das könnt ihr euch zunutze machen, indem ihr mit einem Spannungsteiler eine Referenzspannung von 2,5 Volt erzeugt und dann die Spannungsdifferenz zwischen Referenz (Kanal A1) und OUT Signal des ACS712 (Kanal A0) messt:

Der ACS712 mit ADS1115 am Arduino
Der ACS712 mit ADS1115 am Arduino

Bei null Ampere Stromfluss startet ihr auf diese Weise mit einer Spannungsdifferenz von ungefähr null Volt. Bei kleinen Strömen erhaltet ihr geringe Spannungen, die ihr mit dem ADS1115 verstärken könnt. 

ACHTUNG: ich komme später dazu, warum ich V+ des Verbrauchers an A2 angeschlossen habe. Wartet noch damit, vor allem wenn eure Stromquelle für den Verbraucher über 5 Volt erzeugt! Die Spannung an den Eingängen A0 – A4 darf die Versorgungsspannung des ADS1115 um nicht mehr als 0,3 Volt überschreiten. In diesem Fall wären das 5,3 Volt. Wenn die Versorgungsspannung für den Verbraucher höher ist, müsst ihr noch geeignete Spannungsteiler vor die Eingänge (also hier A2) setzen! Ihr zerstört sonst den ADS1115!

Überprüfung der Messwertschwankungen

Für einen ersten Eindruck habe ich mir die Schwankungen bei null Ampere Stromfluss angeschaut. Dazu habe ich den folgenden Sketch verwendet:

#include<ADS1115_WE.h> 
#include<Wire.h>
#define I2C_ADDRESS 0x48
const float zeroCurrentVoltage_mV = 0.0;

ADS1115_WE adc(I2C_ADDRESS);

void setup() {
  Wire.begin();
  Serial.begin(9600);
  if(!adc.init()){
    Serial.println("ADS1115 not connected!");
  }

  /* Set the voltage range of the ADC to adjust the gain
   * Please note that you must not apply more than VDD + 0.3V to the input pins!
   * 
   * ADS1115_RANGE_6144  ->  +/- 6144 mV
   * ADS1115_RANGE_4096  ->  +/- 4096 mV
   * ADS1115_RANGE_2048  ->  +/- 2048 mV (default)
   * ADS1115_RANGE_1024  ->  +/- 1024 mV
   * ADS1115_RANGE_0512  ->  +/- 512 mV
   * ADS1115_RANGE_0256  ->  +/- 256 mV
   */
  adc.setVoltageRange_mV(ADS1115_RANGE_0256); 

  /* Set the inputs to be compared
   *  
   *  ADS1115_COMP_0_1    ->  compares 0 with 1 (default)
   *  ADS1115_COMP_0_3    ->  compares 0 with 3
   *  ADS1115_COMP_1_3    ->  compares 1 with 3
   *  ADS1115_COMP_2_3    ->  compares 2 with 3
   *  ADS1115_COMP_0_GND  ->  compares 0 with GND
   *  ADS1115_COMP_1_GND  ->  compares 1 with GND
   *  ADS1115_COMP_2_GND  ->  compares 2 with GND
   *  ADS1115_COMP_3_GND  ->  compares 3 with GND
   */
  adc.setCompareChannels(ADS1115_COMP_0_1); 

  Serial.println("ACS712 - Nullstrommessung mit ADS1115");
  Serial.println();
}

void loop() {
  float voltage = 0.0;
  
  for(int i=0; i<10; i++){
    adc.startSingleMeasurement();
    while(adc.isBusy()){}
    voltage += adc.getResult_mV();
  }
  
  voltage /= 10;
  voltage -= zeroCurrentVoltage_mV;
  float current = voltage/0.185;
  Serial.print("ADC712-Spannung [mV]: ");
  Serial.print(voltage);
  Serial.print("  /  Strom [mA]: ");
  Serial.println(current);
  delay(2000);
}

 

Ein paar Anmerkungen zu dem Sketch:

  • zeroCurrentVoltage_mV ist die Spannung zwischen OUT und der Referenzspannung bei null Ampere Strom. Ich habe den Wert erst einmal auf Null gesetzt, den Sketch laufen lassen, den tatsächlichen Wert ermittelt und ihn dann entsprechend eingesetzt (2.0 mV bei mir).
  • setVoltageRange(ADS1115_RANGE_0256) setzt den Spannungsmessbereich auf +/- 256 mV. Das entspricht der höchstmöglichen Verstärkung des ADS1115.
  • setCompareChannels(ADS1115_COMP_0_1) legt fest, dass die Spannungsdifferenz zwischen den Kanälen 0 und 1 gemessen wird.
  • getResult_mV() liefert das Ergebnis der Wandlung direkt in Millivolt.
  • Mit einer Mittelwertbildung aus zehn Messungen konnte ich eine für mich akzeptable Stabilität der Werte erreichen.

Hier das Ergebnis:

Ausgabe von ACS712_with_ADS1115_basic.ino bei null Ampere
Ausgabe von ACS712_with_ADS1115_basic.ino bei null Ampere

Das sieht doch schon nicht so schlecht aus, oder? Wenn man annimmt, dass die Steigung tatsächlich bei 185 mV/A liegt, ist der Sketch oben auch schon fertig einsetzbar.

Verbesserung 3: „Kalibrierung“ der Schaltung

Im nächsten Schritt habe ich mir angeschaut, wie die Abhängigkeit von Strom zu Spannung tatsächlich aussieht. Dazu habe ich verschiedene Verbraucher eingesetzt, den Strom mit meinem Multimeter gemessen und die Spannung mit dem Sketch ACS712_am_ADS1115_Basis.ino ermittelt. Dabei kam Folgendes heraus:

ACS712 - Tabelle 1: Strom vs. Spannung
Tabelle 1: Strom vs. Spannung

Hier grafisch dargestellt mit einer Ausgleichsgerade:

ACS712 - Ausgleichgerade für die Messwerte Strom vs. Spannung
Ausgleichgerade für die Messwerte Strom vs. Spannung

Die Messwerte lagen recht gut auf einer Ausgleichsgerade. Ich habe dann die Spannungswerte aus Tabelle 1 in die Gleichung für die Ausgleichsgerade eingesetzt. Die Ergebnisse findet ihr in der rechten Spalte der Tabelle 1. Sie geben einen Eindruck wie genau die Messung ist. Für eine akkurate Statistik bräuchte man noch mehr Werte, aber es lässt sich abschätzen, dass die Abweichung bei Stromstärken oberhalb von 1 Ampere auf unter 1 Prozent sinkt. 

Die Steigung der Ausgleichsgeraden beträgt 5,2788 mA/mV. Das entspricht 189,4 mV/A, was ein bisschen höher ist als die angegebenen 185 mV/A, aber nicht meilenweit entfernt.  

Verbesserung 4: Leistungssensor-Funktion

Falls ihr den beschriebenen Weg nachvollzieht, könntet ihr jetzt den letzten Sketch verbessern, indem ihr die Gleichung für die Ausgleichsgerade einsetzt. Aber vielleicht wollt ihr dem Projekt auch noch eine Funktion spendieren, mit der ihr die Leistung des Verbrauchers ermittelt. Hier kommt nun die Spannungsmessung an V+ des Verbrauchers (Busspannung) zum Tragen. An dieser Stelle möchte / muss ich nochmal darauf hinweisen, dass die Spannung an den Eingängen des ADS1115 die Betriebsspannung des ADS1115 um nicht mehr als 0,3 Volt übersteigen darf. Falls V+ größer ist, dann setzt Spannungsteiler ein.

Mithilfe der Spannung an V+ und dem Strom (Busstrom) könnt ihr die Leistung errechnen:

    \[ P_{V\!erbraucher}=U_{V_{+}}\,\cdot I_{Bus} \]

Und hier der komplette Sketch dazu:

#include<ADS1115_WE.h> 
#include<Wire.h>
#define I2C_ADDRESS 0x48

ADS1115_WE adc(I2C_ADDRESS);

void setup() {
  Wire.begin();
  Serial.begin(9600);
  if(!adc.init()){
    Serial.println("ADS1115 not connected!");
  }

  /* Set the voltage range of the ADC to adjust the gain
   * Please note that you must not apply more than VDD + 0.3V to the input pins!
   * 
   * ADS1115_RANGE_6144  ->  +/- 6144 mV
   * ADS1115_RANGE_4096  ->  +/- 4096 mV
   * ADS1115_RANGE_2048  ->  +/- 2048 mV (default)
   * ADS1115_RANGE_1024  ->  +/- 1024 mV
   * ADS1115_RANGE_0512  ->  +/- 512 mV
   * ADS1115_RANGE_0256  ->  +/- 256 mV
   */
  //adc.setVoltageRange_mV(ADS1115_RANGE_1024); //uncomment line / change parameter to change range

  /* Set the inputs to be compared
   *  
   *  ADS1115_COMP_0_1    ->  compares 0 with 1 (default)
   *  ADS1115_COMP_0_3    ->  compares 0 with 3
   *  ADS1115_COMP_1_3    ->  compares 1 with 3
   *  ADS1115_COMP_2_3    ->  compares 2 with 3
   *  ADS1115_COMP_0_GND  ->  compares 0 with GND
   *  ADS1115_COMP_1_GND  ->  compares 1 with GND
   *  ADS1115_COMP_2_GND  ->  compares 2 with GND
   *  ADS1115_COMP_3_GND  ->  compares 3 with GND
   */
  //adc.setCompareChannels(ADS1115_COMP_0_1); // uncomment line / change parameter to change channels

  Serial.println("ACS712 - Strom- und Leistungssensorsketch");
  Serial.println();
}

void loop() {
  float voltage = 0.0;

  adc.setCompareChannels(ADS1115_COMP_0_1); // Channel 0 vs. 1
  adc.setVoltageRange_mV(ADS1115_RANGE_0512); // Limit: 512 mV
  
  for(int i=0; i<10; i++){
    adc.startSingleMeasurement();
    while(adc.isBusy()){}
    voltage += adc.getResult_mV();
  }
  voltage /= 10;
 
  Serial.print("V Out          [mV]: ");
  Serial.println(voltage);

  float current_mA = voltage * 5.28 + 10; // experimentell ermittelt
  Serial.print("Busstrom      [mA]: ");
  Serial.println(current_mA);
  
  adc.setVoltageRange_mV(ADS1115_RANGE_6144); // Limit: 6144 mV
  adc.setCompareChannels(ADS1115_COMP_2_GND); // Channel 2 vs. GND
  adc.startSingleMeasurement();
  while(adc.isBusy()){}
  voltage = adc.getResult_V(); 
  Serial.print("Busspannung    [V]: ");
  Serial.println(voltage);

  float power_mW = (voltage * current_mA);
  Serial.print("Leistung      [mW]: ");
  Serial.println(power_mW);

  Serial.println("-------------------------------");
  delay(2000);
}

 

Zwischen den Messungen der ACS712 Spannung und V+ schalte ich im obigen Sketch den Bereich um. Ich habe für die ACS712 Spannung den Bereich bis 512 mV gewählt. Eingesetzt in die Gleichung für die Ausgleichsgerade ergibt sich daraus ein maximaler Strom von ca. 2,7 Ampere. Wenn Ihr mehr braucht, dann erhöht den Bereich entsprechend.

Und so sieht dann die Ausgabe aus:

ACS712: Ausgabe von ACS712_current_and_power_sensor.ino
Ausgabe von ACS712_current_and_power_sensor.ino

Danksagung

Wie meistens, habe ich mich für Teile meines Beitragsbildes wieder bei Pixabay bedient:

40 thoughts on “ACS712 Stromsensor

  1. Hallo Wolfgang,
    was ist der Grund, dass du den ACS712 gegen eine Referenzspannung und nicht gegen Gnd misst?
    Ich würde gerne zwei Leistungsmessungen parallel machen, und mit der Referenzspannung bräuchte ich 2 ADC. Gegen Gnd nur einen.
    gruß,
    Matthias

    1. Hallo Matthias, ein Grund ist: wenn du gegen die Referenzspannung VCC/2 misst, dann bekommst du kleinere Spannungen und kannst eine höhere Verstärkung wählen. Der andere Grund ist, dass der ADS1115 gegen eine interne Spannungsreferenz misst. Der Nullpunkt des ACS712 liegt aber bei VCC/2. Wenn du eine sehr stabile Spannungsversorgung hast, dann ist das kein Problem. Wenn sich dein VCC aber verändert, z.B. weil du im Batteriebetrieb arbeitest, dann verändert sich dein Nullpunkt und platt ausgedrückt haut dieser Fehler 1:1 rein. Bei der Messung über den Arduino ist das anders, da dort VCC die Referenzspannung ist, d.h. der Nullpunkt des ACS712 liegt immer bei einem analogRead() – Wert von (theoretisch) 512.
      Allerdings sollte ich hier noch einmal darauf eingehen, dass Spannungsteiler einen gewissen Fehler verursachen, da der „untere“ Teil, also der Widerstand auf der GND Seite, parallel zum Eingangswiderstand des ADC liegt und dadurch der Gesamtwiderstand geringer wird.
      VG, Wolfgang

  2. Es gibt mehrere Typen für ACS712, die unterschiedliche Skalierungen haben. In der Anleitung von AZ-Delivery steht z.B.:
    ACS712-Modul 5A Skalierung: 185 mV/Amp
    ACS712-Modul 20A Skalierung: 100 mV/Amp
    ACS712-Modul 30A Skalierung: 66 mV/Amp
    Sie müssen den richtigen Bereich für Ihr Projekt auswählen. Dieser stellt einen Kompromiss aus Genauigkeit und maximaler Last dar.

    Ich hab das Sketch im Blog verwendet und mich dann über völlig abweichende Messwerte meines Multimeters gewundert, bis ich darauf kam dass ich da gerade ein Modul für 20A im Einsatz habe. Es wäre gut, wenn man weitere Interessenten im Blog/Sketch darauf hinweist.

    1. Gut zu wissen, dass es auch andere Module gibt.

      Je nach Beschaltung liefert der ACS712 IC eine Spannung zwischen 66 und 185 Millivolt pro Ampere. Auf dem Modul ist die Beschaltung vorgegeben. Alle Module, die ich ausprobiert oder in Online-Shops gesehen habe, haben die maximale Empfindlichkeit von 185 Millivolt pro Ampere implementiert.

      Das ist sicherlich kein Freifahrtschein nicht zu prüfen, ob man nicht doch ein anderes Module hat.

  3. Ich möchte drei ACS712 mit einer Referenzspannung 2,5V am ADS1115 messen.
    Mich irritiert eine Ungereimtheit zwischen Github-Doku und Skript:

    In der Github-Doku „ADS1115_WE/List of public functions ADS1115.pdf“ steht: … ADS1115_COMP_0_2
    Im o.g. Script steht: … * ADS1115_COMP_0_3 -> compares 0 with 3

    Eine der beiden Angaben scheint mir veraltet zu sein.

    1.Kann ich eine Referenz 2,5V an A3 anlegen und dann A0,A1,A2 für die Messwerte der ACS712 verwenden?
    2.Welche Angaben sind für setCompareChannels() möglich?

    Abhängig davon müsste ich meine Platine umlöten.

    1. Die Angabe in der „List of public functions“ ist schlicht ein Übertragungsfehler. Danke für den Hinweis. Werde ich zeitnah ändern.

      1. Ja
      2. In den Beispielsketchen des Beitrags und in den Bibliotheksbeispielsketchen ist eine Liste der Optionen.

  4. Hallo Wolfgang
    Sie haben bei der Berechnung der Spannung durch 1023 geteilt.
    ist 1024 nicht richtig ?

    1. Hallo Waldemar,
      die größte Zahl, die 10 Bit A/D-Wandler ausgeben kann, ist 0b1111111111 = 1023, auch wenn 10 Bit 1024 sind. Wenn die Referenzspannunng 5 V ist und man nähme 1024 als Teiler, dann könnte man also nie 5 V messen, sondern maximal 5 * 1023 / 1024 V. Die meisten teilen durch 1024, weil es 1024 Abschnitte sind: 0-1, 1-2, 2-3,….. 1022-1023.Dem kann ich zwar auch irgendwie folgen, aber aus meiner Sicht ist 1023 aufgrund meiner Argumentation „richtiger“. Letzten Endes ist die Frage eher akademischer Natur, da die Genauigkeit der analogRead() Messung nicht so hoch ist, dass man diesen Unterschied wirklich merken würde.
      VG, Wolfgang

      1. Hallo Wolfgang,
        unabhängig davon, wie sehr ich Deine sehr informative und hilfreiche Seite schätze, bin ich hier auch anderer Meinung. Und ich weiß, daß sich darüber vortrefflich streiten lässt, und das vermutlich schon so lange passiert wie es ADCs gibt;-)
        Im Datenblatt bei den mir bekannten ADCs steht als maximal Code immer Vref – 1 LSB, wonach sich die Vref eben nicht korrekt messen lässt. Wenn Du statt 1024 durch 1023 dividierst hast Du eine falsche Steigung der Kennlinie des ADC.
        Gedankenexperiment: Würdest Du die 1023 (10 Bit ADC) auf einen 16 Bit ADC anwenden, müsstest Du mit 32736 rechnen, anstatt der korrekten 32768, um auf die gleiche Steigung des ADC zu kommen.

        Gruß André

          1. So, ich nehme alles zurück und behaupte das Gegenteil: 1024 ist richtig. Sthet explizit im Datenblatt. Danke nochmal.

  5. Hallo.
    Danke für diesen Beitrag.
    Ich suche allerdings eine Chiplösung mit Hallsensor, die man einfach nur an den isolierten Leiter dran halten kann und so der Strom gemessen wird.

    gibts sowas?

    1. Ja, z.B. hier:
      https://amzn.eu/d/4meCKao (nur Wechselstrom)#

      Oder hier:
      https://amzn.eu/d/6h9vvQu

      Die Genauigkeit und Empfindlichkeit dieser Teile dürfte allerdings begrenzt sein. Aber wenn es dir nicht um exakte Werte geht und du nicht zu geringe Ströme hast, die du messen willst, dann könnte es was für dich sein.

      Einfach mal bei Amazon, eBay, AliExpress und Co nach „Stromsensor“ suchen. In den Ergebnissen findest du mehrere Angebote für solche Sensoren.

  6. Sorry für die dumme Frage, aber ich kann in Deiner Beschreibung nirgends erkennen, für welche Verbraucherspannung das Teil geeignet ist. In den Kommentaren schrieb einer von Haartrockner und Backofen. Also nehme ich an, dass ich 220V anlegen kann??

    Mein Anwendungsfall ist dabei rel. einfach. Vielleicht hast Du da auch eine andere Idee, wobei das Teil ja echt billig ist im Vergleich zum z.B. SCT-013-030 Stromsensor, den ich zuerst auf dem Schirm hatte. Ich will eigentlich nur messen, ob Strom fließt oder nicht. Die Erfassung der Stromstärke bzw. Leistung wäre ein Goodie :).

    Hintergrund: Ich steuer mit Node-Red meine Heizung/Boiler je nach vorhandenem PV-Überschuss, so dass dieser maximal verbraucht wird. Dazu habe ich eine Tabelle, mit allen möglichen Leistungs-Kombinationen. Leider fehlt mir aber die Rückmeldung, ob der Verbraucher auch wirklich Leistung verbraucht (Boiler schon aufgeheizt. Raum schon warm). Wenn der Boiler z.B. schon aufgeheizt ist, muß ich diesen aus der Tabelle rausnehmen.

    1. Hi Konrad, das ist keine dumme Frage und wenn du ein wenig googelst, dann wirst du sehen, dass sich alle ein wenig um die Frage herumdrücken, allen voran die Verkäufer der Module. Das Datenblatt des ACS712 Chips gibt eine Isolierung von 2.1 kV zwischen der Stromseite (also der zu messende Strom) und der „Messseite“, also Versorgungsspannung und Ausgangssignal, an. Das würde unterstellen, dass man locker 220 V anlegen kann. Allerdings ist die Frage, ob die Platine, auf dem der ACS712 verbaut ist, das auch mitmacht. Die Meinungen hinsichtlich des Maximums gehen auseinander, aber die weit überwiegende Meinung ist, dass man 220 V nicht verwenden sollte. Ich selbst bin kein ausgebildeter oder studierter Elektriker oder Elektroniker und tue mich etwas schwer mit einer fundierten Aussage dazu. Gehe lieber auf Nummer sicher bevor du dich verletzt oder dir deine Wohnung abfackelt. Selbstgebaute Schaltungen für 220 Volt würde ich grundsätzlich prüfen lassen.

  7. Aktuell Arbeite ich mit dem Hallsensor ACS712.
    Dein Blogbeitrag zu diesem Thema ist sehr hilfreich gewesen und konnte mir weiterhelfen.
    Da ich über die Formel zur Berechnung des Stromes gestolpert bin wollte ich einmal anmerken, dass diese den Strom in mA bestimmt und nicht A.
    Alternativ könnte man natürlich auch in V die Werte bestimmen und somit den Strom bei A belassen.

    Grüße
    Jasper

    1. Hallo Jasper, vielleicht bin ich nach einem langen Arbeitstag schon etwas verwirrt, aber aus meiner Sicht ist die Formel richtig, wenn man die Spannungen in Millivolt einsetzt (was aus der Ursprungsformel hervorgeht) . Der ACS712 liefert 185mV Signalspannung pro Ampere des zumessenden Stroms plus die halbe Versorgungsspannung. Beispiel: VCC = 5V = 5000mV, I = +1A. Dann wäre Vout = 2500mV + 185mV = 2685 mV.
      VG, Wolfgang

  8. Hallo, Danke für den tollen Bericht.
    Weißt du zufällig, was passiert wenn der 10A Sensor mehr als 10A misst.
    Bei 185mV/A sind es ja 4,35V bei 10A oder ?
    Dann wäre ja noch Puffer bis zu den maximalen 5V?

    Gruß
    Andi

    1. Hallo, wenn ich ins Datenblatt schaue, dann steht da, dass die optimale Range für die 185mV/A Einstellung +/-5 Ampere ist. Ich schätze, dass je näher VOUT an VCC kommt, der Fehler entsprechend groß wird. Wo die Grenze liegt, bei der das Teil zerstört wird, konnte ich dem Datenblatt nicht entnehmen. Lediglich ein Hinweis, dass es 100A für 100 ms verträgt.
      VG, Wolfgang

  9. Hallo Wolfgang,
    beim Durchstöbern Deiner Archive – ich arbeite ungefähr mit allen möglichen Sensoren – habe ich beim Suchen gesehen, dass es über KQ330 und SIM800 noch nichts gibt. KQ330 ist ein power-line-communication Modul, SIM800 ein GSM-Modul, im Grunde schon ein komplettes Handy. Ich denke dass einige schon was damit gemacht haben, aber für die, die noch nichts davon gehört haben sollten, wollte ich das mal anstoßen.
    LG Rainer

    1. Vielen Dank, solche Anregungen bekomme ich gerne. Ein SIM800 und ein SIM900 liegen auch schon in meiner ToDo-Kiste. Den KQ330 kenne ich nicht, aber schaue ihn mir an. VG, Wolfgang

      1. habe da noch ’ne Frage, hat hier im Forum eigentlich schon mal jemand den Vorschlag zu einem Meeting gemacht zwecks Austausch, vielleicht mit Bastelstunde, Diskussionsrunde und so ?

        1. Hallo Rainer, das wäre tatsächlich eine Überlegung Wert. Ich hätte offen gestanden keine Lust eine Liste zu führen und dann immer Einladungen rauszuschicken. Aber vielleicht als fester Termin, alle zwei Wochen oder so und wer kommt, der kommt. Vielleicht per Zoom? Oder schwebt die etwas anderes vor? VG, Wolfgang

          1. Ich hatte die letzten Jahre beim Meetup in Düsseldorf teilgenommen, auch mal in Solingen etwas angestoßen, wo man sich regelmäßig traf. Einmal im Monat in der Woche nach Feierabend hatte sich da bewährt. Man muß nur sehen, aus welchem Umkreis wegen der Strecke, es geht. Sich vor Ort treffen, vielleicht Material mitbringen und evtl. zu testen ist am besten. Oder am Wochenende tagsüber, das lohnt sich dann auch für die, die es weiter haben. Muß man herausfinden. Ich bin, weil im Ruhestand da sehr flexibel.
            Auf jeden Fall sollte man gemeinsam ein Thema überlegen, an dem alle interessiert sind.

            1. Ich dachte, du meintest ein Online Meeting. So ein „echtes“ Treffen wäre auch was. Wenn die Impfungen weiter voran gehen, sollte das ja bald wieder möglich sein. Da müsste man mal schauen wer Interesse hat und wo.

              1. Ja, ein Online Meeting ist, bevor gar nichts läuft, und während der momentanen Krise auf jeden Fall ein guter Anfang. Da kann man/frau sich mal kennen lernen, und evtl. gemeinsam sogar ein größeres Projekt anpacken.

  10. Hallo,
    ich arbeite seit einigen Wochen mit dem ACS712, nunu auch mit ACS725 wegen 3,3Volt. Habe da ein seltsames Problem: Ich teste mit drei verschiedenen ACS’s, alle das gleiche Resultat.
    1. Haartrockner Geschwindigkeit 1, Hitze 1 – 3 Werte Ok (0,7 bis 3,3 Ampere)
    2. Haartrockner Geschwindigkeit 2, Hitze 1 – 3 Werte wie 0 Ampere
    3. kleiner Backofen verschiedene Stufen bi 800 Watt wie 0 Ampere
    Ich verwende dabei Netzteile mit stabiler Betriebsspannung, habe den ACS nicht in der Nähe von Magnetismus.
    Habe dann auch mit dem Messgerät den Ausgang des ACS gemessen, bei Punkt 2 und 3 auch hier Werte, als wenn nichts läuft. Alles unter 2000 Watt mit ACS* 20 Ampere gemessen.
    Habe 5 Nächte getestet, weiß nicht mehr weiter.

    1. Das klingt wirklich merkwürdig. Leider fällt mir keine Erklärung ein, vor allem, weil 1) ja funktioniert. Vielleicht hat ein anderer Leser noch eine Idee oder ähnliches erlebt?

      1. Moin Wolfgang,
        erst mal vielen dank für die interessanten und umfänglichen Infos.
        Mit dem ACS712 habe ich noch nicht gearbeitet, obwohl er hier beim mir „rumliegt“
        Bezüglich der oben stehenden Frage von Rainer hätte ich doch einen Tip oder nächsten Schritt der Analyse, davon ausgehend, daß sich der ACS712 ähnlich verhält wie alle anderen Hall- oder Stromsensoren ohne eine besondere Schaltung zur Gleichtaktunterdrückung.
        –> am besten bemüht der gute Mann einen Oszi um sich das Ausgangssignal anzuschauen
        Hintergrund:
        – wenn er mit dem Sensor eine Wechselspannung misst, sollte er nach beiden Halbwellen schauen
        – je nach Art der Messwertverarbeitung kann er schon mal übersehen, daß seine Verbraucher nur eine Halbwelle belasten

        Ich bin bei der Strommessung mit potentialfreien Spulensensoren darüber „gestolpert“
        –> manche Systeme halbieren die Leistung über eine Diode
        –> und dann kommt nur eine „Halbwelle“ Strom an
        —-> für Wechselspannungen kann ich daher ohnehin nur empfehlen die Differenz aus minimaler und maximaler Spannung des Stromsensors auszuwerten
        —-> dies kompensiert alle möglichen DC-Verschiebungen
        —-> je nach Arduino-Typ dauert eine analoge Messung (auch mit min-max-Betrachtung) ca. 110µs
        —-> sprich innerhalb von 200 Messungen (ca. 22ms) kann man eine Vollwelle abtasten und eine Min-Max-Betrachtung machen
        —-> damit hat man die Chance eine Dioden-veranlasste Halbwelle zu finden
        Dein SW-Vorschlag betrachtet auch nur die Momentaufnahme des Stromflusses
        –> ein Wechselstrom von 1A bringt aber innerhalb von 20ms eine Spannungsänderung von 2,5V +/-185mV
        –> je nach Polung und Stromrichtung fehlt in der Ausgabe nun eine Hälfte davon.
        Eventuell liegt darin das Problem.
        MfG RSchi

    2. Hallo Rainer,
      bei der Betrachtung deiner Verbraucher ist mir Aufgefallen das es eventuell etwas mit induktiven und kapazitiven Lasten zu tun haben könnte ?

      viele Grüße
      Christian

  11. Hallo Wolfgang,

    super Beitrag.
    Wie Michael, würde ich gerne wissen ob, man eine gute Lösung für das Messen von Spannungen wie z.B. mit einem Split-Core erstellen kann.
    Mein Ziel ist es eine Waschmaschine(n) „auszulesen“.
    Zusammen mit einen Rüttelsensor kann man dann die einzelnen „Phasen des Waschprogrammes“ erfassen.
    Im Schleuderprogramm „müsste“ die im Keller befindliche Maschine den meisten Stromverbrauchen besitzen und danach kaum mehr etwas (Knitter-Schutz-Programm).
    Ich könnte z.B. einen „ZMCT101D“ verwenden um z.B. in der Steckdose die Leitung (Phase) auszulesen?
    Alternativ könnte ich einen kleinen Zwischenstecker basteln, mit Schükostecker und Dose, so muss ich das Kabel der Waschmaschine nicht beschädigen, dann weiß ich aber nicht welche Leitung die Phase ist, wenn jemand mal den Stecker herausgezogen haben sollte.
    Oder geht das alles mit den Split-Core genau so gut?
    Auch hier würde ich wie Michael auch ungerne direkt am 230V etwas anschließen wollen.
    Die Messung des Stromverbrauches muss hier nicht so genau sein.
    Da die Waschmaschine aber solange im „Standby“ bleibt und außerdem sich immer mal wieder dreht etc. kann ich kein „Hallsensor“ verwenden der nur „es fließt oder es fließt kein Strom“ misst.

    Grüße

    1. Wenn du nicht gerade Elektriker bist, würde ich es erstmal mit dem Split-Core probieren. Wie gut das geht, kann ich dir leider nicht sagen. Etwas habe ich noch unterschlagen und zwar, dass das Signal aus dem Split-Core noch aufbereitet werden muss, wenn du es mit dem Arduino lesen willst. Eine Anleitung gibt es hier:

      https://innovatorsguru.com/sct-013-000/

      Den ZMCT101D habe ich mir mal angeschaut und diese Anwendungsbeschreibung gefunden:
      http://www.zeming-e.com/file/0_2013_10_18_102618.pdf

      Bei 5 Ampere liefert er 2.5 mA Output. Das ist ein bisschen wenig für den ACS712. Andere, empfindlichere Stromsensoren haben wiederum Probleme mit Wechselstrom. Oder man installiert einen Widerstand am Ausgang und bekommt dann eine Spannung. Das scheint allerdings auch wieder eine Wechselspannung zu sein, die A/D-Wandler nicht unbedingt lesen können. D.h. man müsste wieder eine Signalaufbereitung wie beim Split-Core vornehmen,

  12. Mir kommt es nicht auf Genauigkeit an. Eher darauf, nicht zu offen 230V herumliegen zu haben. Wie kann man einer einzelnen, isolierten Ader mit 1,5mm² „ansehen“, ob da 0 oder 1A oder 5-10A durchfließen?
    Wie oft muss man solch einen Draht um eine Eisenstange wickeln, dass das Magnetfeld gut von einem Hallsensor (oder was sonst?) erkannt wird? Aber die Induktivität kein größeres Problem als die ohmsche Last darstellt… (?) Wäre so ein Selbstbau-Sensor machbar, oder ist das ein Fall für solch einen ACS712?

    Ja ich weiß, Laien sollen die Finger von 230V lassen, aber eine Lampe sicher anzuschließen kann man mir wirklich zutrauen.

    1. Schau mal bei Amazon unter „nichtinvasiver Sensor“. Oder direkt hier:

      https://smile.amazon.de/YHDC-Current-Transformer-SCT013-000-50mA/dp/B01EFSTSM8/ref=pd_sbs_2?pd_rd_w=3uePz&pf_rd_p=c47a53d1-d94f-481c-a018-dcea8bd5c736&pf_rd_r=CET1B1CPA0PP7HX814XH&pd_rd_r=3361ddc5-bb31-4bfc-89c5-94f2520aa5cc&pd_rd_wg=wWz7S&pd_rd_i=B01CU04ZPI&th=1

      Vielleicht ist das ja was für dich. Ansonsten kannst du natürlich einen ACS712 nehmen, wenn du mit 230 V umgehen kannst. Es gibt einiges an Projekten dazu im Netz.

      Ob man mit Kabelwicklungen und Hall Sensoren was machen kann, weiß ich nicht. Das müsste ich selbst ausprobieren. Zumindest sind Hall Sensoren nicht besonders empfindlich.

      1. Danke für den Tip, Wolfgang.
        Split Core muss ja nicht sein, aber im Prinzip ist sowas genau das was ich wollte.
        DL-CT08CL5 macht aus 0-20A (AC) 0-10 mA und außer einmal trennen, durchführen und wieder anschrauben hat man mit der 230V Seite nichts zu tun. An der Mess-Seite muss halt immer ein passender genügend kleiner Widerstand sein, damit da eine passende (Wechsel-)Spannung entsteht.

  13. Haha…mein Gott, ich war blind….und..na ja, man wird nicht jünger….den hab ich ja bei Dir schon durchgelesen damals…

  14. Hallo Wolle
    Wieder ein fundierter toller Bericht in der Kiste! Du brauchst langsam eine Suchfunktion..
    Darf man Wünsche reingeben? Die Strom- und Spannungsmesserei ist ja langsam gründlichst durchgenommen…
    Ja? Die „Time of Flight“ Lidar Sensoren von beispielsweise STE (V53L1X) wären mein Vorschlag. Spektakuläre Technik & die dazu erhältlichen Libs könnten auch ein gewissenhaftes Reviewing brauchen wie es Du drauf hast!
    Thx für Deinen Blog

    1. Oh vielen Dank, das ist sehr nett. Ich habe zwei gute und eine schlechte Nachricht. Erst die schlechte: ich wollte das Thema Stromsensoren noch vervollständigen, es kommt also noch was ….ich weiß das ist vielleicht auf Dauer etwas langweilig….
      Dann die erste gute Nachricht: ja, gerne darf man sich was wünschen, ich sehr froh Anregungen zu bekommen. Und jetzt die noch bessere: einen Beitrag über die Time of Flight Sensoren habe ich schon geschrieben:
      https://wolles-elektronikkiste.de/vl53l0x-und-vl53l1x-tof-abstandssensoren

Schreibe einen Kommentar

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