Autor Tema: (Solucionado) Ayuda con SPI y CS5463  (Leído 22446 veces)

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

Desconectado cyberpex

  • PIC10
  • *
  • Mensajes: 10
(Solucionado) Ayuda con SPI y CS5463
« en: 06 de Junio de 2011, 13:01:05 »
Hola Amigos de TodoPic.

Siempre he entrado al foro y me he nutrido de conocimientos y por lo general, las respuestas a mis preguntas las he encontrado con el buscador.

Esta vez estoy trabajando en un proyecto para hacer un medidor de energía monofásico y no he encontrado mucha ayuda al respecto.

Inicialmente lo pensé con un integrado especializado de Sames, el SA9903.

Me fue imposible conseguirlo (soy de Chile) y finalmente obtuve una solución alternativa de Cirrus Logic, el CS5463.

Lamentablemente, me ha dado más dolores de cabeza de lo pensado, viene en un encapsulado SSOP24 y necesita de un cristal de 4.096MHz.

Para utilizarlo diseñé un PCB que me permite ubicarlo en un protoboard.



En el PCB se encuentra el CS5463 y el cristal de 4.096MHz por debajo del mismo.

Para probarlo realicé un pequeño programa que me permite enviar una trama en hexadecimal y recibir de vuelta la respuesta del integrado.

El código utilizado está escrito en CCS y usa el microcontrolador 18F252

Lo muestro a continuación

Código: [Seleccionar]
#include <18f252.h>
#fuses XT,NOWDT
#use delay(clock=4096000)
#use spi(MASTER, FORCE_HW, MODE=0, BITS=8)
#use rs232(baud=19200, uart1, ERRORS, stream=SERIE)

#include <stdlib.h>
#include <string.h>

//constantes
#define LED    PIN_B4
#define CS     PIN_B3
#define RESET  PIN_B6
#define INT    PIN_B1

//variables
char recibido[50];
int index=0, final;
int contador = 0;
int1 procesar=0;

//definicion de funciones
int gethex1(char digit);

#INT_RDA
void rda_isr()
{
   if(kbhit(SERIE))
   {
      recibido[index] = fgetc(SERIE);
      fputc(recibido[index], SERIE);
      
      if((recibido[index]!='\r')&&(recibido[index]!='\n')&&(recibido[index]!=0x08)&&(recibido[index]!=' ')&&(recibido[index]!='\t'))
      {
         if(index<50)
         {
            index++;
         }
         else
         {
            index=0;
         }        
      }
      else if ((recibido[index]==0x08))
      {
         if(index>0)
         {
            index--;
            recibido[index]='\0';
            
         }
      }
      else if ((recibido[index]=='\n'))
      {
         recibido[index]='\0';
         final=index;
         index=0;
         procesar=1;
      }      
   }  
}

#INT_TIMER0
void rtcc_isr()
{
   if(contador >0)
   {
      contador--;
   }
   else
   {
      contador = 8;
      output_toggle(LED);
   }
}

void main()
{
   int pos, comando, resultado;
   output_high(LED);
   delay_ms(1000);
   output_low(LED);
  
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   enable_interrupts(INT_TIMER0);
   enable_interrupts(INT_RDA);  
   enable_interrupts(GLOBAL);
   set_timer0(0);
   //output_high(RESET);
  
   fprintf(SERIE, "\f>");
   for(;;)
   {
      if(procesar)
      {
         pos=0;
         //fprintf(SERIE, "(procesando: %s)\r\n", recibido);
         output_low(CS);
         fprintf(SERIE, "=");
         while(pos<final)
         {
            comando=gethex1(recibido[pos]);
            pos++;            
            comando<<=4;
            comando+=gethex1(recibido[pos]);
            pos++;
            resultado = spi_xfer(comando);
            fprintf(SERIE, "%X", resultado);
            delay_ms(50);
            
         }
         fprintf(SERIE, "\r\n\r\n>");
         output_high(CS);  
         procesar = 0;
      }
  
   }
}

int gethex1(char digit)
{
   if(digit<='9')
      return(digit-'0');
   else
      return((toupper(digit)-'A')+10);
}

Para verificar su buen funcionamiento, en el bus SPI conecté una memoria SPI la M25X80VSIG (una bios de HP). Puedo leerla y escribirla sin problemas (el chip que mide energía está en el mismo Bus, pero su CS está en estado alto).

La verdad es que me he leído el datasheet del CS5463 bastante bien, pero no sé si me he pasado algo o estoy haciendo algo mal.
Hasta ahora se que hay tres tipos de órdenes:

  • Los comandos, que son de 1 byte y devuelven nada.
  • Las escrituras que son un byte con la orden y 3 bytes con el dato.
  • Las lecturas que son un byte con el registro y 3 bytes de relleno (SYNC0 o SYNC1), devuelven 3 bytes

Para pruebas, he cortocircuitado las entradas Vin+/Vin- y Iin+/Iin-, estoy usando el voltaje de referencia interno y he conectado VA+ VD+ GND y AGND (aparte de la conexión SPI).

Hasta ahora la memoria (que uso para probar el protocolo SPI) funciona bien y puedo leer y escribir, pero el medidor de energía algunas veces devuelve

Código: [Seleccionar]
>f8
=FF
>26fefefe
=5FFFF000

pero el resto de las veces hace:

Código: [Seleccionar]
>f8
=00
>26fefefe
=00000000

Ojalá alguien me pueda ayudar.

El datasheet lo encuentran en:
http://www.cirrus.com/cn/pubs/proDatasheet/CS5463_F3.pdf

una placa de desarrollo en la que baso mis conexiones:
http://www.cirrus.com/en/pubs/rdDatasheet/CDB5463U_DB2.pdf

la página de producto:
http://www.cirrus.com/en/products/cs5463.html

Saludos
« Última modificación: 15 de Junio de 2011, 04:14:03 por cyberpex »

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7912
Re: Ayuda con SPI y CS5463
« Respuesta #1 en: 06 de Junio de 2011, 14:55:15 »
Estoy armando mi placa, así que en poco tiempo estaré haciendo mis primeros pinos con este integrado.
Allí te escribiré experiencias...
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Ayuda con SPI y CS5463
« Respuesta #2 en: 06 de Junio de 2011, 17:19:10 »
Hola! Te comento, yo he trabajado con el CS5461A, y es muy parecido al CS5463.

La frecuencia del cristal no es tan estricta, o sea puede tomar valores entre 1MHz y 5Mhz si no recuerdo mal. Pero, para que no haya falta de sincronismo entre la frecuencia de red y la frecuencia de muestreo la frecuencia elegida debería ser:

FrecuenciaSeñal x 1024 x Npc

Donde Npc es la cantidad de ciclos de computación por ciclo de señal. Fíjate que el CS permite configurar los ciclos de computación (N), para calcular por ejemplo los valores RMS, mediante el registro  Cycle Count Register, pero este no es estrictamente Npc sino un múltiplo. Por ejemplo, si la señal de red es 50Hz y pretendo ocupar 100ms para calcular el valor RMS, N=5*Npc.

Fíjate que si Npc es igual a 80, entonces la frecuencia del cristal debería ser 4096000Hz, y si deseo tomar 1seg de muestras para calcular los valores RMS N debería de colocarlo en 50*80=4000, valor que viene por defecto  ;-)

Como ves, podes elegir un valor de frecuencia del cristal más comercial (de la zona) y modificar el valor de N para que el error sea mínimo.

Respecto a la configuración, SPI debe configurarse en modo CKE=1, CKP=0, frecuencia máxima 2MHz. Para la inicialización hago lo siguiente:


Código: [Seleccionar]
PIN_CS5461=0;
vWriteSPI_CS5461A(0x80); // Reset por software...
PIN_CS5461=1;
__delay_us(200);

