搜索
bottom↓
回复: 41

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

[复制链接]

出0入0汤圆

发表于 2015-2-7 01:31:50 | 显示全部楼层 |阅读模式
本帖最后由 SMC 于 2015-2-7 12:39 编辑

下面的这个问题弄了好久都没做到问题,特来求助大家,指出问题所在的,我愿意给我用不着的电路板(STM32F3 DISCOVERY STM32F0 DISCOVERY),或者各种无刷直流电机(我有大有小,可以随意挑一个,都很猛的,拉几公斤没问题),如果对这些没兴趣,可以意思下给条烟钱。真心求大家帮助,实在是找不到问题所在了。
我使用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]);
        }
}

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2015-2-7 01:38:25 | 显示全部楼层
洗洗睡吧……

出0入0汤圆

 楼主| 发表于 2015-2-7 10:38:45 | 显示全部楼层
我得顶一顶,走过路过的帮看看,十分感谢!

出0入0汤圆

发表于 2015-2-7 10:40:15 | 显示全部楼层
多半虚焊

出0入0汤圆

 楼主| 发表于 2015-2-7 10:45:42 | 显示全部楼层

QFN-64的封装,刀头烙铁拖焊的,放大镜检查,焊接我已经非常仔细了,关键引脚我还用二极管档测试了是否虚焊。
焊接了两片ADC都是一样的情况。

出0入0汤圆

发表于 2015-2-7 11:10:29 | 显示全部楼层
只读取其中一颗ADC试试,如还有问题,再只读取另一颗试试

出0入0汤圆

 楼主| 发表于 2015-2-7 11:12:21 | 显示全部楼层
avr_sz 发表于 2015-2-7 11:10
只读取其中一颗ADC试试,如还有问题,再只读取另一颗试试


我就是先焊接的第一颗,发现会出现完全错误的数据,一直找不出来问题就又焊接了一片,结果还是一样的情况,两个ADC都会出现问题。

出0入0汤圆

发表于 2015-2-7 11:16:06 | 显示全部楼层
把SPI的频率降到100KHz试试

出0入0汤圆

 楼主| 发表于 2015-2-7 11:19:36 | 显示全部楼层
avr_sz 发表于 2015-2-7 11:16
把SPI的频率降到100KHz试试

SPI最低频率只能到328K,在这个频率下依然会出现问题。

出140入115汤圆

发表于 2015-2-7 11:29:42 | 显示全部楼层
没有用过,友情帮顶

出0入0汤圆

发表于 2015-2-7 11:37:27 | 显示全部楼层
每切换一次通道,第一个DRDY后的数值丢弃呢?
还是说每个通道你连续采集几个数值?

出0入0汤圆

发表于 2015-2-7 11:38:20 | 显示全部楼层
Layout没问题吗

出0入0汤圆

 楼主| 发表于 2015-2-7 11:46:31 | 显示全部楼层
qwerttt 发表于 2015-2-7 11:37
每切换一次通道,第一个DRDY后的数值丢弃呢?
还是说每个通道你连续采集几个数值? ...

DRDY是ADC数据准备好的标志,ADC数据准备好之后,我就直接连续读取ADC的数据。不用切换通道,ADC采样的数据都在一个“影子寄存器”里面存放着,直接读取就可以了。
每次ADC数据准备好,就把所有通道数据都读取了,ADC是同步采样的。

出0入0汤圆

 楼主| 发表于 2015-2-7 11:49:01 | 显示全部楼层

layout最多只会影响ADC采样精度,不至于导致这样完全错误的数据啊。
SPI总线读取同一个电路板上的其它传感器都没用问题,就只有ADC会出错。

出0入0汤圆

发表于 2015-2-7 11:57:22 | 显示全部楼层
确定输入信号没有尖峰吗?
也 可以用软件避免掉这个问题 通过检验把误差较大的数值去除,是一种滤波算法来着。

出0入0汤圆

 楼主| 发表于 2015-2-7 12:02:23 | 显示全部楼层
study_hardware 发表于 2015-2-7 11:57
确定输入信号没有尖峰吗?
也 可以用软件避免掉这个问题 通过检验把误差较大的数值去除,是一种滤波算法来 ...

