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.

[参考译文] CCS/MSP430F6736:使用 EVM430-6736在没有能源库的情况下进行能源测量时出现问题

Guru**** 2563960 points
Other Parts Discussed in Thread: EVM430-F6736, MSP430F6736

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/601948/ccs-msp430f6736-problem-using-evm430-6736-for-energy-measurement-without-energy-library

器件型号:MSP430F6736
主题中讨论的其他部件:EVM430-F6736MSP430WARE

工具/软件:Code Composer Studio

大家好、

我在 CCS 7.1上使用 MSP430F6736通过 EVM430-F6736 Launchpad 上的 SD24B 测量能量(不使用能源库)。  我的 SD24B 初始化如下所示-  

REFCTL0 = REFMSTR + REFVSEL_1 + REFON;             /* Enabale Reference = 2.0V */
SD24BCTL1 &=~SD24GRP0SC;                       /* SD16SC */
SD24BCTL0 = SD24SSEL_SMCLK                  /*时钟为 SMCLK */
             | SD24PDIV_3                              /* 16分频=> ADC 时钟:1.048576MHz *
             | SD24DIV0
             | SD24REFS;                             /*使用内部基准*/
_DELAY_CYCLES (0x5000);
SD16INCTL_LIVE = CURRENT_LIVE;                                /*设置通道0 (I1)的增益*/                    /通道2电流
SD16CCTL_LIVE = SD24DF_1 | SD24ALGN | SD24SCS_4;                  /*数据左对齐*/
SD16BOSR_LIVE = 256 - 1;                                               /*将过采样率设置为256 (默认值)*/
SD16PRE_LIVE = 0;

SD16INCTL_VOLTAGE = VOLTGE_GAIN;//设置通道2的增益(V)*/                                                     //通道0电压
SD16PRE_VOLTAGE = DEFAULT_V_PRESALE_FACTOR;
SD16CCTL_VOLTAGE = SD24DF_1 | SD24ALGN | SD24SCS_4;//将过采样率设置为256 (默认值)*/
SD16BOSR_VOLTAGE = 256 -1;//将过采样率设置为256 (默认值)*/
SD24BCTL1 |= SD24GRP0SC;// SD16SC */
SET_SD16IE_VOLTAGE;

我仅在电压通道中获得约25%的更多原始误差。 存在电流通道最小误差(采样为4096SPS)。 此外、测量的电压也不稳定、即在某个时间、测量的最小误差和最大电压在240V rms 信号下具有大约4V 的差值。

其次、我尝试将内部基准更改为1.5V、2.5V、但行为相同。 另一件事是基准值不变、因为我在不更改所有内部基准的计算结果的情况下获得相同的电压。 240V rms 始终约为190V rms。

第三、根据 MSP430ware、我尝试输入2.5V 外部基准并修改了外部基准代码、施加240V rms 电压时的电压约为115V、但更稳定的是最小和最大电压差约为2V。

