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.

[参考译文] MSP430I2040:基于 MSP430i2040的仪表校准问题

Guru**** 2589265 points
Other Parts Discussed in Thread: MSP430I2040, EVM430-I2040S, MSP430I2041

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/777078/msp430i2040-msp430i2040-based-meter-calibration-issue

器件型号:MSP430I2040
主题中讨论的其他器件: EVM430-I2040SMSP430I2041

尊敬的先生,

我正在使用基于 MSP430i2040 (两相能量计)的 TI 能量计代码。 在这里、我使用一个函数

SET_V_rms_scaling (0、0、calib_val[0]);

 

现在、calib_val[0]是要写入闪存的新校准值。 但当我使用此函数时,它不会写入与 calib_val[0]相同的确切值。

 

例如、阶段1的默认比例因子为13428。 如果我将 calib_val[0]中的值设置为12500、它将写入12372。 为什么会这样?

此致。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Pallav、
    我们正在寻找一位有关此主题的专家来帮助您解决此问题。

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

    您好!

    可能会从您设置的值中减去偏移、但我不确定。 我建议查看此函数的代码以进行确认。 请记住、旧能源库已替换为新的能源测量设计中心(EMDC)和软件库。 今后对能源库的支持将受到限制。

    使用适用于 MSP430TmMCU 的全新电能测量设计中心和软件库加快您的计量设计

    适用于 MSP430 MCU 的电能测量设计中心概述视频

    此致、

    James

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

    您好!

    您能告诉我您使用的代码和应用手册吗? 是 SLAA637吗? 如何 发送这些校准值? 通过 GUI、另一个主机 MCU 或代码中? 您的问题可能由闪存损坏引起。 如果您使用 SLAA637代码、则存在未设置闪存控制器时钟的错误。 我建议在"system_setup();"函数之前在'emeter-main.c'文件中添加下面的 FCTL2代码、然后重建工具包>计量>应用项目。

    emeter-main.c 代码更新

    #if defined (__IAR_systems_icc_)|| defined (__TI_Compiler_version__)
    void main (void)
    #else
    int main (int argc、char *argv[])
    #endif
    NUM_PHASES
    = 1
    #define ph 0
    #else
    int ph;
    #endif
    #if defined (TRNG_support)
    uint16_t Randy;
    #endif
    defined (TRNG_purpy_tests)
    int FIPS_RESULT;
    #endif
    静态 int32_t x;
    int phase _state;
    #if (defined (phase_Reversed_detection_support)&& defined (ON_Reversed_select_positive _reading))|| defined (PHASE_INBOND_DETECnation_support)
    int metaduation_state;
    #endif
    
    #if!defined (__MSP430__)
    如果(start_host_environment (argc、argv)< 0)
    EXIT (2);
    #endif
    //[修改的代码]添加了针对闪存控制器速度的 FCTL2配置
    // 以保持 Fftg 介于257kHz 和476kHz 之间。 这应该在以前完成
    // system_setup()和 metaduation_init()函数,因为它们可能
    // 读取/写入闪存/信息存储器。
    FCTL2 = FWKEY | FSSEL1 | FN5 | FN4; //[修改的代码] Fftg =~334kHz
    system_setup();
    #if defineed (TRNG_puriation_tests)
    FIPS_init();
    FIPS_RESULT =-1;
    #endif 

    此致、

    James

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

    尊敬的 James:

    感谢您的回复。 我确实使用 EMDC 进行了编程、并且可以在器件中加载代码。(在这种情况下、当我提供230Vac 时、"gEmSWResult.phaseResults[0].VRMS;"中会显示17128。)

    现在、在这种情况下、您能否建议我这是正确的值? 此外、如果是、请针对相同的情况建议校准步骤。

    就您最后一个与闪存时钟相关的解决方案而言、我添加了此代码修改、但没有效果。

    我还想告诉您、代码初始化时、它会从默认数组中写入正确的值。  此问题仅与函数 SET_V_rms_scaling (0、0、calib_val[0])有关;

    您是否有其他步骤可以在闪存中写入相同内容?

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

    您好!

    [引用用户="Pallav Gandi"]

    感谢您的回复。 我确实使用 EMDC 进行了编程、并且可以在器件中加载代码。(在这种情况下、当我提供230Vac 时、"gEmSWResult.phaseResults[0].VRMS;"中会显示17128。)

    现在、在这种情况下、您能否建议我这是正确的值? 此外、如果是、请针对相同的情况建议校准步骤。

    [/报价]

    如果您使用了我们的 EMDC 示例项目之一或使用提供的 EMDC 二进制文件之一对器件进行了编程、则会在230V 时进行预校准。 因此、如果您使用的是230V、那么如果您使用的是 EVM430-i2040S、它应该会显示2300000。 结果选项卡下的 EMDC GUI 中显示的值是多少? 您使用的是不同的电路板还是您自己的定制电路板? 如果是、我怀疑分压器可能已更改、如果您应用230V、代码在230V 时校准、可能会导致结果偏差。 您也可以在 EMDC GUI 中调整电压传感器电阻分压器、然后重新生成代码。

    在进行校准时、您需要使用精确的测试源为电路板提供电压和电流。 如果您无法访问此类测试源、则可能会使用电阻器/电感器等外部负载来获得接近60度的相位角(PF = 0.5)、以进行相位校准( 在这里进行了更详细的讨论)。 校准说明可在 EMDC 技术指南中找到。

    [引用用户="Pallav Gandi"]

    就您最后一个与闪存时钟相关的解决方案而言、我添加了此代码修改、但没有效果。

    我还想告诉您、代码初始化时、它会从默认数组中写入正确的值。  此问题仅与函数 SET_V_rms_scaling (0、0、calib_val[0])有关;

    您是否有其他步骤可以在闪存中写入相同内容?

    [/报价]

    让我们区分 EMDC 和传统能源库代码。 EMDC 代码已经解决了那些可能已经存在于传统能源库中的闪存问题。 现在、我们继续关注 EMDC 代码并使其正常工作、因为这是推荐的方法。

    此致、

    James

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

    我们参考 SLAA637A 开发了自己的电路板。 如图和使用的参考组件所示、我们已将 R1和 R2比率从1000和1K 修改为990和2.7K。

    此外、对于电流参数、将负载比从10 Ω 更改为13 Ω、将变压器比从1000:1更改为2000:1。 60A 至100A 的最大电流。

    在 EMDC 中更改并测试相同后生成的代码。 现在、为了进行测试、我们也不使用 TI 的软件作为 GUI。 在内部、我们已将通信修改为9600波特、并在 RS485上。 (我们也没有可用作桥接器的套件)。

    现在、当我们以230VAC 连接负载时、"gEmSWResult.phaseResults[0].VRMS"中显示的值为17128。 此外、理想情况下、电流的值为179、当连接到40W 负载时、值为210。

    我不确定 GUI 是否会进行一些计算来显示正确的值、或者我调用的函数是错误的。

    请建议简单的两个查询、以读取阶段1电压并校准阶段1电压。

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

    您好、Pallav、

    [引用 USER="Pallav Gandia">我们开发了自己的参考 SLAA637A 的电路板。 如图和使用的参考组件所示、我们已将 R1和 R2比率从1000和1K 修改为990和2.7K。[/QUERP]

    太棒了! 做得很好。 对于 EVM430-i2040S_SH_1V_1C EMDC 示例项目、我们在230V 时使用 EVM430-i2040S 对其进行了校准。 但是、该板上的 R2为1.5K、而不是2.7K。 因此、如果您使用其中一个示例项目、它们将无法正确测量 RMS 电压、因为即使已校准 R2、R2也已发生更改。

    现在让我们保持 R1和 R2的990K 和2.7K、因为 EMDC 可以对此进行调节、并且它小于最大 ADC 输入电压。

    [引用 USER="Pallav Gandi']此外、对于电流参数、将负载比从10欧姆更改为13欧姆、将变压器比从1000:1更改为2000:1。 60A 至100A 的最大电流。[/QUERP]

    这也很好-在100A 时、不会超过最大 ADC 输入电压。 同样、EMDC 可以处理这一问题。

    [引用 user="Pallav Gandi']在 EMDC 中更改此代码并测试相同代码后生成的代码。 现在、为了进行测试、我们也不使用 TI 的软件作为 GUI。 在内部、我们已将通信修改为9600波特、并在 RS485上。 (我们也没有可用作桥接器的套件)。

    感谢您分享这些信息。 了解您正在做的事情以及您所做的改变、这会非常有帮助。 对于您的初始测试、我强烈建议使用 EMDC GUI、因为您可以信任结果。 我们使用了高波特率(250kBaud)来确保在最坏情况下、包含所有参数的三相配置可在采样中断之间从 MCU 发送到 GUI。 对于您来说、它听起来像是单相或双相配置、因此您可能会觉得很好。 最好仔细检查 SD ADC 中断之间的通信是否发生。 较慢的 ADC 采样率也会有所帮助。

    同样、我建议在以较低的波特率移动到主机器件之前使用 EMDC GUI 进行测试。 同时发生的变化过多、这会增加对问题发生位置的混淆。

    [引用 USER="Pallav Gandhi "]现在,当我们以230VAC 值连接负载时,"gEmSWResult.phaseResults[0].VRMS"中显示的值为17128。 此外、理想情况下、电流的值为179、当连接到40W 负载时、值为210。[/报价]

    如果您创建了一个新的 EMDC 项目、但尚未对其进行校准、则此结果是合理的。 如果您的源电压接近230VAC、请使用 EMDC GUI 校准您的系统并将校准因数存储在闪存中、并在校准后保存 EMDC 项目以将其保留在项目设置中。

    [引用 USER="Pallav Gandi']我不确定 GUI 是否会执行一些计算来分解正确的值、或者我调用的函数是错误的。 [/报价]

    是的、当您在 EMDC 内的校准窗口中输入高压交流测试源时、GUI 知道它们提供了什么。 然后、它从 MCU 读取未校准值、计算差值并应用新的比例因子进行增益校准(基本上获取 ADC 值并将其缩放到对人类有意义的值)。 相位校准也是如此、但我们稍后可以解决这一问题。

    [引用用户="Pallav Gandi"]请建议简单的两个查询,用于读取阶段1电压和校准阶段1电压。

    有关通信命令、请参阅 EMDC 技术指南中的协议部分。 请注意、有一个拼写错误(我已提交一个错误、将在下一个版本中得到解决)、命令不是0xB_、而是0x8_

    我希望这对您有所帮助!

    此致、

    James

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

    我们讨论的值是校准前的值。 由于我们没有硬件来与 EMDC 通信、因此我们已使用自定义协议将其转换为9600波特。

    您能否为我们提供硬件和 GUI 之间的通信字符串、以便进行评估?

    "gEmSWResult.phaseResults[0].VRMS"中的值是否正确?

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

    您好!

    可以在'EM_userConfig.c'文件中找到校准系数。 默认的非校准值如下所示。

    EM_Phase_Calibration g_emPhaseCalibration[EM_PHASE_LENG]=
    {
    //PHASE_A
    {
    voltageSF =_iQ24 (1.000000000)、
    .currentSF =_iq24 (1.000000000)、
    .activePowerSF =_IQ30 (1.000000000)、
    .reactivePowerSF =_IQ30 (1.000000000)、
    PhaseCorrection = 0x0080、
    }、 

    使用 EMDC GUI 完成校准后、这些因素将随校准值更新。

    这是一个快速测试。 我建议您为 MSP430i2041打开其中一个 EMDC 示例项目并生成代码。 使用生成的'em_userconfig.c'文件中的校准因子修改项目、重新编译项目、然后使用项目重新对器件进行编程。 然后、使用 EVM430-i2040S 等1.5k Ω 电阻器替换电路板上的 R2。 然后、施加230V 电压并查看您正在测量的 VRMS 值。

    EM_Phase_Calibration g_emPhaseCalibration[EM_PHASE_LENG]=
    {
    //PHASE_A
    {
    voltageSF =_iQ24 (23.711392999)、
    .currentSF =_iQ24 (16.260255575)、
    .activePowerSF =_IQ30 (0.385561275)、
    .reactivePowerSF =_IQ30 (0.385561275)、
    PhaseCorrection = 0x0071、
    },
    }; 

    同样、它将帮助您购买 HID 桥板和隔离板以进行开发。 通过分析 GUI 和 MCU 之间的通信、这将为您节省大量的开发时间。

    此致、

    James

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

    您是否有幸尝试过我的建议? 谢谢。

    此致、

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

    是的。 我手动设置校准值、以便在通信中显示校准值。

    感谢您的建议。 现在、我的.voltageSF =_iQ24 (1.000000000)、结果为.voltageSF =_iQ24 (1.310000000)、对吧?

    其次、我修改了 EMDC 生成的代码、以便可以在 RS485端口上进行通信。 现在、为了进行调试、我希望您指导我实现该值。

    例如、对于电压、我得到具有 Vrm[0]、Vrm[1]、Vrm[2]、Vrm[3]的* Vrms。 为了以十六进制形式获得正确的值、我应该如何放置它?

    另外、对于活动功率等其他值、具有 actPower[0]至 actPower[7]。 如何将其转换为有意义的值?

    谢谢。

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

    您好、Pallav、

    [引用用户="Pallav Gandi"]

    是的。 我手动设置校准值、以便在通信中显示校准值。 感谢您的建议。

    [/报价]

    太棒了!

    [引用用户="Pallav Gandi"]现在我的.voltageSF =_iQ24 (1.000000000),结果是.voltageSF =_iQ24 (1.310000000),它是否正常?

    我不确定。 它们看起来不同于校准后的 EMDC 示例项目的校准系数。 这些校准系数是否提供了正确的结果? 有关如何在_iQ24()值和整数值之间转换的详细信息,请参阅 用户指南。 对于增益校准、您只需根据观察到的差异调整这些值。 如果测量结果比施加的信号小10.75倍、则需要大于10.75倍的比例因子。

    [引用 USER="Pallav Gandi']第二,我修改了 EMDC 生成的代码,以便可以在 RS485端口上进行通信。 现在、为了进行调试、我希望您指导我实现该值。[/quot]

    为了进行修改、我有两个版本:

    1. 项目#1由 EMDC 生成、可让您通过 UART 以默认波特率250kbaud 与 EMDC GUI 进行通信。 您可以在此项目中调整校准因子、但不能更改任何其他内容。
    2. 项目#2是项目#1加上您在代码中仔细添加和跟踪的更改、例如添加 RS-484通信支持。 对于该项目、如果您更改波特率或通信协议、则无法与 EMDC GUI 进行通信。 这就是项目#1在您的设计中用作参考的原因。

    总之、不要尝试太快地执行。 首先了解 EMDC 通信协议以及数据的发送方式。 然后、在完成该操作后、开始更改通信接口和协议。 简化这些步骤有助于减少问题。

    [引用用户="Pallav Gandi"]

    例如、对于电压、我得到具有 Vrm[0]、Vrm[1]、Vrm[2]、Vrm[3]的* Vrms。 为了以十六进制形式获得正确的值、我应该如何放置它?

    另外、对于活动功率等其他值、具有 actPower[0]至 actPower[7]。 如何将其转换为有意义的值?

    [/报价]

    我在下面的主题中详细讨论了这个问题。 基本上、数组中的第一个元件(例如 Vrm[0]、actPower[0]等)等于 LSB、最后一个元件是 MSB。

    MSP430I2041:通过 UART 发送的 EMDC 有功电能值与单相能量计调试窗口中的 ACTIVeEnergy 表达式不匹配

    这里是另一个供您参考的有用线程。

    MSP430i2040:通过 UART 将 EMDC 与另一个 MCU 连接

    此致、

    James