This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

24位ADC(ADS131E08)经常出现完全错误的数据,求大家帮助

Other Parts Discussed in Thread: ADS131E08, ADS131E04

下面的这个问题弄了好久都没做到问题,特来求助大家,望版主开恩!
我使用ADS131E08这颗24bit ADC,但是8各通道采样数据经常出现完全错误的数据。
电路板上焊接了两颗ADC,采用共同的外部基准、外部晶振,电源(这两颗ADC芯片都是两个月前从TI申请的)。
两个ADC共16个通道都配置成采样ADC内部的测试信号。

问题描述:两颗ADC在采样过程中经常(大概每20次采样出现一次)会出现一些完全错误的数据,两颗ADC(编号分别为1、3)从那个错误的通道开始该ADC剩下的通道的数据都将是完全错误的,比如ADC1的第三个通道出问题了,那么4~8通道的数据都会是完全错误的。
错误数据如下:(3C1指的是编号为3的ADC的第一个通道,1C1是编号为1的ADC的第一个通道,以此内推)

第一组: 错误数据从第三行的3C5(-159)开始,3C6、3C7、3C8都是完全错误的,但是第一行和最后一行的数据又都是正常的。
3c1=   -1301,3c2=   -1237,3c3=   -1168,3c4=   -1185,3c5=   -1405,3c6=   -1480,3c7=   -1120,3c8=   -1162
1c1=   -1018,1c2=   -1248,1c3=   -1159,1c4=   -1311,1c5=   -1393,1c6=   -1429,1c7=   -1325,1c8=   -1166
3c1=   -1296,3c2=   -1246,3c3=   -1169,3c4=   -1185,3c5=    -159,3c6=  522367,3c7= -166400,3c8= -1587209
1c1=   -1071,1c2=   -1257,1c3=   -1147,1c4=   -1305,1c5=   -1408,1c6=   -1423,1c7=   -1338,1c8=   -1195
3c1=   -1307,3c2=   -1241,3c3=   -1165,3c4=   -1190,3c5=   -1405,3c6=   -1480,3c7=   -1121,3c8=   -1164

第二组数据:第三行1C6(-353)开始出现完全错误的数据,之后的1C7、1C8也都是错误的。
1c1=   -1040,1c2=   -1233,1c3=   -1131,1c4=   -1255,1c5=   -1408,1c6=   -1410,1c7=   -1311,1c8=   -1196
3c1=   -1306,3c2=   -1237,3c3=   -1160,3c4=   -1186,3c5=   -1391,3c6=   -1479,3c7=   -1121,3c8=   -1163
1c1=   -1035,1c2=   -1293,1c3=   -1142,1c4=   -1312,1c5=   -1406,1c6=    -353,1c7= 4193978,1c8=    -300
3c1=   -1297,3c2=   -1241,3c3=   -1162,3c4=   -1183,3c5=   -1403,3c6=   -1484,3c7=   -1120,3c8=   -1161
1c1=   -1015,1c2=   -1267,1c3=   -1155,1c4=   -1273,1c5=   -1399,1c6=   -1419,1c7=   -1290,1c8=   -1191

