⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 calibration.c

📁 MSP430电能测量程序,用的是电力线载波通讯.即PLC
💻 C
字号:
//**************************************************************************
//    Calibration Routines for the FE427
//
//    Stefan Schauer
//    Texas Instruments Freising
//    Date        Comments
//    =====================
//    01/09/19    Code Starts for FE427

//**************************************************************************
#include "device.h"
#include "calibration.h"
#include "emeter.h"
#include "parameter.h"
#include "emeter-toolkit.h"
#include "subroutines.h"
#include "display.h"

#include <math.h>

#ifdef withCalibration
float	calCurrent = defSET_CALCURRENT;
float	calVoltage = defSET_CALVOLTAGE;
int	calFreq	= defSET_NOMFREQ;

void CalPlus(unsigned char Cal_Mode)
{
    if (Cal_Mode == 1) s_parameters.pSET_INTRPTLEVL.l ++;  // 
    if (Cal_Mode == 2) s_parameters.pSET_PHASECORR1 ++;    // 
    if (Cal_Mode == 3) s_parameters.pSET_PHASECORR2 ++;    // 

    if (Cal_Mode == 4) s_parameters.pSET_V1OFFSET ++;  // 
    if (Cal_Mode == 5) s_parameters.pSET_I1OFFSET ++;    // 
    if (Cal_Mode == 6) s_parameters.pSET_I2OFFSET ++;    // 

    if (Cal_Mode == 0xA) s_parameters.VRatio += s_parameters.VRatio/1000;  // inc by 0.1%
    if (Cal_Mode == 0xB) s_parameters.IRatio += s_parameters.IRatio/1000;  // inc by 0.1% 
    if (Cal_Mode == 0xC) s_parameters.EnergyRatio += s_parameters.EnergyRatio/1000;  // inc by 0.1%

    // Init. Embedded Signal Processing parameters
    init_esp_parameter(0);
    // Init. event generation and start measurement
    start_measurement();
}

void CalMinus(unsigned char Cal_Mode)
{
    if (Cal_Mode == 1) s_parameters.pSET_INTRPTLEVL.l --;
    if (Cal_Mode == 2) s_parameters.pSET_PHASECORR1 --;
    if (Cal_Mode == 3) s_parameters.pSET_PHASECORR2 --;

    if (Cal_Mode == 4) s_parameters.pSET_V1OFFSET --;  // 
    if (Cal_Mode == 5) s_parameters.pSET_I1OFFSET --;    // 
    if (Cal_Mode == 6) s_parameters.pSET_I2OFFSET --;    // 

    if (Cal_Mode == 0xA) s_parameters.VRatio -= s_parameters.VRatio/1000;  // dec by 0.1%
    if (Cal_Mode == 0xB) s_parameters.IRatio -= s_parameters.IRatio/1000;  // dec by 0.1% 
    if (Cal_Mode == 0xC) s_parameters.EnergyRatio -= s_parameters.EnergyRatio/1000;  // dec by 0.1%

    // Init. Embedded Signal Processing parameters
    init_esp_parameter(0);
    // Init. event generation and start measurement
    start_measurement();
}

