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.

[参考译文] ADS7128:RMS 模块未按预期工作

Guru**** 2507255 points
Other Parts Discussed in Thread: ADS7128, BP-ADS7128

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

https://e2e.ti.com/support/data-converters-group/data-converters/f/data-converters-forum/1194057/ads7128-rms-module-not-working-as-expected

器件型号:ADS7128

我无法实现 RMS 函数、因为从不设置 RMS_done 标志。
在 GENERAL_CFG 寄存器中设置 RMS_EN (位7)应开始转换、但即使在经过很长时间之后、RMS_DONE 标志(SYSTEM_STATUS 寄存器中的位4)也不会设置。

这是主机程序的输出。  我尝试了多个 RMS 采样率、但此示例针对16384个采样。  设置 RMS_EN 后、每10毫秒轮询一次 SYSTEM_STATUS 寄存器:
   
   在地址:23 (0x17)处找到 I2C 器件
   将复位 I2C 器件。
   GENERAL_CFG 寄存器:0
   SYSTEM_STATUS 寄存器:0
   RMS_CFG 寄存器:100010
   GENERAL_CFG 寄存器:10000000
   SYSTEM_STATUS 寄存器:10001000 MSB 寄存器0xC2 = 0 LSB 寄存器0xC1 = 0
   SYSTEM_STATUS 寄存器:10001000 MSB 寄存器0xC2 = 0 LSB 寄存器0xC1 = 0
   SYSTEM_STATUS 寄存器:10001000 MSB 寄存器0xC2 = 0 LSB 寄存器0xC1 = 0
   SYSTEM_STATUS 寄存器:10001000 MSB 寄存器0xC2 = 0 LSB 寄存器0xC1 = 0
   SYSTEM_STATUS 寄存器:10001000 MSB 寄存器0xC2 = 0 LSB 寄存器0xC1 = 0
   SYSTEM_STATUS 寄存器:10001000 MSB 寄存器0xC2 = 0 LSB 寄存器0xC1 = 0
   SYSTEM_STATUS 寄存器:10001000 MSB 寄存器0xC2 = 0 LSB 寄存器0xC1 = 0
   SYSTEM_STATUS 寄存器:10001000 MSB 寄存器0xC2 = 0 LSB 寄存器0xC1 = 0
   SYSTEM_STATUS 寄存器:10001000 MSB 寄存器0xC2 = 0 LSB 寄存器0xC1 = 0
   SYSTEM_STATUS 寄存器:10001000 MSB 寄存器0xC2 = 0 LSB 寄存器0xC1 = 0
   SYSTEM_STATUS 寄存器:10001000 MSB 寄存器0xC2 = 0 LSB 寄存器0xC1 = 0


