矿石收音机论坛

 找回密码
 加入会员

QQ登录

只需一步,快速开始

搜索
楼主: abbey_tom

24bitADC芯片ADS1256的测量精度

[复制链接]
     
发表于 2022-4-20 19:39:53 | 显示全部楼层
本帖最后由 xjw01 于 2022-4-20 20:28 编辑
abbey_tom 发表于 2022-4-18 11:53
我说的这个现象您可以研究一下,
应该不是时序配合的问题。
试验方法是:


这几天,我偿试做了一些测试,并修改电路,基本确定以下结论:
ads1256的抗干扰能力是很差的。受到高频干扰,会造成一些不可预测的结果。
你在对被测源做通、断处理过程中(比如指针表作为电源),接通或断开的瞬间,会人为引入干扰源。
干扰的结果可以表现为多种情况:
1.芯片异常复位,DRDY的状态切换速度与预期的不一样。
2.ADC转换停止,DRDY长期处于0或1状态。DOUT也可能长期处下1状态,或输入乱码
3.ADC转换出现临时中断,如你所描述的现象。
4.芯片出现大电流。(我后来做300mA限流,ads1256就没有出现0.6A的情况,最大只有0.062mA)

还要注意到,输入不同的被测电压,ads1256的工作电流也是不一样的。电源须正常响应。

我把除了模拟电路之外,所有接口都置于低阻状态,甚至做整体屏蔽,依然无法解决问题。
说明,干扰电磁场可以直接从空中进入芯片内部,引起芯片内部MCU异常。
异常的结果,一般伴随DRDY输出的周期出现异常。

理论上,通过增加地线层,可以吸收大量电磁干扰。我现在用转接板制作,没有地线层,更容易受干扰。

要使ads1256可靠工作,须检测DRDY的周期。周期正常,说明数据比较可靠,否则须考虑复位。复位电路也须仔细设计,不小必,该引脚也可能受到干扰。



补充内容 (2022-4-21 09:00):
0.062mA有误,是62mA(含单片机电流)
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2022-4-20 20:21:08 | 显示全部楼层
xjw01 发表于 2022-4-20 19:39
这几天,我偿试做了一些测试,并修改电路,基本确定以下结论:
ads1256的抗干扰能力是很差的。受到高频 ...

网上吐嘈ads1256的抗干扰能力也有不少,
有人说拿示波器观察DRDY异常,
24位数据未读取完毕DRDY就置高;
数据的后几位输出波形异常;
DRDY的输出波形异常;
我没有示波器观察不到。
也有说芯片异常复位的,
交流接触器一动作它也动作,
可能确实不适合在复杂环境中使用,
除非采取一些比较管用的抗干扰措施。
回复 支持 反对

使用道具 举报

     
发表于 2022-4-21 08:16:47 | 显示全部楼层
abbey_tom 发表于 2022-4-20 20:21
网上吐嘈ads1256的抗干扰能力也有不少,
有人说拿示波器观察DRDY异常,
24位数据未读取完毕DRDY就置高 ...

这种芯片,在工程现场是不能用的,烧个电焊,可能就停机了。即使是家用,也不适合长时间稳定采集。
估计只能用在实验室环境了,ads1256内部的MCU太低档了。
我打算回读内部寄存器的值,看看受干扰后,寄存器的值是否发生改变。如果改变了,就复位,并重新初始化。
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2022-4-21 19:29:25 | 显示全部楼层
xjw01 发表于 2022-4-21 08:16
这种芯片,在工程现场是不能用的,烧个电焊,可能就停机了。即使是家用,也不适合长时间稳定采集。
估计 ...

隔一段时间读寄存器进行比对,
看是不是既设值,
如果不是就复位芯片,
应该可行。
回复 支持 反对

使用道具 举报

     
发表于 2022-4-21 23:57:42 | 显示全部楼层
本帖最后由 xjw01 于 2022-4-22 00:05 编辑
abbey_tom 发表于 2022-4-21 19:29
隔一段时间读寄存器进行比对,
看是不是既设值,
如果不是就复位芯片,


    我的复位键是接电源的,不易受干扰的,芯片没有被复位。

    被干扰后,芯片异常,无法正常读取数据。上述想法无法实现。

    但我无意中发现:被干扰后,只是造成DOUT数据无法移出而已。因为DRDY始终保持低电平,程序误以为有新数据,反复输出SCK信号来读取数据,而数据是错的。

    后来,我再次回到数据手册:数据读取后,芯片立刻将DRDY置1。所以,如果不是1,说明芯片受到电磁干扰。这样,判断是否受到干扰就有了依据。

    然而,如何让DRDY恢复正常?如何让它变为1?百思不得解。用示波器测SCK脚,总是有脉冲,它是用来读取数据的,可数据无效。越看越生气。拿起摄子,干脆把SCK引脚对地短路,我真不想看这些脉冲!!