PIN_CS5461=0;
vWriteSPI_CS5461A(0x40); // Registro de configuración
vWriteSPI_CS5461A(0x00);
vWriteSPI_CS5461A(0x00); // Int activo bajo
vWriteSPI_CS5461A(0x61); // HPF=1, K=1;
PIN_CS5461=1;

PIN_CS5461=0;
vWriteSPI_CS5461A(0x4A);
vWriteSPI_CS5461A(0x00);
vWriteSPI_CS5461A(0x0F);
vWriteSPI_CS5461A(0x3C); // N=3900 -> 4Mhz ~ 1s
PIN_CS5461=1;

//----------------------------------
PIN_CS5461=0;
vWriteSPI_CS5461A(0x5E);
vWriteSPI_CS5461A(0xFF);
vWriteSPI_CS5461A(0xFF);
vWriteSPI_CS5461A(0xFF);       // Borramos todos los bits de STATUS
PIN_CS5461=1;

PIN_CS5461=0;
vWriteSPI_CS5461A(0x74);
vWriteSPI_CS5461A(0x80);
vWriteSPI_CS5461A(0x00);
vWriteSPI_CS5461A(0x00); // Mask = 0x800000 -> INT=DRDY Ciclo de computado terminado
PIN_CS5461=1;

//----------------------------------
PIN_CS5461=0;
vWriteSPI_CS5461A(0xE8); // Conversion continua
PIN_CS5461=1;

Con ello te permite testear el pin INT el cual te indicará que ha terminado el ciclo de computación y realizar la lectura:

Código: [Seleccionar]
void vReadCS5461A(void){

PIN_CS5461=0;
vWriteSPI_CS5461A(0x16); // Leemos IRMS
ValueIRMS.HB=ucReadSPI_CS5461A(0xFF);
ValueIRMS.MB=ucReadSPI_CS5461A(0xFF);
ValueIRMS.LB=ucReadSPI_CS5461A(0xFF);
PIN_CS5461=1;

PIN_CS5461=0;
vWriteSPI_CS5461A(0x18); // Leemos VRMS
ValueVRMS.HB=ucReadSPI_CS5461A(0xFF);
ValueVRMS.MB=ucReadSPI_CS5461A(0xFF);
ValueVRMS.LB=ucReadSPI_CS5461A(0xFF);
PIN_CS5461=1;

PIN_CS5461=0;
vWriteSPI_CS5461A(0x5E);
vWriteSPI_CS5461A(0x80);
vWriteSPI_CS5461A(0x00);
vWriteSPI_CS5461A(0x00); // Borramos todos los bits de STATUS
PIN_CS5461=1;
}

ValueIRMS y ValueVRMS son variables de 24-bits, en donde 0xFFFFFF = 250mV. En mi caso al tomar los primeros valores, los resultados obtenidos (sin ningún tipo de calibración) eran un % menor al real, y diferente en cada canal, pero realizando la calibración de ganancia AC eso mejora y los resultados son muy buenos.


Saludos!


« Última modificación: 06 de Junio de 2011, 17:22:16 por Suky »
No contesto mensajes privados, las consultas en el foro

Desconectado cyberpex

  • PIC10
  • *
  • Mensajes: 10
Re: Ayuda con SPI y CS5463
« Respuesta #3 en: 14 de Junio de 2011, 12:43:16 »
Gracias!!!

Estoy gratamente sorprendido de que me respondieran tan pronto, lamentablemente, no había tenido tiempo de revisar.

La gente de Cirrus todavía no me responde los correos que envié antes de postear en el foro.

Muchas Gracias Suky, probaré la inicialización en tanto tenga un poco de tiempo libre y te comento los resultados!!

