Como medir potencia y consumo con ACS712??

Como el analogReference(EXTERNAL); no me acaba de quedar claro, se supone que es para obtener mas bits de muestreo sino me equivoco pero me lia bastante y de momento lo voy a dejar, de momento he conseguido que a carga 0 se mantenga un valor de 510 estable, eso si anada que tocas algo cambia pero sin tocar nada se mantiene , siguiente esta formula calculo el consumo y mas o menos es fiable pero con una precision de saltos ~74mA muy proximos a 0,66 que
(((5.00*ADC)/1023)-2.49267)/0.066; //el 2.49267 es el valor que me da tomando como 0 ADC 510 que *5/1023 es eso.
Todo esto resulta ser practicamente igual que (ADC-510)*0.074 y ademas consume menos micro.
Una vez tengo esto estoy intentando sacar la R para calcular el votaje osease R= V/I y midiendo V con el tenster de la fuente y I del resultado no consigo sacar una R estable y segun aumenta el consumo me aumenta la R y la cosa no cuadra. Ando con 2 testers uno midiendo la intensidad y otro el voltaje.
Alguna idea de como hacer los calculos?? para hallar voltaje del circuito,no la que mide el sensor?? y ya de paso para hayar la potencia Cheyenne comentas medir otra entrada y multiplicar los dos valores, podrias explicarmelo un poco mejor.
Un saludo.

riscking creo que tenemos varias cosas que concretar, al menos para que yo termine de aclararme.
Tu finalidad es medir el consumo de un motor, ¿no? ¿Qué potencia tiene ese motor? ¿Cuánto va a consumir en tu aplicación? ¿Es un motor AC o DC?
Indicas que tienes el ADC712 en la versión de 30 A. Por tanto tal como indicas llevando la salida del ADC712 directamente a la entrada analógica de Arduino tendrás una precisión de 74 mA. Cuando estés midiendo corrientes del orden de 20 A no tendrá mucha importancia. Pero si mides del orden de 1 A el error será de hasta el 7,4% y mayor a menores intensidades.

Sobre la potencia simplemente es tensión por intensidad. Si tu motor lo vas a alimentar a una tensión fija sólo tendrás que multiplicar la intensidad calculada por ese valor en el programa de Arduino para obtener la potencia. Si la tensión al motor es variable tendrás que meterla a través de otra entrada analógica a Arduino para poder multiplicar V*I.

Tengo una gran duda sobre el funcionamiento de este sensor. Cuando mide AC, ¿la tensión de salida es un valor proporcional a I(rms) o es proporcional a la intensidad instantánea?

Dices que intentas calcular la R para sacar el voltaje. Entiendo que te estás refiriendo a los parámetros del motor. ¿Por qué quieres sacar la tensión? ¿No estás alimentando tú el motor y por tanto es un valor conocido? Por otro lado la representación de un motor no es una resistencia; es una fuerza contraelectromotriz y una resistencia. La resistencia es un valor fijo pero la fuerza contraelectromotriz es una tensión proporcional a la velocidad del motor.

Hola cheyenne, estaba intentando sacar la tension porque estaba haciendo pruebas en continua, pero bueno vamos a trabajar de momento solo en alterna, y empiezo de nuevo.
Segun algunas pruebas que he visto de la gente la tension de salida es proporcional a Irms.
He puesto una bombilla de 100W y 50 muestras para hacer la media y el resultado es este, es un bucle y no se mantiene estable toamando 510 como 0A, es una bombilla y puede que el consumo no sea estable pero que salga negativo es normal?? o los calculos esos ya no sirven por ser alterna?? Si P=VxI I=100/230=0.434A podria ser los 0.5184 que mide, igual esta bien pero porque varia tanto?
He encontrado este PDF pero no me queda claro de como hacer los calculos que ponen, Vrms seria 230, Irms no se muy bien como lo calcula.
http://www.brain4home.eu/attachments/BAE0910-AN01-WattMeter.pdf

