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.

[参考译文] ADS112U04:在多个单端通道上读取时降低采样率

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

https://e2e.ti.com/support/data-converters-group/data-converters/f/data-converters-forum/1311781/ads112u04-decreased-sampling-rate-when-reading-on-multiple-single-ended-channels

器件型号:ADS112U04

大家好!

首先、很抱歉、此主题是否已经解决、但我没有找到与此 ADC 模型类似的内容。

我将 ADS112U04与 ESP8266EX 连接、并且需要在一个通道上读取1000SPS、在另一个通道上读取200SPS。

一个通道上的转换运行良好、但当我添加更多通道时、会出现许多读取错误、并且读取停止。

采样率为20SPS 时、工作正常、但 I Go 越高、误差越多。 波特率为115200。

我按以下方式行事(我不知道这是不是正确的方式):

设置中:
-由硬件复位
- acStartup ();//函数由 TI 代码提供

循环中:

uint8_t data_adc[12];
  
  registerWrite(0x00, REG0_AIN0);
  registerWrite(0x01, REG1);
  registerWrite(0x02, REG2);
  registerWrite(0x03, REG3);
  registerWrite(0x04, REG4);

  for (int i = 0; i < 10; i += 2) {
    // Wait for GPIO2/DRDY to transition low
    while (digitalRead(GPIO_DRDY_PIN) == HIGH) {};
    sendCommand_ADC(0x10);
    while (!Serial.available());
    uint16_t dataLowByte = Serial.read();
    while (!Serial.available());
    uint16_t dataHighByte = Serial.read();
    data_adc[i] = static_cast<uint8_t>(dataLowByte);
    data_adc[i + 1] = static_cast<uint8_t>(dataHighByte);
  }

  registerWrite(0x00, REG0_AIN2);
  registerWrite(0x01, REG1);
  registerWrite(0x02, REG2);
  registerWrite(0x03, REG3);
  registerWrite(0x04, REG4);

  for (int i = 10; i < 12; i += 2) {
    while (digitalRead(GPIO_DRDY_PIN) == HIGH) {};
    sendCommand_ADC(0x10);
    while (!Serial.available());
    uint16_t dataLowByte = Serial.read();
    while (!Serial.available());
    uint16_t dataHighByte = Serial.read();
    data_adc[i] = static_cast<uint8_t>(dataLowByte);
    data_adc[i + 1] = static_cast<uint8_t>(dataHighByte);
  }

sendCommand_ADC 函数:

void sendCommand_ADC(uint8_t command) {
  Serial.write(SYNC_WORD);
  Serial.write(command);
}

通信登记:

#define REG0_AIN0       (CONFIG0_MUX_AIN0_AVSS | CONFIG0_GAIN_1 | CONFIG0_PGA_BYPASS_NO)
#define REG0_AIN2       (CONFIG0_MUX_AIN2_AVSS | CONFIG0_GAIN_1 | CONFIG0_PGA_BYPASS_NO)
#define REG1            (CONFIG1_DR_600_SPS | CONFIG1_MODE_TURBO | CONFIG1_CM_CONTINUOUS | CONFIG1_VREF_EXT | CONFIG1_TS_DISABLED)
#define REG2            (CONFIG2_DRDY_OLD | CONFIG2_DCNT_DISABLED | CONFIG2_CRC_DISABLED | CONFIG2_BCS_DISABLED | CONFIG2_IDAC_OFF)
#define REG3            (CONFIG3_I1MUX_DISABLED | CONFIG3_I2MUX_DISABLED | CONFIG3_AUTO_MANUAL)
#define REG4            (CONFIG4_GPIO2DIR_OUT | CONFIG4_GPIO1DIR_IN | CONFIG4_GPIO0DIR_IN | CONFIG4_GPIO2SEL_DRDY | CONFIG4_GPIO2DAT_LO | CONFIG4_GPIO1DAT_LO | CONFIG4_GPIO0DAT_LO)

非常感谢大家

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

    尊敬的 Edwin:

    欢迎来到 E2E 论坛!  我会建议一件事、那就是如果配置保持不变、则不要发送寄存器写入。  例如、如果您只更改了多路复用器、请勿重写 REGISTER1-4的配置。

    另外、绝对要确保您不会同时发送和接收数据。  您可以使用 UART TX 和 RX 引脚上的示波器或逻辑分析仪验证这一点。  最好是使用逻辑分析仪、因为其上有一个用于 UART 通信的协议分析仪。  系统锁定最常见的原因是交叉通信。

    我没有看到任何您以20sps 运行的代码。  REG1条件显示涡轮模式下为600sps (1200sps)。

    另一个可能的问题是您的时序断开。  请首先使用单次模式、而不是在连续模式下运行。  在读出数据之前、DRDY 可能正在改变状态。  最终目标是确保在下一次转换完成之前读取数据。

    此致、

    鲍勃 B

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

    尊敬的 Bob:

    感谢您的答复。

    我已经删除了冗余寄存器写入并添加了一个条件、以验证 UART 端口是否可用以及系统不再挂起。

    条件已添加:

    if (Serial.available()) {
        registerWrite(0x00, REG0_AIN0);
      }


    但是、我意识到、我在更改寄存器配置时获得的值是不正确的、因为实际上、这种条件不允许修改寄存器的值、但允许保留相同的值。

    我尝试过以下操作:

    while (!Serial.available());
    registerWrite(0x00, REG0_AIN0);

    但系统被锁定了。

    您认为这是硬件限制导致的吗? 是否可以通过软件纠正此问题?

    为了澄清一下、我在这里发布了我在第一篇文章中解释的用于获取1000SPS + 200SPS 的代码、而不是20SPS。

    非常感谢

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

    尊敬的 Edwin:

    示例 C 代码 可用于演示如何与 ADS112U04通信。  相对于每个单独微控制器外设的代码可能比较复杂。  您需要完全了解每个函数语句实际做了什么。

    每个寄存器写入命令都必须以0x55的同步字节开头。  完全验证代码是否按预期运行的唯一方法是将逻辑分析仪与 UART 协议分析器功能配合使用。  这些逻辑分析仪数据是我需要看到的、可以进一步帮助您的工作。

    如果要更改多路复用器、则需要向寄存器0发送寄存器写入、如果要更改多路复用器和数据速率、则需要发送两条命令、其中一条对应于寄存器0、另一条对应于寄存器1。   

    最后、单步执行代码只会对您展示少量内容。  当您通过通常独立于代码流运行的外设与外部设备进行通信时、需要监控通信、以确保真正执行您认为正在执行的操作、并且计时符合所有要求。  我工具箱中最有价值的工具是逻辑分析仪。

    此致、

    鲍勃 B