Autor Tema: Medidor de Energía con MCP3909  (Leído 14217 veces)

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

Desconectado bigluis

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 511
    • Tutoriales de Qt C++
Medidor de Energía con MCP3909
« 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

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:
  • Según la Nota de Aplicación de Microchip se deben medir el voltaje y la corriente instantaneos y a partir de estos valores calcular el desfase, la potencia activa, la potencia reactiva y la potencia aparente, por lo tanto me gustaría saber como se realizan estos cálculos.
  • Será suficiente que utilice el PIC18Fxx5x sin necesidad de utilizar un segundo PIC como muestra la Nota de Aplicación.
  • Sería más eficiente realizar cálculos con variables tipo Float de 32 bits que con variables de 40bits o 64bits
  • Según la nota de aplicación se deben recojer aproximadamente 128 muestras del AFE, y si la frecuencia de la línea es de 60Hz entonces deberíamos recoger muestras cada 130us aproximadamente, entonces ¿Hay suficiente tiempo para realizar los cálculos?
  • Para realizar el cálculo de la raíz cuadrada de un número se necesitan aproximadamente 1ms ¿Será necesario utilizar algún tipo de RTOS?



A continuación dejo los archivos adjuntos.
« Última modificación: 23 de Abril de 2011, 16:55:22 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: Medidor de Energía con MCP3909
« Respuesta #1 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:

  • Sabemos que si tomamos 2N muestras, para realizar divisiones o multiplicaciones el calculo es más eficiente en tiempo de cómputo, por ello es que se debe seleccionar entre muestrear 256, 128 o 64 muestras por ciclo. Luego se sabe que el MCP3909 tiene una frecuencia de muestreo de MCKL/256, entonces si se quiere obtener 256 muestras por ciclos se debe otorgar MCKL=60Hz x 256 CiclosPorMuestra x 256 Muestras = 3932160 Hz.
  • Si la frecuencia no tiene el valor calculado o la señal no es exactamente de 60Hz provoca que las 256 muestras tomadas no correspondan exactamente a un ciclo de la señal lo cual para un calculo acumulado de IRMS o VRMS provoca un error. Hace un tiempo realice el siguiente analisis en MATLAB:
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');




  • Para saber cuando el MPC3909 dispone de datos a convertir debes dejar el CS=0 y esperar el pulso denominado DR sobre la linea SDO, puedes usar el módulo de comparación y generar una interrupción cada 1, 4 o 16 flancos para un micro de la serie 18F, con lo cual disminuyes la tasa de muestreo.
  • El tema de determinar si tienes suficiente tiempo como para realizar los cálculos no te queda otra que simular la recepción de datos,  desarrollar los calculos necesarios y determinar el tiempo de computo  :tongue:
  • Otra opción que puedo darte es utilizar un chip de Cirrus (los cuales entregan samples) que entregan el valor RMS cada cierto tiempo de computo totalmente configurable ahorrándote mucho trabajo y permitiendo ocupar el microcontrolador para la interface con el usuario.




Saludos!

« Última modificación: 23 de Abril de 2011, 15:03:13 por Suky »
No contesto mensajes privados, las consultas en el foro

Desconectado bigluis

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 511
    • Tutoriales de Qt C++
Re: Medidor de Energía con MCP3909
« Respuesta #2 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.
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: Medidor de Energía con MCP3909
« Respuesta #3 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!
« Última modificación: 23 de Abril de 2011, 00:10:54 por Suky »
No contesto mensajes privados, las consultas en el foro

Desconectado bigluis

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 511
    • Tutoriales de Qt C++
Re: Medidor de Energía con MCP3909
« Respuesta #4 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

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?
« Última modificación: 22 de Abril de 2011, 20:08:08 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: Medidor de Energía con MCP3909
« Respuesta #5 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

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!
No contesto mensajes privados, las consultas en el foro

Desconectado bigluis

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 511
    • Tutoriales de Qt C++
Re: Medidor de Energía con MCP3909
« Respuesta #6 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);
   
   
}
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: Medidor de Energía con MCP3909
« Respuesta #7 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!
No contesto mensajes privados, las consultas en el foro

Desconectado MGLSOFT

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 7912
Re: Medidor de Energía con MCP3909
« Respuesta #8 en: 23 de Abril de 2011, 08:14:32 »
Seguiré el tema, esta interesante...
Sobre el hardware ya tienes algo hecho??
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado bigluis

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 511
    • Tutoriales de Qt C++
Re: Medidor de Energía con MCP3909
« Respuesta #9 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.
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: Medidor de Energía con MCP3909
« Respuesta #10 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!
No contesto mensajes privados, las consultas en el foro

Desconectado bigluis

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 511
    • Tutoriales de Qt C++
Re: Medidor de Energía con MCP3909
« Respuesta #11 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
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: Medidor de Energía con MCP3909
« Respuesta #12 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!
No contesto mensajes privados, las consultas en el foro

Desconectado bigluis

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 511
    • Tutoriales de Qt C++
Re: Medidor de Energía con MCP3909
« Respuesta #13 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.
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 bigluis

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 511
    • Tutoriales de Qt C++
Re: Medidor de Energía con MCP3909
« Respuesta #14 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í.
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