Autor Tema: Prototipo de Medidor de corriente en las viviendas  (Leído 49689 veces)

0 Usuarios y 7 Visitantes están viendo este tema.

Desconectado Suky

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Prototipo de Medidor de corriente en las viviendas
« Respuesta #30 en: 29 de Mayo de 2010, 11:52:36 »
Prefiero el ADE77...  :P  :D :D
No contesto mensajes privados, las consultas en el foro

Desconectado Menta

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 607
Re: Prototipo de Medidor de corriente en las viviendas
« Respuesta #31 en: 29 de Mayo de 2010, 14:27:09 »
Prefiero el ADE77...  :P  :D :D

jajaja... bueno, ya lo suponía  :D, igual yo no los vendo a ninguno de ellos, así que cada quien que use el que le parece.
Cómo podría probar el ADE77..???  ya que no me da samples la página de Analog device y la de microchip sí. No se si lo pueda conseguir en mi ciudad  :?
     

Desconectado jeanvega54

  • PIC10
  • *
  • Mensajes: 13
Re: Prototipo de Medidor de corriente en las viviendas
« Respuesta #32 en: 06 de Junio de 2010, 23:31:06 »
hola buenas noches, comenze a realizar pruebas con el sensor y estoy presentando una incertidumbre, ya que el datasheet me dice que que posee 2.5 v en la salida vout sin haber consumo de corriente, pero a medida que coloco la carga me debe incrementar el voltaje de salida, tambien me dice que funciona tanto para ac y tension dc.

en las pruebas solo me varia de 0.2 v a 0.8 v en AC variando la carga desde 0 amp a 4 amp, midiendo con tester en AC y si mido en dc con el tester tengo un voltaje constante en 2.5 v. alguien que me pueda ayudar se lo agradesco.

anexo circuito
 

Desconectado bigluis

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 511
    • Tutoriales de Qt C++
Re: Prototipo de Medidor de corriente en las viviendas
« Respuesta #33 en: 18 de Junio de 2010, 01:50:36 »
A continuación muestro un código que he estado desarrollando para realizar un medidor de energía sin los ADE. En este código solo muestreo la señal de voltaje y la señal de corriente, tomo 256 muestras y a partir de ellas obtengo Irms y Vrms. Estos son los valores básicos para obtener la potencia aparente (VA) y para encontrar la potencia Actica (W) y la potencia Reactiva (VAR) es necesario encontrar el desfase entre el voltaje y la corriente y luego el factor de Potencia.

Yo se que no es necesario ya que los IC realizan todo el trabajo, pero era algo que tenía que presentar en mi universidad, así que ahi les va.