Lo que ha medido con la formula anterior es esto:
507; -0.2222; -0.2220000028
503; -0.5184; -0.5180000305
503; -0.5184; -0.5180000305
506; -0.2962; -0.2960000038
512; 0.1481; 0.1480000019
515; 0.3702; 0.3700000047
517; 0.5184; 0.5180000305
517; 0.5184; 0.5180000305
516; 0.4443; 0.4440000057
514; 0.2962; 0.2960000038
511; 0.0740; 0.0740000009
507; -0.2222; -0.2220000028
503; -0.5184; -0.5180000305
503; -0.5184; -0.5180000305
507; -0.2222; -0.2220000028
512; 0.1481; 0.1480000019
515; 0.3702; 0.3700000047
517; 0.5184; 0.5180000305
517; 0.5184; 0.5180000305
516; 0.4443; 0.4440000057
514; 0.2962; 0.2960000038
511; 0.0740; 0.0740000009

Lo que tienes que tener muy claro es la diferencia entre corriente continua y corriente alterna. Y a continuación cómo funciona el sensor, eso es vital. Recuerda lo que te puse:

Tengo una gran duda sobre el funcionamiento de este sensor. Cuando mide AC, ¿la tensión de salida es un valor proporcional a I(rms) o es proporcional a la intensidad instantánea?

Tras ver el pdf que enlazas entiendo que el sensor ACS712 mide la intensidad instantánea. Por eso la toma de lecturas, cuantas más hagas, verás que la media sale cero. Claro, tú vas tomando lecturas y el ADC te da un valor que varía desde -I de pico hasta +I de pico pasando por cero, dependiendo en qué momento de la onda senoidal tomes la lectura. El vatímetro del pdf por eso pone a la salida del ACS712 otro integrado que justo lo que hace es ir integrando todos los valores de intensidad en el tiempo para poder calcular Irms (Irms matemáticamente es la raiz cuadrada de la integral de la intensidad al cuadrado en el tiempo).

Por si te has perdido voy al grano. Con ese ACS712 tienes dos opciones para calcular la intensidad (Irms) en corriente alterna:

  • Una es calcular la verdadera Irms. Para eso puedes hacerlo con un integrado como el del pdf (BAE0910) que te va integrando los valores. O también puedes ir tomando lecturas con Arduino "muy rápido" para que haga el mismo Arduino el trabajo de integración. No sé si Arduino lo podrá hacer por velocidad de muestreo y posterior cálculo.

  • La otra es la opción sencilla aunque por supuesto menos precisa. Consiste en que a la salida del ACS712 implementes un circuito detector de pico (en el datasheet del ACS712 ya viene). Ese valor de pico lo llevas a Arduino, lo divides por raiz de dos (1,4142) y el valor que te da es Irms. Esto es así cuando la intensidad es una senoide pura. En la práctica existen armónicos y el valor así calculado difiere del verdadero Irms. Pero según lo que quieras medir y la precisión creo que te puede valer.

Por ahora voy a ver si lo puedo conseguir con arduino, he estado viendo algunas web como esta Workspace not found que usan un ade7753 con el arduino, que mide irms vrms w va y vaar,
me he encontrado con este codigo que usan con el acs712 para calcular tb el irms vrms , toman dos lecturas no se si del mismo acs712, pero hay cosas como lo del filtro paso alto que multipica por 0.996 que no entiendo y los coeficientes de calibración que no se como medirlos, me tiene que llegar un mini osciloscopio que he pillado que supongo que me sera util para estas cosas.

//Basic energy monitoring sketch - by Trystan Lea
//Licenced under GNU General Public Licence more details here
// openenergymonitor.org

//Sketch measures voltage and current. 
//and then calculates useful values like real power,
//apparent power, powerfactor, Vrms, Irms.

//Setup variables
int numberOfSamples = 3000;

//Set Voltage and current input pins
int inPinV = 2;
int inPinI = 1;

//Calibration coeficients
//These need to be set in order to obtain accurate results
double VCAL = 1.0;
double ICAL = 1.0;
double PHASECAL = 2.3;

//Sample variables
int lastSampleV,lastSampleI,sampleV,sampleI;

//Filter variables
double lastFilteredV, lastFilteredI, filteredV, filteredI;
double filterTemp;

//Stores the phase calibrated instantaneous voltage.
double calibratedV;

//Power calculation variables
double sqI,sqV,instP,sumI,sumV,sumP;

//Useful value variables
double realPower,
       apparentPower,
       powerFactor,
       Vrms,
       Irms;
       
void setup()
{
   Serial.begin(9600); 
}