void CalMode(unsigned char Cal_Mode)
{
    float fvalue;
//    unsigned int value;
    unsigned int i = 0;
#ifdef withUARTComm
    unsigned char saved_tx_mode;
#endif
#ifdef withDisplay
    unsigned char saved_Display_Mode;
	saved_Display_Mode = Display_Mode;	// Save original display mode		
	Display_Mode = display_calib;		// Switch LCD to calibration mode 
#endif		

    if (Cal_Mode == 0)
    {
#ifdef withUARTComm
        saved_tx_mode = TX_Mode; // save tx_mode
#endif
        // Init. Embedded Signal Processing parameters
        s_parameters.IRatio = 1;
        s_parameters.VRatio = 1;
        s_parameters.EnergyRatio = 1;
        s_parameters.pSET_PHASECORR1 = (int) 0;
        s_parameters.pSET_PHASECORR2 = (int) 0;
        s_parameters.pSET_STARTCURR_INT = 0;
        s_parameters.pSET_STARTCURR_FRAC = 0;
//        s_parameters.pSET_INTRPTLEVL.l = 0x80000000;
        init_esp_parameter(0);
        // Init. event generation and start measurement
        start_measurement();
        while ((i++) < 3) 
		{
			WaitLPM();	// Wait in Low-Power mode.  Handle other interrupts.
		} // wait for values
        fvalue = (float)((((float)POWERFCT)/POW_2_14));
        fvalue = acos(fvalue)*180/__PI;  // convert to degree
        fvalue = calPhi - fvalue;
        fvalue = (fvalue/calFreq*(POW_2_20/360));
        s_parameters.pSET_PHASECORR1 = (int) fvalue;
//        s_parameters.pSET_PHASECORR2 = (int) 0;

        #define CalTime 5       
        CalCyclCnt = CalTime * calFreq;    // Set Cycles to CalTime * 1 sec
        // Init. event generation and start measurement
        start_calibration();

        i=0;
		while ((OP_Mode != done) && (i++ <= CalTime))
		{
			WaitLPM();	// Wait in Low-Power mode.  Handle other interrupts.
		} // wait for stable values

//        s_parameters.VRatio = (float) ((long)calVoltage * 1000) / V1RMS;
        s_parameters.VRatio = (calVoltage * 1000.0) / V1RMS;
        #define scale (float)( (float)1000 * (float)1000 * (float)calCosPhi * (float)CalTime / (float)16 )
//        s_parameters.EnergyRatio = (float) ( (float)calCurrent *  (float)calVoltage * scale / (float)energy.l );
//		s_parameters.IRatio = (float) ((long)calCurrent * 1000) / IRMS_HI;
		s_parameters.IRatio = (calCurrent * 1000.0) / IRMS_HI;
//        s_parameters.IRatio = (float) (s_parameters.EnergyRatio / s_parameters.VRatio);
        s_parameters.EnergyRatio = (float) s_parameters.VRatio * s_parameters.IRatio;

        s_parameters.pSET_STARTCURR_INT  = (unsigned int)((defSET_STARTCURR * calCurrent * 1000 / s_parameters.IRatio));
        s_parameters.pSET_STARTCURR_FRAC = (unsigned int)((defSET_STARTCURR * calCurrent * POW_2_16 * 1000 / s_parameters.IRatio) - (defSET_STARTCURR_INT * POW_2_16));

//        s_parameters.pSET_STARTCURR_INT = (unsigned int)(IRMS_HI * defStartCurrent / calCurrent);
//        s_parameters.pSET_STARTCURR_FRAC = (unsigned int);
//        s_parameters.pSET_INTRPTLEVL.l = (unsigned long) 0;
//        s_parameters.pSET_INTRPTLEVL.h = (unsigned long) 0;


        // Set Temperature Gain
        s_parameters.ulTempGain = ((unsigned long)defCalTemp*100 + s_parameters.ulTempOffset*100)/((unsigned long)temperature);
		
        // Init. Embedded Signal Processing parameters
        init_esp_parameter(0);
        // Init. event generation and start measurement
        start_measurement();
#ifdef withUARTComm
        TX_Mode = saved_tx_mode;
#endif
    }

    if (Cal_Mode == 9)
    {
        // save Parameters to FLASH memory
        flash_replace_block( (char *)&s_parameters_flash, (char *)&s_parameters, sizeof(s_parameters));

		// Init. Embedded Signal Processing parameters
        init_esp_parameter(1);
        // Init. event generation and start measurement
        start_measurement();
    
        _EINT();  // Interrupts has been disabled during Flash write/erase
    }

#ifdef withDisplay
	Display_Mode = saved_Display_Mode;	// Restore original display mode	
	LCDM16 &= ~(0xF0);					// Turn off unused segments of LCD
#endif		

}

#endif // withCalibration

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -