TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: murphy9 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);
}
}
-
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...
-
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
-
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.
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;
}
}
-
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