Mit ACS 712 Wechselstrom messen

Hallo,

vor einiger Zeit dachte ich das es mir gelungen sei mit dem ACS 712 Wechselstrom ziemlich genau zu messen.

Da habe ich es den sketch mit einem 1kW Wasserkocher ausprobiert und es funktionierte ziemlich präzise

Nun habe ich das ganze an einer 3kW Heizung ausprobiert und nichts ist wie es war. =(

Hier mal der sketch:

#include <Bounce.h>
#include <LiquidCrystal.h>
#define MEDIAN   512
#define MEAS_INT 20  
#define ACS_ADC  A0
#define K_ACS    0.1028    //für 20A version

uint8_t RelaisKnopf2 = 24;
uint8_t buttonState_k2 = 0; 
Bounce bouncer_k2 = Bounce( RelaisKnopf2, 5 );


uint8_t k[] = {A15, A14, A13, A12};
int backLight = 53;
LiquidCrystal lcd(39, 41, 43, 45, 47, 49, 51);

int ledPin = 12;// LED connected to digital pin 12
int fade;
int poti = A7;
void setup()  { 
  pinMode(backLight, OUTPUT);
  digitalWrite(backLight, HIGH);
  lcd.begin(20, 4);
  
  uint8_t i;
  for (i = 0; i < 4; i++) {
    pinMode(k[i], OUTPUT);
    digitalWrite(k[i], LOW);
  }
  
  
  analogReference(DEFAULT);
  analogRead(ACS_ADC);
  
  Serial.begin(9600);
 
 int myEraser = 7;             // this is 111 in binary and is used as an eraser
 TCCR1B &= ~myEraser;   // this operation (AND plus NOT),  set the three bits in TCCR2B to 0
 
 int myPrescaler = 2;         // this could be a number in [1 , 6]. In this case, 3 corresponds in binary to 011.   
 TCCR1B |= myPrescaler;  //this operation (OR), replaces the last three bits in TCCR2B with our new value 011

} 

void loop()  { 
  
  if ( bouncer_k2.update() ) {  //Relais2
     if ( bouncer_k2.read() == HIGH) {
       if ( buttonState_k2 == LOW ) {
          digitalWrite(k[1], HIGH);
         buttonState_k2 = HIGH;
       } else {
          digitalWrite(k[1], LOW);
         buttonState_k2 = LOW;
      }
    }
  }
  
fade = analogRead (poti);
fade = map(fade, 0 , 1023, 0, 255);

  analogWrite(ledPin, fade);
  fade = map (fade,0,255,100,0);
  messwertAnzeigen(0,0,fade,3);
  
  
  lcd.setCursor(0, 1);
  lcd.print("I=");
  uint32_t sum2=0;
  uint16_t n=0;
  uint32_t StartTime, StopTime;
  int16_t adc;
  uint32_t avrg=0;
  float I; 
  
 
  
  StartTime=millis()+1;
  StopTime=StartTime+MEAS_INT;
  while(StartTime>millis());
  while(StopTime>millis())
  {
    adc=(MEDIAN-analogRead(ACS_ADC));
    sum2+=(uint32_t)adc*adc;
    n++;
     
  }
  if (n>0)
  {
    avrg=sqrt(sum2/n);
  }

  I=(float)avrg*5/(K_ACS*1024);
  lcd.setCursor(2, 1);
  lcd.print(I);
  lcd.print("A   ");
  
  int W;
  W= (I*I) * 16;
  lcd.setCursor(0, 2);
  lcd.print(W);
  lcd.print("W    ");
}

void messwertAnzeigen(int spalte, int zeile, int wert, int stellen)
{
  char buf[7];
  lcd.setCursor(spalte,zeile);
  itoa (wert,buf,10);
  lcd.print(wert);  
  for (int i=0;i<stellen-strlen(buf);i++)
  lcd.print(" ");
    
}

Der Wert springt nun wild rum in einem bestimmten bereich um den eigentlichen wert.
Das war vorher nicht so, da wurde der wert minimal jede 2 sec geändert oder garnicht.

Außerdem sind die werte die rauskommen vollkommen falsch.

ich habe z.B mal notiert:

A = 8,07 und Leistung somit 1041W (die formel wie ich es in Watt umrechne (R=16Ohm) (I*I)*R=P)

Gemessen habe ich aber 113V Wass ja denn ca. 800W wären. Es war zwar kein RMS-Messgerät, aber ein normales Messgerät kann doch nicht so falsch liegen.

Bitte helft mir diese beiden probleme zu lösen.
Was ist auch einmal falsch.

Gruß

strohhirn

Wenn du den Strom einer ohmsche Last messen willst, stimmt das auch

Sobald aber induktive oder kapazitve Lasten ins Spiel kommen wird es komplizierter.
http://www.elektrotechnik-fachwissen.de/wechselstrom/leistung-wechselstrom.php

Wie muss ich dann jetzt meine Formel ändern?

Außerdem hat das ganze doch recht präzise mit einer 1kW Heizung funktioniert. (das ist doch wie die 3kW Heizung ein ohmscher Wiederstand)

Deine "1kw Heizung" war ein Wasserkocher das ist ein ohmscher Widerstand.

Was genau ist deine 3kW Heizung für ein Verbraucher ?

Logischerweise auch ein ohmscher wiederstand.

OK - dann ging mein Gedanke in die falsche Richtung.

rudirabbit:
OK - dann ging mein Gedanke in die falsche Richtung.

Ist die Heizung vielleicht getaktet? Denke da gerade an eine Lötstation.

Was meinst du mit getaktet?

Mir fällt gerade auf, der ACS712 kann nur bis 5 Ampere messen, laut Datenblatt

Es gibt 3 Versionen davon und ich habe die 20A Version.

strohhirn:
Was meinst du mit getaktet?

Schnelles ein und ausschalten zur Leistungsreduzierung mit Hilfe von deltaT oder einem einfachen Poti/Wahlschalter als Leistungswertgeber

Eigentlich nicht.
Ich reguliere die Heizung mit dem Kemo M028.

Aber das hat alles schon mit der 1kW Heizung funktioniert und auf einmal nichtmehr.
Der wert springt wild rum und ist falsch.

Kannst du die Schaltung erneut mit der 1kW Heizung testen? Was geschiet wenn du direkt 3kW mißt, ohne den Regler?

Heute nicht mehr aber morgen vllt.

Das mit den 113V kann schon hin kommen da das Modul ist Phasenanschnitt-Steuerung.
Und laut deinen Datenblatt kann das Modul nur mit entsprechenden Kühlkörper große lasten über 3,5A Regeln.

Ist alles gut gekühlt. Und das Modul funktionier auch.

Das problem ist das der Wert falsch ist und er rumspringt, was beides vorher nicht war.

Dracul:
Das mit den 113V kann schon hin kommen da das Modul ist Phasenanschnitt-Steuerung.
Und laut deinen Datenblatt kann das Modul nur mit entsprechenden Kühlkörper große lasten über 3,5A Regeln.

Wenn die Kühlkörper nicht gegen wären, hätte das zur Ursache, dass das Ding a) abschaltet (falls Schutzkreis im Gerät integriert ist) b) nicht mehr anpackbar ist c) abfackelt

