Strom messen mit Pololu ACS711EX

Hallo zusammen.
Kurz zu mir. ich bin Ü60 und seit meiner Kindheit in der 'Elektronik' unterwegs. Seit neuestem mit Arduino.

Zu meinem Problem.
Für eine Reifenschleifmaschine für Slotcar's habe ich eine Steuerung gebaut. den Strom des Schleifmotors wird mit dem Pololu ACS711EX überwacht. Hier nun das Problem.
Das Teil ist sehr schnell und misst dadurch Mist. Der gemessene Strom schwangt z.B. zwischen
1,5 und 5 A.
Hat jemand eine Idee, wie man den Stromsensor träge bekommt?

Gruß
Kalli

Ist das ein analoger oder ein digitaler Sensor, also was gibt er aus? Einen analogen Sensor kann man mit einem RC-Glied und abgeschirmter Leitung, einem Stützkondensator über In schon etwas beruhigen. Desgleichen sollte U ref am Arduino ebenfalls stabil und nochmal, wie auch im Datenblatt angegeben, mit einem C gepuffert sein. Stufe 2 ist dann die Glättung per Mittelwertbildung in Software. Letzteres kannst Du ebenfalls mit digitalen Sensoren anwenden.
Was mir gerade einfällt, wie wird der Motor eigentlich angesteuert? Mit PWM? Dann ist natürlich klar, warum du "Grütze" misst!

Hi Kalli,
wenn die Stromschwankungen einhergehen mit der Benutzung, so ist das normal. Hat der Motor ne große Last zu stemmen, "verschieben" sich die Magnetfelder und wirken weniger "strombremsend".

Ich denke du wirst um eine detailiertere Beschreibung deines Aufbaus und des Effektes nicht herumkommen. So stochern wir ein wenig im Trüben. Kann alles mögliche sein.

Cheers
:slight_smile:

Hi,
der Motor wird mit Gleichstrom (7 V) betrieben. Kein PWM. Der Leerlaufstrom liegt bei ca 2,2 A. Der Laststrom soll durch Zustellen des Rades an den Schleifstein auf z.B. 5,5 A Ansteigen. danach wird die Zustellung gestoppt und auf ein Minimalstrom (3,3 A) gewartet. usw
Bei dieser Überwachung hab ich halt extreme Messergebnisse. Momentan löse ich es dadurch, dass ich 51 Messungen vornehme, diese sortiere und den mittleren Wert benutze. Dadurch fallen die extremen Ausreißer raus.
Vielleicht hat ja jemand eine bessere Idee

Gruß
Kalli ::slight_smile:

Ich habe ich mich bei der analogen Glättung bedient:

/*
Author:        Erik Bartmann
Website:       http://www.erik-bartmann.de
Blog:          http://www.tumblr.com/tumblelog/arduino-processing
Twitter:       https://twitter.com/#!/ErikBartmann
Flickr:        http://www.flickr.com/photos/erikbartmann/6325377576 (Schaltplan)
Flickr:        http://www.flickr.com/photos/erikbartmann/6325380800 (Schaltungsaufbau)
Scope:         Die Lüftersteuerung
Version:       1.0
Date:          03.10.2011
Last modified:
Description:   Dieser Sketch zeigt Dir die Ansteuerung eines Lüfters, der über den
               Temperatursensor LM35 geregelt wird. Zudem werden Status-Informationen
               im angeschlossenen LC-Display angezeigt.
Achtung:       Das angeschlossene LC-Display, das über den I2C-Bus angesteuert wird, benötigt
               unter Arduino 1.0 eine von mir modifizierte Library, die zum jetzigen Zeitpunkt vom
               Hersteller noch nicht angeboten wurde. Diese Library muss in das Verzeichnis 
               arduino-1.0-rc1\libraries kopiert werden. Der Ordner liegt hier im Projektverzeichnis
               und lautet LiquidCrystal_I2C.
Referenz:      http://www.arduino.cc/en/Reference/Wire
               http://www.arduino.cc/en/Reference/LiquidCrystal
               http://arduino.cc/en/Reference/PinMode
               http://arduino.cc/en/Reference/Constants
               http://arduino.cc/en/Reference/For
               http://arduino.cc/en/Reference/Delay
               http://arduino.cc/en/Reference/If
               http://arduino.cc/en/Reference/Else
*/
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#define sensorPin 0    // Verbunden mit LM35 Ausgang
#define DELAY1 10      // kurze Wartezeit beim Messen
#define DELAY2 500     // kurze Wartezeit beim Anzeigen
#define motorPin 9     // Lüfter-Pin
#define threshold 25   // Schalt-Temperatur für Lüfter (25 Grad Celsius)
#define hysterese 0.5  // Hysterese-Wert (0.5 Grad Celsius)
const int cycles = 20; // Anzahl der Messungen
LiquidCrystal_I2C lcd(0x27, 16, 2); // Adresse auf 0x27 für 16 Zeichen/2 Zeilen

