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.

[参考译文] ADS1299:ADS1299:在 ADS1299的所有通道上验证测试单、波形显示的是上升沿和下降沿的峰值

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

https://e2e.ti.com/support/data-converters-group/data-converters/f/data-converters-forum/1414278/ads1299-ads1299-verifying-test-singal-on-all-channels-of-ads1299-waveform-is-showing-peaks-on-rising-and-falling-edge

器件型号:ADS1299

工具与软件:

我正在使用微控制器对 ADS1299进行编程和控制、目前我已成功读取器件 ID、能够读取/写入寄存器、现在已配置为在所有通道上生成测试信号并在串行端口上绘制。 下面是图形数据的屏幕短接。 我观察到测试信号中没有上升/下降沿。 正确吗? 当前所有数据引脚均开路、以下是我的 CONFIG 寄存器设置:

配置1:96
CONFIG2:d0
CONFIG3:EC
LOFF:0
CH1SET:5.
CH2SET:5.
通道3SET:5.
CH4SET:5.
CH5SET:5.
CH6SET:5.
CH7SET:5.
CH8SET:5.
BIAS_SENSP:0

如果是正确的,需要意见? 或者需要进行任何调整。 我想先确认一下、然后再研究生物信号。

谢谢

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

    您好、Jahan -测试信号乍一看都是正确的。 问题到底是什么?

    您可能需要检查输出代码是如何转换回电压的。 差分测试信号应以中标度(0V)为中心、振幅由寄存器设置描述。 您可以参阅我们的 EVM 用户指南以获取示例:

    此致、

    Ryan

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

    非常感谢您的答复。 我担心测试信号上升沿和下降沿的异常峰值。

    一些测试后、我遇到了一个稍微不同的问题。 当我增加采样率时、通道上的测试数据开始显示垃圾。 例如、当每秒250个样本时、所有通道都正确。 但是、在每秒1k 个样本的采样率下、我发现最后3个通道显示垃圾数据、如下所示。 在每秒16k 次采样的最大速度下、所有通道都显示垃圾。

    最后3张图是通道6、7、8、第一张图是通道1-5。

    同样、当我在 CONFIG-1中设置16K 样本时、所有图都显示垃圾数据:

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

    大家好、Jahan、

    对我来说、这似乎是一个数据采集问题、可能是数据写入输出移位寄存器的时间(即 nDRDY 下降沿)与主机启动/完成数据传输之间的时序不匹配引起的。 您必须确保在下一个 nDRDY 中断之前完全读取所有数据。 器件的默认模式(RDATAC)会自动将最新的数据覆盖到输出移位寄存器中。

    对于尖峰、这是无法预料的、但我不确定目前是什么原因造成了这种情况。 方波测试信号通过 PGA 和一阶 LPF、因此应消除任何过冲/下冲。 此外、采样率非常低、以至于我不希望 ADC 输出能够捕获此类行为。 您能否绘制原始十进制值并仅在几个周期内放大?

    此致、

    Ryan

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

    经过多次试验,我决定进行一次测试。 下面的代码用于从所有通道读取2000个数据样本。 采样率增加了一个步骤并由串行端口发送。 我使用了一个串行数据记录器来记录数据。 但我观察到、随着采样率的提高、我无法记录数据。 我包含了数据图表以及用于读取和打印数据的逻辑。 请查看并指导我如何更改以最大速度读取和打印数据。

    串行波特率: (230400)

    SPISettings ads1299SPISettings (2000000、MSBFIRST、SPI_MODE1)

    从所有通道读取2000个数据样本并提高采样率的代码:

    for (uint8_t regValue = 0xD6; regValue >= 0xD0; regValue--) 
          {
            digitalWrite(ledPin, LOW);
            sendCommand(ADS1299_SDATAC);
            writeRegister(ADS1299_CONFIG1, regValue);
    
            // Print the current register value to the Serial Monitor
            Serial.print("Config1 Data: 0x");
            Serial.println(regValue, HEX);  // Prints the current register value in HEX
            startDataAcquisition();
            lastSampleTime = millis();
            sampleCount = 0;
              while (sampleCount < 2000)
              {
                if (digitalRead(ADS1299_DRDY_PIN) == LOW) 
                {
                  readAndPrintData();
                  sampleCount++;
                }
              }
    
              stopDataAcquisition();
              sendCommand(ADS1299_SDATAC);
              delay(10);
    
          }

    这是我的读取和打印函数代码:

    void readAndPrintData() 
    {
      digitalWrite(ADS1299_CS_PIN, LOW);
      
      // Skip status bytes (3 bytes)
      for (int i = 0; i < 3; i++) {
        SPI.transfer(0x00);
      }
    
      // Read and print channel data
      for (int i = 0; i < numChannels; i++) {
        long channelData = 0;
        for (int j = 0; j < 3; j++) {
          channelData <<= 8;
          channelData |= SPI.transfer(0x00);
        }
        
        // Handle negative values
        if (channelData & 0x800000) {
          channelData |= 0xFF000000;
        }
        
        // Convert to microvolts
        float microvolts = (float)channelData * (4.5 / 0x7FFFFF) * 1000000.0 / 1.0; // Assuming gain = 1
        Serial.print(microvolts, 2);
        if (i < numChannels - 1) Serial.print(",");
      }
      Serial.println();
    
      digitalWrite(ADS1299_CS_PIN, HIGH);
    }

    我的开始数据/停止数据函数:

    void startDataAcquisition()
    {
      sendCommand(ADS1299_START);
      delay(10);
      sendCommand(ADS1299_RDATAC);  // Enter read data continuous mode
      delay(10);
    }
    
    void stopDataAcquisition()
    {
      sendCommand(ADS1299_STOP);
      delay(10);
    }

    以下是数据图:

    代码运行多次以记录2000个样本并更改 CONFIG-1的值、然后使用相同的函数记录 nprint ...

    很抱歉这么长的时间、但是需要帮助

    祝你好运

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

    大家好、Jahan、

    您需要监控 nDRDY 的时序并确保整个 SPI 通信帧(216位)发生在两个连续下降沿(即数据速率周期)之间。 如果该设置不匹配、则在默认模式 RDATAC 模式下数据将被覆盖和损坏。 请参见下图:

    或者、您可以尝试改用 RDATA 模式。 要使用 RDATA 模式、请发送 SDATAC 命令(11h)。 然后、在 nDRDY 下降沿之后、发送 RDATA 命令(12h)+ 216位0b。 这会扩展帧、但允许您重叠下一个 nDRDY、而不会破坏当前 SPI 事务。 注意:在此模式下可能会完全丢失样本、但可以证明在较快的数据速率下是由这种时序重叠引起的问题。

    此致、

    Ryan