急问专家:我的ADS1255数字输出引脚信号有拖尾,导致数据读数不正确。请问这是由什么原因造成的?(DOUT引脚本来通过一个47R的电阻连接至隔离器,现在把这个电阻断开即外电路什么也没接,其现象是一样的。做了几个板子都是一样的现象。时钟8.192M,采样率4000SPS,供电模拟5V,数字3.3V)
Wayne Xu:
请问你描述的拖尾现场是什么样的,能否用示波器截一下图。
数字接口的问题,一般来源于阻抗匹配,时序和建立保持时间。
ADS1255的DOUT是在SCLK的上升沿输出数据,MCU要在SCLK的下降沿读取数据。
xingxing hu:
回复 Wayne Xu:
我用ADS1255做数据采集器,采用8.192M外部时钟输入,4000SPS输出采样率,PGA=1,关闭片内输入缓冲,disable CLKOUT,其余是默认设置。控制器是S3c2440,linux操作系统。开机设置前读11个寄存器内容为
31 01 20 F0 E1 28 00 00 B6 09 45
经上述设置后再读11个寄存器内容为
31 01 00 C0 E0 28 00 00 B6 09 45
是正确的。但采集时在无模拟输入(如电路图所示)时经常在1秒内(程序以1秒数据为1帧)有一个数据出现异常,且这个数据大多数情况下其高字节跟低字节是相同的而中间字节是0xFF,比如是0x31FF31或0x26FF26或0x7FF07等;而且这个异常数据出现的位置相对稳定,比如基本出现在1帧中的0.1秒到0.25秒之间。当输入接正弦信号测试时也同样在正弦波形上叠加有这个异常的数。
电路图和DOUT示波器截图以及采集波形见附件。
谢谢!
xingxing hu:
回复 xingxing hu:
现在在DOUT引脚上加了一个8.2k的下拉电阻接地,现在没有拖尾现象了,但读出的数据仍不对!也就是不时在一秒内有一个异常的数
Wayne Xu:
看了你的电路图,问题可能来源于你加的这个隔离器。据我所知,ADuM的隔离器是电磁的,EMI不是很好。可以试试TI的电容式隔离器。
你试着把隔离器拆掉,做一下试验。问题是不是还存在?
另外CLK信号在隔离器中离信号线可能有些近。
如果可以,能抓到数据错误时的SPI波型最好分析。另外,你的SPI总线上,还有其他器件没?
xingxing hu:
回复 Wayne Xu:
我也这样想过可能是隔离器的问题,所以把DIN引脚直接用导线跨接在S3C2440的SPI输入引脚上(连接ADuM隔离器的两个电阻分别断开了),同时把两个地也用导线连接了,实验结果没有什么改善。
另外也怀疑过是SPI总线驱动的问题,更改过各种模式,波特率也改过,都没有什么效果。最后干脆不用SPI总线而用高、低电平来模拟时序,其结果都是一样的,即还是有异常数据的存在。
SPI总线上只有一片ADS1255(通过ADuM隔离器),没有其它器件。TI的电容隔离器有哪些型号?
xingxing hu:
回复 xingxing hu:
我也这样想过可能是隔离器的问题,所以把DOUT引脚直接用导线跨接在S3C2440的SPI输入引脚上(连接ADuM隔离器的两个电阻分别断开了),同时把两个地也用导线连接了,实验结果没有什么改善。
另外也怀疑过是SPI总线驱动的问题,更改过各种模式,波特率也改过,都没有什么效果。最后干脆不用SPI总线而用高、低电平来模拟时序,其结果都是一样的,即还是有异常数据的存在。
SPI总线上只有一片ADS1255(通过ADuM隔离器),没有其它器件。TI的电容隔离器有哪些型号?
xingxing hu:
回复 xingxing hu:
而且异常数据在1秒内基本只有1个,出现在时间位置还相对固定!已经检查过驱动层和应用层程序的数据缓冲区,觉得没什么问题(缓冲区数组:cData[100][12000])。
Wayne Xu:
回复 xingxing hu:
你再做一个实验,把MCU附近的地用一根粗线与ADS1255的数字地引脚。
TI的ISO7241就是非常适合用于SPI总线的隔离芯片。它是三同向一反向的。
其它的,请参照http://www.ti.com/paramsearch/docs/parametricsearch.tsp?family=analog&familyId=3121&uiTemplateId=NODE_STRY_PGE_T
Wayne Xu:
回复 xingxing hu:
你的程序在出现问题的那段时间,还有没有处理别的数据什么的?
还有一个办法,把代码里的别的功能先都屏敝掉,只让ARM跑测试ADC的程序,试一下。
xingxing hu:
回复 Wayne Xu:
现在确认是芯片的问题!原因如下: (在做如下实验时ADS1255到CPU是跳线直连的,即去掉了ADuM隔离器,两个地线也用导线连接了)
1、在4000采样时,应用程序未做任何处理,只做两件事:(1)直接把从底层读出的数据实时(从网口)转发,监控波形有异常;(2)把数据存在本地,之后再取出看,画出的波形一样有异常,且跟实时传输的波形一致。
2、在4000采样时,应用程序只读取前面600字节(包括异常数据出现的那段,这样做是为了减少读取时间,看是不是读数时干扰了底层的中断响应),但在应用程序中其余不变,仍按4000采样来处理数据(即每帧的601-12000这段数据值是0),异常数据仍会出现。
3、在4000采样时,把DOUT引脚断开,其余不变,此时监控波形只是一直线,幅度为0,不会出现异常数据,说明异常数据不是出现在程序中。
4、现在在底层更改采样率,时钟8.192M不变,把DRATE(03H)寄存器值分别改为B0(在7.68M时钟时当为2000SPS)、A1(在7.68M时钟时当为1000SPS),而其它不变,即底层的数组及应用程序仍作为4000来读取数据(此时一个数组中前约6000或约3000个字节是数据,后面部分数据是0,但一个数组总字节数12000保持不变),这时就不会出现那个异常数据了。
所以综上所述,问题不是出在硬件及程序上,而是芯片,且只在4000采样(DRATE寄存器值设为C0)时出现这个异常的数。请问该怎样解决?谢谢!