void loop()
{ 

for (int n=0; n<numberOfSamples; n++)
{

   //Used for offset removal
   lastSampleV=sampleV;
   lastSampleI=sampleI;
   
   //Read in voltage and current samples.   
   sampleV = analogRead(inPinV);
   sampleI = analogRead(inPinI);
   
   //Used for offset removal
   lastFilteredV = filteredV;
   lastFilteredI = filteredI;
  
   //Digital high pass filters to remove 2.5V DC offset.
   filteredV = 0.996*(lastFilteredV+sampleV-lastSampleV);
   filteredI = 0.996*(lastFilteredI+sampleI-lastSampleI);
   
   //Phase calibration goes here.
   calibratedV = lastFilteredV + PHASECAL * (filteredV - lastFilteredV);
  
   //Root-mean-square method voltage
   //1) square voltage values
   sqV= calibratedV * calibratedV;
   //2) sum
   sumV += sqV;
   
   //Root-mean-square method current
   //1) square current values
   sqI = filteredI * filteredI;
   //2) sum 
   sumI += sqI;

   //Instantaneous Power
   instP = calibratedV * filteredI;
   //Sum
   sumP +=instP;
}

//Calculation of the root of the mean of the voltage and current squared (rms)
//Calibration coeficients applied. 
Vrms = VCAL*sqrt(sumV / numberOfSamples); 
Irms = ICAL*sqrt(sumI / numberOfSamples); 

//Calculation power values
realPower = VCAL*ICAL*sumP / numberOfSamples;
apparentPower = Vrms * Irms;
powerFactor = realPower / apparentPower;

//Output to serial
Serial.print(realPower);
Serial.print(' ');
Serial.print(apparentPower);
Serial.print(' ');
Serial.print(powerFactor);
Serial.print(' ');
Serial.print(Vrms);
Serial.print(' ');
Serial.println(Irms);

//Reset accumulators
sumV = 0;
sumI = 0;
sumP = 0;

}

Lo primero decir que un medidor de potencia es lo que llevo en mente como pequeño proyecto para hacer algún día.

El enlace que pones realizan los cálculos como la primera opción que te indicaba, realizando todos los cálculos Arduino, por lo que ya vemos que sí que tiene suficiente velocidad y cálculo para realizarlo.

El filtro paso alto tal como indican quita los 2,5 V de continua que introduce el ACS712 sobre las medidas reales. No lo he mirado detenidamente pero imagino que el factor 0.996 será una calibración empírica que han hecho sobre los valores que entrega el ACS712, pero vamos que de esto no estoy nada seguro.

Imagino que el código no está completo, ¿no? Es que por ejemplo no veo que reseteen la variable n del contador. También me parece curioso que en cada muestra de lecturas (el bucle for) no establezcan el tiempo, es decir, que esa parte de programa saben que Arduino siempre la ejecuta en el mismo tiempo. La verdad es que eso hace más sencillo el programa.

Como ves utilizan dos entradas de Arduino tal como te dije que haría falta, una entrada mide la tensión y otra la intensidad. Así pueden calcular los valores de Vrms, Irms, potencia aparente y potencia activa. Y con esto pueden calcular el factor de potencia sin tener que calcular en ningún sitio los pasos por cero de tensión e intensidad y su diferencia en el tiempo.

flico:
En mi casa domotica tenia pensado usar un sensor de corriente como el uso @sergegsx o como el de este enlace
45AMP AC/DC Non-Invasive Hall-Effect Current Sensor. porque la verdad me da un poco de "canelo" usar un sensor que tienes que meterle tension por sus pines para medir el consumo, estando tan cerca el pin que va al arduino.

flico el dia que vayas a meterte con el tema de los consumos avísame, pensé que podía terminar la documentación mucho antes pero no tengo tiempo ahora. Pero vamos que si vas a ponerte te puedo ayudar mucho.

riscknig
yo te recomendaria que si vas a medir respecto de un aparato de alterna, que uses un CT current transformer sensor. el codigo que pegas es el correcto para este tipo de sensores y lo mas importante es que no son intrusivos.

flico el dia que vayas a meterte con el tema de los consumos avísame, pensé que podía terminar la documentación mucho antes pero no tengo tiempo ahora. Pero vamos que si vas a ponerte te puedo ayudar mucho.

Pues tomo nota segegsx

Hola,