输入信号无论是测试芯片内部信号还是外部信号都会出现问题。
担心模拟电源或者基准源上出现尖峰导致,基准源和模拟电源都是用的最好的料,不过这个电路板有个缺点,ADC基准源引脚处忘记加滤波电容了。

出0入0汤圆

发表于 2015-2-7 12:05:56 | 显示全部楼层
楼主试试用IO模拟SPI,我以前也遇见过硬件SPI读数据错误,一直找不到原因,软件也没错,后来把单片机频率改成SPI频率的一半,就再也没出现过问题

出0入0汤圆

发表于 2015-2-7 12:16:29 | 显示全部楼层
问题可能还是出在时序上,用逻辑分析仪看下时序。cs使能后短暂延时再操作ADC

出0入0汤圆

发表于 2015-2-7 12:21:53 | 显示全部楼层
for(i=0;i<9;i++)     
                        adc1buf=ReadBuf[3*i]<<16 |ReadBuf[1+3*i]<<8 |ReadBuf[2+3*i];  //将27字节数据转化成9个24位的数据

上面这里赋值错了吧?把数据给指针adc1buf ?

出0入0汤圆

 楼主| 发表于 2015-2-7 12:42:09 | 显示全部楼层


adc1buf是一个数组名,也就是指向数组第一个。
您看的很仔细,非常感谢你!这个是网页显示问题,实际上程序是adc1buf{i}=ReadBuf[3*i]<<16 |ReadBuf[1+3*i]<<8 |ReadBuf[2+3*i]; 小括号显示不出来我用大括号代替了。

出0入0汤圆

发表于 2015-2-7 12:43:12 | 显示全部楼层
感觉是SPI通信受干扰,比如中途丢失了一个时钟后面的数据都会被移位,下一次拉低CS重新通信恢复正常,和楼主现象很接近。
用逻辑分析仪应该能捕获到错误,看数据时用原始的16进制比10进制更容易发现移位。

出0入0汤圆

 楼主| 发表于 2015-2-7 12:53:54 | 显示全部楼层
dzcn 发表于 2015-2-7 12:16
问题可能还是出在时序上,用逻辑分析仪看下时序。cs使能后短暂延时再操作ADC ...

您好,有没有便宜好用的逻辑分析仪推荐下呢,我一般只用于看SPI,CAN等总线,SPI时钟最高20Mhz。
CS之后的延迟我也加过了,不是这个问题。

出0入0汤圆

 楼主| 发表于 2015-2-7 12:58:01 | 显示全部楼层
eleqian 发表于 2015-2-7 12:43
感觉是SPI通信受干扰,比如中途丢失了一个时钟后面的数据都会被移位,下一次拉低CS重新通信恢复正常,和楼 ...

恩,假如逻辑分析仪看到了确实是通信问题,那么这个问题该怎么解决呢?
SPI时钟速度我从10.25MHz到328K全部都试了,都会出问题,程序中同一个循环下SPI读取的其它传感器的数据从来不出问题,就只有ADC出问题。

出0入0汤圆

发表于 2015-2-7 12:58:20 来自手机 | 显示全部楼层
楼上的分析可能靠谱。觉得还是驱动和时序的事。

出0入0汤圆

发表于 2015-2-7 13:04:11 | 显示全部楼层
两颗ADC的ADC_DRDY是连在一起的吗? 建议你只连接一颗ADC试一试,代码里也只读取那颗ADC吧

出0入0汤圆

 楼主| 发表于 2015-2-7 13:07:50 | 显示全部楼层
avr_sz 发表于 2015-2-7 13:04
两颗ADC的ADC_DRDY是连在一起的吗? 建议你只连接一颗ADC试一试,代码里也只读取那颗ADC吧 ...

是的,两颗的DRDY在一起并着(两颗ADC是完全同步的,可以这样做的),我就是先焊接了一颗,发现有问题,以为是芯片问题就又焊接了一颗的,结果两颗都是一样的问题。

出0入0汤圆