到目前为止、我已经能够使用 Arduino 微控制器通过在许多不同 AIN 通道上成功使用 OSR (过采样)功能对该 ADS7128进行编程和使用。  因此、我确信此特定 ADS7128已正确连接、而且我的微控制器可以正确地对此特定 ADS7128进行编程。  所以、这个问题似乎特定于 RMS 函数。

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

    Scott、

    1. 我同意你的命令顺序。  这符合第8.3.12节中概述的方法。
    2. 我还同意、由于您可以配置寄存器并执行 OSR 读数、因此不太可能出现某种类型的连接错误。
    3. 我不知道为什么您没有得到一个 RMS 转换完成。 但是、在查看 Arduino 调试输出时、似乎您要轮询 SYSTEM_STATUS 并读取 RMS MSB 和 LSB 寄存器。  我不知道这会导致问题、但你可以尝试只读取 SYSTEM_STATUS 寄存器吗?
    4. 此外、您可能希望尝试向 GENERAL_CFG 的 RMS_EN 位写入"1"。 这应该会启动一个转换。  第8.3.12节中的步骤解释了在阅读 RMS 转换结果后执行此操作,但您可能也需要在第一次转换时编写此步骤。

    请告诉我上述任何建议是否有帮助。  如果您无法取得任何进展、我将很快在实验中了解这一点。

    艺术

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

    您好!

     

    以下是不读取 RMS 输出寄存器而仅读取状态寄存器情况的输出。

    调用 Wire.begin ()进行 I2C 通信。

    在地址:23 (0x17)处找到 I2C 器件

    将复位 I2C 器件。

    GENERAL_CFG reg:0                                           这是在复位后

    SYSTEM_STATUS 寄存器:0

    RMS_CFG 寄存器:100010

    GENERAL_CFG 寄存器:10000000                          这是在设置位7 "RMS_EN"之后

    System_status reg:10001000

    SYSTEM_STATUS reg:10001000                      每10毫秒持续读取 SYSTEM_STATUS

    System_status reg:10001000

    System_status reg:10001000

    System_status reg:10001000

    System_status reg:10001000

    System_status reg:10001000

    System_status reg:10001000

    System_status reg:10001000

    SYSTEM_STATUS reg:10001000                      年前、RMS 转换应该已完成

     

    因此、对 RMS 输出 MSB 和 LSB 寄存器的读取不会对状态寄存器产生影响。

    我在开始每次转换之前都设置了 RMS_EN 位。

    谢谢!

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

    您好!

    为了进一步确认此特定 ADS7128设置、我在 Ain5上添加了诊断输出并使用过采样(OSR)功能重新运行、我已将5伏直流电除以2、从而确认此设置接线正确、并且任何问题似乎局限于 RMS 功能:

    在地址:23 (0x17)处找到 I2C 器件

    将复位 I2C 器件。

    OSR_CFG 寄存器0x3 = 111                                                   设置为对128个样本求平均值

    GENERAL_CFG reg 0x 1 = 0                                            在复位后清除

    CHANNEL_SEL reg 0x11 = 101

    将 GENERAL_CFG 设置为101000                                将设置 CNVST 和 STATS_EN 位

    GENERAL_CFG 寄存器0x1 = 100000                                立即读取 CNVST 位已由 ADS7128清除

    SYSTEM_STATUS reg 0x0 = 10001000                         OSR_DONE 位

               32724                                                                       预计为2^16 / 2、因此输出正常

    OSR_CFG 寄存器0x3 = 111                                                   将启动另一个转换以监控 OSR 输出噪声

    GENERAL_CFG 寄存器0x 1 = 100000

    CHANNEL_SEL reg 0x11 = 101

    将 GENERAL_CFG 设置为101000

    GENERAL_CFG 寄存器0x1 = 100000

    SYSTEM_STATUS 寄存器0x0 = 10001000

               32721.

    OSR_CFG 寄存器0x3 = 111

    GENERAL_CFG 寄存器0x 1 = 100000

    CHANNEL_SEL reg 0x11 = 101

    将 GENERAL_CFG 设置为101000

    GENERAL_CFG 寄存器0x1 = 100000

    SYSTEM_STATUS 寄存器0x0 = 10001000

               32724.

    OSR_CFG 寄存器0x3 = 111

    GENERAL_CFG 寄存器0x 1 = 100000

    CHANNEL_SEL reg 0x11 = 101

    将 GENERAL_CFG 设置为101000

    GENERAL_CFG 寄存器0x1 = 100000

    SYSTEM_STATUS 寄存器0x0 = 10001000

               32722.

     

    观察结果:

    我得到预期的直流值(最大值的50% 计数)、而且噪声非常小(对于128样本 OSR 取平均值、约为14个无噪声位、对于标称的12位模拟转换器来说还不错)。

    希望这有助于诊断 RMS 功能不按预期工作的问题。

    谢谢!

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

    Scott、

    我将在实验中看看这个。  这需要几天时间。 我在您的方法中看不到任何明显的问题、因此我想详细说明如何使用 RMS 模式。   很抱歉你遇到的困难。  

    艺术  

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

    Scott、  

    我的一位同事可能找到了答案(感谢 Cynthia)。  请在此处查看全文:  ADS7128:RMS 转换不开始。  要点是您需要收集初始样本以完成 RMS 转换。  根据您使用的模式、您完成这些转换的方式将会有所不同。  请告诉我这是否有帮助。  如果没有、我将继续学习有关 RMS 的详细教程。

    艺术  

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

    您好!

    我已经按照数据表中的步骤操作(也在另一篇文章中列出)。

    我只是尝试了一些不同的东西、如果我需要以某种方式读取通道以开始转换(尽管根据文档、我应该只需要设置 RMS_EN 位)。

    我还将 RMS 样本数量减少至默认值1024。


    在地址:23 (0x17)处找到 I2C 器件
    将复位 I2C 器件。
    GENERAL_CFG 寄存器:0
    SYSTEM_STATUS 寄存器:0
    RMS_CFG 寄存器:100000                     <=设置 AIN2、并使用默认#样本= 1024
    GENERAL_CFG 寄存器:10000000
    此外、还需设置 CHANNEL_SEL reg 0x11 = 10 <=                       请尝试此操作、看看它是否有帮助。   针对与 RMS 相同的 Ain2进行设置
            在测试期间、读取选定通道的 ADC 转换= 32723 <=对于此输入上的2.5VDC 有效
    GENERAL_CFG reg=10000000 system_status reg= 10001000      <=还会监控 GENERAL_CFG 以验证仍设置 RMS_EN
    GENERAL_CFG reg=10000000 system_status reg= 10001000      <=每20毫秒保持轮询一次
    GENERAL_CFG reg=10000000 system_status reg= 10001000
    GENERAL_CFG reg=10000000 system_status reg= 10001000
    GENERAL_CFG reg=10000000 system_status reg= 10001000
    GENERAL_CFG reg=10000000 system_status reg= 10001000
    GENERAL_CFG reg=10000000 system_status reg= 10001000
    GENERAL_CFG reg=10000000 system_status reg= 10001000
    GENERAL_CFG reg=10000000 system_status reg= 10001000
    GENERAL_CFG reg=10000000 system_status reg= 10001000       <=很久以前应该已经设置了 RMS_DONE

    关于 RMS 计算需要额外采集40个样本、我不确定这在我的测试中有多大意义、因为超过16384甚至1024个样本并不能满足我的需求; 不管怎么说、我等待 RMS_DONE 的时间远远超过它应该花费的时间(我持续检查长达2秒、远远超过它应该需要的时间)。

    所以,显然我仍然缺少一些东西。

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

    Scott、

    好的。  我将继续测量并逐步编写教程。  这需要一些时间。

    此致、艺术

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

    Scott、您好、

    艺术一直参与细节的工作,但在他能够回答之前,他不得不转移到一些不同的责任。  我将尝试回答我们认为可能发生的情况。  在上一篇文章中、您重置了 ADS7128、然后配置各种寄存器设置。  配置是手动模式、但我不看到您实际上是在启动新转换。

    在手动模式下、您需要每次读取数据以触发新的转换启动。  根据产品说明书第8.4.2节"当读取输出数据的最后一个字节时、在 SCL 的第九个下降沿(ACK 位)启动新的转换。" 因此、在设置 RMS_done 标志之前、您需要读取所请求的 RMS 样本数(配置中为1024个)的数据以及额外的40次转换。

    在自动序列模式下、这与手动模式类似、只是多路复用器会自动切换到序列中的下一个所需通道。  根据数据表中的表7、读取与手动模式类似的数据后、下一次转换开始。

    自主模式如下所述。  此处 ADS7128设置为仅在序列中使用 RMS 通道、一旦开始转换、就应在完成 RMS_CFG 中设置的转换周期数后设置 RMS_DONE 状态。  我们发现有点令人困惑的是、若要重新启动另一个 RMS 计算、应清除 RMS_EN 位(设置为0)、然后重新设置为 GENERAL_CFG 寄存器中的"1"。

    在我们的测试中、我们使用了 BP-ADS7128并向 AIN0输入信号。  我们还配置了4096个采样、并且未从计算中减去直流电。  启动 RMS 计算的过程如下:

    步骤

    寄存器

    地址

    链接

    停止

    1.

     RMS_CFG 寄存器

     0xC0

    0x01

    CH0上的 RMS、不减去直流、样本= 4096

    2.

     GENERAL_CFG

     0x01

    0xA0

    RMS_EN、无 CRC、STATS_EN、无比较器、

    正常转换启动、默认通道配置、无校准、无复位

    3.

     SEQUILD_CFG

     0x10

     0x00

    SEQ_MODE ='00'

    无需写入、默认工作

    4.

     OPMODE_CFG 寄存器

     0x04

    0x00

    CONV_MODE ='00'

    无需写入、默认工作

    5.

     GPIO_CFG

     0x07

    0x00  

    无需写入、默认工作

    6.

     AUTO_SEQ_CH_SEL

     0x12

    0x01

    这将选择通道0作为序列中的唯一通道(在数据表中未完全清零)

    7.

     SEQUILD_CFG

     0x10

    0x01

    停止通道排序、自动序列模式

    (根据流程图执行此操作)

    8.

     OPMODE_CFG 寄存器

     0x04

    0x20

    自主模式、高速振荡器、

    采样频率= 1000ksps

    9.

     SEQUILD_CFG

     0x10

    0x11

    启动通道排序、自动序列模式

    (根据流程图执行此操作)

    10.

     System_STATUS

     0x00  

     

    由位4 ="1"上 RMS_DONE 的计时器或监控状态暂停

    11.

     SEQUILD_CFG

     0x10

    0x01

    停止序列发生器

    12.

     RMS_LSB

     RMS_MSB

     0xC1

     0xC2

    读取 RMS 结果

    13.

     System_STATUS

     0x00

    0x10

    清除 RMS_DONE 位

    14.

     GENERAL_CFG

     0x01

    0x20

     禁用 RMS 模块

    按照上述程序对我们的测试起作用。

    此致、

    Bob B

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

    您好!

    我仍然不明白为什么我不能让 RMS 功能在手动模式下工作(该模式看起来应该更简单、更适合我的任务)。

        我仍想查看使用手动模式进行 RMS 测量的配方示例。

    尽管如此,即使我不明白,我也可以使用自动排序来使你的配方正常工作:

    1) 1)在步骤14中、由于不需要在转换前设置 STATUS_EN 位、因此有必要在转换后设置 GENERAL_CFG 寄存器中的 STATS_EN 位以允许后续 RMS 转换(我已验证这确实是必要的)。  或者、我发现在转换完成后设置 GENERAL_CFG = 0x00 (RESET)也允许进行后续转换。

    2)为什么第11步清零 SEQ_START (第4位)是在配方中,因为最初当我忘记包含该步骤时,该配方是有效的,所以添加该步骤似乎没有必要。

    此外、为了让其他读者受益、请注意 AUTO_SEQ_CH_SEL 通道选择方案与 RMS_CFG 和 CHANNEL_SEL 寄存器不同。

    谢谢!

    Scott

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

    Scott、您好、

    自动序列模式最容易实现、但我们仍在手动模式下工作。  上述步骤基于图33中的数据表流程图。  可能会有细微的更改、但这些更改也可能有效、但我们知道这是一个序列、实际上是有效的。

    1)为什么在步骤14中、需要在转换后设置 GENERAL_CFG 寄存器中的 STATS_EN 位以允许后续 RMS 转换(我确认这确实是有必要的)、因为在转换前不必设置 STATS_EN 位。  或者、我发现在转换完成后设置 GENERAL_CFG = 0x00 (复位)也允许后续转换。

    这是这些细微的变化之一。   这里的关键点是、在可以重新启用该位以开始计算之前、您需要通过清除该位来禁用 RMS_EN 位。  很遗憾、数据表中未提供此信息。  它将尽快更新。  

    2)为什么第11步清除 SEQ_START (第4位)是在配方中,因为当我忘记包含该步骤时,该配方才开始工作,所以添加该步骤似乎没有必要。

    如果要使通道保持序列运行、则无需清除 SEQ_START 来停止通道序列。  在我们的测试用例中、它在我们完成操作时被清除。

    此致、

    Bob B

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

    Scott、您好、

    另一个更新。  我基本上使用了默认加电设置、运行手动模式、并且能够看到 RMS_DONE 位的设置。  我使用了 AIN0作为输入。  我遵循的步骤如下所示:

    步骤

    寄存器

    地址

    链接

    停止

    1.

     RMS_CFG 寄存器

     0xC0

    0x00

    CH0上的 RMS、不减去直流、样本= 1024

    2.

     GENERAL_CFG

     0x01

    0x80

    RMS_EN、无 CRC、无 STATS_EN、无比较器、

    正常转换启动、默认通道配置、无校准、无复位

    3.

     SEQUILD_CFG

     0x10

     0x00

    SEQ_MODE ='00'使用手动模式

    无需写入、默认工作

    4.

     通道_SEL

     0x11

    0x00

    MANUAL_Chid ="00"选择 AIN0

    无需写入、默认工作

    5.

     GPIO_CFG

     0x07

    0x00  

    无需写入、默认工作

    6.

     

     

    启动转换读取

    7.

     

     

    继续从器件读取转换、至少额外进行1024 + 40次转换

    8.

     System_STATUS

     0x00

    在位4 ="1"上监控 RMS_DONE 的状态

    9.

     RMS_LSB

     RMS_MSB

     0xC1

     0xC2

    读取 RMS 结果

    10.

     System_STATUS

     0x00

    0x10

    清除 RMS_DONE 位

    11.

     GENERAL_CFG

     0x01

    0x00

     禁用 RMS 模块

    希望按照此过程、您将在手动模式下找到成功。  一个关键点是保持转换继续、您必须按照数据表第25页的图31手动读取 ADS7128。  如数据表中所述"当输出数据的最后一个字节被读取时、SCL 的第九个下降沿(ACK 位)开始新的转换"。

    此致、

    Bob B

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

    您好!

    能否详细说明手动模式下上述顺序中的步骤6和7? 提供实际的寄存器操作将会非常有帮助、因为我在2月10日尝试启动了 ADC 转换、而 RMS 仍然失败。  手动模式 RMS 的这一方面不直观、这是因为 RMS_EN 似乎应该启动这个过程、并且不管怎样、实际的 RMS 计算结果将在 RMS_LSB 和 RMS_MSB 寄存器中。

    此外、在上述步骤4中、如果使用除 Ain0之外的其他通道、那么除了默认设置的通道0之外、是否需要设置 CHANNEL_SEL?

    谢谢!

    Scott

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

    Scott、您好、

    在步骤4中、我使用了 AIN0、但这可以设置为另一个通道。  您可以使用 CHANNEL_SEL 可用的任何通道。  

    就第6步和第7步而言、显然我们并不了解器件的功能。  对于手动模式、必须手动读取转换结果并开始下一次转换。  图31第25页的数据表详细说明了这一点。  只有当您开始并读取设定的转换数(在我看来、使用的默认值是1024)加上额外的40次转换来完成计算时、才会计算 RMS。  在手动模式下、仅等待一段时间不起作用。

    祝您好运、

    Bob B