📄 calibration.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 + -