El sensor, tal como te decían, mide corrientes instantaneas, añadiendo un ofset de 2,5v, para dar tensones positivas aunque haya intensidades negativas. , si son 66mV por A para 30 A tienes que tener na tension de 4,48V. 0,066x30+2,5.

Tendras problemas de precisión en las corrientes bajas.
Ojo, tal como te decían si es corriente alterna tienes valores instantáneos, los promedios dan cero.

Las respuestas están bastante bien explicadas en una app note de Atmel, hay un. Link en esta entrada de mi blog http://www.zigbe.net/?p=540

También hay ejemplos de código para arduino, inspirados en esta appnote, smilares a los de openenergy, que también están extraidos del mismo lugar.

http://www.zigbe.net

Hola, voy a probar medirlo con un integrado ade7753 o ade7759 y un transformador de corriente, he estado mirando algunos pero hay tantos que no se en que me debo fijar, me gustaria que fuese de los que se pueden abrir para meter el cable, he visto 3, de estos cual creeis que iria mas fino, osea mas preciso?? Seria para medir unos 10A como mucho mucho 15A.
http://www.seeedstudio.com/depot/noninvasive-ac-current-sensor-100a-max-p-547.html?cPath=144_154
http://www.seeedstudio.com/depot/noninvasive-ac-current-sensor-30a-max-p-519.html?cPath=144_154
http://iteadstudio.com/store/index.php?main_page=product_info&cPath=4&products_id=203
He encontrado otros dos:
http://www.dentinstruments.com/media/20A_Mini_Hinged_CT_Specs_112310.pdf
http://www.dentinstruments.com/media/50A_Mini_Hinged_CT_Specs_112310.pdf

Hola.

Al final hiciste funcionar el sensor?
Porque yo estoy ahora mismo igual que tú y no salgo del atasco.

Salu2.
Uraken.

puff que va, lo queria para alterna y al final no sacaba nada en claro y al final lo acabe dejando, si consigues algo con el porfavor dime que tengo 2 unidades cogiendo polvo.
Un saludo

Pues nada.... a seguir investigando.

Salu2.
Uraken.

¿Alguien me puede decir como se conectaría el elemento donde quiero medir la intensidad?

https://www.google.co.il/search?q=acs712&espv=210&es_sm=122&source=lnms&tbm=isch&sa=X&ei=0uzlUtK8HpOBhAfSwYGwCA&ved=0CAkQ_AUoAQ&biw=1600&bih=775&pws=0

mira los modulos que venden en ebay, te ayudara.
, solo hay que identificar los pines. tienes ejemplos de conexión aquí.

Hola , estamos tratando de este mismo tema y ya se ha avanzado muy bien, está en el siguiente link:

Ya se tiene las mediciones de tensión y corriente, y estamos en camino de leer el factor de potencia, invoco a la comunidad que brinden todas las ideas y aportes.

Para medir voltaje estoy usando un transformador de voltaje 220/12 VAC, esto lo puedes encontrar de un adaptador y le quitas la parte de rectificación, aquí está:
http://openenergymonitor.org/emon/buildingblocks/measuring-voltage-with-an-acac-power-adapter

y para que midas corriente si no es mucha usa el sensor de efecto hall ACS712 con capacidad de hasta 30 A. Si deseas medir mas potencia ya a nivel industrial yo estoy actualmente desarrollando la medición con bobinas rogowski, es muy efectiva esta bobina en comparación a los de efecto hall, shunt, incluso transformadores de corriente.

Espero te sirva, y sigamos comentando y aportando ideas a todos.

Hasta luego.

Esta es la imagen de la medición que realizaba con el sensor hall ACS 712
proceso FOCO DE 100 W Y LICUADORA(FLECHA AL ENCENDER LICUADORA, Luego se estabiliza y se apaga, solo queda foco de 100 W)

riscking:
Por ahora voy a ver si lo puedo conseguir con arduino, he estado viendo algunas web como esta Workspace not found que usan un ade7753 con el arduino, que mide irms vrms w va y vaar,
me he encontrado con este codigo que usan con el acs712 para calcular tb el irms vrms , toman dos lecturas no se si del mismo acs712, pero hay cosas como lo del filtro paso alto que multipica por 0.996 que no entiendo y los coeficientes de calibración que no se como medirlos, me tiene que llegar un mini osciloscopio que he pillado que supongo que me sera util para estas cosas.

//Basic energy monitoring sketch - by Trystan Lea

