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}{1023}

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 1023 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);
}

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:

Schreibe einen Kommentar

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