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**** 2952510 points

Other Parts Discussed in Thread: ADS7128, AMC3330, TLV9001

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

https://e2e.ti.com/support/data-converters-group/data-converters/f/data-converters-forum/1655436/ads7128-how-to-convert-hardware-rms-register-count-back-to-ac-voltage-for-a-level-shifted-input

部件号: ADS7128
主题中讨论的其他器件: AMC3330、 TLV9001

尊敬的 TI 团队:

我 在自主监控模式下使用 ADS7128 来测量高压交流输入 (400V)。

我们的模拟前端 (AFE) 可衰减 400Vac 信号、并通过 AMC3330 隔离放大器和 TLV9001 运算放大器。 运算放大器改变交流波形、使其产生  2.048V 的直流失调电压、从而为 ADC 引脚提供安全的未削波单极波(从~0.53V 摆动到~3.56V)。

当我们读取 16 位硬件 RMS 数据寄存器(和)时RMS_MSB RMS_LSB、我们会看到一个巨大的差异、具体取决于 DC_SUB RMS_CFG (地址 0xC0) 寄存器内的 DC 减法 () 配置:

  • 启用直流消减时: * RMS_CFG 使用的值: 0x07 (通道 0、DC_SUB = 1b、65,536 个样本)

    • 观察结果: 对于 400V 交流输入范围、原始 RMS 寄存器计数读数在 62000 到 63000 之间非常高。

  • 禁用直流消减时: * RMS_CFG 使用的值: 0x03 (通道 0、DC_SUB = 0b、65,536 个样本)

    • 观察到的结果: 对于完全相同的输入范围、原始 RMS 寄存器计数显著下降到较低的范围、介于 29000 和 32000 之间。

我们的 TI 问题:

  1. 为什么启用 DC SubtractionDC_SUB = 1b() 会导致寄存器针对电平转换的单极信号输出接近 63000 的高计数? 内部数学引擎是否由于在负半个周期内信号降至计算的平均直流基线以下而欠流或向后缠绕?

  2. 将原始 16 位 RMS 寄存器计数转换回输入 ADC 电压的确切数学公式是什么?

请查找所附的电路原理图和信号波形。

PS:在原理图中、您会发现电压为 2.5V、但对于电流测试、电压为 2.048v。