这下可好,轻轻一碰,数据输出正常了。

   我立刻明白,摄子引入了额外的脉冲,数据正常了。我想,读数异常时,何不在程序中引入SCK脉冲,使得芯片恢复。
   经过反复调试,最终完美解决,一个数据也不丢。方法如下:

  P_CS = 0;
  ads1256_w1b(CMD_RDATA); //读数据
  ads1256_delay(25); //25对应10us,须延时6.6us以上才能读取数据(详见ads1256手册的t6)
  v  = ads1256_r1b(); v <<= 8;
  v += ads1256_r1b(); v <<= 8;
  v += ads1256_r1b();
  while(!P_DRDY){ //当ads1256受到干扰,数据移出异常,须重读
     P_SCK=1; ads1256_delay(1); //输出SCK脉冲
     P_SCK=0; ads1256_delay(1);
     ads1256_w1b(CMD_RDATA); //重读数据
     ads1256_delay(25);
     v  = ads1256_r1b(); v <<= 8;
     v += ads1256_r1b(); v <<= 8;
     v += ads1256_r1b();
  }
  P_CS = 1;
  if(v&0x00800000) v |= 0xFF000000;



回复 支持 1 反对 0

使用道具 举报

     
发表于 2022-4-22 00:12:05 | 显示全部楼层
总体说,还是spi线受干扰了。我的spi线太长了。

我用8V变压器测试。变压器通电后,次级对大地大约有110V的高电压。
我用次级(手不要碰变压器的铁芯,以免对地电压下降)的一个引脚,触碰ads1256电路板的地线,每次触碰,都会引起ads1256异常。

经过上述方法处理后,一切正常。
回复 支持 反对

使用道具 举报

     
发表于 2022-4-22 06:59:20 | 显示全部楼层
或者简化为如下代码
while(1){ //当ads1256受到干扰,数据移出异常,须反复读取,直到正确.通常最多8次读取就可以得到正确数据
     ads1256_w1b(CMD_RDATA); //读数据
     ads1256_delay(25);  //25对应10us,须延时6.6us以上才能读取数据(详见ads1256手册的t6)
     v  = ads1256_r1b(); v <<= 8; //读数据到v. v用移位法是低效的,但兼容性好
     v += ads1256_r1b(); v <<= 8;
     v += ads1256_r1b();
     if(P_DRDY) break;; //已读到正常的读数
     P_SCK=1; ads1256_delay(1); //输出SCK脉冲
     P_SCK=0; ads1256_delay(1);
}
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2022-4-22 09:53:22 | 显示全部楼层
本帖最后由 abbey_tom 于 2022-4-22 09:55 编辑
xjw01 发表于 2022-4-21 23:57
用示波器测SCK脚,总是有脉冲,它是用来读取数据的,可数据无效。 ...


