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-4:获取内部测试信号时出现问题

Guru**** 2563960 points
Other Parts Discussed in Thread: ADS1299-4, ADS1299

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

https://e2e.ti.com/support/data-converters-group/data-converters/f/data-converters-forum/1053989/ads1299-4-problem-obtaining-internal-test-signals

器件型号:ADS1299-4
主题中讨论的其他器件: ADS1299

您好!

这是我第一次在论坛上发帖、所以如果我不提供信息、请多多包涵。

我已经阅读了其他一些文章、了解如何获取内部测试信号、我正在努力获取方波信号。 我将具有 ESP32的 ADS1299-4用作 MCU。 我将在下面发布我的代码、并在底部不断获取输出。 我遵循了数据表中规定的启动过程、 能够正确读取和写入寄存器。 首先、我仅尝试从通道1获取测试信号并缩短其他三个通道。  我正在使用 Arduino IDE 并构建定制 PCB。 作为参考、我遵循 openBCI 原理图和开源代码来构建 PCB。

我遇到的问题是测试信号的输出。 如下图所示、输出非常奇怪、不是应该的平方。 我不知道我只是没有正确配置寄存器、或者我的 SPI 时钟可能只是不正确。 下图是我在串行绘图仪和串行监视器上得到的-6000左右的否定答案。

是否有人可以通过向我展示我所做的错误以及我可以采取哪些措施来解决问题来帮助我? 非常感谢!

这是我得到的串行绘图仪输出。

  

下面是我之后使用完整代码的代码片段:

这就是我对寄存器的写入方式:

更新通道数据:

下面是我希望如何打印数据的函数:

包含代码的全文文件。

