Medidor de potencia TrueRMS para 220Vac hasta 2A

Este medidor es la versión final de las entradas anteriores donde mencionamos el rectificador de precisión y el algoritmo para medición TrueRMS basado en la formula del promedio de los cuadrados de las mediciones cuadráticas. Esta es la formula reemplazo de la conocida raíz de la integral de su función al cuadrado, lo que sucede es que en el microcontrolador no podremos reconocer la forma de onda ingresante de forma sencilla entonces debemos optar por la formula de la sumatoria. 
Este método realiza la discretización de la señal, es decir toma muestras de la señal presente en el ADC cada una determinada cantidad de tiempo preestablecida.
La cantidad de muestras o samples que el sistema toma cada segundo sera, en parte, la precisión de nuestro medidor ya que mientras mas muestras tomamos mas fiel sera la señal conformada por la discretización del MCU.

En este link podrán expandir el tema de la medición TrueRMS 

Por otro lado una vez resulto el procesamiento de la señal, debemos realizar el acondicionamiento de la misma, ya que el ADC del microcontrolador no trabaja con tensión negativa y solo trabajara entre 0 y 5, representando 0 y 1023 valores de tensión para una configuración a 10bit.
Hay otros métodos para expandir la resolución del ADC, por ejemplo utilizando una entrada autorango y al mismo tiempo realizar el autorango de la tensión de referencia, de esa forma se podrá aprovechar mas el ADC, pero en nuestro proyecto estamos buscando un sistema sencillo para medir la potencia de dispositivos conectados a la red eléctrica y asi poder realizar el testeo del mismo.

Como sabemos, la forma de onda en la red eléctrica es una función seno que varia entre 311Vp y -311Vp, conformando asi un valor de 622Vpp o un valor de 220Vrms.
Claramente no podremos ingresar este valor al microcontrolador, por ello debemos atenuar el mismo mediante resistencias para llegar a un valor aceptable (entre 3 y 4V, dejando 1V extra ante eventuales picos, de todas formas lo ideal es utilizar supresores de transitorios como un diodo TVS, resistencias dependientes de la tensión como un MOV, etc..)

Si nosotros atenuamos la señal lo suficiente como para ingresarla al microcontrolador, y tomamos el 0V como la masa del sistema en común con el neutro de la linea, tendremos un solo hemiciclo y en el hemiciclo negativo no tendrá efecto nuestro sistema, entonces para ello debemos tomar el hemiciclo negativo y pasarlo al cuadrante positivo de la señal, para ello lo mas sencillo es utilizar un rectificador de onda completa.

Aunque lo mas sencillo es usar un puente de diodos, tenemos que recordar el nuestro sistema solo tendrá unos 3 o 4V disponibles, y un puente rectificador tiene una caída mínima de 1V, esto nos dificulta la medición porque nos resta un 30% de representación. 
Este problema lo podremos resolver con un rectificador de precisión en base a amplificadores operacionales.
Entonces, primero rectificaremos la señal con un amplificador operacional y luego ajustaremos su nivel de tensión para que sea adecuada en el ADC. Para este proceso necesitamos dos amplificadores operacionales, y como mediremos tanto tensión como corriente, debemos utilizar el circuito duplicado, por ello he implementado un cuádruple operacional LMV324.

En el caso de la corriente, es mas evidente la necesidad del rectificador de precisión porque mediremos la corriente en base a la caída de tensión en un shunt (shunt que realizamos con una resistencia de potencia y bajo valor), en mi caso he implementado una resistencia de 1 ohm 5W, esto quiere decir que cuando circulan 2A por la misma, tendremos por ley de ohm, V=I*R=2A*1R=2V, y la potencia de disipación sera P=I^2*R=2^2*1=4W, entonces la resistencia soportara bien la potencia, pero tendremos que tener cuidado con no sobrepasar este valor, para ello es ideal un fusible de 2A.


En el circuito podremos ver que esta sera la interfaz electrónica de medición (el medidor en si), pero como se observa en la izquierda tenemos un conector con las dos entradas y una masa, este sera conectado con otra placa donde pondremos el divisor resistivo y el shunt en base a la resistencia cerámica de 1R y 5W, también agregaremos en ese sector el fusible de protección, los TVS y MOV para proteger nuestro circuito.
El sistema completo funciona con una batería de 9V que luego sera reducido a 5V mediante la fuente reguladora con 7805, al utilizar tanto los amplificadores operacionales como el microcontrolador a 5V no tendremos problemas en la tensión máxima presente en los ADC ya que el amplificador no entregara mas tensión que la de alimentación del mismo.


