Autor Tema: Medicion de temperatura con pt100 usando el integrado ads1248  (Leído 2472 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado murphy9

  • PIC10
  • *
  • Mensajes: 21
Medicion de temperatura con pt100 usando el integrado ads1248
« en: 25 de Octubre de 2012, 10:30:49 »
Hola a todos me encuentro realizando un proyecto en el que necesito medir temperatura usando una pt100. Para ello opté por utilizar el conversor y acondicionador de señal ads1248 de texas instrument. Este integrado se comunica por spi y no tengo mucha experiencia en este tipo de transmision serie. He hecho algunos programas y no consigo comunicarme todavía, alguien tiene experiencia con este dispositivo o conoce algún otro que sirva para los mismos fines y de preferencia sea i2c?. Adjunto el programa que realicé por si alguien puede darme una mano. Les informo ademas que pongo un led en el pin de clock y este no enciende nunca por lo que sospecho que ni siquiera se establece la comunicación spi, estoy en lo correcto?. Desde ya agradezco sus respuestas


Programa:


#INCLUDE <18F4550.H>
#fuses XT,PUT,VREGEN,NOWDT,NOPROTECT,NOLVP,NODEBUG
#use delay(clock=4000000)
#define DA_SCL PIN_b1
#define DA_SDO PIN_c7
#define DA_SDI PIN_b0
#define DA_CS PIN_a0
#include <lcdpf.c>
#use spi(MASTER,CLK=DA_SCL, DO=DA_SDO, DI=DA_SDI, BITS=8, MODE=0, mSB_FIRST, stream=DA_spi,FORCE_SW)


int dato_spi1[]={120,51,23};
float dato;

//void main()
//{//setup_spi(SPI_MASTER | SPI_L_TO_H | SPI_CLK_DIV_16); //inicia el puerto SPI.
//   while(true)
//   {
//      output_low(DA_CS);
//     spi_xfer(DA_spi,0xb0);/* |4 bits dummy|10bits DA|2 bits x */
    //  spi_write(0xb0);
     
    //  delay_ms(500);
    //  output_high(DA_CS);
    //  delay_ms(500); 
   //}



void iniciar_ads(){
   spi_xfer(DA_spi,0x40);
   spi_xfer(DA_spi,0x01);// configura registro 00h (MUX 0) para Pt100
   spi_xfer(DA_spi,0x41);
   spi_xfer(DA_spi,0x00);;//configura el registro 01h (VBIAS)
   spi_xfer(DA_spi,0x42);
   spi_xfer(DA_spi,0x30);;//configura el registro 02h (MUX 1)
   spi_xfer(DA_spi,0x43);
   spi_xfer(DA_spi,0b01110001);//configura el registro 03h (SYSO)
   spi_xfer(DA_spi,0x4A);
   spi_xfer(DA_spi,0x07);// configura el registro 0Ah (IDAC 0) 
   spi_xfer(DA_spi,0x4B);
   spi_xfer(DA_spi,0x01);;// configura el registro 0Bh (IDAC 1)
   delay_ms(30);
   }

void main ()


   {
   set_tris_a(0);
   lcd_init();
   iniciar_ads();
 
   lcd_gotoxy(1,1);
   printf(lcd_putc,"temperatura %.2f   ",dato);
   lcd_gotoxy(1,2);
   printf(lcd_putc,"temperatura %u   ",dato_spi1[0]);
   lcd_gotoxy(1,3);
   printf(lcd_putc,"temperatura %u   ",dato_spi1[1]);
   lcd_gotoxy(1,4);
   printf(lcd_putc,"temperatura %u   ",dato_spi1[2]);
 
   delay_ms(1500);
   iniciar_ads ();
   while (true)
   {
     
         output_toggle(pin_a0);
         dato_spi1[0]=spi_xfer(0xff); //MSB
         dato_spi1[1]=spi_xfer(0xff);//MID BYTE
         dato_spi1[2]=spi_xfer(0xff);//LSB

         dato= ((long)dato_spi1[2]*64 + (long)dato_spi1[1]*8 + (long)dato_spi1[0])*0.002686;
         
         lcd_gotoxy(1,1);
         printf(lcd_putc,"temperatura %.4f  ",dato);
         lcd_gotoxy(1,2);
         printf(lcd_putc,"temperatura %02u   ",dato_spi1[0]);
         lcd_gotoxy(1,3);
         printf(lcd_putc,"temperatura %02u   ",dato_spi1[1]);
         lcd_gotoxy(1,4);
         printf(lcd_putc,"temperatura %02u   ",dato_spi1[2]);
         delay_ms(1000);
      }

 
   }

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7912
Re: Medicion de temperatura con pt100 usando el integrado ads1248
« Respuesta #1 en: 25 de Octubre de 2012, 10:50:28 »
No has probado usando otras librerías como base??
Esta el ADS8320 y el AD7715 y 7730 que deberían servirte para desarrollar la tuya...
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado murphy9

  • PIC10
  • *
  • Mensajes: 21
Re: Medicion de temperatura con pt100 usando el integrado ads1248
« Respuesta #2 en: 25 de Octubre de 2012, 12:05:41 »
Gracias por tu respuesta MGLSOFT, la verdad no había visto nada de eso, ahora mismo me pongo a investigar y cualquier cosa vuelvo por aqui

Desconectado fabienlepe

  • PIC10
  • *
  • Mensajes: 1
Re: Medicion de temperatura con pt100 usando el integrado ads1248
« Respuesta #3 en: 03 de Julio de 2013, 19:48:01 »
Que tal amigos, he trabajado con el pic32mx y con el ads1248 he logrado comicarme con el ads mediante SPI y leer la temperatura de un RTD pt100 de (100ohms) les dejo mi codigo para que vean lo que he hecho y saber si estoy correcto ya que mi tarjeta tiene fallas en la lectura pero no se porque.

Código: [Seleccionar]
void medir()
{
         putsUART1("***  MIDIENDO *** \r\n");
        ////////// OPEN SPI1 ////////////////////////////////////////
        openSPI1();
        ////////////////////// configuracion de los ADS1248 /////////////
        CS_ADS1248_1_LOW;
        delay(sec);
putcSPI1(0x06); // RESET
        delay(sec);
dummy=getcSPI1(); //dummy read
        putsUART1("***  Esperando ADS *** \r\n");
while(DRDY_ADS1248_1==1);
        ADS1248_config();
CS_ADS1248_1_HIGH;
        delay(sec);
        //////////////////////< configuracion de los ADS1248 /////////////     
}

void ADS1248_config (void){
 ////////////////////////Configuracion de los ADS1248/////////////////
       
unsigned char dummy=0;
putcSPI1(0x17);//0x17 // SDATAC
dummy=getcSPI1(); //dummy read
putcSPI1(0x40);  //0x40 //First Byte to Write register 0
dummy=getcSPI1(); //dummy read
putcSPI1(0x03);//0x03  //Second Byte Cantidad de registros a leer = 4 3+1
dummy=getcSPI1(); //dummy read
putcSPI1(0x01); //before 0x01  //MUX0   000=AIN0+(default)  001=AIN1-(default)
dummy=getcSPI1(); //dummy read
putcSPI1(0x00); //0x00  //VBIAS 0=Biasvoltagenotenabled(default)
dummy=getcSPI1(); //dummy read
putcSPI1(0x20);//0x20 //before 0x38   //MUX1 (0=Internal oscillatorin use, 01=Internal referenceis alwayson, 11=Onboardreferenceselectedandinternally connectedto REF0input pair, 000=Normaloperation(default))
dummy=getcSPI1(); //dummy read
putcSPI1(0x07);//0x17 //before 0x39   //******SYS0 PGA2 0x29=4PGA2 (PGA 000=1(default),001=2,010=4,011=8,100=16) y SPS(2000SPS) 1001 to 1111=2000SPS
dummy=getcSPI1(); //dummy read
/////////////////////////////
putcSPI1(0x4A);//0x4A   //First Byte to Write register 0x0A
dummy=getcSPI1(); //dummy read
putcSPI1(0x01);//0x01  //Second Byte Cantidad de registros a leer = 2 1+1
dummy=getcSPI1(); //dummy read
putcSPI1(0x06);//before 0x06   //****** IDAC0 000=off(default),001=50?A,010=100?A,011=250?A,100=500?A 101=750?A, 110=1000?A, 111=1500?A,
dummy=getcSPI1(); //dummy read
putcSPI1(0x01);//0x01   //IDAC1=0x01 (bits outputfirst firts current sourceDAC. 0000=AIN0, bits outputfirst second current sourceDAC 0001=AIN1
dummy=getcSPI1(); //dummy read
putcSPI1(0x14);//0x14 // RDATAC
dummy=getcSPI1(); //dummy read
        putsUART1("***  ADS CONFIGURADO *** \r\n");
       

}

void ADS1248()
{
    x=0;
while(x<=muestras){
        if(DRDY_ADS1248_1==0){
            CS_ADS1248_1_LOW;           
for(i=0;i<3;i++){
                    putcSPI1(0xFF);     // dummy byte a causa de que el SPI es dual envia y recibe al mismo tiempo
                    buff[i]=getcSPI1();
                    temp=SpiChnGetRov(1, TRUE);

                     if(((buff[0]>>7)&0x01)==0x01){
                         valores[x++] = 0xFF000000|(((buff[0]<<16)&0xFF0000)|((buff[1]<<8)&0xFF00)|((buff[2])&0xFF));//((buff[0]<<24)&0x80000000)
                     }else{
                         valores[x++] = (((buff[0]<<16)&0x7F0000)|((buff[1]<<8)&0xFF00)|((buff[2])&0xFF));//((buff[0]<<24)&0x80000000)
                    }
                }                         
                if(x>=muestras){
                    //x=0;
                    for(i=0;i<muestras;i++){
                        promedioRTD = promedioRTD+valores[i];
                        resultado= (promedioRTD/muestras);
                        temperatura = ((resultado*M_rtd)-(B_rtd));                 
                        promedioRTD=0;
                        resultado=0;
                    }
                   
                    sprintf(buffer_temp,"%.0f",temperatura);
                    putsUART1("Temperatura: ");
                    putsUART1(buffer_temp);
                    putsUART1("\r\n");
                    //medir();
                   
               }
                           
            }
           //delay(100E6);
            CS_ADS1248_1_HIGH;
           }
}


Desconectado murphy9

  • PIC10
  • *
  • Mensajes: 21
Re: Medicion de temperatura con pt100 usando el integrado ads1248
« Respuesta #4 en: 05 de Julio de 2013, 12:42:20 »
Hola, te comento que yo pude finalmente comunicarme y hacer funcionar este dispositivo. Lo que si debo decirte es que tuve innumerables problemas, sobre todo al principio cuando tenía que configurar la ganancia y demás parámetros. Pude solucionar mis problemas en un foro de Texas Instruments, si te sirve de algo te envío la pagina de donde resolví todas mis dudas: http://e2e.ti.com/support/data_converters/precision_data_converters/f/73/p/226895/803693.aspx#803693. Saludos