发表于 2015-2-7 13:13:38 | 显示全部楼层
SMC 发表于 2015-2-7 13:07
是的,两颗的DRDY在一起并着(两颗ADC是完全同步的,可以这样做的),我就是先焊接了一颗,发现有问题,以 ...

个人认为这样不太好,要是有一颗出问题了,就会影响到另一颗。而且可能还搞不清楚哪颗出的问题

出0入0汤圆

发表于 2015-2-7 13:13:56 | 显示全部楼层
SMC 发表于 2015-2-7 12:58
恩,假如逻辑分析仪看到了确实是通信问题,那么这个问题该怎么解决呢?
SPI时钟速度我从10.25MHz到328K全 ...

如果真是受干扰就要注意layout了,布线尽量短,有良好的地回路,远离强干扰源等,方便的话贴出PCB图。

出0入0汤圆

发表于 2015-2-7 15:31:15 | 显示全部楼层
SMC 发表于 2015-2-7 12:53
您好,有没有便宜好用的逻辑分析仪推荐下呢,我一般只用于看SPI,CAN等总线,SPI时钟最高20Mhz。
CS之后 ...

我用的是淘宝上三十多的,一般用足够了。SPI时钟高的话最好买100M。

出0入0汤圆

发表于 2016-7-29 14:51:00 | 显示全部楼层
好东西,正在用ADS130e08,发现资料好少,找到131也好

出0入0汤圆

 楼主| 发表于 2016-8-1 18:38:29 | 显示全部楼层
ckhf 发表于 2016-7-29 14:51
好东西,正在用ADS130e08,发现资料好少,找到131也好

开心吧~.~

出0入0汤圆

发表于 2016-8-1 19:24:50 | 显示全部楼层
芯片初始化需要做些特殊操作吗?像1232那样的

出0入0汤圆

 楼主| 发表于 2016-8-3 18:43:59 | 显示全部楼层
not_at_all 发表于 2016-8-1 19:24
芯片初始化需要做些特殊操作吗?像1232那样的

没什么特殊操作,就配置下寄存器

出0入0汤圆

发表于 2016-12-8 16:48:19 | 显示全部楼层

那是

出0入0汤圆

发表于 2021-4-9 10:05:01 | 显示全部楼层
楼主,能否传一个完整的STM32的工程上来,学习下,谢谢

出0入0汤圆

发表于 2023-5-15 14:26:45 | 显示全部楼层
8通道同时采样时采样率最高可以达到多少?

出0入8汤圆

发表于 2023-5-16 23:34:22 | 显示全部楼层
SPI接口上加上100pf电容试一下,类似的厂家说是SPI总线寄生电容导致的,加电容就好了

出0入8汤圆

发表于 2023-5-16 23:42:32 | 显示全部楼层
对地加电容 具体多大得试验不影响时钟波形为准

出0入300汤圆

发表于 2023-5-17 07:20:21 来自手机 | 显示全部楼层
每当我看到别人读不出来adc就会抑制不住的幸灾乐祸

出0入169汤圆

发表于 2023-5-17 09:33:00 | 显示全部楼层
ibmx311 发表于 2023-5-17 07:20
每当我看到别人读不出来adc就会抑制不住的幸灾乐祸
(引用自39楼)

阿哈哈哈

别人不知道,我大部分都是一次就成功的。

偶尔遇到不成功的情况都是自己蠢的。都是没好好看DS犯的低级错误。

出0入300汤圆

发表于 2023-5-17 11:24:47 来自手机 | 显示全部楼层
d__xin 发表于 2023-5-17 09:33
阿哈哈哈

别人不知道,我大部分都是一次就成功的。

(引用自40楼)

我干活30多年,没有一次成功过的时候

出0入169汤圆

发表于 2023-5-17 11:37:33 | 显示全部楼层
ibmx311 发表于 2023-5-17 11:24
我干活30多年,没有一次成功过的时候
(引用自41楼)

我这搞的都简单,一般就串口485+网口+AD。接一堆外购传感器。

没啥太大的难度。大部分坛友仔细认真点都能一次过吧
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-15 18:16

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表