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.

[参考译文] ADS131E04:奇怪的 DRDY 行为

Guru**** 2548490 points
Other Parts Discussed in Thread: ADS131E04

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

https://e2e.ti.com/support/data-converters-group/data-converters/f/data-converters-forum/780456/ads131e04-strange-drdy-behavior

器件型号:ADS131E04

大家好、
我提前对这篇帖子的长度表示歉意、但我认为最好是说一些不必要的内容、而不是省略一些有用的内容。
我们尝试在定制板上使用 ADS131E04和 STM32F4微控制器从3轴模拟加速计获取数据、但我们正在经历 DRDY 线的一些奇怪行为。


我们所需的只是100Hz 采样率、因此我们计划将 ADC 配置为1kSPS、RDATAC 模式、软件启动和停止命令(START 引脚连接到低电平)、并且只需忽略10个 DRDY 转换中的9个。
我们能够与 ADS 通信、正确写入配置寄存器并读回它们。


现在、从第一个屏幕截图中可以看到、当我们发出 RDATAC 命令后紧跟 START 命令时、DRDY 行为正确:每1ms 发生一次转换(由于我们不是从 SPI 检索数据、因此我们不会发出 SCLK、因此线路会停止); 但是、如果我们尝试读取数据(15字节 SPI 读取操作)、有时 DRDY 会每4.5ms 减慢一次转换(第2个屏幕截图)。


在第3个屏幕截图中、您可以看到 DRDY (3品红色)、ISR 信标解锁(1黄色)和 SPI 15字节读取操作(2青色)的时序;只需忽略编号4 (蓝色)、我在进行屏幕截图之前忘记禁用行。


检索到的数据似乎是正确的(从传感器的方向看)、所以问题可能仅涉及 DRDY 时序。奇怪的是、它似乎不能准确再现、 它似乎具有某种类型的随机性、因为有时 DRDY 会在不发出 STOP 命令的情况下停止"切换"。

第4个屏幕截图显示、发生这种情况时、在最后一次采集中、DRDY 会以16kHz 而不是1kHz 的频率"切换"(某种复位?! 但数据表指出模块复位为32kHz。)。

如果我们尝试在 DRDY 停止后多次读取配置寄存器、我们会看到随机值数次、然后看到一些值似乎是"默认"配置。

我们的配置随机值"默认"配置
0:0xD00:0x300:0xD0
1:0xD61:0x4D1:0x91
2:0xE22:0x62 2:0xE0
3:0x613:0x1D3:0x41
4:0x004:0x4E4:0x00
5:0x105:0x205:0x10
6:0x10 6
:0x10 6:0x10 6:0x10 6:0x10 6:0x10 6:0x7 0x107:0x6C7:0x10
8:0x908:0x328:0x10
9:0x009:0x009:0x08
10:0x0710:0x0010:0x07
11:0x0F11:0xC011:0x0F 

最后一个屏幕截图只是为了显示 DRDY 在第一个 SCLK 下降沿之后变为正确的高电平。


我们尝试了不同的配置(采样率、SPI 速度...) 没有任何结果。
您是否经历过这样的经历? 如果有用、我可以上传有关 ADS 的原理图部分。

提前感谢您的帮助。

此致。