这个我有些不解,
SCK是单片机主动输出的,
既然总是有脉冲,
为何还要额外引入脉冲?
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2022-4-22 09:57:39 | 显示全部楼层
xjw01 发表于 2022-4-22 06:59
或者简化为如下代码
while(1){ //当ads1256受到干扰,数据移出异常,须反复读取,直到正确.通常最多8次读取 ...

受干扰期间,
通过额外引入SCK所读取到的数据是否正常,
需要剔除吗?
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2022-4-22 10:00:18 | 显示全部楼层
本帖最后由 abbey_tom 于 2022-4-22 10:06 编辑
xjw01 发表于 2022-4-21 23:57
我的复位键是接电源的,不易受干扰的,芯片没有被复位。

    被干扰后,芯片异常,无法正常读取 ...

另外,
我看到网上有人说,
由于STM32速度快,
正常读取到一组数据后,
可能还没有等到DRDY变高,
又会重复读取到一组,
我倒是没有遇到这种情况。
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2022-4-22 10:12:28 | 显示全部楼层
xjw01 发表于 2022-4-22 00:12
总体说,还是spi线受干扰了。我的spi线太长了。

我用8V变压器测试。变压器通电后,次级对大地大约有110V ...

不错,可以再观察一段时间。
看看是否还有异常。

现在是查询方式读取数据,
假如以中断方式,
在DRDY的下降沿进入中断,
这种DRDY受干扰后一直为低的情况也不会引发数据读取,
应该也消除了SCK反复作用读取不正确数据的现象。
回复 支持 反对

使用道具 举报

     
发表于 2022-4-22 16:05:54 | 显示全部楼层
abbey_tom 发表于 2022-4-22 10:12
不错,可以再观察一段时间。
看看是否还有异常。

测试环境不同,徐老师用杜邦线通讯,楼主板载MCU+ADC出现干扰几率低很多
回复 支持 反对

使用道具 举报

     
发表于 2022-4-22 16:25:59 | 显示全部楼层
跳动的部分应该去掉,
回复 支持 反对

使用道具 举报

     
发表于 2022-4-22 18:05:36 | 显示全部楼层
abbey_tom 发表于 2022-4-22 09:57
受干扰期间,
通过额外引入SCK所读取到的数据是否正常,
需要剔除吗?

不要剔出,数据是有效的。原理如下:
干扰脉冲的处理:
    1.理解时序:
    ads1256监视从DIN输入的指令。当有正常的指令时,它将在t6之后响应。当然,能否完成指令,还与t11或tDATA等有关。
ads1256转换结束后,DRDY置0直到有新数据置方才置1,且数据更新完成后立刻置0。在非连续转换模式下,用户不取出数据,DRDY就一直为0,直到取出数据后才置1。

    2.软件处理干扰脉冲:

    当SCK上的干扰脉冲达到连续8个以上,输入的命令是不可预测的,但大概率发送了WAKEUP命令。有且仅有SCK受干扰时,则DIN输入数据全0(假定DIN=0);若仅DIN受干扰,则没有数据输入;若SCK与DIN同时受干扰,且信号相同(共模),那么输入命令全为1,也是WAKEUP命令。如果DIN 和SCK干 扰信号不一样,那么输入了什么命令就是未知的,但这是小概率。

    设有4个干扰脉冲,相当于事先移入半字节命令0000,但还未达到8个。下面推演RDATA命令读数据以及增补1个SCK脉冲的效果。
    发送8个SCK,DIN送入0000 0001(RDATA),实际送入0001。其中干扰SCK 的0000以及当前发送的0000会被ads1256抛弃。由于接收命令需要t6喘气时间,而我们一口气次发送了8个SCK,上1个SCK下降沿与下1个SCK上升沿的时差远小于t6,所以前8个bit被抛弃,开始接收新新命令。即使是双字节命令,也由于第2字节不完整,造成命令未被执行。
    再来8个SCK读数据,DIN送入0000 0000。同样的原因,抛弃了8bit,实际送入0000
    再发8个SCK读数据,DIN送入0000 0000。同样的原因,抛弃了8bit,实际送入0000
    再发8个SCK读数据,DIN送入0000 0000。同样的原因,抛弃了8bit,实际送入0000
    可见,发送任何指令,最后只剩下0.5字节或1.5字节,命令全部无效。幸好,现在已知当前已送入的命令是半字节0000,所谓的“半字节”,拜干扰脉冲所赐。干扰脉冲5个,这半字节就是5bit,干扰脉冲10个,这半字节便是2bit

    再送1个SCK脉冲,相当于增加一个干扰脉冲,可以得到0000 0,快要变成WAKEUP命令了。也许永远无法知晓干扰脉冲的个数,只知道快要变成WAKEUP。无所谓,重复上述的读取过程,每重复一次,相当于多了1个干扰脉冲。最后必将得到完整的8个0(WAKEUP命令),它是否生效只取决于t6、t11。也无所谓是否生效。到此,命令字节已完整,是8的倍数,后续的命令将生效,RDATA正常势行,PDRDY将置1.
回复 支持 反对

使用道具 举报

     
发表于 2022-4-22 18:24:37 | 显示全部楼层
本帖最后由 xjw01 于 2022-4-22 18:27 编辑
abbey_tom 发表于 2022-4-22 10:00
另外,
我看到网上有人说,
由于STM32速度快,


另外,
我看到网上有人说,
由于STM32速度快,
正常读取到一组数据后,
可能还没有等到DRDY变高,
又会重复读取到一组,
我倒是没有遇到这种情况。
=================================
网络上的,做个参考吧,多数人写程序,只是在修改他人的程序,并没有花多少时间研究时序。
那个手册,关键部分,正常要读3遍,甚至10遍的。所以,译为中文方便一些。

DRDY不会变高的,读完后才变高。连续模式下,如果读慢了,才会读到下一次。
硬件spi比较快,软件spi比较慢,但比较好用,时序控制得更细一些。

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 加入会员

本版积分规则

小黑屋|手机版|矿石收音机 ( 蒙ICP备05000029号-1 )

蒙公网安备 15040402000005号

GMT+8, 2025-4-28 18:19

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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