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.

[参考译文] ADS1158:通道数据读取命令序列中缺少通道

Guru**** 2563000 points
Other Parts Discussed in Thread: ADS1158, ADS1248

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

https://e2e.ti.com/support/data-converters-group/data-converters/f/data-converters-forum/729012/ads1158-missing-channels-in-channel-data-read-command-sequence

器件型号:ADS1158
主题中讨论的其他器件: ADS1248

您好!

我使用 ADS1158在自动扫描模式下转换15个模拟通道、并且 START 引脚始终处于启用状态。  我 使用通道数据读取命令读取数据、如 SBAS429D 文档的第29页所述。  我每4ms 发送一系列15条命令来获取通道数据。  SPI 时钟频率为3MHz。

我没有在每个周期获取15个通道的信息。  我只能获得6-7个频道的信息、但不能获得其余频道的信息。

我会怎么做?

提前感谢。

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



    另一方面、我不确定问题是什么。 但是、我要检查几件事。

    首先、我将从对 ADS1158寄存器的回读开始。 如果寄存器编程不正确、则自动扫描可能会经历错误的通道设置。 读回所有寄存器、但确保已设置自动扫描、并确保 MUXDIF、MUXSGO、MUXSG1和 SYSRED 全部设置为正确的寄存器。 将结果传回、以便我们可以参考它们。

    查看发出的数据。 某些通道是否可靠地输出数据、而跳过其他通道? 我假设您正在读取状态字节以使用数据验证通道。 跳过的数据数量是否一致? 数据是否正确?

    最后、我将获得一个逻辑分析仪并验证 ADC 的输出。 输出数据是否全部传输、但您的微控制器或系统仅捕获部分数据并丢失其余数据?

    对于 ADS1158、自动扫描序列应是一个简单的状态机、步进从一个通道移动到下一个通道。 它不应错过寄存器中编程的通道步骤。 如果这是编程问题或数据丢失问题、我们应该能够调试错误。



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

    欢迎访问 TI E2E 论坛!

    ADS1158是一款多路复用 ADC、每次只转换一个通道。 每次/DRDY 变为低电平时、您只能时钟输出来自最新转换通道的数据。

    因此、要从所有15个通道读取数据、您需要首先启用 MUXSG0和 MUXSG1寄存器中的所有通道、等待单通道转换完成、时钟输出数据、等待、时钟输出数据等 收集所有15个通道的数据后、ADS1158将在第一个通道重新开始扫描。

    注意:ADS1158没有任何内部存储器缓冲区、因此如果您在转换期间(在下一个/DRDY 完成之前)没有超时数据、则转换数据将丢失。 在这种情况下、您要么需要允许自动扫描继续循环遍历所有通道、要么需要重新配置寄存器以在所需通道开始转换、并等待另一个转换完成、然后再读取所需通道数据。

    此致、
    Chris
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    //对于 ADC2
    CS2_Low ();
    delay_ms (1);
    SPI_SendData8 (SPI1、ADS1248_CMD_RESET);delay_ms (5);
    SPI_SendData8 (SPI1、ADS1248_CMD_SDATAC);delay_ms (1);

    ADS1248WREG (ADS1248_REG_MUX1、ADS1248_REG_MUX1_VALUE);DELAY_ms (1);
    ADS1248WREG (ADS1248_REG_SYS0、ADS1248_REG_SYS0_VALUE);DELAY_ms (1);
    ADS1248WREG (ADS1248_REG_VBIAS、ADS1248_REG_VBIAS_VALUE);DELAY_ms (1);
    ADS1248WREG (ADS1248_REG_IDAC0、ADS1248_REG_IDAC0_VALUE);Delay_us (10);
    delay_ms (1);
    CS2_High ();


    //对于 ADC1
    CS1_Low ();
    delay_ms (1);
    ADS1248WREG (ADS1248_REG_MUX1、ADS1248_REG_MUX1_VALUE);DELAY_ms (1);
    ADS1248WREG (ADS1248_REG_SYS0、ADS1248_REG_SYS0_VALUE);DELAY_ms (1);
    ADS1248WREG (ADS1248_REG_VBIAS、ADS1248_REG_VBIAS_VALUE);DELAY_ms (1);
    ADS1248WREG (ADS1248_REG_IDAC0、ADS1248_REG_IDAC0_VALUE);Delay_us (10);
    delay_ms (1);
    CS1_High ();

    ADS1248_REG_MUX1_VALUE0x20//参考选择-请参阅 ADS1248数据表
    ADS1248_REG_SYS0_VALUE0x03//PGA = 1;SPS = 40
    ADS1248_REG_VBIAS_VALUE0x00
    ADS1248_REG_IDAC0_VALUE0x06//1mA IDAC

    IF (通道<5)
    CS1_Low ();Delay_us (50);ADS1248WREG (ADS1248_REG_IDAC1、ChannelIDAC[Ch]);CS1_High ();Delay_us (10);//定义环形通道的电流注入
    //
    CS1_Low ();Delay_us (50);ADS1248WREG (ADS1248_REG_MUX0、ChannelCommands[Ch]);CS1_High ();
    其他

    CS2_Low ();Delay_us (50);ADS1248WREG (ADS1248_REG_IDAC1、ChannelIDAC[Ch]);CS2_High ();Delay_us (10);
    CS2_Low ();Delay_us (50);ADS1248WREG (ADS1248_REG_MUX0、ChannelCommands[Ch]);CS2_High ();

    通过 SPI 还有其他命令用于读取转换器值。
    然后使用多项式曲线将转换器值校准为温度。
    问题在于、将两个通道切换在一起时、I m 会在基准寄存器上获得4V 的基准电压、而不是2V 的基准电压

    所有值都是消歧的。而对于单芯片操作、转换值和校准值是正确的。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Joseph、感谢您的快速回答。

    我确实会读回 ADS1158的寄存器、它们会按预期进行编程。  我将发送配置寄存器的值:

    - CONFIG0:0x16 (状态字节启用、斩波启用、时钟输出禁用、使用外部 ADC 输入、自动扫描模式、4096fclk 周期复位)

    - CONFIG1:0x03 (待机模式、无延迟、传感器偏置电流源关闭、数据速率0b11。

    MUXSCH:0x00

    MUXDIF:0x00

    MUXSG0:0xFF

    - MUXSG1:0xFF

    - SYSRED:0x00

    我使用示波 器验证了 ADC 的输出、我看到的是、有时 ADC 发送与两个连续通道数据读取命令的应答相同的通道的值。  例如、我在命令应答中接收0x8B 作为状态通道、在以下命令应答中接收0x0B 作为状态通道、然后接收0x8C 和0x0C 等... 因此、ADC 似乎没有在两个连续的通道数据读取命令之间单步进入下一个通道。

    提前感谢您的帮助。

    此致、

    Antonio

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

    您好、Antonio、

    [引用 USER="Antonio Agenjo)]我使用示波 器验证了 ADC 的输出、我看到的是、有时 ADC 会发送与两个连续通道数据读取命令的应答相同通道的值。  例如、我在命令应答中接收0x8B 作为状态通道、在以下命令应答中接收0x0B 作为状态通道、然后接收0x8C 和0x0C 等... 因此、ADC 似乎没有在两个连续的通道数据读取命令之间单步进入下一个通道。

    如果您在下一次转换完成之前重新读取相同的转换数据、这将是 ADS1158的预期行为。

    上半字节中的"0x80"值会告诉您数据是新数据还是重新读取最后一个转换结果。

    我想您希望 ADS1158在每次发出读取命令时都能提供新的转换数据;但是、ADC 需要一段特定的时间来切换通道并提供新通道的转换结果(如/DRDY 信号所示)。 由于您要启用 CONFIG0寄存器中的 CHOP 位、转换数据将仅以大约11.8kSPS 的速率显示。 相反、如果您禁用斩波(即 CONFIG0 = 0x12)、您将看到 ADC 的输出数据速率增加到23.7kSPS。

    此致、
    Chris

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    这是否意味着只有一个寄存器用于存储转换数据? 我以为每个通道都有一个寄存器、寄存器存储每个通道的转换数据、每次我请求数据时、都会从一个通道获取数据、通道指针移到下一个寄存器。

    我要做的是让 ADC 在自动扫描模式下进行转换、并定期询问值、其中周期大于转换15个通道所需的时间。 如果 ADC 存储了15个转换值、我可以按顺序请求、而无需等待转换时间。

    那么、如果我想从15个通道获取新数据、我必须等待1个通道的转换、然后读取它、并重复此过程、我对吗?

    我无法在系统中使用中断、因此无法使用/DRDY 作为中断源、以便在通道数据读取就绪时启动该数据读取、并且 SW 必须在每个周期中执行大量计算、因此等待每个通道转换太耗时...

    您认为哪种方法可以是最佳方法?

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

    您好、Antonio、

    正确、ADS1158的存储器深度使得读取数据只返回最近的转换结果。 我不知道任何能够存储多个通道数据的高通道数精密 ADC。

    要从 ADS1158的所有15个通道获取数据(不缺少结果)、需要使用/DRDY 中断或频繁轮询 ADS1158 (至少与转换周期相同)来读取数据。 使用/DRDY 中断是检索数据的推荐方法、因为它占用的处理器较少。

    如果您不需要以高吞吐量捕获每个转换结果、则可以考虑使用具有脉冲转换模式的自动扫描模式。 在此模式下、您的微控制器将控制新转换的开始、然后 ADS1158只捕获一次转换并等待。 然后、您的微控制器可以读取数据并发出新的 START 命令、以便您能够以您具有处理带宽的任何速率循环浏览所有通道。

    此致、
    Chris