En este otro circuito tendremos la interfaz de potencia que esta separada para una mejor comprensión del sistema y aislación entre las partes al montarlo en un gabinete.

El PCB sera el siguiente para ambos casos.



Dejare también esta animación del Proteus demostrando el funcionamiento del mismo, podemos observar que tenemos una lampara como carga pero a su vez tiene un capacitor en serie que estará cortocircuitado eventualmente con un interruptor, para poder corroborar una carga resistiva y capacitiva, al mismo tiempo podremos ver la variación en el display LCD y el desfasaje en el osciloscopio que fácilmente podríamos también calcular el factor de potencia midiendo el cruce por cero entre la tensión y la corriente.


Ahora podremos analizar el programa, que ya he realizado en otras practicas pero de todas formas lo pondremos aquí ya que es bueno corroborar el funcionamiento del mismo.
Notemos que he agregado la redefinición de pines en el LCD ya que por comodidad en el PCB resulta mas fácil la disposición secuencial de los mismos.
El programa mide la tensión, obtiene la sumatoria de los cuadrados del promedio, divide las muestras y por ultimo realiza la raíz cuadrada.
Este proceso se realiza dos veces, primero para tensión y segundo para la corriente.
Luego realiza el producto TrueRMS del mismo y muestra los valores en el LCD.

  1. #include <16F883.h>
  2. #device adc=10
  3. #use delay(int=4000000)
  4. #define LCD_ENABLE_PIN  PIN_B2
  5. #define LCD_RS_PIN      PIN_B0
  6. #define LCD_RW_PIN      PIN_B1
  7. #define LCD_DATA4       PIN_B4
  8. #define LCD_DATA5       PIN_B5
  9. #define LCD_DATA6       PIN_B6
  10. #define LCD_DATA7       PIN_B7
  11. #include <LCD.C>
  12. #include <math.h>
  13. void main(){
  14.    setup_adc_ports(sAN0|sAN1|VSS_VDD);
  15.    setup_adc(ADC_CLOCK_DIV_2);
  16.    int16 i;
  17.    float adc1, valorMax1=0, adc2, valorMax2=0;
  18.    float tension, corriente, potencia;
  19.    lcd_init();
  20.    while(true){
  21.       for(i=0;i<300;i++){
  22.          set_adc_channel(0);
  23.          adc1=read_adc()*5.0/1023.0;
  24.          delay_us(60);
  25.          valorMax1=adc1*adc1+valorMax1;
  26.          set_adc_channel(1);
  27.          adc2=read_adc()*5.0/1023.0;
  28.          delay_us(60);
  29.          valorMax2=adc2*adc2+valorMax2;
  30.       }  
  31.       tension=sqrt(valorMax1/300)*136;
  32.       corriente=sqrt(valorMax2/300)*0.61;
  33.       potencia=tension*corriente;
  34.       lcd_gotoxy(1,1);
  35.       printf(lcd_putc,"RMS    W: %3.0f ",potencia);
  36.       lcd_gotoxy(1,2);
  37.       printf(lcd_putc,"V: %3.0f A: %3.3f ",tension, corriente);
  38.       valorMax1=0;
  39.       valorMax2=0;
  40.    }
  41. }


Se agrega una versión modificada del circuito en caso de no contar con un amplificador operacional Rail to Rail como el LMV324.
Si utilizamos un amplificador operacional que no es Rail to Rail como el LM324, tendremos en su salida la tensión de Vcc-1.5V, es decir un máximo de 3.5V que estará desaprovechando la resolución del ADC.
Por ello se ha implementado una pequeña modificación en el firmware y el hardware para contrarrestar este problema.
La idea principal es modificar la tensión de referencia del ADC, entre 0 y 3.5V, para ello en el programa cambiaremos la linea:

   setup_adc_ports(sAN0|sAN1|VSS_VDD);

por:

   setup_adc_ports(sAN0|sAN1|VREF_VREF);

Como podremos ver, en este caso se utiliza Vref para GND y para +B, quedando el pin RA2 (-Vref) a GND y el pin RA3 (+Vref) a 3.5V.

También debemos modificar en el programa la linea que lee el ADC, ya que la misma convierte el valor entre 0 y 1023 y lo convierte entre 0 y 5V, en nuestra modificación tendrá que ser entre 0 y 3.5V.

Cambiaremos las lineas: 

         adc1=read_adc()*5.0/1023.0;
y esta:
         adc2=read_adc()*5.0/1023.0;

Por:
         adc1=read_adc()*3.5/1023.0;
y esta:
         adc2=read_adc()*3.5/1023.0;

De esta forma ya quedan los cambios modificados correctamente para trabajar en 3.5V.