Muchas gracias por la pronta respuesta. (También a MGLSOFT)
« Última modificación: 15 de Junio de 2011, 15:31:14 por cyberpex »

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Ayuda con SPI y CS5463
« Respuesta #4 en: 14 de Junio de 2011, 13:37:18 »
La gente de Cirrus todavía no me responde los correos que envié antes de postear en el foro.

Parece que no son de responder, yo hace más de un mes les escribí y todavía los espero  :? Suerte que no soy de quedarme esperando  :D


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

Desconectado cyberpex

  • PIC10
  • *
  • Mensajes: 10
Re: Ayuda con SPI y CS5463
« Respuesta #5 en: 15 de Junio de 2011, 01:42:46 »
Hola Suky...
debo agradecerte muchísimo la ayuda...

estuve haciendo puebas hasta ahora y finalmente lo conseguí. Lamentablemente, no era por un tema de software, sino por un error humano. la alimentación VA+ estaba cortada.

Ahora recibo datos, aunque no son estables, veré si funciona correctamente leyendo los otros registros...

adjunto el código optimizado, que inicializa el chip de Cirrus y lee temperatura, IRMS y VRMS por si le sirve a alguien

Código: [Seleccionar]
#include <18f252.h>
#fuses HS,NOWDT
#use delay(clock=20MHz)
#use spi(FORCE_HW, MODE=0, MASTER, stream=MYSPI, BITS=32)
#use rs232(baud=19200, uart1, ERRORS, stream=SERIE)

//constantes
#define LED    PIN_B4
#define RESET  PIN_B5
#define INT    PIN_B1

//variables globales

//definicion de funciones

void CS5463_init()
{
   // Software reset
   spi_xfer(MYSPI, 0x80, 8);
   delay_ms(200);
   
   //Registro de configuración: Int activo bajo; HPF=1, K=1
   spi_xfer(MYSPI, 0x40000061);
   
   //N=4000  cristal de 4,096MHz
   spi_xfer(MYSPI, 0x4A000FA0);
   
   // Borrar todos los bits de STATUS
   spi_xfer(MYSPI, 0x5E000000);
   
   // Mask=0x800000 -> INT=DRDY Ciclo de computado terminado
   spi_xfer(MYSPI, 0x74800000);
   
   //Conversión contínua
   spi_xfer(MYSPI, 0xE8, 8);   
}