Código: C++
  1. //Autor: Luis Alberto Vargas Tijerino.
  2.  
  3. //Nicaragua, 15 de Junio de 2010.
  4.  
  5. //Seudónimo: Bigluis
  6.  
  7. #include <18f4550.h>            //pic a utilizar          
  8. #DEVICE ADC=10
  9. #include <Puertos.c>
  10. #fuses XT,NOMCLR,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL1,CPUDIV1,NOVREGEN,NOPBADEN // fuse con cristal 48Mhz
  11. #use delay (clock=48M)         //Fosc=48Mhz
  12.  
  13. #define LCD_DATA4       PIN_B0
  14. #define LCD_DATA5       PIN_B1
  15. #define LCD_DATA6       PIN_B2
  16. #define LCD_DATA7       PIN_B3
  17. #define LCD_ENABLE_PIN  PIN_B4
  18. #define LCD_RS_PIN      PIN_B5
  19. #define LCD_RW_PIN      PIN_B6
  20.  
  21. #include <lcd.c>                  //libreria manejo lcd
  22.  
  23.  
  24. int8    N=0;                                            //N = Numero de muestras        
  25. int16 V=0,I=0;                          //Voltaje y Corriente instantaneos
  26. int16 Vmax=0,Imax=0;    //Voltaje y corriente Maxima.
  27. int32 Vrms=0,Irms=0;    //Voltaje y Corriente RMS.                                
  28.  
  29. #INT_TIMER0
  30. void TIMER0_ISR(void){
  31.         delay_cycles(2);                
  32.         set_timer0(73);
  33.        
  34.         set_adc_channel(3);                             //Seleccionamos el Canal para medir voltaje
  35.         read_adc(ADC_START_ONLY);       //Iniciamos la conversion AD del voltaje
  36.         Vrms+=_mul(V,V);                                                //Realizamos la sumatoria de los cuadrados de V
  37.         if(Vmax<V)Vmax=V;
  38.         V=read_adc(ADC_READ_ONLY);  //una vez terminada laconversion AD del voltaje lo guardamos
  39.        
  40.         set_adc_channel(2);                             //Realizamos la sumatoria de los cuadrados de I
  41.         read_adc(ADC_START_ONLY);   //Iniciamos la conversion AD de la corriente
  42.         Irms+=_mul(I,I);                                                //Realizamos la sumatoria de los cuadrados de I
  43.         if(Imax<I)Imax=I;                                       //obtenermos el valor de la corriente pico                  
  44.         I=read_adc(ADC_READ_ONLY);      //Una vez terminada la conversion AD de la
  45.                                                                                                                         //corriente lo guardamos
  46.        
  47.        
  48.                
  49.         N++;                 
  50. }
  51.  
  52. //Funcion para calcular la raiz cuadrada de un numero
  53. int32 raiz(int32 x){
  54.     int32 r = x, t = 0;
  55.     if(!x)return 0;
  56.     if(x<4)return 1;
  57.     while (t != r){
  58.         t = r;
  59.         r = (x/r + r)/2;
  60.     }
  61.     return r;
  62. }
  63.  
  64.  
  65. void main(void){
  66.         PORTA=0;
  67.         PORTB=0;
  68.         PORTC=0;
  69.         PORTD=0;
  70.         PORTE=0;
  71.         TRISA=3;                                //Solo RA0 y RA1 como entrada los demas como salida
  72.         TRISC=0;        //PORTC como salida.        
  73.         TRISD=0;        //PORTD como salida.
  74.         TRISE=0;                                //PORTE como salida
  75.         TRISB=0;                                //PORTB como salida
  76.        
  77.         lcd_init();             //Iniciamos el LCD            
  78.         lcd_putc("\fVe=    Vp=\nIe=    Ip=");   //Escribimos los caracteres en el LCD
  79.        
  80.         enable_interrupts(GLOBAL|INT_TIMER0);   //Habilitamos Interrupciones Globales y TMR0
  81.         set_timer0(75);                                                                         //ponemos TMR0=75 para que pasen 256-75 conteos
  82.         setup_timer_0(T0_8_BIT|T0_DIV_4);               //Seteamos el TMR0 a 8 bits y relacion 4:1
  83.                                                                                                                                                                 //Para que transcurran 65.083us en cada desborde
  84.         setup_adc_ports( VSS_VDD|AN0_TO_AN3 );//Ponemos Vref+=Vss y Vref-=Vdd, y AN0 a AN3 como analogicas
  85.         ADCON2=0b10001000|ADC_CLOCK_DIV_64;     //Seleccionamos Tad=64*Tosc y Tacqt=2Tad.
  86.         ADON=1;                                                                                                                         //Encendemos el ADC
  87.         setup_comparator(A0_A3_A1_A2_OUT_ON_A4_A5);
  88.         while(true){
  89.                 if(N==255){                             //Si se han tomado 255 muestras
  90.                         disable_interrupts(INT_TIMER0); //Desabilitamos la Interrupcion del TMR0
  91.                         Vrms=raiz(Vrms/256);    //Sacarle raiz cuadrada a la sumatoria de las muestras de Voltaje
  92.                         Irms=raiz(Irms/256);            //y a las de Corriente
  93.                         printf(lcd_putc,"%Lu",Irms);    //Mostramos en pantalla la Corriente RMS
  94.                         lcd_gotoxy(11,2);                                               //Ubicamos el cursor en la posicion 11,2
  95.                         printf(lcd_putc,"%Lu",Imax);    //Mostramos en pantalla la Corriente Pico            
  96.                         lcd_gotoxy(4,1);                                                        //Ubicamos el cursor en la posicion 4,1
  97.                         printf(lcd_putc,"%Lu",Vrms);    //Mostramos en pantalla el Voltaje RMS          
  98.                         lcd_gotoxy(11,1);                                               //Ubicamos el cursor en la posicion 11,1
  99.                         printf(lcd_putc,"%Lu",Vmax);    //Mostramos en pantalla el Voltaje Pico
  100.                         lcd_gotoxy(4,2);                                                        //Ubicamos el cursor en la posicion 4,2
  101.                         Vrms=0;Irms=0;Imax=0;Vmax=0;    //Inciamos los valores para iniciar la medicion
  102.                         enable_interrupts(INT_TIMER0);  //Habilitamos la interrupcion del TMR0
  103.                 }
  104.   }
  105. }

