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.

[参考译文] ADS1231:输出值不正确

Guru**** 2399305 points
Other Parts Discussed in Thread: ADS1231, ADS1262, ADS124S06, ADS1248

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/data-converters-group/data-converters/f/data-converters-forum/655248/ads1231-incorrect-output-value

部件号:ADS1231
线程中讨论的其他部件: ADS1262ADS124S06ADS1248

我正在负荷传感器应用程序中轮询ADS1231。 在我应用负载的情况下,我通常获得小于0x20万的ADC值。 有时我得到的ADC值为0x?FFFF。

我的代码是

void ReadAdc()

   IF( GetDataBit())
   {
      返回;
   }

//读取数据
   long newValue =0;
   for (int nBit=0;nBit<24;nBit++)
   {
      时钟(Clock_PIN);
      新值<<= 1;
      newValue += GetDataBit();
   }
//添加另一个时钟以强制数据引脚高电平,以便上述轮询正常工作
   时钟(Clock_PIN);
}

   void delay()           { delayMicroseconds(1);}
   Void Clock (int nPin)   { digitalWrite (nPin,1);Delay();digitalWrite (nPin,0); Delay();}

从示波器跟踪中,我可以看到,当我获得错误读数时,dout针脚在时钟脉冲中保持高位。

虽然我在开始读取之前正在检查DOUT是否过低,但我没有与ADS1231采样间隔同步,因此在我的轮询期间有可能启动新的采样。

我是否需要等待DOUT时钟高时低时,以便与采样间隔同步?

是否有更好的部分可用于此应用程序(理想情况下,我希望在大约1ksps的情况下使用20多位)

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我已经部分回答了我自己的问题:)

    该问题似乎是由于未与ADC采样时钟同步造成的

    当我将代码更改为时
    while (!GetDataBit())

    While (GetDataBit())


    //读取数据
    long newValue =0;
    for (int nBit=0;nBit<24;nBit++)

    时钟(Clock_PIN);
    新值<<= 1;
    newValue += GetDataBit();
    }
    //添加另一个时钟以强制数据引脚高电平,以便上述轮询正常工作
    时钟(Clock_PIN);

    我不再得到意外值。

    这并不理想,因为我显然在等待转换时浪费时间。

    我将研究在数据就绪引脚上使用中断,但再次强调,这不是理想的做法。

    我的应用是否有更好的ADC (20位以上,1ksps)-显然,我也在寻找新设备,而不是那些接近使用寿命的设备
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,Robert:

    欢迎参加E2E论坛! 如果在读取数据期间发生转换更新,则可能会看到数据读取出现问题。  数据 检索下第13页的数据表中提到了这一点。  轮询新数据的一般问题是您希望在DOUT/DRDY从高到低的转换后尽快收集结果,但  这可能会在循环中运行的许多其他进程中变得困难。   显然,这是您对 发送的第一个代码的困难。

    第二段代码等待完整的转换周期结束,然后查找更新周期,然后读取数据。  这可以起作用,但会浪费大量时间,也不 会捕获 连续数据。  您最多只能捕获所有其他转换结果。

     有多种方法可以检查新数据。  使用轮询方法时,最好在转换期间多次调用轮询函数。  这将显著降低在更新期间读取结果的风险。  另一种方法使用中断在DOUT/DRDY从高到低转换后尽快读取数据。

    另一个考虑因素是最大限度地提高SCLK频率 ,以确保通信速度尽可能快,从而读取数据。   

    至于  其他设备的使用和更快的数据速率,您很可能 会遇到相同类型的问题。  另外,在1kHz时,20位以上的分辨率和增益将是一项挑战。  您可以查看的一些设备是ADS124S06和ADS1262。

    此致,

    Bob B

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Bob,您好!

    感谢您的回答。

    我同意数据表确实提到在转换过程中读取数据时出现问题,但也许可以更清楚地说明,即使您在数据就绪较低的情况下开始传输,也必须完成。 (我看到过其他设备的类似支持问题,这意味着这并不是对设备操作方式的常见误解)。 它确实使它和类似设备很难用于简单轮询的应用程序。

    我的第二个代码示例不是最终解决方案,而是快速测试,以证明我已经确定了问题。 虽然它确实浪费CPU资源,但由于我发送了25个时钟脉冲,因此DOUT保持高电平,如果在DOUT降低之前进行轮询,它仍应采集每个样本。

    在我的测试环境中,使用中断是一项挑战,但如果我使用此设备或类似设备,我会将它们用于我的生产系统

    感谢您推荐的备用设备,我将对其进行检查

    此致

    Rob

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Rob,您好!

    感谢您的评论,因为我们始终有兴趣尝试使数据表中的内容更加清晰。  我想补充的一点是,我们所提供的各种设备的复杂性。  

    对于ADS1231,该器件是引脚控制的,具有非常简单的接口。  对于此器件,转换结果具有单个输出寄存器,因此当转换完成时,当DOUT/DRDY从高状态转换为低状态时,转换结果将被放置在此输出寄存器中。  无法通过命令与ADS1231通信,也无法重复或读取设备中的数据。  它是一款简单,价格低廉的设备。

    我们有其他设备会以类似方式自动输出数据(转换结果发布到输出寄存器),但也可能会 关闭转换结果的自动过帐。  ADS1248系列就是其中一组器件。  这是一个具有许多寄存器的更为复杂的设备,并且 能够通过命令读取单个转换结果。  使用此设备,您可以关闭自动发布结果并直接读取结果。  因此,随着设备的复杂性,您可以获得额外的功能,以防止您看到的数据中断类型。

    借助ADS124S06,您可以获得一项附加功能,即 一旦您从设备开始读取数据,转换结果更新将不会干扰当前的数据读取。  此设备还可以在单个转换模式下运行,您可以通过发出启动命令来启动转换周期,从而更有效地控制转换的时间。

    因此,设备和功能众多,因此设备的操作和设备的成本可以涵盖多种不同的应用。

    此致,

    Bob B