void main()
{
   int32 recibido;
   output_high(LED);
   delay_ms(1000);
   output_low(LED);
   
   fprintf(SERIE, "Iniciando dispositivo...");
   output_low(RESET);
   delay_ms(200);
   output_high(RESET);
   delay_ms(100);
   CS5463_init();   
   fprintf(SERIE, "OK\r\n\r\n");
   
   for(;;)
   {
      // Lee Temperatura
      recibido=spi_xfer(MYSPI, 0x26FFFFFF);
      fprintf(SERIE, "Temperatura: \t%LX\r\n", recibido);     
     
      // Lee IRMS
      recibido=spi_xfer(MYSPI, 0x16FFFFFF);
      fprintf(SERIE, "Corriente: \t%LX\r\n", recibido);
     
      // Lee VRMS
      recibido=spi_xfer(MYSPI, 0x18FFFFFF);
      fprintf(SERIE, "Voltaje: \t%LX\r\n", recibido);
     
      // Borra todos los bits de STATUS
      spi_xfer(MYSPI, 0x5E800000);
     
      delay_ms(1000);
   }

Debo comenrtar que las entradas Vin+- y Iin+- estan cortocircuitadas, para que la entrada del comparador  sea cero, aunque, todavía no calibro el chip.

dejaré el tema abirto hasta que verifique que funciona bien...

Saludos a todos y muchas gracias

Desconectado cyberpex

  • PIC10
  • *
  • Mensajes: 10
(Solucionado) Ayuda con SPI y CS5463
« Respuesta #6 en: 15 de Junio de 2011, 04:13:37 »
Finalmente funciona!!

Pongo el código que muestra el valor de las variables (en hexa) refresca cada 5 segundos y manda la info por serie:

Código: [Seleccionar]
#include <18f252.h>
#fuses HS,NOWDT
#use delay(clock=20MHz)
#use spi(FORCE_HW, MODE=0, MASTER, stream=MYSPI, BAUD=400000, BITS=8)
#use rs232(baud=19200, uart1, ERRORS, stream=SERIE)

//constantes
#define INT    PIN_B1
#define CS     PIN_B3
#define LED    PIN_B4
#define RESET  PIN_B5

const char VARIABLE[32][30]=
{  
   "Configuration................",
   "Current DC Offset............",
   "Current Gain.................",
   "Voltage DC Offset............",    
   "Voltage DC Gain..............",      
   "N............................",      
   "Pulse Rate...................",      
   "Instantaneous Current........",      
   "Instantaneous Voltage........",      
   "Instantaneous Power..........",      
   "Active Power.................",      
   "RMS Current..................",      
   "RMS Voltage..................",      
   "Epsilon......................",      
   "Power Offset.................",      
   "Status.......................",      
   "Current AC Offset............",      
   "Voltage AC Offset............",      
   "Operation Mode...............",      
   "Temperature..................",      
   "Average Reactive Power.......",      
   "Instantaneous Reactive Power.",      
   "Peak Current.................",      
   "Peak Voltage.................",    
   "Reactive Power (Triangle)....",      
   "Power Factor.................",      
   "Interrupt Mask...............",      
   "Apparent Power...............",      
   "Control......................",      
   "Harmonic Active Power........",      
   "Fundamental Active Power.....",      
   "Fundamental Reactive Power..."
};
      
//Comandos
#define CONFIG       0
#define I_DCOFF      1
#define I_GN         2
#define V_DCOFF      3
#define V_GN         4
#define CYCLECOUNT   5
#define PULSERATEE   6
#define I            7
#define V            8
#define P            9
#define P_ACTIVE     10
#define I_RMS        11
#define V_RMS        12
#define EPSILON      13
#define P_OFF        14
#define STATUS       15
#define I_ACOFF      16
#define V_ACOFF      17
#define MODE         18
#define T            19
#define Q_AVG        20
#define Q            21
#define I_PEAK       22
#define V_PEAK       23
#define Q_TRIG       24
#define PF           25
#define MASK         26
#define S            27
#define CTRL         28
#define P_H          29
#define P_F          30
#define Q_F          31



//variables globales

//definicion de funciones

void CS5463_init()
{
   // Software reset
   output_low(CS);
   spi_xfer(0x80);
   output_high(CS);
   delay_ms(200);
  
   //Registro de configuración: Int activo bajo; HPF=1, K=1
   output_low(CS);
   spi_xfer(0x40);
   spi_xfer(0x00);
   spi_xfer(0x00);
   spi_xfer(0x61);
   output_high(CS);
    
   //N=4000  cristal de 4,096MHz
   output_low(CS);
   spi_xfer(0x4A);
   spi_xfer(0x00);
   spi_xfer(0x0F);
   spi_xfer(0xA0);
   output_high(CS);
  
   // Borrar todos los bits de STATUS
   output_low(CS);
   spi_xfer(0x5E);
   spi_xfer(0x00);
   spi_xfer(0x00);
   spi_xfer(0x00);
   output_high(CS);
  
   // Mask=0x800000 -> INT=DRDY Ciclo de computado terminado
   output_low(CS);
   spi_xfer(0x74);
   spi_xfer(0x80);
   spi_xfer(0x00);
   spi_xfer(0x00);
   output_high(CS);
  
   //Conversión contínua
   output_low(CS);
   spi_xfer(0xE8);    
   output_high(CS);
  
}

int32 leer_CS5463(int registro)
{
   int h_byte, m_byte, l_byte;
   output_low(CS);
   spi_xfer(registro<<1);
   h_byte=spi_xfer(0xff);
   m_byte=spi_xfer(0xff);
   l_byte=spi_xfer(0xff);
   output_high(CS);
   return(make32(0,h_byte,m_byte,l_byte));  
}


void main()
{
   int32 resultado;
   int cont, temperatura;
   output_high(LED);
   delay_ms(1000);
   output_low(LED);
  
   fprintf(SERIE, "\fIniciando dispositivo...");
   output_low(RESET);
   delay_ms(200);
   output_high(RESET);
   delay_ms(100);
   CS5463_init();  
   fprintf(SERIE, "OK\r\n\r\n");
   delay_ms(500);
  
   for(;;)
   {
      fprintf(SERIE, "\f");      
      for(cont=0; cont<32;cont++)
      {
         resultado = leer_CS5463(cont);
         fprintf(SERIE, "%s%LX",VARIABLE[cont], resultado);
         if(cont%2)
            fprintf(SERIE, "\r\n");
         else
            fprintf(SERIE, "   ");        
      }
      
      //Temperatura
      resultado = leer_CS5463(T);
      temperatura = make8(resultado, 2);
      fprintf(SERIE, "\r\n Temperatura actual: %d grados Celsius",temperatura);
      
      delay_ms(5000);
   }
}

Y la salida del terminal es:



Falta por comprobar los valores agregando la etapa de alterna y calibrar el dispositivo.

En tanto tenga la placa definitiva cuelgo algo, para el que le pueda servir.

Saludos


Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: (Solucionado) Ayuda con SPI y CS5463
« Respuesta #7 en: 15 de Junio de 2011, 10:32:06 »
Buenísimo! Vas a observar, por lo menos me paso, que en AC hay que calibrar, pero hecho eso los resultados son muy buenos y se mantiene una excelente linealidad en todo el rango.


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

Desconectado bolso103

  • PIC10
  • *
  • Mensajes: 20
Re: (Solucionado) Ayuda con SPI y CS5463
« Respuesta #8 en: 03 de Agosto de 2011, 12:44:55 »
Hola muchachos,

Muy buen post, los felicito, me ha nutrido de información muy valiosa.
Estoy armando un proyecto con medidores CS5463 y MCU's ATMEGA128RFA1 (con protocolo ZigBee incorporado). La idea es conectar varios CS5463 en distintos toma corrientes de una casa, conectados por SPI a varios ATMEGA128RFA1, que tienen una antena donde transmiten la información de las mediciones a un MCU central donde se lo conecta a un PC.
He leído muchas veces el datasheet del Cirrus, pero la misma no es muy extensa en lo que refiere al bootloader. En la sección 8.1 dice algo así como Auto-boot Configuration. Por lo que entendí, la idea es poder cambiar los registros asignados por defecto y comenzar a registrar los valores de energía (tensión RMS, corriente, factor de potencia, etc, etc). Para ello, compré una de las EEPROM's SPI sugeridas por el fabricante: la AT25020A. Cirrus ofrece una secuencia como ejemplo, pero la misma no es muy clara, y no le encontré mucha utilidad. ¿Cómo lograron uds. decirle al CS5463  que comience a guardar valores en sus registros internos? ¿Tal vez no es necesario, y lo hace automático, sin necesidad del auto-boot secuence?

Gracias y saludos,
Gabriel

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: (Solucionado) Ayuda con SPI y CS5463
« Respuesta #9 en: 03 de Agosto de 2011, 13:07:43 »
Entiendo que el Auto-boot Configuration es para que el CS tomé la configuración de los registros de calibración desde una memoria externa y después comience a trabajar. Fíjate que enviando el comando 0xE8 el CS convierte continuamente...

Yo por ejemplo no uso eeprom, las configuraciones de cada CS están dentro de la memoria del micro y se establece cuando se inicia.

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

Desconectado bolso103

  • PIC10
  • *
  • Mensajes: 20
Re: (Solucionado) Ayuda con SPI y CS5463
« Respuesta #10 en: 03 de Agosto de 2011, 14:11:47 »
Entiendo que el Auto-boot Configuration es para que el CS tomé la configuración de los registros de calibración desde una memoria externa y después comience a trabajar. Fíjate que enviando el comando 0xE8 el CS convierte continuamente...

Yo por ejemplo no uso eeprom, las configuraciones de cada CS están dentro de la memoria del micro y se establece cuando se inicia.

Saludos!

Así que tal vez no sea necesaria ni la EEPROM ni ningún programador?

Gracias,
Gabriel

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: (Solucionado) Ayuda con SPI y CS5463
« Respuesta #11 en: 03 de Agosto de 2011, 14:16:16 »
No es necesario, es un adicional que se ofrece.


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

Desconectado bolso103

  • PIC10
  • *
  • Mensajes: 20
Re: (Solucionado) Ayuda con SPI y CS5463
« Respuesta #12 en: 03 de Agosto de 2011, 14:20:23 »
No es necesario, es un adicional que se ofrece.


Saludos!

Gracias Suky! Me has alegrado el día. Mandé las placas a soldar, en cuanto estén prontas, intentaré recabar datos desde el micro. Los mantendré informados.

Saludos,
Gabriel

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: (Solucionado) Ayuda con SPI y CS5463
« Respuesta #13 en: 03 de Agosto de 2011, 14:22:57 »
Hechas las placas lo que queda es calibrarlos individualmente, guardar esos valores que son lo que se establecen al inicializar el dispositivo. Los valores los podes guar en la memoria del microcontrolador  ;-)


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