Para utilizar la librería "Puertos.c" descargarla de aquí

A continuación adjunto un archivo donde se muestra la simulación y los códigos.
« Última modificación: 21 de Junio de 2010, 01:33:41 por bigluis »
Tutoriales de Qt C++

No es necesario que hagamos Grandes cosas, sino que lo que hagamos sea importante.

SI la NECESIDAD es la MADRE del CONOCIMIENTO, SEGURAMENTE la PEREZA su TÍA.

Cuando el ARTE requiere de PRECISION le llamamos CIENCIA

Desconectado Suky

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Prototipo de Medidor de corriente en las viviendas
« Respuesta #34 en: 18 de Junio de 2010, 11:10:40 »
Muy bueno el aporte! Seguramente, antes que realizar Vrms/256 haría las rotaciones hacia la derecha, sería más eficiiente en tiempo de ejecución  :?


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado jeanvega54

  • PIC10
  • *
  • Mensajes: 13
Re: Prototipo de Medidor de corriente en las viviendas
« Respuesta #35 en: 18 de Junio de 2010, 14:33:55 »
gracias por tu aporte!!!! estoy analizandolo y cualquier duda te pregunto

Desconectado bigluis

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 511
    • Tutoriales de Qt C++
Re: Prototipo de Medidor de corriente en las viviendas
« Respuesta #36 en: 18 de Junio de 2010, 15:10:17 »
Muy bueno el aporte! Seguramente, antes que realizar Vrms/256 haría las rotaciones hacia la derecha, sería más eficiiente en tiempo de ejecución  :?


Saludos!

 :) Eso es exactamento lo que hace CCS, si observas el código ASM generado, lo que hace CCS es simplemente correr los 3 bytes más significativos a los menos significativos, eliminando el byte menos significativo.

 :lol: Escogí realizar 256 muestras porque dividir cualquier número entre 256 es simplemente eliminar el Byte menos significativo. Es decir, es más fácil y rápido para el PIC dividir entre 256 que entre 5.
Tutoriales de Qt C++

No es necesario que hagamos Grandes cosas, sino que lo que hagamos sea importante.

SI la NECESIDAD es la MADRE del CONOCIMIENTO, SEGURAMENTE la PEREZA su TÍA.

Cuando el ARTE requiere de PRECISION le llamamos CIENCIA

Desconectado Menta

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 607
Re: Prototipo de Medidor de corriente en las viviendas
« Respuesta #37 en: 18 de Junio de 2010, 15:29:34 »
Buen código, estuve viendo y hacer lo que tú haces y usar el mcp3909 de microchip en modo spi es más o menos el mismo trabajo para el pic, no obstante esto, voy a adquirir unos mcp3909 porque quiero medir energía consumida y para eso es necesario que el cálculo de la portencia sea muy preciso, el integrado tiene una resolución de 16bits y el amplificador PGA integrado, pero fuera de esto no es muy brillante el chip.