电路图在最下面
ADC部分程序如下:
void ADS131E08_Init(void)
{
  u8 i=0,j=0;
  GPIO_InitTypeDef GPIO_InitStruct;

  u8 ADS131E08_Test_Init[][2] = 
  {
      {0x96, CONFIG1},  // 24BIT  1KPS
      {0xF3, CONFIG2},   //内部产生测试信号
      {0x15, CH1SET},    //配置到采样内部测试信号的通道上
      {0x15, CH2SET},
      {0x15, CH3SET},
      {0x15, CH4SET},
      {0x15, CH5SET},
      {0x15, CH6SET},
      {0x15, CH7SET},
      {0x15, CH8SET},
   };
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); 
        SPI_mode_change_1(SPI_BaudRatePrescaler_32);     //SPI_CPOL = SPI_CPOL_Low;  SPI_CPHA = SPI_CPHA_2Edge;   84/32 MHz的SPI时钟             
        
        /* ADC_START */
        GPIO_InitStruct.GPIO_Pin = GPIO_Pin_3;
        GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;
        GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
        GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP;
        GPIO_InitStruct.GPIO_Speed = GPIO_Speed_25MHz;
        GPIO_Init(GPIOA, &GPIO_InitStruct);
        ADC_STOP;
        
        /*ADC_DRDY Configure PA0 pin as input floating */
        GPIO_InitStruct.GPIO_Pin = GPIO_Pin_4;
        GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN;
        GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP;
        GPIO_Init(GPIOA, &GPIO_InitStruct);
        
        ADC1_CS_LOW;
        ADC3_CS_LOW;
        SPI_SendByte(SPI1, RESET);   ]  
        delayms(750);        
        SPI_SendByte(SPI1, SDATAC); 
        ADC1_CS_HIGH;
        ADC3_CS_HIGH;
         
        for(i=0; i<sizeof(ADS131E08_Test_Init)/2; i++){ 
                for(j=1;j<4;j++){
                        ADS131E08_WriteReg(j, ADS131E08_Test_Init[1], ADS131E08_Test_Init[0]);
                        delayus(2);
                }
        }
        ADC_START;          
        
        ADC1_CS_LOW;
        ADC3_CS_LOW;
        delayus(1);
        SPI_SendByte(SPI1, RDATAC);  //Put the Device Back in RDATAC Mode  
        delayus(1);
        ADC1_CS_HIGH;
        ADC3_CS_HIGH;                    
}
void ADS131E08_Read(s32 *adc1buf,s32 *adc2buf,s32 *adc3buf)
{
        u8 ReadBuf[27],i=0;
        
        if(ADC_DRDY==0) 
        {
                ADC1_CS_LOW;
                for(i=0;i<27;i++){
                        ReadBuf=SPI_ReadByte(SPI1);  //连续读取ADC1的27个字节数据
                }
                ADC1_CS_HIGH;
                for(i=0;i<9;i++)     
                        adc1buf=ReadBuf[3*i]<<16 |ReadBuf[1+3*i]<<8 |ReadBuf[2+3*i];  //将27字节数据转化成9个24位的数据
                
                for(i=1;i<9;i++){                                  //将补码转化成原码       
                        if(adc1buf>=0x800000)        
                                adc1buf-=0xffffff;          
                }
                
                ADC3_CS_LOW;                                //连续读取ADC3的27个字节数据             
                for(i=0;i<27;i++){
                        ReadBuf=SPI_ReadByte(SPI1);
                        delayus(1);
                }
                ADC3_CS_HIGH;
                for(i=0;i<9;i++)     
                        adc3buf=ReadBuf[3*i]<<16 |ReadBuf[1+3*i]<<8 |ReadBuf[2+3*i]; //将27字节数据转化成9个24位的数据
                
                for(i=1;i<9;i++){                               //将补码转化成原码 
                        if(adc3buf>=0x800000)
                                adc3buf-=0xffffff;
                }
                printf("1c1=%8d,1c2=%8d,1c3=%8d,1c4=%8d,1c5=%8d,1c6=%8d,1c7=%8d,1c8=%8d\n",adc1buf[1],adc1buf[2],adc1buf[3],adc1buf[4],adc1buf[5],adc1buf[6],adc1buf[7],adc1buf[8]);
                printf("3c1=%8d,3c2=%8d,3c3=%8d,3c4=%8d,3c5=%8d,3c6=%8d,3c7=%8d,3c8=%8d\n",adc3buf[1],adc3buf[2],adc3buf[3],adc3buf[4],adc3buf[5],adc3buf[6],adc3buf[7],adc3buf[8]); 
        }
}

  • 由于这颗 ADC 芯片采用 Serial SPI   接口.

    猜测错误是串行传输引起的. 通道接收中是否遇到中断或其他因素的影响, 建议用示波器监控一下传输波形.

  • 识路前贤您好!小弟我最近在学习ADS131E04进行AD转换,遇到了问题,怎么就是没有转换结果出来

    快两个星期了,第一次搞DSP,简直头都大了。在网上看到您的帖子,不知您的问题现在搞定了吗?

    特在贵帖下求助,望您抽空指点一下,谢谢!

  • 看你的描述,很大可能是SPI通信接口的问题。

    可以将读到的错误的数据跟正确的做对比分析,看看是否是少读了一位、还是什么其他情况

    另外,看你的程序是IO口模拟的SPI,请用示波器检查时序是否满足要求

    请检查是否有其他中断干扰了spi的读取转换结果?

  •     TI大神您好,我想问一下为什么我的ADS131E04的输出引脚Dout只在 /CS引脚拉高的情况下才有高电平的输出,而且输出还是渐变的

           图中1为Dout输出端的信号图,2为片选信号。

        请问为什么会出现这种奇怪的现象呢?

  • 请问您的问题解决了吗 我也遇到和您一样的问题了