Go Down

Topic: Como medir potencia y consumo con ACS712?? (Read 11835 times) previous topic - next topic

riscking

Hola de nuevo, me he pillado un par de plaquitas ACS712 la de 30A que es un integrado de efecto Hall con el cual se puede medir la corriente de un circuito, la idea es medir el consumo de un motor y si sobrepasa de x ejecutar una rutina de parada, pero me gustaria tb poder medir el consumo de un aparato durante x tiempo pero eso mas adelante, la verdad que vale para muchas cosas.



Lo he conectado a arduino y atraves del puerto analogico 1 me lee sin carga alguna ente 722 y 724  unos 2.4v, hago un muestreo de 20 ciclos y saco la media para mas precision, el caso esque una vez hecho esto no se que hacer con esos valores, he metido un led de 3w  a 3,5v para probar y sube hasta 730.
Como puedo calcular la intensidad y la potencia del circuito?
Un saludo.

ionhs

Parece interesante el cacharro, Has mirado el datasheet? Tiene 15 preciosas hojas en perfecto ingles, lo he mirado por encima y hay formulas que supongo que tendrás que aplicar. Lo mejor es que te lo leas despacito que los datasheet se las traen. SAlu2

Cheyenne

Creo que no tienes que tener muchos problemas en utilizarlo. Es un sensor Hall que mide la intensidad positiva y negativa transformándola en tensión. Cuando la intensidad es nula te dará un valor de tensión que ya indicas que es 2,4 V. Según la ganancia de la plaquita lo que suba de tensión por encima de esos 2,4 V será la intensidad positiva. Y si baja de los 2,4 V será negativa.

Para medir potencias tienes que medir en otra entrada de Arduino la tensión en la carga y multiplicar los dos valores. Todo esto en contínua que imagino que es lo que quieres ya que con señales alternas cambian algunas cosas.
http://cuadricopterodiyarduino.blogspot.com/

ASTROCAR

Exacto apicando las ley de ohm V=R*I y con las derivadas de portencia ya puede obtener los valores que deseas eso si como ya lo especifico el colega en C.D.

Saludos y estamos en contacto.

flico

Dependiendo del IC que tengas hay una tabla que te dice el nivel de voltaje por amperio, por ejemplo para 30A la salida es 66mV/Amp, luego conviertes el valor del ADC en voltios y con una regla de 3 ya tienes los amperios.

Para mayor precisión, puedes usar una tensión mas baja en la referencia del ADC, por ejemplo de 3,3V en vez de usar los 5V.
Trabajando en ...

    * Control Domotico (En montaje ...)
    http://casitadomotica.blogspot.com/
 

[url=https://bitbucket.org/fmalpartida

flico

En mi casa domotica tenia pensado usar un sensor de corriente como el uso @sergegsx o como el de este enlace
http://www.panucatt.com/product_p/cs-45al.htm. 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.
Trabajando en ...

    * Control Domotico (En montaje ...)
    http://casitadomotica.blogspot.com/
 

[url=https://bitbucket.org/fmalpartida

riscking

ionhs lo primero que hice fue mirarme le datasheet, y las formulas desde luego mis conociminetos no llegan ni a saber descifrarlas.
Ahora he probado con el duevilanove y me da los valores mas aproximados que indica vcc/2, con Intesidad 0 mide  2,49-2.50v haciendo la conversion del valor leido por 5/1023, aunque midiendo con el tester no coinciden exactamente
El caso es que sin carga mide 511 con el analogread - 2,49 y con ella 514 y 2.51.
Segun el datasheet la resistencia interna del conductor es 1,2M

Flico no entiendo como hacer los calculos como dices, esos 66mv/A daba por hecho q era la sensibilidad del aparatito, q es mas sensible que el de 5A por ejemplo.

ASTROCAR la ley de ohm directamente aqui no lo veo, porque V seria en este caso 0.02.

Esot es mas dificil de lo que me pensaba.

flico

Por cada amperio de consumo la salida se incrementa 66mV
1A --- 66mV
2A ---132mV
Como para el consumo máximo de 30A la salida es 1980mV, es una tontería tener el rango de 0 a 5 Voltios en el ADC porque pierdes resolución, de hay lo bajar la tensión de referencia del ADC (pin Aref)
Trabajando en ...

    * Control Domotico (En montaje ...)
    http://casitadomotica.blogspot.com/
 

[url=https://bitbucket.org/fmalpartida

riscking

#8
Dec 11, 2011, 11:52 pm Last Edit: Dec 12, 2011, 02:29 am by riscking Reason: 1
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.

Cheyenne

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.
http://cuadricopterodiyarduino.blogspot.com/

riscking

#10
Dec 15, 2011, 06:02 pm Last Edit: Dec 15, 2011, 06:15 pm by riscking Reason: 1
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

Cheyenne

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:

Quote
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.
http://cuadricopterodiyarduino.blogspot.com/

riscking

Por ahora voy a ver si lo puedo conseguir con arduino, he estado viendo algunas web como esta http://arduinopower.pbworks.com/w/page/10175892/FrontPage 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.
Code: [Select]
//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;

}

Cheyenne

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.
http://cuadricopterodiyarduino.blogspot.com/

Sergegsx


En mi casa domotica tenia pensado usar un sensor de corriente como el uso @sergegsx o como el de este enlace
http://www.panucatt.com/product_p/cs-45al.htm. 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.

Go Up