MAX471 Stromsensor

Über den Beitrag

In diesem Beitrag möchte ich die Reihe über Stromsensoren mit dem MAX471 noch weiter vervollständigen. Der eine oder andere Stammleser ist vielleicht schon genervt – ich möchte die wichtigsten Stromsensoren aber alle behandelt haben. Der Blog soll auch als Nachschlagewerk dienen. 

Technische Eigenschaften des MAX471

Das Herzstück der MAX471 Module ist der eigentliche MAX471 IC. Das Datenblatt dazu gibt es hier. Der MAX471 ist für die Messung von Strömen bis zu 3 Ampere ausgelegt. Intern hat er einen Shunt (= kleiner Widerstand zur Strommessung) von 35 Milliohm, durch den der zu messende Strom geschickt wird. Der MAX471 verstärkt die über dem Shunt abfallende Spannung und gibt sie am OUT Pin aus. Die Spannung an OUT ist unabhängig von der Stromrichtung immer positiv.

Ich habe zwei Versionen von MAX471 Modulen gefunden, die sich ein wenig in ihrer Ausführung und den Eigenschaften entscheiden:

MAX471 Module
MAX471 Module

Zunächst einmal aber zu den Gemeinsamkeiten. Beide Module haben keinen Anschluss für eine Versorgungsspannung. Der MAX471 „bedient“ sich bei dem zu messenden Stromkreis. Die Module werden über ihre Anschlüsse RS+/RS- bzw. VIN / VOUT in den Stromkreis integriert. Die Spannung muss im Bereich von 3 bis 36 Volt liegen. Das bedeutet, dass der MAX471 nur auf der High-Side, also auf der V+ Seite vor dem Verbraucher, angeschlossen werden kann.

Der „nackte“ MAX417 hat noch einen Shutdown Pin, mit dem man ihn in einen Ruhemodus versetzen kann. Dieser ist bei den Modulen nicht ausgeführt.

Die wichtigsten Daten auf einen Blick

  • Maximaler Strom: 3 Ampere.
  • Spannungsbereich: 3 – 36 Volt.
  • Strom(eigen)bedarf: < 100 Mikroampere.
    • im Shutdown (nur IC): < 18 Mikroampere.
  • Shunt: 35 Milliohm.
  • Empfindlichkeit: ca. 1 Volt / Ampere.

Unterschiede zwischen den MAX471 Modulen

Ausführung oben links (violettes Modul):

  • Stromanschluss an RS+ / RS-
  • Signal an OUT
  • SIGN: Gibt die Stromrichtung an

Ausführung oben rechts (rotes Modul):

  • Stromanschluss an VIN / VOUT
  • Signal 1 (1 Volt / Ampere) an AT
  • Signal 2 (0,2 Volt / Ampere) an VT
  • Der SIGN Pin ist nicht ausgeführt

Das Signal 2 wird über einen Spannungsteiler auf dem Modul aus dem Signal 1 erzeugt. Der Spannungsteiler besteht aus dem 30 kOhm und dem 7,5 kOhm Widerstand, die gut erkennbar auf dem Modul aufgelötet sind.

Anschluss des MAX471 am Arduino

Die Schaltung

So könnte eure Schaltung für das violette Modul bei Verwendung eines Arduino UNO aussehen:

MAX471 Modul am Arduino UNO
MAX471 Modul am Arduino UNO

Das OUT Signal wird bei dieser Schaltung am analogen Eingang A0 gelesen. Der Anschluss SIGN ist ein Open-Collector Eingang. Er ist geschlossen, wenn der Strom von RS+ nach RS- fließt und offen bei Stromfluss in die andere Richtung. Ihr könnt das prüfen, indem ihr einen Pullup Widerstand dranhängt und dann über digitalRead() auslest. Ein HIGH bzw. 1 würde anzeigen, dass der Strom von RS+ nach RS- fließt. 

