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..




20 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.

    ResponderBorrar
    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.

      Borrar
    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.

      Borrar
    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.

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

      Saludos!

      Borrar
    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".

      Borrar
    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.

      Borrar
    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!

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

    ResponderBorrar
    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!

      Borrar
  3. hola amigo tengo una inquietud, si el rectificador de presiciòn es de onda completa por que solo usas un diodo.

    ResponderBorrar
    Respuestas
    1. Hola, lo que sucede es que no funciona de la misma manera que un rectificador de onda completa basico. Este usa los operacionales para compenzar y por la configuracion usa el diodo solamente para separar un semi siclo del otro, no lo usa para rectificar en si.
      Saludos.

      Borrar
  4. Buenas tardes amigo tengo una pregunta, como hago los calculos para rectificar 110vac y convertirlos en 5vac como realizo la configuracion, que valores de resistencia debo tomar.muchas gracias saludos

    ResponderBorrar
    Respuestas
    1. Hola, así como esta, si medis 110V te va a mostrar 110V, ya que esta calibrado en cuanto a los valores. Si queres podes modificar las resistencias R1 y R2 que son el divisor de tensión para la entrada de 220V (ver imagen en colores), pero si cambias eso hay que cambiar el programa también, te recomendaría que no cambies nada y así te va a medir 110V cuando ingreses esa tensión.
      Fíjate este otro proyecto, tal vez te parece mas sencillo o te interesa mas: http://electgpl.blogspot.com/2017/01/medidor-de-potencia-ac-sin-amplificador.html
      Saludos

      Borrar
  5. Buenas porque al simularlo en donde se la entrada AN1 cuando no hay carga me sale un vatiaje de 68w aprox y ademas le genera voltaje aun sin carga

    ResponderBorrar
    Respuestas
    1. Hola, no deberia aparecer nada la verdad, en la simulacion al menos cuando lo simule, nunca me ha pasado eso

      Borrar
  6. hola un saludo desde colombia atlantico es una region costera de colombia mas concretamente desde soledad que es una ciudad del atlantico. mis mas respetuosos y permitame dejarle mi gran aprecio por su conocimiento yo soy relativamente nuevo en esto y no he tenido digamos un tutor que me guie en esto de los micros que es mi gran pasion, siempre he logrado montar alguno que otro circuito y los que mas me dan lidia jejeje son los de matris de leds.
    sin embargo tambien me gusta la amplificacion y me he querido armar de un circuito que me permita medir el consumo de voltios y corriente que usa el amplificador y ademas ver el volumen de salida asi algo parecido al vumetro con lcd que lograste construir, y por eso me tope con este blog, he visto que ya desde hace un año nadie le comenta sin embargo lo he seguido desde ya hace tiempo es mas vi el video que le manifiesta el pesame de la muerte de ampletos, pero bueno no es el caso, le estaria agradecido cualquier ayuda ya que no he estudiado como debe ser los micros aunque si soy tec. electronica y es lo que me ha ayudado para poder sacar todo adelante muchas gracias y disculpe tanta chachara jjajaj saludes y espero que se encuentre bien usted y su familia. saludes elberto suarez.

    ResponderBorrar
  7. Viejo al momento de hacer la simulación y programar el pic manda error
    Podrías pasar la simulación a este correo (kelvinmanotas@Gmail. Com)

    ResponderBorrar
  8. Hola, podrías compartir la simulacion o la imagen clara de los componentes y conexiones, gracias! excelente trabajo! Te dejo mi correo.
    tulcanjose1@gmail.com

    ResponderBorrar