Si bien se desvía un poco del tema, como está relacionado pongo un link a un trabajo de un amigo mio que hace mucho que no veo. Es un muy buen trabajo sobre corrección del factor de potencia y para ello debe medir el desfase entre tensión y corriente. El código está en ensamblador. Seguramente quien esté interesado en este post pueda interesarse en este trabajo.
Corrector de factor de potencia

Saludos.
     

Desconectado bigluis

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 511
    • Tutoriales de Qt C++
Re: Prototipo de Medidor de corriente en las viviendas
« Respuesta #38 en: 18 de Junio de 2010, 15:45:00 »
Hola Menta!

 :( Queria comentar que el link que pusiste no funciona

 :) Porfavor revisalo y corrigelo si no es mucha molestia.
Tutoriales de Qt C++

No es necesario que hagamos Grandes cosas, sino que lo que hagamos sea importante.

SI la NECESIDAD es la MADRE del CONOCIMIENTO, SEGURAMENTE la PEREZA su TÍA.

Cuando el ARTE requiere de PRECISION le llamamos CIENCIA

Desconectado Menta

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 607
Re: Prototipo de Medidor de corriente en las viviendas
« Respuesta #39 en: 18 de Junio de 2010, 16:29:56 »
Que raro, a mi me funciona bien. Igual te lo subo a mi 4shared:
corrector.rar

     

Desconectado Suky

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Prototipo de Medidor de corriente en las viviendas
« Respuesta #40 en: 19 de Junio de 2010, 12:05:19 »
Muy bueno el aporte! Seguramente, antes que realizar Vrms/256 haría las rotaciones hacia la derecha, sería más eficiiente en tiempo de ejecución  :?


Saludos!

 :) Eso es exactamento lo que hace CCS, si observas el código ASM generado, lo que hace CCS es simplemente correr los 3 bytes más significativos a los menos significativos, eliminando el byte menos significativo.

 :lol: Escogí realizar 256 muestras porque dividir cualquier número entre 256 es simplemente eliminar el Byte menos significativo. Es decir, es más fácil y rápido para el PIC dividir entre 256 que entre 5.

Bien ahí! no me habia fijado, es que C18 no lo hace  :5]
No contesto mensajes privados, las consultas en el foro

Desconectado Suky

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Prototipo de Medidor de corriente en las viviendas
« Respuesta #41 en: 20 de Junio de 2010, 12:41:59 »
Era C30 que no lo hace, me equivoque, C18 ni idea  :mrgreen:


Otra cosa, como se está calculando el valor RMS, que involucra un periodo, la cantidad de muestras debe ser tal que se abarque un periodo o varios, si se toman más muestras o menos se produce error en el cálculo. Esto es importante cuando se hacen pocas muestras por periodo, capaz al ser 256 no afecte pero hay que analizarlo.  ;-)

Por ejemplo en mi caso en el cual obtengo 16 muestras por ciclos de 7 magnitudes, debo tener precaución en la frecuencia de muestro.  :? Porque una variación de 2 Hz en la frecuencia de la magnitud producia un error del 2% si no recuerdo mal.


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado bigluis

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 511
    • Tutoriales de Qt C++
Re: Prototipo de Medidor de corriente en las viviendas
« Respuesta #42 en: 20 de Junio de 2010, 13:41:52 »
Según la hoja de datos del ADE7758 se utiliza la siguiente ecuación para obtener los valores RMS

$$F_{RMS} = \sqrt {{1 \over N}\sum\limits_{n = 0}^{N - 1} {f^2 \left[ n \right]} }