e2e.ti.com/.../testSignals.txt

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

    您好、Elke、

    欢迎来到 E2E 论坛!!!

    我认为您没有为内部测试信号正确设置 CONFIG2寄存器。 要启用内部测试信号、需要将方波内部测试信号的 CONFIG2.Bit1设置为"1"、将 CONFIG2.Bit0设置为"1"。 根据您的硬件设计、您需要确保正确设置基准电压(VREF = VREFP - VREFN)。

    谢谢

    -TC

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

    感谢您的快速回复!

    我将 CONFIG2.Bit1和 CONFIG2.Bit0都更改为"1"、因此将 CONFIG2写入0xD3。 我现在还检查了我的基准电压、当以 AVSS 为基准进行测量时、我得到以下结果:

    VREFP = 4.51V

    VREFN = 0V

    VCAP1 = 1.2V

    VCAP2 = 2.52V

    VCAP3 = 6.9V

    VCAP4 = 2.25V

    并以接地为基准:

    AVDD = 2.51V

    AVSS =-2.51V

    我仍然会获得我之前得到的奇怪输出。 因此、我不知道问题是什么。 如果您能帮助我检查我是否遗漏了某个内容、我会附上我正在使用的原理图? 我只想补充一点、因为我忘了在原始帖子中添加它、我将使用双极电源为 ADS 供电。

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

    您好、Elke、

    感谢您提供相关信息。

    原理图和所有器件电压看起来都很好。 对于调试、您可能需要查看具有逻辑分析仪或示波器的 SPI 接口、以查看您是否获得了正确的输出数据位。 另请验证您是否在为 STAT_1输出中的24个状态位获得了正确的前导码(0xC0)。 另一种选择是在"正常电极"模式下提供已知信号(直流或正弦波)、并检查结果是否与您的输入匹配。

    谢谢

    -TC

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

    我使用代码打印状态寄存器、得到 FFC00000。 是否可以将其视为正确?

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

    您好、Elke、

    如果您将状态位的最后3个字节填充到4字节数据、则状态位的最后3个字节看起来是正确的。 我不熟悉您为 ADC 输出打印十进制值的代码。 请验证 ADC 二进制补码数据格式的转换是否正确。

    谢谢

    -TC

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

    谢谢、一定会!

    我正忙于查看 SPI 通信、以查看是否存在不正确的情况。 您对我应该去的地方有什么建议吗? 在处理 SPI 时、您遇到的最常见问题是什么? 我可以帮助我缩小搜索范围。 根据数据表、我知道 ADS 适用于 SPI 模式1、并且 SPI 频率为2MHz。  

    如果有助于我使用的 MCU 是 ESP32 Wroom 模块。  

    真的很感谢所有的帮助!

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

    您好、Elke、

    我没有完整地浏览您的代码、因此我不知道问题的确切位置。 最简单的调试方法之一是向输入端施加直流电压并在示波器上查看 SPI 数字输出。 将代码的输出与示波器上观察到的 SPI 数据进行比较。 首先施加直流电压 VIN≥+VREF VIN  ≤-VREF、并验证您可以分别获得0x7FFFFFF 和0x800000的输出代码。 您可以切换到直流内部测试信号(CAL_FREQ[1:0]= 0b11)以获得固定直流测试信号。

    如果您获得了正确的直流测试输出、则下一个调试步骤将查看您的 UC ISR 如何处理 DRDY 信号。

    我希望这能帮助您找到您所看到的问题。

    谢谢

    -TC

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

    您好!  

    很抱歉、现在只回复。 我只是想与您一起检查一下。 当我检查状态寄存器时、我的代码长时间不执行任何操作、然后绘制大量的零、然后在两者之间绘制带零的 FFC00000 (如所附图片所示)。

    我还将附加提供该输出的代码。 我只想知道这是否与状态寄存器之间的零正常、或者状态寄存器输出是否应该持续为 C0?

    e2e.ti.com/.../newtestSignals.txt

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

    您好、Elke、

    ADC 输出将始终以24个状态位开始、然后是每个通道的24位数据。 24状态位将始终以0b1100开头。 即使您让通道输入悬空、ADC 的输出也不应全为零。   

    谢谢

    -TC

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

    您好、TCT、

    很抱歉我现在只回复了。 我现在能够连续输出状态寄存器值0xC0 (和我之前的帖子一样、中间没有零)。 但是、我的寄存器未正确读取和写入。 当我的寄存器被错误写入时、如何获得正确的状态寄存器输出?

    我将在下面发布我的代码供您检查。 EEG。函数只是一个头文件、其中我将 CS 拉高和拉低以发送命令字节。  

    谢谢。

    e2e.ti.com/.../testSignal.txt

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

    您好、Elke、

    感谢您的更新。  

    请参阅下面的 E2E 常见问题解答、了解如何调试数字问题。

    谢谢

    -TC

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

    您好!

    感谢您参阅此帖子、但我在尝试读取和写入我的寄存器的早期阶段阅读了该帖子。 如果我的所有其他寄存器都不正确、如何获得状态寄存器的正确输出、我真的很困惑? 当然、如果我的寄存器不正确、我不应该获得正确的状态寄存器输出?  

    我将在您提到的帖子中再次查看调试步骤、看看我是否可以让我的寄存器再次正确写入、同时为我提供正确的状态寄存器输出。

    谢谢!

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

    您好!

    我再次正确读取和写入我的寄存器、但现在我再次遇到同样的问题、在这里、我只得到0作为输出。 我使用示波器来查看 DRDY 引脚会发生什么情况。 在启动过程中,我的 DRDY 引脚会按应有的方式脉冲,但一旦到达 updateChannelData()函数,我的 DRDY 引脚就会变为高电平并保持该状态。  

    您过去是否遇到过这样的问题?  

    谢谢!

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

    您好、Elke、

    在 updateChannelData()函数期间使用示波器检查 SPI 接口引脚(DRDYB、CSB、SCLK、DIN、DOUT)可能会很有用。 默认情况下、器件应处于 RDATAC 模式、即使未检索数据、DRDYB 也将切换该模式。 请参阅图41了解数据就绪(DRDYB)行为。 上电时的初始流程(图67)应该是验证器件功能的良好起点。

    请确保在写入和读取器件寄存器后发送正确的命令(RDATAC)、以启用每个 DRDYB 上的转换数据输出。

    谢谢

    -TC

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

    您好!

    那么、如果我正确理解图41、DRDY 在处于 RDATAC 模式时应始终处于高电平吗? 我确实按照图67中所述的加电过程进行了操作、并让我的寄存器再次正确绘图、但现在我无法再次获得正确的状态寄存器输出。

    在图67所述的启动过程中,显示“发出复位脉冲”是可以通过将 RESET 命令发送到芯片来实现的,还是应该使用 PinMode 函数(PinMode (RESET,LOW);PinMode (RESET,HIGH))来脉冲复位引脚?

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

    您好、Elke、

    感谢您发帖。

    在 RDATAC 模式下、当 START 引脚被拉高时、DRDYB 将被拉高(请参阅图40)。 下一个 DRDYB 下降沿指示数据已准备好检索。 图41显示了在 SCLK 的第一个下降沿将 DRDYB 引脚拉至高电平。 无论数据是从器件中检索还是通过 DIN 引脚发送命令、均可执行此操作。

    您可以发送 RESET 命令或切换 RESET 引脚以复位器件。

    -TC  

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

    尊敬的 TC:

    我查看了图41并了解 DRDYB 应如何工作。 当我启动系统时、DRDYB 在发送 START 命令之前和寄存器写入 START 之后都已处于高电平、START 将变为低电平。 我按照图67中的加电顺序进行了操作、但它似乎没有响应我发送的启动命令。 如果我理解正确、那么如果我向它发送 START 命令、应该会变为高电平吗?

    谢谢!

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

    您好、Elke、

    如数据表中所示、当使用 START 命令控制转换时、您需要将 START 引脚保持在低电平。 如果您处于 RDATAC 模式、DRDYB 将指示转换是否已启动。  

    谢谢

    -TC

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

    您好!

    我能够使 DRDYB 以250Hz 的频率进行脉冲、更新数据后启动和复位均为高电平、但状态寄存器输出仍然为0。 我将连接 DRDYB 的示波器输出和代码。 否则、是否有任何问题呢? 当我想获得状态寄存器输出时、在启动过程之后、我是否应该将 RESET 拉回低电平?

    很抱歉、照片旋转。 我似乎无法以正确的旋转方式上传。

    e2e.ti.com/.../1222.New-Text-Document.txt

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

    我现在检查了、我的 DOUT 电压处于 mV 范围内。 复位和启动为高电平、DRDYB 以250Hz 的频率进行脉冲。 什么可以保持 DOUT 低电平? 我认为这就是我为状态寄存器获得零输出的原因。

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

    您好、Elke、

    您是否已验证 uC SPI 接口不会干扰 ADS1299的 DOUT 引脚? 请遵循我在前面的帖子中列出的一些调试建议。

    谢谢

    -TC

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

    您好!

    是的、我遵循了您提供的调试建议、现在可以获得输出。 谢谢! 我注意到我的通道1引脚为高电平、一旦它开始输出数据、引脚就变为低电平。 您以前遇到过这样的问题吗? 我得到的值是非常大的负值。 代码与我之前的文章相同、图片显示了我获得的串行输出。 三个零代表我写为断电的通道2-4。

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

    您好、Elke、

    感谢您提供测试数据。  

    您能否澄清一下通道1引脚所指的是哪个引脚?

    一旦您能够使用正确的状态位捕获数据、您就可以使用内部测试信号来验证数据的有效性、正如您在初始 POST 中所做的那样。 同样、这将有助于确保所有硬件和软件正常工作。

    谢谢

    -TC

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

    抱歉。 对于通道1、我使用的是 IN1P (引脚16)。

    我打印了寄存器、并得到了数据表第44页中所述的默认寄存器设置、按照第62页上的启动程序(图67)、并根据该程序正确打印寄存器。 但是、我按照图67中所述对寄存器进行写入、但当我将其输出回来时、寄存器返回错误。 使用这些错误的寄存器时、我会得到正确的状态寄存器、并且在值2500和-4500之间有一个块波、并且我的 DRDYB 会按应有的频率进行脉冲。 所有寄存器以00h 的形式写入、直到 BIAS_SENSP、然后它将随机值写入寄存器。

     当我输出正确的测试信号寄存器输出时、我得到一个0输出、用于所有东西。 当我的寄存器写入不正确时、如何获得正确的状态寄存器值(C0h)和一个块测试信号? 我遵循了您早期提供的 SPI 调试步骤、除了写入错误的测试信号寄存器之外、一切都正常。 默认设置和启动过程寄存器写入正确、然后写入不正确的测试信号寄存器。

    希望这可以理解我想解释的内容吗? 原因我认为这些错误写入的寄存器在我向通道1 (IN1P)引脚施加信号时也会阻止我获取数据?

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

    您好、Elke、

    感谢您的澄清。

    IN1P 引脚是一个高阻抗输入引脚、不应受器件运行的影响。 请检查 IN1N 是否存在导致外部输入行为不正确的问题。

    器件寄存器的读/写操作与读/写操作共用同一个 SPI 接口。 因此、切勿损坏或混合操作至关重要。 RDATAC 和 SDATAC 命令用于避免在连续转换模式下运行时出现任何通信错误。 只要关键寄存器未损坏并导致 DRDY 信号行为错误、在数据检索期间、您将始终看到状态位的正确前导码。 但是、在这种情况下、您可能会看到不正确的通道数据。

    谢谢

    -TC

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

    如果我想将 ADS 置于正常电极模式、此功能是否正确? SDATAC 和 RDATAC 是否在正确的位置? 我正在尝试查看是否有任何函数或代码干扰 SPI 接口、因此我可能缺少什么?

    void ADSMode(){
    // ADS1299-4数据表页62:

    digitalWrite (CS_ADS、low);//将 CS 拉低以启动通信

    spi.transfer (_SDATAC);
    delayMicroseconds (4*tCLK);//延迟4 tCLK 周期

    //使用内部基准,即 BIASREF 信号(AVDD + AVSS)/2
    WREGConf (CONFIG2、0xD0);
    delayMicroseconds (2);

    //为 f_mod/4096设置器件(250SPS)
    WREGConf (CONFIG1、0x96);WREGConf (CONFIG3、0xE8);

    //将通道设置为输入短路
    WREGConf (CH1SET、0x60);WREGConf (CH2SET、0x89);
    WREGConf (CH3SET、0x89);WREGConf (CH4SET、0x89);
    delayMicroseconds (2);

    // MIPSC1
    WREGConf (MIPSC1、0x20);//将 SRB1连接到所有4个通道反相输入

    spi.transfer (_RDATAC);
    delayMicroseconds (2);
    digitalWrite (CS_ADS、HIGH);//将 CS 拉为高电平以停止通信
    spi.endTransaction();

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

    您好、Elke、

    该函数对我来说看起来很好。  

    谢谢

    -TC

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

    尊敬的 TC:

    谢谢! 我还将要求您检查我的更新通道功能、我只想确保我按照我在论坛帖子(https://e2e.ti.com/support/data-converters-group/data-converters/f/data-converters-forum/772488/faq-ads129x-how-do-i-convert-adc-output-codes-to-volts/2856893#2856893)中所理解的那样正确地将 ADC 代码转换为电压转换。

    然后、我想询问我获得的输出。 我目前正在使用直流电源、并为通道1 (IN1P)提供4.7V 和20mA 电流。 寄存器看起来正确输出、通道1设置为0x60 (增益= 24、正常电极输入)、通道2-4设置为0x89 (通道断电、增益= 1、输入缩短)。 我所附图片是在订单状态寄存器中进行转换后、按照该顺序依次跟随通道1-4获得的输出的一部分。  您可以看到、我的通道1的值不变、也是2.38V、并且通道2是否也应该为0? 通道2上连接了一个电极、但未连接任何电极。  

    这也让我感到困扰的是,数字不会改变,而只是保持不变。 当我用手指敲击直流电压时、如果没有电源、则输出相同。

    我将附上电极输入子电路的图片以及 ADS1299-4原理图的特写图。 在我的第一篇博文中可以看到整个原理图。 您是否认为电阻器和电容器可能会以某种方式阻止信号从电极流至芯片? 我遵循了 openBCI 的原理图、他们的 Cyton 板上有这些组件、因此、肯定应该能够跨越?

    我的其他寄存器配置如下:

    CONFIG1 0x96

    CONFIG2 0xD3

    CONFIG3 0xe8

    CH1SET 0x60

    CH2-4SET 0x89

    MIPSC1 0x20

    其余为0x00。

    我仅使用我的正通道输入、所有负通道输入均连接到 AVDD、如数据表中所述。  

    您是否知道此问题的原因?

    e2e.ti.com/.../5483.Code.txt

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

    您好、Elke、

    请参阅我之前的一些建议、以确保您的信号链通过利用内部测试信号正常工作。 如果通道断电、数字输出代码应为零。 我不知道为什么您会获得该特定通道的非零数据。 请使用示波器验证 SPI 输出。

    请注意、如果您将通道增益设置为24、则通道的输入信号将受到限制。 您看到的是 ADC 输出饱和至直流输入的满量程。 有关更多详细信息、请参阅数据表的模拟输入部分。

    谢谢

    -TC