TODOPIC

Microcontroladores PIC => * PROYECTOS * => Mensaje iniciado por: bigluis en 22 de Abril de 2011, 00:49:06

Título: Medidor de Energía con MCP3909
Publicado por: bigluis en 22 de Abril de 2011, 00:49:06
Hola amigos de TodoPIC.

Hace algún tiempo prometi crear un nuevo tema para el dieño de un medidor de energía domiciliar, en esta ocasión decidí que el dispositivo que utilizaré como Analog Front-End (AFE) será el MCP3909 del fabricante Microchip.

Mi objetivo es utilizar este AFE en conjunto con un PIC18FXX5X que posee comunicación USB con la PC, lo que nos permite transmitir los datos almacenados durante un período de medición (Por lo general 1 mes) desde el medidor hacia la PC.

Estoy tomando como base el medidor trifásico propuesto en la Aplication-Note de Microchip que se encuentra en el siguiente link.
http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=1406&dDocName=en520559 (http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=1406&dDocName=en520559)

Hasta el momento solo he logrado decifrar una pequeña parte del código que nos brinda Microchip y me gustaría que me ayuden ya que tengo muchas dudas al respecto. A continuación muestro el código que he desarrollado hasta el momento.

Archivo: "Medidor de Energía MCP3909.h"
Este archivo se utiliza para la declaración de los bits de configuración y la frecuencia de reloj que utilizaremos.
Código: C
  1. #FUSES NOWDT                    //No Watch Dog Timer
  2. #FUSES WDT128                   //Watch Dog Timer uses 1:128 Postscale
  3. #FUSES XT                       //Crystal osc <= 4mhz for PCM/PCH , 3mhz to 10 mhz for PCD
  4. #FUSES NOPROTECT                //Code not protected from reading
  5. #FUSES NOBROWNOUT               //No brownout reset
  6. #FUSES BORV20                   //Brownout reset at 2.0V
  7. #FUSES NOPUT                    //No Power Up Timer
  8. #FUSES NOCPD                    //No EE protection
  9. #FUSES STVREN                   //Stack full/underflow will cause reset
  10. #FUSES NODEBUG                  //No Debug mode for ICD
  11. #FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
  12. #FUSES NOWRT                    //Program memory not write protected
  13. #FUSES NOWRTD                   //Data EEPROM not write protected
  14. #FUSES IESO                     //Internal External Switch Over mode enabled
  15. #FUSES FCMEN                    //Fail-safe clock monitor enabled
  16. #FUSES PBADEN                   //PORTB pins are configured as analog input channels on RESET
  17. #FUSES NOWRTC                   //configuration not registers write protected
  18. #FUSES NOWRTB                   //Boot block not write protected
  19. #FUSES NOEBTR                   //Memory not protected from table reads
  20. #FUSES NOEBTRB                  //Boot block not protected from table reads
  21. #FUSES NOCPB                    //No Boot Block code protection
  22. #FUSES MCLR                     //Master Clear pin enabled
  23. #FUSES LPT1OSC                  //Timer1 configured for low-power operation
  24. #FUSES NOXINST                  //Extended set extension and Indexed Addressing mode disabled (Legacy mode)
  25. #FUSES PLL1                     //No PLL PreScaler
  26. #FUSES CPUDIV4                  //System Clock by 4
  27. #FUSES USBDIV                   //USB clock source comes from PLL divide by 2
  28. #FUSES VREGEN                   //USB voltage regulator enabled
  29. #FUSES ICPRT                    //ICPRT enabled
  30.  
  31. #use delay(clock=48000000)