No recuredo si fue en la hoja de datos del ADE o del MCP3909 que recomiendan que se realicen 64, 128 ó 256 muestras por ciclo.

Tengo entendido que la cantidad de muestras es para tener una mejor apreciación de los armónicos, no sé exactamente cuanto es el error producido, pero el error también depende de la precisión del ADC.
Tutoriales de Qt C++

No es necesario que hagamos Grandes cosas, sino que lo que hagamos sea importante.

SI la NECESIDAD es la MADRE del CONOCIMIENTO, SEGURAMENTE la PEREZA su TÍA.

Cuando el ARTE requiere de PRECISION le llamamos CIENCIA

Desconectado Suky

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Prototipo de Medidor de corriente en las viviendas
« Respuesta #43 en: 20 de Junio de 2010, 19:40:54 »
Según la hoja de datos del ADE7758 se utiliza la siguiente ecuación para obtener los valores RMS

$$F_{RMS} = \sqrt {{1 \over N}\sum\limits_{n = 0}^{N - 1} {f^2 \left[ n \right]} }


Por lo menos los ADE no lo hacen así, leer el datasheet.


No recuredo si fue en la hoja de datos del ADE o del MCP3909 que recomiendan que se realicen 64, 128 ó 256 muestras por ciclo.

Tengo entendido que la cantidad de muestras es para tener una mejor apreciación de los armónicos, no sé exactamente cuanto es el error producido, pero el error también depende de la precisión del ADC.

Yo he hecho el analisis, por eso el comentario  ;-)


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado bigluis

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 511
    • Tutoriales de Qt C++
Re: Prototipo de Medidor de corriente en las viviendas
« Respuesta #44 en: 21 de Junio de 2010, 01:24:57 »
:) En la página 24, capítulo Channel 1 RMS Calculation, de la hoja de datos del ADE7753 sale la ecuación que mencioné anteriormente.

En esa misma página, capítulo Channel 1 Sampling sale que la razón de muestreo de salida puede ser de 27.9 kSPS, 14 kSPS, 7 kSPS, ó 3.5 kSPS qué al dividirlos entre 60 o 50 se aproximan a un número de muestras 2^n. Con lo anterior no estoy afirmando que sea necesario hacerlo con un número de muestras 2^n. Es decir, escogí 2^N porque para los PIC es más facil realizar la división.

En la página 34, capítulo Achieving Line Cycle Sampling with Zero Blind Cycles de la hoja de datos del MCP3909, dice lo siguiente:

"In most energy meter applications, it will be necessary to have 2N samples for each 50 or 60 Hz line cycle, where N is typically 64, 128 or 256. Controlling the MCLK of the MCP3909 allows you to control the sample rate and ultimately the data ready (DR) pulses for coherent waveform sampling."

"En la mayoría de aplicaciones con medidores de energía, es necesario tener 2^N muestras por cada ciclo de 50 ó 60 Hz. donde N tipicamente es 64, 128 o 256. Controlando el MCLK del MCP3909 te permite controlar la razón de muestreo y finalmentel los pulsos data ready(DR) para muestreo coherente de la forma de onda."

:? Me imagino que también podemos controlar el CLK de los ADE77 para poder controlar la razón de muestreo, aunque todavía no lo sé, pero voy a seguir leyendo la hoja de datos, y voy a comenzar a hecer pruebas en esta semana.

Esto es lo que yo he entendido de los medidores de energía hasta el momento.  :oops: Si estoy en un error por favor corrijanme.

 :-/ entre más aportes realicemos será mejor.
« Última modificación: 21 de Junio de 2010, 01:29:00 por bigluis »
Tutoriales de Qt C++

No es necesario que hagamos Grandes cosas, sino que lo que hagamos sea importante.

SI la NECESIDAD es la MADRE del CONOCIMIENTO, SEGURAMENTE la PEREZA su TÍA.

Cuando el ARTE requiere de PRECISION le llamamos CIENCIA