TI论坛
直播中

杨云

7年用户 828经验值
私信 关注
[问答]

两颗ADS131E08在采样过程中经常出现完全错误的数据,什么原因导致的?


  • 下面的这个问题弄了好久都没做到问题,特来求助大家,望版主开恩!
    我使用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=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=%8dn",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=%8dn",adc3buf[1],adc3buf[2],adc3buf[3],adc3buf[4],adc3buf[5],adc3buf[6],adc3buf[7],adc3buf[8]);
            }
    }

回帖(3)

王建

2024-12-12 09:34:12
  由于这颗 ADC 芯片采用 Serial SPI   接口.
猜测错误是串行传输引起的. 通道接收中是否遇到中断或其他因素的影响, 建议用示波器监控一下传输波形.
举报

王凯

2024-12-12 09:34:23
 看你的描述,很大可能是SPI通信接口的问题。
可以将读到的错误的数据跟正确的做对比分析,看看是否是少读了一位、还是什么其他情况
另外,看你的程序是IO口模拟的SPI,请用示波器检查时序是否满足要求
请检查是否有其他中断干扰了spi的读取转换结果?
举报

杨万富

2024-12-12 18:06:42
根据您的描述,您在使用两颗ADS131E08 24bit ADC时,遇到了采样数据经常出现完全错误的问题。这个问题可能由以下几个原因导致:

1. 电源问题:请检查您的电源是否稳定,以及是否满足ADS131E08的电源要求。不稳定的电源可能会导致数据错误。确保电源电压在规定的范围内,并且电源纹波足够小。

2. 外部晶振问题:请检查您的外部晶振是否正常工作,以及是否满足ADS131E08的时钟要求。晶振的频率和稳定性对ADC的性能有很大影响。如果晶振有问题,可能会导致采样数据错误。

3. 外部基准问题:请检查您的外部基准是否稳定,以及是否满足ADS131E08的基准要求。基准电压的稳定性对ADC的精度有很大影响。如果基准电压有问题,可能会导致采样数据错误。

4. 电路板设计问题:请检查您的电路板设计是否合理,以及是否遵循了ADS131E08的数据手册中的建议。例如,确保ADC的地线和电源线布局合理,避免信号干扰。此外,检查是否有短路或者焊接不良等问题。

5. 软件问题:请检查您的软件代码是否正确配置了ADS131E08的寄存器,以及是否正确处理了采样数据。错误的配置或者数据处理可能会导致采样数据错误。

为了解决这个问题,您可以尝试以下步骤:

1. 检查电源、晶振和基准电压是否正常工作,并确保它们满足ADS131E08的要求。

2. 检查电路板设计,确保地线和电源线布局合理,避免信号干扰。同时,检查是否有短路或者焊接不良等问题。

3. 检查软件代码,确保正确配置了ADS131E08的寄存器,以及正确处理了采样数据。

4. 如果问题仍然存在,您可以尝试更换新的ADS131E08芯片,以排除芯片本身的问题。

希望以上建议能帮助您解决问题。如果问题仍然存在,请提供更多详细信息,以便我们为您提供更具体的帮助。
举报

更多回帖

×
20
完善资料,
赚取积分