在所有条件下、它都超出了限制。 无法理解为什么它的工作方式仅像这个电压通道、而电流通道的行为是准确的。 请帮助。 提前感谢您!

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

    我将研究您的问题、并将很快作出响应。

    此致、

    James

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

    Gaurav、您好!

    尽管您没有使用能源库、但看起来您使用的是能源库中'emeter-setup.c'文件中的代码。

    emeter-setup.c

    /*
    模拟前端初始化例程。
    *
    **将 Σ-Δ ADC 模块配置为模拟前端
    、用于*使用电流互感器的防篡改仪表和
    *分流器作为电流传感器(请参阅通道0和1的配置)。
    */
    static __inline__ void init_analog_front_end_normal (void)
    {
    /*
    *首先、它确保嵌入式信号处理是正确的
    *禁用、否则将无法修改
    * SD16寄存器。
    *
    #if define(_MSP430_has _ESP430E__)
    ESPCTL &=~Espen;
    #endif
    
    /*
    *模拟前端的常规配置、
    *适用于所有通道:时钟选择(SMCLK)和分频器
    *设置(取决于 SMCLK 频率)和基准电压
    *选择。
    *
    
    REFCTL0 = REFMSTR + REFVSEL_1 + REFON; /* Enabale Reference = 2.0V */
    
    //SD16CCTL_VOLTAGE &=~SD24SC;
    //SD16CCTL_LIVE &=~SD24SC;
    SD24BCTL1 &=~SD24GRP0SC; /* SD16SC */
    #if defined (single_phase)&& defined (neline_monitor_support)
    // SD16CCTL_NEUTRAL &&~SD24SC;
    #endif
    
    MCLK_DEF = 16
    SD24BCTL0 = SD24SSEL_SMCLK //时钟为 SMCLK */
    | SD24PDIV_3 /* 16分频=> ADC 时钟:1.048576MHz *
    | SD24DIV0
    | SD24REFS; /*使用内部基准*/
    #endif
    MCLK_DEF = 8
    SD24BCTL0 = SD24SSEL_SMCLK //时钟为 SMCLK */
    | SD24PDIV_3 /* 8分频=> ADC 时钟:1.048576MHz *
    | SD24REFS; /*使用内部基准*/
    #endif
    
    //MM24取出 SD24ALGN 部件
    SD16INCTL_LIVE = CURRENT_LIVE; /*设置通道0 (I1)的增益*/
    SD16CCTL_LIVE = SD24DF_1 | SD24SCS_4; /*将过采样率设置为256 (默认值)*/
    SD16BOSR_LIVE = 256 - 1; /*将过采样率设置为256 (默认值)*//
    SD16BIE |= SD16IE_LIVE;
    SD16PRE_LIVE = 0;
    
    #if 已定义(nutel_monitor_support)
    SD16INCTL_NEUTRAL = CURRENT_NEUART_GAIN;//设置通道1 (I2)的增益*/
    SD16CCTL_NEUTRAL = SD24DF_1 | SD24SCS_4; /*将过采样率设置为256 (默认值)*/
    SD16BOSR_NEUTRAL = 256 -1; /*将过采样率设置为256 (默认值)*//
    SD16BIE |= SD16IE_NEUTRAL;
    SD16PRE_NEUTRAL = 0;
    #endif
    
    /*配置模拟前端通道2 -电压*/
    SD16INCTL_VOLTAGE = VOLTGE_GAIN; /*设置通道2 (V)的增益*/
    SD16CCTL_VOLTAGE = SD24DF_1 | SD24ALGN | SD24SCS_4; /*将过采样率设置为256 (默认值)*/
    SD16BOSR_VOLTAGE = 256 -1; /*将过采样率设置为256 (默认值)*/
    SD24BCTL1 |= SD24GRP0SC; /* SD16SC */
    SET_SD16IE_VOLTAGE;
    #ifdef with _DMA
    extern Int16_t DMA_ADC_buffer[6];
    
    SD24BCTL1_H = SD24DMA1_H;
    
    DMACTL0 = DMA0TSEL_SD24IFG;
    DMA0SA =(无符号短整型)和 SD24BMEML0;
    DMA0T= DMADC_ADDR_3
    
    + DMASK + DMADDCR =无符号短整型;DMADDR_ADDR_3 + DMADDCR =无符号 DMADDR_ADDR_3 + DMASK + DMASK =无符号 ADDR_ADDR_3;DMADDR_ADCCR + DMAS3 + DMASK + DMASK + DMADDR_ADDR_ADCCR + DMAS3 + DM 启用 IE
    #else
    //set_SD16IE_VOLTAGE;
    #endif
    SD16PRE_VOLTAGE = DEFAULT_V_PRESALE_FACTOR;
    //#if defined (SD16CONF1_FUSGE)
    // SD16CONF1 = SD16CONF1_FUSGE;
    //#endif
    
    #if !defined (ESP_support)&& defined (single_phase)
    chan1.metrology.current.in_phase_correction[0].sd16_preloaded_offset = 0;
    #if 已定义(nutel_monitor_support)
    chan1.metrology.neutral.in_phase_correction[0].sd16_preloaded_offset = 0;
    #endif
    #endif
    /*
    *\note
    *请注意、过采样率应相同
    *表示所有通道。 默认为256。
    *
    
    //SD24BIE=0x1;
    //SD24BCTL1 |= SD24GRP0SC;已更改
    } 

    从较低的层次来看、我注意到代码与'emeter-setup.c'之间唯一的区别是代码在"SD16CCTL_live"寄存器中启用了"SD24ALGN"。 在较高层次上、我建议您查看 此 EVM 源代码中的其他文件 、以了解如何正确处理 ADC 数据。 例如,'emeter-foreus.c'文件中的 voltage ()函数使用除法和缩放因子以10mV 为增量计算 RMS 电压。 如果采样率为4096个样本/秒(SPS)、那么1秒后、您将获得大约4096个样本。 记录的平方电压样本的点积被截断为26位、然后除以样本数。 ADC 样本从'emeter-background.c'文件传递到'emeter-forefore.c'文件。

    此时、继续使用2.0V 内部基准。

    当您说"它超出限制"时、您是指您遇到过溢、您超出了应用的精度限制、还是其他问题?

    此致、

    James

    MSP 客户应用

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 James、
    感谢您的回复、尽管我的工作站没有收到我的回复、但我对此感到遗憾。
    超出限值意味着我的精度超出限值。 所有变量都不会溢出(选中)
    我仅使用能源库中的 SD24初始化部分、除此之外什么都没有。
    主要的问题是、当我使用电压和电流的标准 rms 计算时、出现更多的原始误差、即 sqrt (样本的 SUMSQ)。
    我同意图书馆的部分处理是不同的,但我认为这只是为了提高速度,除此之外没有别的。 我对读取 samles 的24位/16位寄存器有疑问。 在 MEMH 上的电压通道库中、对于电流通道、MEMH 和 MEML 均被考虑在内。 根据 MSP430ware、在连续模式下只需 MEMH 即可读取样本。 用原始错误打破了我的头、尝试了很多、没有帮助。 请尝试查看原始错误部件。 如果需要、我可以共享我的代码(但它的所有标准计算)
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 James、
    除上述主题外、我需要告知、选择任何内部基准1.5/2.0/2.5时、在 Vref 引脚上测量的基准电压始终为1.153V、您能解释一下吗? 如果是、我认为我的问题已经解决、因为所有计算都是按照2.0V 基准完成的、如果我将计算调整为1.153V 基准、我就会获得良好的结果。 但现在的问题是、内部基准为何不准确且不可选择、因为所有选择始终为1.153
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Gaurav、您好!

    感谢您提供更多详细信息。 遗憾的是、我将 REF 模块(1.5V、2.0V、2.5V)与 SD24_B 模块的内部基准混淆。 根据 MSP430F5xx/6xx 用户指南中的第29.2.3节、内部 SD24_B 基准提供一个大约1.2V 的固定电压、因此、如果您在 VREF 上测量的电压大约为1.15V、这是有道理的。 我很抱歉造成混淆。 令人惊讶的是、该器件具有两种不同类型的 ADC。 为了控制内部 SD24_B 基准、SD24BCTL0寄存器被配置。 为了控制另一个 REF 模块、REFCTL0被配置。

    现在我们已经弄清了这一点、让我们继续看看您看到的误差。 在代码中、我看到您将在转换寄存器 SD24BMEMHx 和 SD24BMEMLx 中对齐滤波器的输出、以获得电压和电流结果。

    SD16CCTL_LIVE = SD24DF_1 | SD24ALGN | SD24SCS_4; /*数据左对齐*/ 
    SD16CCTL_VOLTAGE = SD24DF_1 | SD24ALGN | SD24SCS_4;//将过采样率设置为256 (默认值)*/ 

    在'emeter-structs.h'文件中、我看到您正在讨论的内容。 电压结果被映射到 SD24BMEMHx 寄存器、而当前结果将同时从 SD24BMEMHx 和 SD24BMEMLx 寄存器中获得完整的32位值。 查看 MSP430F5xx/6xx 用户指南中的表29-1至29-3、您在这里所做的一切似乎都正常。

    您可能会看到电压通道上由于错误的调节因子而出现问题。 在能源库代码中、通常有一个初始值在校准期间进行调整。

    此致、

    James

    MSP 客户应用