Archivo: "Variables_64bits.c"
En este archivo he desarrollado con ayuda de Suky unas librerias que me seran utiles para la manipulacion de variables de 40 y 64 bits respectivamente. Aunque creo que sería mejor utilizar variables tipo float para la manipulación de los datos pero aún no estoy seguro.
Código: C
  1. ///////////////////////////////////////////////////////////////////////////
  2. ////                                                                   ////
  3. ////                                                                   ////
  4. ////        (C) Copyright 2010 www.micros-designs.com.ar               ////
  5. //// Este código puede ser usado, modificado y distribuido libremente  ////
  6. //// sin eliminar esta cabecera y  sin garantía de ningún tipo.        ////
  7. ////                                                                   ////
  8. ////                                                                   ////
  9. ///////////////////////////////////////////////////////////////////////////
  10.    
  11. /*- Version Log --------------------------------------------------------------*
  12.  *   Fecha       Autor                Comentarios                             *
  13.  *----------------------------------------------------------------------------*
  14.  * 16/08/10      Suky               Original (Rev 1.0)                        *
  15.  *----------------------------------------------------------------------------* */
  16. typedef union{
  17.     unsigned int8  mbyte[8];
  18.     unsigned int16 Word[4];
  19.     unsigned int32 Dword[2];
  20. }UINT64;
  21.  
  22. typedef union{
  23.    unsigned int8 mbyte[5];
  24.    unsigned int16 Word[2];
  25.    unsigned int32 Dword[1];
  26. }UINT40;
  27.  
  28. #define Zero64(x) x.Dword[0]=0;x.Dword[1]=0
  29. #define IsZero64(x) ((x.Dword[0]==0)&&(x.Dword[1]==0))
  30. #define Bit64_set(x,i) x.Byte[i>>3]|=(1<<(i&7))
  31.        
  32. void ui64Add64x64(uint64 &a, uint64 &b, uint64 &result1){
  33.    result1.Dword[0]=a.Dword[0]+b.Dword[0];
  34.    #ASM
  35.       MOVF   b.mbyte[4],W
  36.       ADDWFC a.mbyte[4],W
  37.       MOVWF  result1.mbyte[4]
  38.       MOVF   b.mbyte[5],W
  39.       ADDWFC a.mbyte[5],W
  40.       MOVWF  result1.mbyte[5]
  41.       MOVF   b.mbyte[6],W
  42.       ADDWFC a.mbyte[6],W
  43.       MOVWF  result1.mbyte[6]
  44.       MOVF   b.mbyte[7],W
  45.       ADDWFC a.mbyte[7],W
  46.       MOVWF  result1.mbyte[7]
  47.    #ENDASM
  48. }
  49.  
  50. void ui64Sub64x64(UINT64 &a, UINT64 &b,UINT64 &result1){
  51.    result1.Dword[0]=a.Dword[0]-b.Dword[0];
  52.    #ASM
  53.       MOVF   b.mbyte[4],W
  54.       SUBWFB a.mbyte[4],W
  55.       MOVWF  result1.mbyte[4]
  56.       MOVF   b.mbyte[5],W
  57.       SUBWFB a.mbyte[5],W
  58.       MOVWF  result1.mbyte[5]
  59.       MOVF   b.mbyte[6],W
  60.       SUBWFB a.mbyte[6],W
  61.       MOVWF  result1.mbyte[6]
  62.       MOVF   b.mbyte[7],W
  63.       SUBWFB a.mbyte[7],W
  64.       MOVWF  result1.mbyte[7]
  65.    #ENDASM
  66. }
  67.  
  68. void ui64Mult32x32(UINT64 &_a, UINT64 &_b, UINT64 &_result){
  69.    _result.Dword[0]=_a.Dword[0] * _b.Dword[0];
  70. }

Archivo: "Declaraciones.h"
En este archivo defino y declaro las variables que se utilizarán en el código.
Código: C
  1. #BIT MCP_MCLR     = PORTA.0      // MCLR for all three MCP3909s
  2. #BIT MCP_MCLR_dir = TRISA.0
  3. #BIT MCP_HPF      = PORTA.1
  4. #BIT MCP_HPF_dir  = TRISA.1
  5. #BIT MCP_CS       = PORTA.2      // Chip select for MCP3909
  6. #BIT MCP_CS_dir   = TRISA.2  
  7. #BIT MCP_G0       = PORTA.3      // Gain selection G0 for all three MCP3909s
  8. #BIT MCP_G0_dir   = TRISA.3  
  9. #BIT MCP_G1       = PORTA.4      // Gain selection G1 for all three MCP3909s
  10. #BIT MCP_G1_dir   = TRISA.4  
  11.  
  12. int16 V,I,           //Voltaje y corriente instantaneos
  13.       V_D1,I_D1,     //Voltaje y corriente retrasado una muestra
  14.       V_P,I_P;       //Voltaje y corriente para el calculo de Potencia
  15.  
  16. UINT40 V_WAcc,     //40-bit working accumulator for voltage squared
  17.        I_WAcc;     //40-bit working accumulator for current squared

Archivo: "Medidor de Energía MCP3909.c"
Este es el archivo principal del programa.
Código: C
  1. #include <18f4550.h>
  2. #include <Medidor Energia MCP3909.h>
  3. #include <Puertos.c>
  4. #include <variables_64bits.c>
  5. #include <declaraciones.h>
  6. #include <math.h>
  7.  
  8. #use spi(FORCE_HW, BITS=16)
  9.  
  10. void MCP_init(void){
  11.    MCP_CS=0;
  12.    MCP_MCLR=1;
  13.    delay_us(4);
  14.    spi_write(0xAC);
  15.    delay_us(2);
  16.    MCP_CS=1;  
  17. }
  18.  
  19. void Hardware_init(void){
  20.    TRISA=0;
  21.    TRISB=0;
  22.    TRISC=0;
  23.    DISABLE_INTERRUPTS(GLOBAL);
  24.    SETUP_ADC_PORTS(NO_ANALOGS);
  25.    PORTA=0;
  26.    PORTB=0;
  27.    PORTC=0;
  28.    MCP_CS=1;
  29.    SETUP_TIMER_0(T0_8_BIT|T0_INTERNAL|T0_DIV_4);
  30.    SET_TIMER0(0x78);
  31.    SETUP_TIMER_3(T3_INTERNAL|T3_DIV_BY_8);
  32.    SET_TIMER3(0);
  33.    SETUP_TIMER_2(T2_DIV_BY_1,5,1);
  34.    SET_PWM2_DUTY(3);
  35.    SETUP_CCP2(CCP_PWM);
  36.    setup_spi(SPI_MASTER|SPI_CLK_DIV_4|SPI_L_TO_H|SPI_SAMPLE_AT_END);
  37. }
  38.  
  39. void main(){
  40.    Hardware_init();
  41.    MCP_init();
  42.    while(1);
  43. }

A continuación muestro algunas dudas:

(http://www.todopic.com.ar/foros/index.php?action=dlattach;topic=34506.0;attach=15550)

A continuación dejo los archivos adjuntos.
Título: Re: Medidor de Energía con MCP3909
Publicado por: Suky en 22 de Abril de 2011, 11:16:41
Hola! mmm... Trabajarlo todo en C y un microcontrolador de 8-bits puede que sea complicado, por el tema de los tiempos... Hay otra Nota de Aplicación de Microchip en donde realizan el medidor de 3 fases con un 18F2550, pero el código de éste esta desarrollado en asm  :undecided:

Código: Matlab M
  1. Vp_Max=10000;
  2. t_init=0.159;
  3. F_range=[45:0.25:55]';                                                                                                                                                                                                                                                                          
  4. t=[t_init:0.00015625:t_init+0.0199]; % 50Hz
  5. for i=1:size(F_range)
  6.     y(i,:)=abs(Vp_Max.*sin(2*pi*F_range(i).*t));
  7.    
  8.     y_16bits(i,:)=int32((y(i,:).*65535)./Vp_Max); %Obtengo Valor muestreado a 16 bits
  9.     Y_16bits(i,:)=(double(y_16bits(i,:)).*Vp_Max)./65535; %Obtengo valor medido a partir del valor de 16-bits
  10.    
  11.     Sum_16bits(i)=0;
  12.     for k=1:128
  13.         Sum_16bits(i)=Sum_16bits(i)+Y_16bits(i,k)^2;
  14.     end
  15.     RMS_y(i)=Vp_Max/sqrt(2);
  16.     RMS_16bits(i)=sqrt(Sum_16bits(i)/128);
  17.    
  18.     Error_RMS_16bits(i)=((RMS_16bits(i)-RMS_y(i))/RMS_y(i)).*100;
  19.     Const(i)=RMS_16bits(i)/RMS_y(i);
  20. end
  21.  
  22. figure(1);
  23. plot(F_range,Error_RMS_16bits);title('Error RMS');grid;
  24. xlabel('Frecuencia Señal');ylabel('Porcentaje error');
  25. plot(F_range,Error_RMS_16bits,'r');


(http://www.todopic.com.ar/foros/index.php?action=dlattach;topic=34506.0;attach=15567)






Saludos!

Título: Re: Medidor de Energía con MCP3909
Publicado por: bigluis en 22 de Abril de 2011, 17:38:06
Hola Suky, me podrias dar el link de la otra Nota de aplicación de Microchip donde usan el 18f2550 para el medidor de energia trifasico, no la encuentro por ningún lado.

Gracias por la opción de Cirrus pero también he pensado en usar el ADE7753 de Analog Devices, este dispositivo me entrega todos los valores sin necesidad de hacer ningún cálculo (Vrms, Irms, W, VA, VAR, etc...), pero quería probar con el MCP3909 ya que es más barato y al final y al cabo siempre es necesario un MCU y por los momentos solo me interesa medir Energía Activa.

Cuando te refieres a usar el módulo de comparación es utilizar el módulo CCP en modo Captura cada flanco ascendente, ¿no? Que en CCS queda de la siguiente manera:
Código: [Seleccionar]
SETUP_CCP1(CCP_CAPTURE_RE);
ENABLE_INTERRUPS(INT_CCP1);

Y conectar el PIN CCP1 al PIN MCP_SDO.
Título: Re: Medidor de Energía con MCP3909
Publicado por: Suky en 22 de Abril de 2011, 18:20:57
Por aquí esta el medidor con 18F2550 18F2520  :oops: : http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=1406&dDocName=en520559

Es configurar el módulo CCP en modo captura, ni idea la sintaxis en CCS. Yo lo implementé pero con un PIC24, por aquí se puede ver hecho en C30: http://www.micros-designs.com.ar/trabajando-con-el-mcp3909-c-i-para-medicion-de-energia/


Saludos!
Título: Re: Medidor de Energía con MCP3909
Publicado por: bigluis en 22 de Abril de 2011, 19:44:01
Hola suky, esa es la misma página que mencioné antes, y esta muy bueno lo que has hecho.

Y según he leído en los codigos fuentes de las Notas de aplicación de Microchip es mejor utilizar la interrupción INTx y cambiar la frecuencia del MCP_CLKI así varías la cantidad de muestras que pueden ser obtenidas del MCP3909 y me imagino que se disminuye la enregía consumida ya que se realiza menos trabajo.

Por aquí encontre otra nota de aplicación en la que nos dan un código fuente en C
http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=1824&appnote=en544926 (http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=1824&appnote=en544926)

En tu código he observado que primero esperas a que ocurra el pulso de DR y luego pones el pin CS del MCP a cero para iniciar la recepción de datos, ¿es esto correcto?
Título: Re: Medidor de Energía con MCP3909
Publicado por: Suky en 22 de Abril de 2011, 20:52:26
Hola suky, esa es la misma página que mencioné antes, y esta muy bueno lo que has hecho.

Y según he leído en los codigos fuentes de las Notas de aplicación de Microchip es mejor utilizar la interrupción INTx y cambiar la frecuencia del MCP_CLKI así varías la cantidad de muestras que pueden ser obtenidas del MCP3909 y me imagino que se disminuye la enregía consumida ya que se realiza menos trabajo.

Por aquí encontre otra nota de aplicación en la que nos dan un código fuente en C
http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=1824&appnote=en544926 (http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=1824&appnote=en544926)

En tu código he observado que primero esperas a que ocurra el pulso de DR y luego pones el pin CS del MCP a cero para iniciar la recepción de datos, ¿es esto correcto?

El tema del clock es como lo prefieras, creo que depende más de la disponibilidad y de las posibles modificaciones que se quiera hacer en el futuro.

En realidad dejo CS=0 para habilitar el MCP y detectar el DR, luego leo los registros, coloco CS=1 y vuelvo a colocar a CS=0 para el próximo DR. Después la interrupción, según como sea configurada, tomará cierta cantidad de DR y generará la interrupción.


Saludos!
Título: Re: Medidor de Energía con MCP3909
Publicado por: bigluis en 22 de Abril de 2011, 21:06:28
Entonces debería ser algo así
Código: [Seleccionar]
#include <18f4550.h>
#include <Medidor Energia MCP3909.h>
#include <Puertos.c>
#include <variables_64bits.c>
#include <declaraciones.h>
#include <math.h>

#use spi(FORCE_HW, BITS=16)

#INT_EXT2
void MCP_READ(){
   MCP_CS=0;
   delay_us(2);
   V=spi_xfer();
   I=spi_xfer();
   delay_us(2);
   MCP_CS=1;
   delay_us(1);
   MCP_CS=0;
}

void MCP_init(void){
   MCP_MCLR=1;
   delay_cycles(1);
   MCP_CS=0;
   delay_us(2);
   spi_write(0xAC);
   delay_us(2);
   MCP_CS=1; 
}

void Hardware_init(void){
   TRISA=0;
   TRISB=0B100;
   TRISC=0;
   DISABLE_INTERRUPTS(GLOBAL);
   SETUP_ADC_PORTS(NO_ANALOGS);
   PORTA=0;
   PORTB=0;
   PORTC=0;
   MCP_CS=1;
   SETUP_TIMER_0(T0_8_BIT|T0_INTERNAL|T0_DIV_4);
   SET_TIMER0(0x78);
   SETUP_TIMER_3(T3_INTERNAL|T3_DIV_BY_8);
   SET_TIMER3(0);
   SETUP_TIMER_2(T2_DIV_BY_1,5,1);
//!   SETUP_CCP1(
   SET_PWM2_DUTY(3);
   SETUP_CCP2(CCP_PWM);
   setup_spi(SPI_MASTER|SPI_CLK_DIV_4|SPI_L_TO_H|SPI_SAMPLE_AT_END);
   ENABLE_INTERRUPTS(INT_EXT2_L2H);
   ENABLE_INTERRUPTS(GLOBAL);
}

void main(){
   Hardware_init();
   MCP_init();
   MCP_CS=0;
   while(1);
   
   
}
Título: Re: Medidor de Energía con MCP3909
Publicado por: Suky en 23 de Abril de 2011, 00:07:33
Si, parece todo correcto. Pero no he trabajado en CCS con SPI por hardware y la sentencia #use spi(FORCE_HW, BITS=16), así que no puedo asegurar que funcione de manera correcta.


Saludos!
Título: Re: Medidor de Energía con MCP3909
Publicado por: MGLSOFT en 23 de Abril de 2011, 08:14:32
Seguiré el tema, esta interesante...
Sobre el hardware ya tienes algo hecho??
Título: Re: Medidor de Energía con MCP3909
Publicado por: bigluis en 23 de Abril de 2011, 16:38:33
Hola amigos,

 :oops: Me podrían hacer el favor de probar el código ya que en estos momentos no tengo a mano el MCP3909 y no puedo probarlos en físico, todos los dispositivos me llegan dentro de un mes.
Título: Re: Medidor de Energía con MCP3909
Publicado por: Suky en 23 de Abril de 2011, 17:09:36
Hola amigos,

 :oops: Me podrían hacer el favor de probar el código ya que en estos momentos no tengo a mano el MCP3909 y no puedo probarlos en físico, todos los dispositivos me llegan dentro de un mes.

A mi se me complica, tengo todo un hardware armado para el CS5461A  :undecided: Igual muchas de las dudas que puedan surgir las podes simular, por ejemplo para el caso del uso de spi_xfer, se puede simular y observar si genera 16 clock como debiera de ser...
Comunicarte con el MCP es bastante sencillo, no creo que eso genere un problema, lo que si es una tarea interesante desarrollar el algoritmo para el medidor  :tongue:


Seguiré el tema, esta interesante...
Sobre el hardware ya tienes algo hecho??

Yo el hardware que tengo para las pruebas es muy parecido a los esquemas que aparecen en las Notas de aplicación, ya sea de Microchip o de Cirrus.


Saludos!
Título: Re: Medidor de Energía con MCP3909
Publicado por: bigluis en 23 de Abril de 2011, 17:24:22
Ya he simulado la transmisión SPI y mediante el SPI debugger he comprobado que se realiza la transmisión de los 16 bits.

Mi principal temor es que si funciona el CS y se transmite cuando ocurre la interrupción externa 2, además no sé si los ADC del MCP realizarán correctamente su trabajo.

Por eso quería comprobar el código que tengo hasta el momento antes de seguir, para evitar hacer un código sumamente grande que despues sea muy dificil de corregir.

Por probar el hardware no te preocupes, ya que habrán muchas personas interesadas en hacerlo, para eso es el foro no,  :D
Título: Re: Medidor de Energía con MCP3909
Publicado por: Suky en 23 de Abril de 2011, 17:51:50
Ya he simulado la transmisión SPI y mediante el SPI debugger he comprobado que se realiza la transmisión de los 16 bits.

Mi principal temor es que si funciona el CS y se transmite cuando ocurre la interrupción externa 2, además no sé si los ADC del MCP realizarán correctamente su trabajo.

Por eso quería comprobar el código que tengo hasta el momento antes de seguir, para evitar hacer un código sumamente grande que despues sea muy dificil de corregir.

Por probar el hardware no te preocupes, ya que habrán muchas personas interesadas en hacerlo, para eso es el foro no,  :D

El MCP no te va a transmitir si no le otorgas CLK  :mrgreen:


Suerte con el proyecto...


Saludos!
Título: Re: Medidor de Energía con MCP3909
Publicado por: bigluis en 23 de Abril de 2011, 19:01:49
Para otorgarle CLK al MCP pienso utilizar el módulo CCP2 y generar una frecuencia de reloj de 2MHz para obtener 128 muestras, y si quiero modificarlo a 64 muestras solo divido a la mitad la frecuencia, igualmente si quiero 256 muestras multiplico por 2 la frecuencia.
Título: Re: Medidor de Energía con MCP3909
Publicado por: bigluis en 23 de Abril de 2011, 20:24:07
Alguien me podría ayudar con el diseño de un Filtro IIR que se utilizará para las muestras de Vrms, Irms y VA.

Hasta el momento tengo pensado diseñar el filtro de manera analógica y luego convertirlo a discreto y finalmente sacar la ecuación que pondré en el PIC, pero no estoy muy seguro si eso es así.
Título: Re: Medidor de Energía con MCP3909
Publicado por: Suky en 23 de Abril de 2011, 20:41:22
Para otorgarle CLK al MCP pienso utilizar el módulo CCP2 y generar una frecuencia de reloj de 2MHz para obtener 128 muestras, y si quiero modificarlo a 64 muestras solo divido a la mitad la frecuencia, igualmente si quiero 256 muestras multiplico por 2 la frecuencia.

No me refería a eso sino que trate de interpretar lo dicho con
Citar
Mi principal temor es que si funciona el CS y se transmite cuando ocurre la interrupción externa 2,

 :undecided: Pensé que tenias miedo que se te escape algún dato!  :D

Para el filtro IIR: http://www-users.cs.york.ac.uk/~fisher/mkfilter/trad.html



Saludos!



Título: Re: Medidor de Energía con MCP3909
Publicado por: bigluis en 29 de Abril de 2011, 20:24:53
Hola Suky.

Me podrías ayudar un poco más con el diseño de los filtros, lo que ocurre es que no sé cuál es la frecuencia de corte de los filtros y como a partir de eso manejar el programa que aparece en el link que pusiste.
Título: Re: Medidor de Energía con MCP3909
Publicado por: Suky en 29 de Abril de 2011, 22:04:23
Exactamente para que se va a utilizar el filtro? Porque por ejemplo los chips CS54... de Cirrus implementan un filtro pasa-bajos y pasa-altos después del conversor analogico-digital, y para calcular el valor RMS tienen una maquina de calculo que toma N mediciones, calcula la suma de los cuadrados, lo divide por N y aplica raíz. Los ADE... veo que aplican otro concepto y se ve en el dominio de la frecuencia, que es que al realizar el cuadrado de la señal analógica, el resultado tiene una componente en 0Hz y otra en 100Hz, y los que nos interesa es solo dejar la componente en 0Hz que aplicándole raíz cuadrada representa el valor RMS, y por ello se aplica un filtro pasa-bajos.



Saludos!

Título: Re: Medidor de Energía con MCP3909
Publicado por: bigluis en 29 de Abril de 2011, 23:38:34
:( Pues esa es una de las cosas que no entiendo, pero según las notas de aplicación de Microchip es necesario hacer 8 filtros IIR de primer orden, 6 filtros pasa bajos despues de las multiplicaciones y 2 filtros pasa alto antes de las multiplicaciones, aunque considero que los filtros pasa alto del MCP3909 nos evitan el trabajo de implementarlos en el PIC (Ver AN1291, pag. 3).

A continuación muestro el diagrama de flujo de la nota de aplicación del Medidor Trifásico.
(http://www.todopic.com.ar/foros/index.php?action=dlattach;topic=34506.0;attach=15627)

Y la siguiente figura muestra el diagrama de flujo del Medidor de Energía Monofásico con una resitencia Shunt.
(http://www.todopic.com.ar/foros/index.php?action=dlattach;topic=34506.0;attach=15629)

No recuerdo en cual de las 2 notas de aplicación leí que era recomendable que los filtros pasa bajo tengan una frecuencia de corte de 9Hz para eliminar la componente de AC de 50Hz de la línea.
Título: Re: Medidor de Energía con MCP3909
Publicado por: Suky en 30 de Abril de 2011, 01:01:26
Claro, Microchip implementa por software lo que realizan los ADE... por hardware  :tongue: Revisa en el datasheet de algún ADE, en la sección de calculo de RMS explican un poco como es el proceso. Yo mucho en eso no he profundizado como para indicar cual es la frecuencia de corte adecuada, pero debe andar alrededor de los 10Hz. Eso si, con un filtro de orden 1 es suficiente?


Ahora el ultimo comentario que realizas, un filtro pasa-bajos para eliminar la componente DC? Entiendo que es pasa-altos, pero en ese caso el MCP ya lo tiene incluido en el hardware, solo hay que habilitarlo.

Saludos!
Título: Re: Medidor de Energía con MCP3909
Publicado por: bigluis en 30 de Abril de 2011, 01:12:24
Ahora el ultimo comentario que realizas, un filtro pasa-bajos para eliminar la componente DC? Entiendo que es pasa-altos, pero en ese caso el MCP ya lo tiene incluido en el hardware, solo hay que habilitarlo.

 :oops: Si me equivoque, los filtros pasa bajos son para eliminar la componentes AC y dejar solo las componentes DC ya que estas al final son las potencias activa y aparente.
Título: Re: Medidor de Energía con MCP3909
Publicado por: Suky en 30 de Abril de 2011, 01:17:18
Ahora el ultimo comentario que realizas, un filtro pasa-bajos para eliminar la componente DC? Entiendo que es pasa-altos, pero en ese caso el MCP ya lo tiene incluido en el hardware, solo hay que habilitarlo.

 :oops: Si me equivoque, los filtros pasa bajos son para eliminar la componentes AC y dejar solo las componentes DC ya que estas al final son las potencias activa y aparente.


Aaa! Ahí si, ya se da un valor como para comenzar...Yo lo utilizaría para todos los filtros pasa-bajos, ya que tienen la misma idea. Fíjate que utilizando la página para el diseño de un filtro, para orden 1 es muy sencillo. Hay que seleccionar orden, frecuencia de muestreo y frecuencia de corte.


Saludos!
Título: Re: Medidor de Energía con MCP3909
Publicado por: MGLSOFT en 30 de Abril de 2011, 09:23:32
Yo pedí muestras del CS5463 de Cirrus Logic, a ver como va la cosa. :mrgreen: :mrgreen:
Título: Re: Medidor de Energía con MCP3909
Publicado por: Suky en 30 de Abril de 2011, 12:26:05
Yo pedí muestras del CS5463 de Cirrus Logic, a ver como va la cosa. :mrgreen: :mrgreen:

Tengo rutinas en C30 probadas con un dispositivo similar, ya voy a publicar algo  ;-)

Saludos!
Título: Re: Medidor de Energía con MCP3909
Publicado por: Suky en 30 de Abril de 2011, 12:42:59
 :undecided:  Estoy viendo el datasheet de un ADE78xx, y veo que aplicar el filtro pasa-bajos reemplaza la operación de dividir por N, o estoy equivocado? Porque entiendo que la sumatoria de los cuadrados debe hacerse, y aplicar la raíz también, entonces que beneficios tiene hacerlo de esa manera? Será porque se implementa por hardware? Porque si se toman 2N muestras, realizar la división es rotar N veces a la derecha  :tongue:


Saludos!
Título: Re: Medidor de Energía con MCP3909
Publicado por: bigluis en 30 de Abril de 2011, 14:47:34
Yo tengo entendido que es necesario aplicar la sumatoria y la division entre N y luego la raíz cuadrada para obtener los valores RMS y tamién se deben filtrar los valores despues de sacar los cuadrados y antes de la sumatoria.

La diferencia que hay en los ADE es que ellos no calculan el valor RMS del voltaje sino que calculan el valor absoluto, lo que creo que es tomar el valor mas alto de la señal, ya que me imagino que el voltaje no varía tanto como la corriente y sale mucho más facil obtener el valor mayor que obtener el valor RMS. A continuación muestro una imagen del flujo de la señal en el ADE7753.

(http://www.todopic.com.ar/foros/index.php?action=dlattach;topic=34506.0;attach=15641)
Título: Re: Medidor de Energía con MCP3909
Publicado por: Suky en 30 de Abril de 2011, 17:51:29
Yo tengo entendido que es necesario aplicar la sumatoria y la division entre N y luego la raíz cuadrada para obtener los valores RMS y tamién se deben filtrar los valores despues de sacar los cuadrados y antes de la sumatoria.

No, o uno o el otro. Está claro en lo que marcas como Obtiene Irms. El tema del filtro en éste caso es para realizar un calculo.

Después tienes que colocar un LPF a la entrada, como filtro anti-aliasing (analógico) y la opción de agregar un filtro pasa-bajos después del conversor (digital) como para solo dejar la señal de 50/60Hz.


Saludos!
Título: Re: Medidor de Energía con MCP3909
Publicado por: Menta en 10 de Junio de 2011, 18:19:48
Esto sería una especie de resumen del datasheet que provee microchip sobre el MCP3909, la realicé hace algunos meses, espero que les sea de utilidad a más de uno. Está casi completo y en formato .doc así que los errores que encuentren los modifican y listo y si quieren terminarlo, lo terminan también falta poquito. Y sería muy bueno que si hacen algo de eso suban el resultado aquí par que le sirva a otros.
Saludos.