此致、
Prathamesh

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

    您好 Prathamesh、

    对此主题的响应延迟、我深表歉意。 我现在正在查看此内容。  

    我缺少一个参数来验证 RMS 读数。 ADC 的基准电压是多少、如何生成和提供该电压? 我需要这样计算 ADC 的满量程输入范围。  

    信号的振幅 (Vpk) 为 1.518V 交流、等于 1.073Vrms。 假设有 5V 基准电压和 16 位输出、我预计  在 启用 RMS_DC_SUB 的情况下会得到接近 14,064(从 19,900 个代码更正)的结果。 您是否能够分享 RMS_MSB 和 RMS_LSB 寄存器的结果?

    此外、被测输入信号的频率是多少? 如果未通过 CLK_DIV 和 OSC_SEL 寄存器字段调整 ADC 采样率、则观察窗口的长度可能不足以在给定交流信号频率的情况下计算准确的结果。 快速查看以下文档、如果您发现配置与文档中建议的内容之间存在任何即时差异、请告诉我。  

    https://www.ti.com/lit/ab/sbaa399/sbaa399.pdf

    此致、
    Joel

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

    尊敬的 Joel:

    感谢您的详细答复。

    根据我的理解、Vref 为 5V(AVDD 也为 5V,我不确定两者是否相同)。

    关于时钟配置、我查看了当前设置
    CLK_DIV[3:0] = 0000b 、其中和 OSC_SEL = 0。 根据您分享的应用手册、要  使用 65,536 个 RMS 样本正确测量低于 80Hz 的输入频率、转换速率应以 ƒCYCLE  = 333.3kHz 为目标。 我们的电流配置偏离此指南、该指南可能会解释我们看到的采样窗口问题。

    为了解决这个问题、我将更新 CLK_DIV[3:0] = 0011b 时钟分频器、以将内部时钟速度降低到建议的规格。 我将使用该值运行一系列测试、并发回报告它是否使我们的读数保持稳定。

    作为参考、我附上了固件源代码以及原始观察日志副本。 我还在 400V 交流负载下、在 ADC 通道 0 连接了一个干净的示波器捕捉输入波形。

    您能否验证以下 TI E2E 文章中详述的实施指南是否与我们的用例相符?

    如果您需要我们这边的任何其他诊断日志或寄存器转储、请告诉我

    此致、

    Prathamesh Kulkarni




    代码:  

    S16 s16ADS7128_GetChannelRMS (const C_ADS7128_DEVICE* const pcDev、
    E_ADS7128_Chan eChannel、
    U16 *pu16Data)
    {
    //*************************************** 函数范围数据**************************************************
    S16 s16Result = eADS7128_RET_ERROR;
    U8 u8RmsCfgVal = 0U;
    //U8 rmscfgvalafterread;
    U8 u8Status = 0U;
    U8 u8Lsb = 0u;
    U8 u8Msb = 0U;

    //****************************************** 函数代码****************************************************
    //直接参数安全跟踪检查
    if ((pcDev!= KB_NULL_ptr)&&(pu16Data!= KB_NULL_ptr)&&((U8) eChannel <= 7U)
    {
    //----------------------------------------------------------------------------------------------------
    //步骤 1 和 2:配置 RMS 引擎属性
    //----------------------------------------------------------------------------------------------------
    //位 7-4:RMS_Chid = eChannel
    //位 2:DC_SUB = 1b(默认情况下根据要求强制激活)
    //位 1-0:RMS_SAMPLES = eSamples
    u8RmsCfgVal =((U8) eChannel 和 0x07U)<< 4U)|((U8) RMS_Samples_65536 & 0x03U);
    u8RmsCfgVal ||(1U << 2U);//启用直流减法

    s16Result = s16ADS7128_SingleRegWrite (pcDev、RMS_CFG_ADDRESS、u8RmsCfgVal);
    如果 (s16Result!= eADS7128_RET_OK) 返回 s16Result;

    //----------------------------------------------------------------------------------------------------
    //步骤 3:清除并启用数学引擎(强制执行缺失的 0 -> 1 切换规则)
    //----------------------------------------------------------------------------------------------------
    //首先确保其已完全清除
    s16Result = s16ADS7128_SingleRegWrite (pcDev、ADS7128_General_CFG_ADDR、0x20U);//仅 STATS_EN
    如果 (s16Result!= eADS7128_RET_OK) 返回 s16Result;

    //将 RMS_EN 驱动为高电平(位 7 = 1)-> 0x20 | 0x80 = 0xA0
    s16Result = s16ADS7128_SingleRegWrite (pcDev、ADS7128_General_CFG_ADDR、0xA0U);
    如果 (s16Result!= eADS7128_RET_OK) 返回 s16Result;

    //----------------------------------------------------------------------------------------------------
    //步骤 4:设置序列发生器拓扑和启动转换
    //----------------------------------------------------------------------------------------------------
    // 4a. 在更改路由掩码之前停止任何正在进行的转换框架
    s16Result = s16ADS7128_SingleRegWrite (pcDev、ADS7128_SEQUENCE_CFG_ADDR、0x00U);//空闲模式
    如果 (s16Result!= eADS7128_RET_OK) 返回 s16Result;

    // 4b。 清除 GPIO 引脚行为配置以防止功能串扰
    s16Result = s16ADS7128_SingleRegWrite (pcDev、ADS7128_PIN_CFG_ADDR、0x00U);
    如果 (s16Result!= eADS7128_RET_OK) 返回 s16Result;

    // 4c。 将目标通道启用为序列字符串中唯一受监控的模拟节点
    s16Result = s16ADS7128_SingleRegWrite (pcDev、ADS7128_AUTO_SEQ_CH_SEL_ADDR、(U8)(1U <<(U8) eChannel));
    如果 (s16Result!= eADS7128_RET_OK) 返回 s16Result;

    // 4D。 将序列发生器参数转换为自动序列配置 (SEQ_MODE = 01b)
    s16Result = s16ADS7128_SingleRegWrite (pcDev、ADS7128_SEQUENCE_CFG_ADDR、0x01U);
    如果 (s16Result!= eADS7128_RET_OK) 返回 s16Result;

    // 4e。 移位转换器状态至高速自主监控 (CONV_MODE = 01b)-> 0x20
    s16Result = s16ADS7128_SingleRegWrite (pcDev、ADS7128_OPMODE_CFG_ADDR、0x20U);
    如果 (s16Result!= eADS7128_RET_OK) 返回 s16Result;

    // 4f。 将序列处理环路置为有效 (SEQ_START = 1b)-> 0x01 | 0x10 = 0x11
    s16Result = s16ADS7128_SingleRegWrite (pcDev、ADS7128_SEQUENCE_CFG_ADDR、0x11U);
    如果 (s16Result!= eADS7128_RET_OK) 返回 s16Result;

    //----------------------------------------------------------------------------------------------------
    //步骤 5:轮询数学累积块完成标志
    //----------------------------------------------------------------------------------------------------
    应该做
    {
    s16Result = s16ADS7128_SingleRegRead (pcDev、ADS7128_SYSTEM_STATUS_ADDR、&u8Status);
    if (s16Result!= eADS7128_RET_OK)
    {
    //物理总线错误时发生无限循环的安全回滚恢复块
    (void) s16ADS7128_SingleRegWrite (pcDev、ADS7128_SEQUENCE_CFG_ADDR、0x01U);
    (void) s16ADS7128_SingleRegWrite (pcDev、ADS7128_General_CFG_ADDR、0x20U);
    返回 s16Result;
    }

    } while (((u8Status & ADS7128_RMS_DONE_MASK)== 0U);//检查位 4 (0x10)

    // 4g。 冻结内部连续采样器帧执行 (SEQ_START = 0)
    s16Result = s16ADS7128_SingleRegWrite (pcDev、ADS7128_SEQUENCE_CFG_ADDR、0x01U);
    如果 (s16Result!= eADS7128_RET_OK) 返回 s16Result;

    //----------------------------------------------------------------------------------------------------
    //步骤 6:提取指标、清除跟踪状态、禁用 RMS 模块上下文
    //----------------------------------------------------------------------------------------------------
    //从内部寄存器依次读取原始计算步骤
    s16Result = s16ADS7128_SingleRegRead (pcDev、RMS_LSB_ADDRESS、&u8Lsb);
    如果 (s16Result!= eADS7128_RET_OK) 返回 s16Result;

    printf(“ RMS 值 LSB:%d\n“、u8Lsb);

    s16Result = s16ADS7128_SingleRegRead (pcDev、RMSB_ADDRESS、&u8Msb);
    如果 (s16Result!= eADS7128_RET_OK) 返回 s16Result;

    printf(“ RMS 值 MSB:%d\n“、u8Msb);

    //合并为 16 位有效载荷输出指针赋值
    *pu16Data =(U16)(((U16) u8Msb << 8U)|(U16) u8Lsb);

    //通过向完成位写入 1 来清除完成位 (0x10)
    s16Result = s16ADS7128_SingleRegWrite (pcDev、ADS7128_SYSTEM_STATUS_ADDR、0x10U);
    如果 (s16Result!= eADS7128_RET_OK) 返回 s16Result;

    //禁用 RMS 模块以省电并复位器件状态 (RMS_EN = 0)
    s16Result = s16ADS7128_SingleRegWrite (pcDev、ADS7128_General_CFG_ADDR、0x20U);
    如果 (s16Result!= eADS7128_RET_OK) 返回 s16Result;

    s16Result = eADS7128_RET_OK;
    }

    返回 s16Result;

    }

    注意:为了便于您更好地理解、我删除了 printf 并从代码中读取寄存器部分。

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

    尊敬的 Joel:

    根据您的建议、我查看了 ADS7x28 真均方根模块 文档、发现由于我们的输入信号频率为 50Hz 、65,535 个样本所需的 ƒCYCLE μ s 应为 333.33kSPS。

    我通过将 OPMODE 寄存器 值设置为 0x23、在代码中实现了这种更改。 然而、即使经过这种修改、我们仍然观察到 RMS 值在 62,000 至 63,000 范围内。

    还有一点需要澄清:正如你上面提到的、预期值约为 19,900个代码。 该值是根据 Vpk-pk (1.518Vac) 还是 RMS 电压 (1.073Vrms) 计算得出的? 如果使用 RMS 电压进行计算、则 在 1.073Vrms 下、预期 ADC 代码约为 14,064。

    我随附了一个表格、其中显示了在相应交流输入电压下观察到的 RMS 值。 我还附上了一个文本文件、其中包含测试过程中捕获的多个 RMS 测量结果。 在该文件中、您可以找到寄存器设置以及相应的 MSB 和 LSB 值。

    此外、我还附录了 ADC 电路图、其中显示了 VREF 的生成方式。

    注意: 在当前配置中启用了直流消减功能。

    请您就这些观察结果提供反馈。

    此致、
    Prathamesh

    输入交流电压 RMS 代码
    360 62792-62842
    380 62936-62997
    400 63080-63153.
    420 63226-63299
    440 63395-63473

    e2e.ti.com/.../RMS-Results-Observed.txt