En cuanto al circuito se ha implementado una fuente de tensión de referencia en base al integrado TL431, para el cual debemos agregarle algunas resistencias y en mi caso un pequeño preset para ajustar a 3.5V, lo cual tendremos que ajustar midiendo en el circuito.

Como todo instrumento de medición debemos realizar una calibración previa antes de utilizarlo, pero sera por única vez..




10 comentarios:

  1. Corregidme si me equivoco pero el lm324 sólo llega por la parte de arriba a vcc-1.5 o lo que es lo mismo perdemos rango del ADC,ya que si Vcc son 5v solo llegamos hasta 3.5v. No sería mejor alimentarlo con más tensión o usar otro opamp o usar otra Vref para el ADC.

    ResponderEliminar
    Respuestas
    1. Hola, estas en correcto, lo probé con un LMV324 que es Rail to Rail, pero no encontré el modelo en el diagrama. Ahora le cambio la nomenclatura. De todas formas como decía antes, lo ideal seria hacer un auto rango para aprovechar la resolución y un Vref dinámico, pero si empiezo a complicar el diagrama no lo arma nadie después y pierde el sentido. Tampoco estoy seguro de que se consiga fácilmente el Rail to Rail, yo tengo algunos que compre acá pero nose ahora como estara la cosa, lo probe con varios LM, TL, NE, etc.. todos andan relativamente bien. Lo que se podría hacer es agregar un zener de 3V3 o uno programable tipo TL431 algo asi, para que tome el Vref a 3.5V.
      Saludos.

      Eliminar
    2. Cuando haga el ultimo video del proyecto ya montado y eso, lo voy a mencionar, mientras voy a ver si consigo una alternativa discreta, aunque no recuerdo que me costara tanto conseguir el LMV, pero buen por las dudas. cambiando el Vref podria ser mejor.

      Eliminar
    3. Ahí le cambie la configuración del ADC por: setup_adc_ports(sAN0|sAN1|VREF_VREF);
      Donde tengo los pines de referencia uno a masa y el otro a 3.5V, cambie el fuente donde calcula la tensión del ADC en base a 5V por 3.5V y por ultimo resta el diagrama., pero esta modificación vale para amplificadores operacionales que no son Rail to Rail.

      Eliminar
    4. Ahí le agregue la segunda opción al post!, Gracias por avisar!!!

      Saludos!

      Eliminar
    5. Estoy repasando algunos puntos y cada vez me cuadra menos que tomando un valor de muestras N en período desconocido dé el valor aproximado a la Vrms. Qué pasaría si tomamos las muestras en un periodo de 0.5ms justo cuando medimos la salida de un dimer que vale zero? Seria cero no? Podría darse el caso que si en una señal periódica de 100Hz o sea de 1ms en la que la mitad del periodo es cero y la "otra una cosa fea" midamos solo los ceros ¿no?

      Entonces supongo que las muestras deben tomarse como mínimo durante un periodo más o menos largo para que de un valor aproximado, lo que es lo mismo durante un ciclo como mínimo o alguna otra condición que desconozco.

      Lo siento es que se me había ocurrido otro método para tomar muestras y seria usando un timer e interrupciones, y forzar el muestro en esos "periodos concretos". Eso sí sería menos comprensible para la gente que solo sabe "arduino".

      Eliminar
    6. Me autorespondo. En el 4:51 dices que tomas muestras de dos semiciclos con eso deben ser correctos los resultados.

      Perdón no supe escuchar suficiente.

      Eliminar
    7. Jeje, no hay problema, me sirven las criticas y consultas porque de ahí puedo ir perfeccionando el firmware, el hard ya esta bien, pero el firmware siempre se puede ir optimizando.
      Ahora tengo una nueva versión en el lab, que dispara el calculo cuando detecta el cruce por cero, de esa forma siempre comienza la lectura en el principio del hemiciclo, esto lo hace dejando pasar el segundo cruce por cero ya que ahí aparece el otro hemiciclo y cuando finalizan estos dos realiza la cuenta y la muestra, de esta forma se mejora considerablemente el sistema y la cantidad de muestras que toma es dinámica, no depende de un valor fijo con un for. Esta andando bien, no noto mucha diferencia pero el valor es mas fiel.
      Saludos!

      Eliminar
  2. hola amigo tengo una duda el programa es del voltaje y amperaje o solo es de amperaje??

    ResponderEliminar
    Respuestas
    1. Hola como estas?, el programa y el circuito miden la corriente y la tensión, luego la procesa y muestra el valor TrueRMS de la tensión, la corriente y la potencia.
      Saludos!

      Eliminar