Desconectado bolso103

  • PIC10
  • *
  • Mensajes: 20
Re: (Solucionado) Ayuda con SPI y CS5463
« Respuesta #14 en: 18 de Agosto de 2011, 18:37:45 »
Hola nuevamente,

He terminado la interfaz a la red monofásica. La hice como sugiere el fabricante, a través de un shunt resistor de 5m ohm y un divisor de tensión con una resistencia de 470ohm, y la otra de 1Mohm. En el divisor se utilizaron dichos valores para tener un voltaje de 106.07mV RMS, mientras que el shunt es de 5m ohm para una tensión de 106.07mV RMS y una corriente de 20A RMS.
En cuanto a las resistencias y capacitores que se utilizan para filtrar el ruido (la hoja de datos no da los valores), utilicé todas las resistencias de 100ohm (RI+, RI-, RV+, RV-), los capacitores:

CV+=4.7nF
CV-=100pF
CI+=0.1uF
CI-=0.1uF
CVDiff=4.7nF
No estoy utilizando CIDiff.

En cuanto a la tierra (ACGND), uní las intersecciones de todos los capacitores (salvo CVDiff), de igual forma que lo sugiere Cirrus, y conecté la unión al vivo de la línea.

Para testear el funcionamiento, conecté la pinza del osciloscopio (negativo) a ACGND, y la punta (positivo) a la salida VIN+. Con esto, tome una fotografía, para ver la forma de onda. Obtuve la siguiente imagen:



Luego hice lo mismo, pero para la corriente. Obtuve la siguiente imagen:



Para la primera, Vpico=240mV
Para la segunda, Vpico=130mV

Claramente se ve que la forma de onda esta distorcionada. Lo curioso, es que no varió la forma de onda al conectarle carga. Nota: no conecté el Cirrus para evitar fallas.

FINALMENTE, conecté la pinza del osciloscopio a VIN- y la punta a VIN+, deseando ver una hermosa onda senoidal de 106mVRMS. (Sin carga). Resultado: se quemó instantáneamente la resistencia de 100ohm RV-. Y no comprendo porque (todas las resistencias de 100ohm son de 1/4W, mientras que las del divisor son de 2W).

Qué experiencias han tenido ustedes con la interfaz analógica?

Saludos,
Gabriel