//Licenced under GNU General Public Licence more details here
// openenergymonitor.org

//Sketch measures voltage and current.
//and then calculates useful values like real power,
//apparent power, powerfactor, Vrms, Irms.

//Setup variables
int numberOfSamples = 3000;

//Set Voltage and current input pins
int inPinV = 2;
int inPinI = 1;

//Calibration coeficients
//These need to be set in order to obtain accurate results
double VCAL = 1.0;
double ICAL = 1.0;
double PHASECAL = 2.3;

//Sample variables
int lastSampleV,lastSampleI,sampleV,sampleI;

//Filter variables
double lastFilteredV, lastFilteredI, filteredV, filteredI;
double filterTemp;

//Stores the phase calibrated instantaneous voltage.
double calibratedV;

//Power calculation variables
double sqI,sqV,instP,sumI,sumV,sumP;

//Useful value variables
double realPower,
      apparentPower,
      powerFactor,
      Vrms,
      Irms;
     
void setup()
{
  Serial.begin(9600);
}

void loop()
{

for (int n=0; n<numberOfSamples; n++)
{

//Used for offset removal
  lastSampleV=sampleV;
  lastSampleI=sampleI;
 
  //Read in voltage and current samples. 
  sampleV = analogRead(inPinV);
  sampleI = analogRead(inPinI);
 
  //Used for offset removal
  lastFilteredV = filteredV;
  lastFilteredI = filteredI;
 
  //Digital high pass filters to remove 2.5V DC offset.
  filteredV = 0.996*(lastFilteredV+sampleV-lastSampleV);
  filteredI = 0.996*(lastFilteredI+sampleI-lastSampleI);
 
  //Phase calibration goes here.
  calibratedV = lastFilteredV + PHASECAL * (filteredV - lastFilteredV);
 
  //Root-mean-square method voltage
  //1) square voltage values
  sqV= calibratedV * calibratedV;
  //2) sum
  sumV += sqV;
 
  //Root-mean-square method current
  //1) square current values
  sqI = filteredI * filteredI;
  //2) sum
  sumI += sqI;

//Instantaneous Power
  instP = calibratedV * filteredI;
  //Sum
  sumP +=instP;
}

//Calculation of the root of the mean of the voltage and current squared (rms)
//Calibration coeficients applied.
Vrms = VCALsqrt(sumV / numberOfSamples);
Irms = ICAL
sqrt(sumI / numberOfSamples);

//Calculation power values
realPower = VCALICALsumP / numberOfSamples;
apparentPower = Vrms * Irms;
powerFactor = realPower / apparentPower;

//Output to serial
Serial.print(realPower);
Serial.print(' ');
Serial.print(apparentPower);
Serial.print(' ');
Serial.print(powerFactor);
Serial.print(' ');
Serial.print(Vrms);
Serial.print(' ');
Serial.println(Irms);

//Reset accumulators
sumV = 0;
sumI = 0;
sumP = 0;

}

Hice correr este código y funciona perfectamente, por lo que ahora revisaré el código y ver los factores de calibración y corregirlos.

Saludos.

El filtro es un filtro digital y esos son coeficientes del filtro digital.

Por favor para usar códigos y enlaces debes usar tags y leer Normas del Foro

Tienes muchos elementos a considerar.
// Voltage is reduced both by wall xfmr & voltage divider
#define AC_WALL_VOLTAGE  220 // 122   
#define AC_ADAPTER_VOLTAGE 15.2   // valor a ajustar segun salida de tu trafo
// Ratio of the voltage divider in the circuit
#define AC_VOLTAGE_DIV_RATIO 11   // 220/12 = 18.33
// CT: Voltage depends on current, burden resistor, and turns
#define CT_BURDEN_RESISTOR 68    // si usas transformador de intensidad 
#define CT_TURNS 1012                    // propio del trafo de intensidad

Quien tolera esto en ram

int numberOfSamples = 3000;

Para el #define AC_ADAPTER_VOLTAGE 15.2 
lo mejor es el osciloscopio, mides el valor Pico y listo ese es tu dato, de lo contrario lees con un voltimero en AC y su valor lo multiplicas por Raiz(2) o sea 1.41

Saludos
Esto parece the walking dead. Este post tenia un año inactivo. En cuanto pueda paso un sketch que hice para un medidor de factor de potencia para compartir