Die Verdrahtung des alternativen, roten Moduls ist dann keine Überraschung mehr. Die meisten werden wohl eher den empfindlicheren Ausgang AT benutzen als VT.

Alternatives MAX471 Modul am Arduino
Alternatives MAX471 Modul am Arduino

Kalibrierung

Wenn es nicht so genau darauf ankommt, könnt ihr jetzt einfach loslegen und den Strom nach dieser Formel bestimmen:

I\,[\text{mA}]=analogRead(A0)\cdot\frac{5000}{1024}

Wer es genauer haben möchte, der nimmt mithilfe des Strommessgerätes seines Vertrauens eine Kalibrierkurve auf. Die meisten Multimeter liefern nach meiner Erfahrung ziemlich genaue Werte. Und wer dann noch bei seinen Strommessungen unterhalb von einem Ampere bleiben möchte, der erhöht die Auflösung des Arduino A/D-Wandlers mit analogReference(INTERNAL). Das bewirkt, dass der Arduino UNO bzw. der darauf verbaute ATmega328P eine interne 1,1 Volt Quelle als Referenz benutzt. Einfach ausgedrückt: ein analogRead Ergebnis 1024 entspricht nicht mehr 5, sondern 1,1 Volt. 

Zur Aufnahme der Kalibrierkurve setzt ihr verschiedene Verbraucher mit unterschiedlichem Stromverbrauch in den Stromkreis. Zum Auslesen des A/D-Wandlers habe ich den folgenden Sketch benutzt:

void setup() {
  Serial.begin(9600);
  analogReference(INTERNAL); // adjust if you use another MCU
}

void loop() {
  unsigned int rawVal = 0;
    
  for(int i=0; i<25; i++){
    rawVal += analogRead(A0);
    delay(10);
  }
  float meanRawVal = (rawVal / 25.0);
  Serial.println(meanRawVal);
  delay(2000);        
}

 

Da die Messwerte noch recht stark schwankten, werden jeweils 25 Einzelwerte gemittelt. Die Spannung in Millivolt erhaltet ihr durch Multiplikation der Rohwerte mit 1,1/1023. Das habe ich Excel für mich machen lassen. Außerdem hat Excel für mich eine Ausgleichsgerade erstellt, in deren Formel ich die Spannungswerte eingesetzt habe (kalkulierter Strom). Dieser stimmt wirklich erstaunlich gut mit den gemessenen Werten überein:

Kalibrierung des MAX471
Kalibrierung des MAX471
Ausgleichsgerade zur Kalibrierung des MAX471
Ausgleichsgerade zur Kalibrierung des MAX471

Eigentlich sollte die Steigung der Kalibriergeraden 1 mA/mV betragen, stattdessen sind es 0,9452. Das ist immerhin eine Abweichung von gut 5 Prozent. Der Aufwand lohnt sich also schon, wenn ihr den Strom genau messen wollt. Ich habe das ganze auch nochmal mit meinem Lieblings-A/D-Wandler, dem ADS1115, wiederholt. Da hatte die Kalibriergerade eine Steigung von 0,948. Das passt alles ziemlich gut zusammen.

Der vollständige Strom- und Leistungssensor

Nun könnt ihr die Kalibriergerade benutzen, um Ströme zu bestimmen. Ihr könnt mit dem Stromsensor aber auch die Leistung P des Verbrauchers bestimmen. Dazu müsst ihr lediglich die Spannung an V+ des Verbrauchers messen. Den Strom (Busstrom genannt) kennt ihr ja schon.

P = U_{V_{+}}\cdot I_{Bus}

Aber Achtung: wenn die Stromquelle für den Verbraucher eine Spannung größer 5 Volt liefert, müsst ihr unbedingt noch einen Spannungsteiler zwischen V+ (Verbraucher) und A1 (Arduino setzen). Ihr zerstört sonst den Arduino!