void setup(){
  pinMode(motorPin, OUTPUT);
  lcd.init(); // LCD initialisieren
  lcd.backlight(); // Hintergrundbeleuchtung aktivieren
}

void loop(){
  float resultTemp = 0.0;
  for(int i = 0; i < cycles; i++){
    int analogValue = analogRead(sensorPin);
    float temperature = (5.0 * 100.0 * analogValue) / 1024;
    resultTemp += temperature; // Aufsummieren der Messwerte
    delay(DELAY1);
  }
  resultTemp /= cycles; // Berechnung des Durchschnitts
  lcd.clear(); // clear-Methode löscht LCD Inhalt
  lcd.print("Temp: "); // print-Methode schreibt LCD Inhalt
  lcd.print(resultTemp);
  #if ARDUINO < 100
    lcd.print(0xD0 + 15, BYTE); // Grad-Zeichen (Arduino 0022)
  #else
    lcd.write(0xD0 + 15); // Grad-Zeichen (Arduino 1.00)
  #endif
  lcd.print("C");
  lcd.setCursor(0, 1); // setCorsor-Methode positioniert LCD-Cursor
  lcd.print("Motor: ");
  if(resultTemp > (threshold + hysterese))
    digitalWrite(motorPin, HIGH);
  else if(resultTemp < (threshold - hysterese))
    digitalWrite(motorPin, LOW);
  lcd.print(digitalRead(motorPin) == HIGH?"an":"aus");
  delay(DELAY2);
}

Funktioniert prima mit einem LM35, wobei ich noch zusätzlich 2,2µ Folie am Analogeingang gegen Masse gelegt habe. Kein "Zappeln", aber Reaktion innerhalb einer zehntel Sekunde.
Was natürlich auch noch eine Rolle spielen kann, das ein Gleichstrommotor Kohlebürsten hat und die Bürsten nie aufs Milliohm gleich guten Kontakt haben. Außerdem ist der Rotor meinst mit vielen Teilwicklungen gewickelt und fein geschlitzt, so das die Kohlen immer mehrere Teilwicklungen versorgen, eine läuft unter der Kohle weg, die Nächste kommt rein. Daraus bedingt schwankt der Strom auch schon ohne Belastung ständig wie ein Kuhschwanz. Wenn du im Datenblatt siehst, das der Hallsensor bis 100Khz auflöst, dann weißt du schon, wohin die Reise geht. Klemme mal ebenfalls einen Folienkondensator zwischen Masse und den Analogeingang. Experimentiere ruhig mit dessen Größe. Versuchesweise 10nF, 100nF und 1µF. Dann siehst du schon, wohin die Reise geht. Nimm aber keinen Elko, der verfälscht die geringe Analogspannung eventuell. Notfalls geht ein Keramikkondensator, aber Folie (MKT, MKP, MKL, MKC...) wäre ideal.

Hat jemand eine Idee, wie man den Stromsensor träge bekommt?

Sicher, dass deine Stromversorgung stabil ist?
Das ist zwingend nötig.
Über USB versorgt, wird das sicher nichts......

Hallo,
der Sensor hat einen analogen Ausgang. Kann es sein, das Du zu schnell missst?
Messe doch genau 1x in einer Sekunde- dann mal, 1x in zwei Sekunden.
Gruß und Spaß
Andreas
P.S. Messe doch einmal den Strom einer Glühlampe oder eines 500W Halogenscheinwerfer.
Dann siehst Du schon einmal was Dein Aufbau taugt.

So,
vielen Dank für die Infos.
Zu den verschiedenen Punkten ist einiges zu sagen.
Die Stromversorgung für den Motor kommt aus einem zweiten Netzteil und der Arduino wird mit 12 Volt über 'vin' mit Strom versorgt. Damit dürfte es keine Beeinflussungen geben.
Nimmt man als Verbraucher eine Halogenlampe gibt es wegen der rein ohmschen Last auch keine Fehlmessungen. Alles ist so im grünen Bereich.
Sobald aber der Motor angeschlossen wird, muss ich gegen die normalen physikalischen Gegebenheiten kämpfen. Die Stromschwankungen sind normal und müssen durch ein träges Messverfahren ausgeglichen werden.
Hier kam mir ein Betrag von der "Netzmafia" zur Hilfe.

http://www.netzmafia.de/skripten/hardware/Control/auswertung.pdf - 318008

Im Absatz '1.3.6 Ausreisser-Test' fand ich den Ansatz. Danach mache ich 51 Messungen, sortiere sie nach ihrer Größe und nehme dann den Wert aus der Mitte. Ein Messzyklus dauert ca 12 ms und stört nicht den Ablauf. Dieser Wert aus der Mitte schwankt in einem Bereich der zu keiner Fehlfunktion führt. Die Anlage funktioniert jetzt einwandfrei.

Gruß
Kalli