strohhirn:
Ich reguliere die Heizung mit dem Kemo M028.
http://www.kemo-electronic.de/datasheets/m028.pdf

Und was steht im ersten Satz der Beschreibung des Kemo M028 ?

M028 | Leistungsregler 110 - 240 V/AC, 2600 VA
Zum Regeln von ohmschen + induktiven Lasten (z.B. Motoren, Heizungen, usw., wenn diese im Phasenanschnitt geregelt werden können).

Junge, Du machst uns verrückt, weil Du eine Heizung mit Phasenanschnitt regelst und Dir dessen nicht bewußt bist.
Wenn Du die Leistung eines mit Phasenanschnittsteuerung geregelten Verbrauchers messen willst, dann mußt Du den quadatischen Mittelwert der Spannung bzw des Stroms aus den Momentanwerten berechen und dann Strom und Spannung multiplizieren. Bei ohmschen Verbrauchern mußt Du das nur einmal machen, wenn Du die Nennleistung/den Nennstrom kennst. Die Spanung ist dann Phasengleich mit dem Strom und steht im gleichen Verhältnis wie momentane der Effektivwert des Stromes zum Nennstrom.
Die Meßschaltung könnte mit einer 1kW Heizung funktioniert haben, wenn Du 100% Power gegeben hattest.

Es war zwar kein RMS-Messgerät, aber ein normales Messgerät kann doch nicht so falsch liegen.

Normale Messgeräte sind auf eine Spannung mit sinusförmigem Spannungsverlauf geeicht. Da kannst Du ruhig ziemlich falsch messen.

Grüße Uwe

Gut dann ist der Fehler ja schon mal gefunden. Danke

Junge, Du machst uns verrückt

Tut mir wirklich leid. Ich hatte das ganze mit dem Wechselstrom und Phasenanschnitt nicht so in der Schule und im internet ist das auch sehr kompliziert umschrieben.

Hier nochmal der Rechenteil im sketch:

uint32_t sum2=0;
     uint16_t n=0;
     uint32_t StartTime, StopTime;
     int16_t adc;
     uint32_t avrg=0xFFFF;
     float I; 
  
     StartTime=millis()+1; 
     StopTime=StartTime+MEAS_INT;
     while(StartTime>millis());  // Wir warten bis eine neue Millisekunde anfängt...
     while(StopTime>millis()) // Dann summieren wir bis zur StopTime
  {
     adc=(MEDIAN-analogRead(ACS_ADC)); // die Differenz zum Mittelwert
     sum2+=(uint32_t)adc*adc;                 // wird quadriert und aufsummiert
     n++;
  }
  if (n>0)
  {
    avrg=sqrt(sum2/n);   // ... und am Ende die Wurzel aus dem Durchschnitt der Quadrate
  }

  I=(float)avrg*5/(K_ACS*1024);
  W =(I*I)* R; // R=16 Ohm

Das ganze wurde schon mal von michael_x kommentiert.

Momentanwerten berechen

passiert das bei mir bereits irgenwo?

und dann Strom und Spannung multiplizieren

wo soll ich den den Stromwert herbekommen den muss ich doch erstmal hiermit heraufinden und spannung kann ich nicht messen.(höhstens R*I kann ich rechnen)

Könntest du bitte deine vorgeschlagenen änderungen am sketch vornehmen und sie auch kommentieren?

Gruß

strohhirn

MIt R kommst noch weit bei einer Phasenanschnittssteuerung. Es handelt sich hier nicht mehr um einen rein ohmschen Widerstand.