Schaltung für den MAX471 als Strom- und Leistungssensor
Schaltung für den MAX471 als Strom- und Leistungssensor

Der vollständige Sketch braucht dann wohl keine großen Erklärungen mehr, bis auf einen Punkt. Die Referenz für den A/D-Wandler wechselt in der Hauptschleife zwischen 5 Volt (DEFAULT) und 1.1 Volt (INTERNAL). Nach dem Umschalten auf 1.1 Volt hatte ich zunächst merkwürdig geringe Werte ermittelt. Dieser Effekt lässt sich abstellen, indem man ein Dummy analogRead() durchführt, gefolgt von einem kurzen delay  (Zeile 18-20).

const int outPin = A0;
const int busPin = A1;
const int signPin = 8;

void setup() {
  Serial.begin(9600);
  Serial.println("MAX471 Strom- und Leistungssensor");
  Serial.println();
}

void loop() {
  float voltage = 0.0;
  unsigned long rawVal = 0;
  analogReference(INTERNAL);

  /* Nach dem Umschalten muss ein Dummy analogRead 
     erfolgen, gefolgt von einem kurzen delay() */
  rawVal = analogRead(outPin);
  rawVal = 0;
  delay(10);

 
  for(int i=0; i<25; i++){
    rawVal += analogRead(outPin);
    delay(10);  // Zum Ausgleich von Schwankungen
  }
    
  voltage = (rawVal/25.0) * 1100.0 / 1023.0;
  Serial.print("V Out         [mV]: ");
  Serial.println(voltage);

  float current_mA = voltage * 0.9452 + 1.0544; // Kalibrierfaktoren
  Serial.print("Busstrom      [mA]: ");
  Serial.println(current_mA);

  Serial.print("Stromrichtung:    : ");
  if(digitalRead(signPin)){
    Serial.println("RS+ -> RS-");
  }
  else{
    Serial.println("RS- -> RS+");
  }

  analogReference(DEFAULT);
  voltage = analogRead(busPin) * 5.0 / 1023.0;  
  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);
}

 

Und so sieht dann das Endergebnis auf dem seriellen Monitor aus:

Ausgabe von MAX471_Complete.ino
Ausgabe von MAX471_Complete.ino

Noch stabilere Werte mit Schwankungen von deutlich unter einem Milliampere konnte ich bei Verwendung eines ADS1115 A/D-Wandlers erzielen. Aber das Ergebnis ist so ja auch schon nicht schlecht.

Danksagung

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