Mattia

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


    感谢您的特写。 我很感谢您提供更多信息来帮助调试出现的问题。

    我认为与器件的通信存在一些问题、但我还不确定所有问题。 我将解释我看到的一些内容、我将建议尝试一些内容。

    首先、该 ADC 具有一些延迟、第一次转换需要额外的时间才能获取完全稳定的数据。 通常、我本来希望 START 和 STOP 命令启动 ADC 转换、而 STOP 命令停止 ADC 转换。 在您的情况下、转换看起来会继续、因为/DRDY 会继续每1ms 输出一次。 如果您每10ms 执行一次此操作、以100SPS 的速率获取数据、我不确定 ADC 为什么看起来没有停止。

    其次、预计间隔为4.5ms。 但是、我本来希望每次都能做到这一点。 如果使用 DR[2:0]、则转换时的数据速率为1kSPS。 然而、由于数字滤波器的延迟(或者实际上是第一次读取的稳定时间)、第一次读取会在很晚的时间(并且随后的读数会以1/(数据速率)的速率输出。 您可以在数据表第28页的稳定时间部分中看到这一点。 如果 DR[2:0]=100、则首次读取的设置时间为9224 tclk、在2.048MHz 的时钟下、该值为4.5ms。

    如果您处于 RDATAC 模式并尝试读取寄存器、则一旦/DRDY 变为低电平、您可能会立即获取数据而不是寄存器数据。 我想这就是您的 RREG 给出错误读数的原因。

    如果您使用 START 和 STOP 命令、则可以执行如图33 (数据表第29页)中所示的操作、我只需执行单次 START 和 STOP 即可仅获取一个数据。 从您的图中可以看到、停止似乎永远不会出现、但您偶尔会得到开始。

    至于以16kSPS 的速率切换 DRDY、您会看到不同的数据速率、虽然复位会实现这一点、但我认为这将是复位时的错误数据速率、除非主时钟较慢。

    现在、这就是我要推荐的内容。 首先、我认为可能存在一些通信问题。 验证数字计时并检查 SCLK 频率。 似乎您错过了起点和停止点、但我不清楚这是为什么发生的。 我还会检查复位(确保/reset 始终为高电平)。

    要从器件获取数据、我建议使用其他通信方法。 首先、像您已经完成的那样将器件设置为1kSPS。 然后发送 SDATAC 命令。 这将防止每次转换时数据更新到 DOUT。 但是、器件应继续转换。 这将清除 RREG 问题。

    之后、为了读取数据、我只需使用微控制器中的计时器。 每隔10ms 发出一条 RDATA 命令、然后收集数据。 这样、ADC 就不会启动或停止、而是每10ms 收集一次数据。 我认为这是为您的应用获取数据的最佳方式。

    请告诉我您的想法。 我不确定我在您的帖子中涵盖了所有内容。


    吴约瑟
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Joseph、
    感谢您的快速回答! "不幸的是"今天我不在上班、但周一的第一件事是、我会尝试您的建议并告知您。

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



    我已经听说过您大概一周了、我只是想了解一下您对 ADS131E04的读取方法。 我提到了一种替代的操作方法来读回器件。 我还想指出、由于对 START 命令的响应不一致、您可能会遇到一些通信错误。 我认为您可能需要查看通信并验证是否存在噪声问题。 无论如何、我认为使用 SDATAC 和定期 RDATA 进行连续操作可以满足您的需求。

    我现在将关闭此帖子、但如果您仍然遇到问题、请发帖、我们可以继续调试您的电路。



    吴约瑟
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Joseph、
    非常感谢您的支持、非常感谢!
    不幸的是、我们在工作中遇到了一些其他问题、因此我直到今天才能够处理这些问题。 我希望我能在几天内发布您的建议。 现在、具有10ms 计时器的 SDATAC 和 RDATA 工作良好、因此我将其标记为"已解决"、但我认为需要做一些额外的工作才能正确理解我们为什么会出现这种奇怪的行为。

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

    大家好、Joseph、大家好!

    我再次写信、因为我最终发现了问题所在。

    这完全是"我的错"、ADS131E04的行为是正确的、我在寻找错误的方向来发现问题、当然、需要一些时间才能意识到这一点。

    正如我在第一篇帖子中所说、我正在为 STM32F4微控制器开发应用、并且我正在使用硬件抽象层库进行 SPI 通信。  该库具有一个称为 HAL_SPI_Receive ()的函数

    HAL_StatusTypeDef HAL_SPI_Receive (SPI_HandleTypeDef * hspi、uint8_t * pData、uint16_t Size、uint32_t Timeout) 

    尽管名称不同、但在接收数据的同时实际传输数据。 它使用一个更低层的函数 HAL_SPI_TransmitReceive()

    HAL_StatusTypeDef HAL_SPI_TransmitReceive (SPI_HandleTypeDef * hspi、uint8_t * pTxData、uint8_t * pRxData、uint16_t Size、uint32_t Timeout) 

    它在 TX 线上发送"虚拟数据"、只是为了生成时钟脉冲、以便从从器件输出数据。 在 HAL_SPI_Receive ()中有这一行  

    HAL_SPI_TransmitReceive (hspi、pData、pData、size、Timeout); 

    因此基本上 HAL_SPI_TransmitReceive()在 TX 线上发送 pData 的内容,同时在 RX 线上接收数据并将其保存在 pData 中。 我认为在接收时发送的某些数据可能包含 SDATAC 命令或 RESET 命令或类似的内容。 因此、我要解决这个问题、只需在将缓冲区用于接收函数之前将其复位为0x00。

    我希望这可以为遇到这一问题的任何人腾出一些时间。

    再次感谢 Joseph 的参与。

    Mattia

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


    感谢您将解决方案的说明发布回我们的网站。 我很高兴您能够解决这个问题。

    如果您对 ADS131E04有任何其他问题、请随时返回此 E2E 论坛!


    吴约瑟