13 thoughts on “MAX471 Stromsensor

  1. Hallo Wolfgang,
    ich kann das Problem von Manuel P. absolut nachvollziehen. Habe inzwischen bei drei verschiedenen Händlern jeweils 2 der MAX471 Stromsensor Module gekauft, und keines funktioniert. Beim geringsten Strom geht die Ausgangsspannung auf über 3,3 Volt. Bereits bei 0,2 wird das IC glühend heiß und gibt nach kurzer Zeit den Geist auf. Habe mal bei den neuen Modulen den Widerstand am IC zwischen den Pins 2/3 und 6/7 gemessen. Hier ist mir aufgefallen, dass der Widerstand sehr unterschiedlich ist und zwischen 320 und 460 Ohm liegt. Gemäss Datenblatt müsste hier ein Shunt (R SENSE) von 35 Milliohm sein. Bin also auch der Meinung, dass hier fake-ICs verbaut worden sind. Vielleicht hat ja Manuel schon einen Nachfolger gefunden…

    Viele Grüße
    Hermann Sch.

    1. Da scheine ich wohl Glück gehabt zu haben, dass meine Teile funktionieren. Sehr unerfreulich sowas.

  2. Servus,
    ersteinmal vielen Dank für die vielen guten Artikel.

    Ich habe jetzt etliche MAX471 getestet (Blaue und Lila Module) und bei allen liegen ohne Last bei 5V am Ausgang ca 3,6V an. Laut Datenblatt ist das die Maximalspannung „the output voltage can be no greater than VRS+ – 1.5V“. Unter Last sinkt die Spannung, in meinem Fall um 0,033V. Der Strom der Last ist 27mA.

    Laut Datenblatt sollten ohne Last 0V am Ausgang und 3V bei 3A „so that an output resistor (ROUT) of 2kΩ yields 1V/A for a full-scale value of +3V at ±3A“. Der 2K Widerstand ist auf dem Modul und funktioniert.

    Bei allen 5 Modulen war das Ergebnis das selbe. Können das Fake Chips sein oder Defekte?

    Grüße Manuel

    1. Hallo Manuel,
      du schreibst es liegen 5 Volt ohne Last an. D.h. deine Spannungsquelle ist mit ihrem + an RS+ und mit ihrem – an GND des MAX471, richtig? Und an RS- hängt nichts, auch richtig? Und dann misst du trotzdem eine Spannung zwischen OUT und GND? Das sollte in der Tat nicht sein. Es ist wichtig, dass die Spannungsquelle und der MAX471 ein gemeinsames GND haben, sonst funktioniert es nicht. Könnte da der Fehler liegen? Das ist mir jedenfalls schon mal passiert.
      VG, Wolfgang

      1. Hallo Wolfgang,
        Ja genau so angeschlossen und mehrfach überprüft. Gemeinsames GND vorhanden.
        Hab danach extra nochmal einen MAX471 wo anders gekauft, aber genau das selbe Problem.
        Grüße Manuel

        1. Hallo Manuel,
          dann fällt mir auf die Ferne kein weiterer Fehler ein. Irgendwie erscheint es mir unwahrscheinlich, dass mehrere MAX471 eine Macke haben. Wenn es gar nicht geht, dann schick mir einen und ich schaue ihn mir an.
          VG, Wolfgang

          1. Hallo Wolfgang,
            das kann ich gerne machen wenn Du die Zeit aufwenden möchtest.
            Grüße Manuel

            1. Kein Problem. Der Aufwand hält sich in Grenzen. Die Adresse steht im Impressum (siehe unten).

                1. Also, ich habe die Module getestet und beide liefern absurde Werte. Bei dem einen sind die Werte an OUT ungefähr 4x so hoch wie erwartet, bei dem anderen 3x so hoch. Was ich aber nicht feststellen konnte sind die von dir gemessenen 3.6 Volt an OUT bei 0 mA Last. Ich habe mal bei Amazon gestöbert und festgestellt, dass einige MAX471 Module sehr schlechte Bewertungen haben. Viele Hinweise, dass Module nach kurzer Zeit kaputt gegangen sind. Ich habe bei zwei Shops anscheinend Glück gehabt, aber da sind sie leider nicht mehr verfügbar. Also vielleicht wagst du noch einen Kauf.

                  1. Vielen Dank fürs testen, dann weiß ich wenigstens das der Fehler nicht bei mir liegt. Hab jetzt auch mehrfach gelesen das der MAX471 schon länger abgekündigt ist, vielleicht kleben die Chinesen gerade die ganzen B-Ware IC´s auf die Module?
                    Werde mich mal auf die Suche nach den Nachfolgern machen.

                    Beste Grüße und Gesund bleiben
                    Manuel

  3. Hallo Wolle,
    ein interessanter Artikel. Was ich nicht ganz nachvollziehen kann – in der Grafik und im Programm wird mit einer Korrektur von +1,0544 gerechnet, in der abgebildeten Exceltabelle jedoch mit 1,2. Warum?

    1. Ganz einfach: Fehler meinerseits. Gut gesehen! Wird gleich korrigiert. Vielen Dank!

      Update: ist behoben. Ich hatte die Kalibrierung zweimal gemacht und dann zwar die Steigung, aber nicht den Achsenabschnitt in der Excel Tabelle aktualisiert.

Schreibe einen Kommentar

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