176 lines
4.1 KiB
C
176 lines
4.1 KiB
C
/********************************************************************************
|
||
Copyright (C), Sinowealth Electronic. Ltd.
|
||
Author: Sino
|
||
Version: V0.0
|
||
Date: 2020/04/26
|
||
History:
|
||
V2.0 2020/04/26 Preliminary
|
||
********************************************************************************/
|
||
#include "Main.h"
|
||
|
||
|
||
BOOL bCaliFlg; //上位机发送校准命令后置位该标志
|
||
U16 xdata ulExtVPack;
|
||
S32 xdata slExtCur;
|
||
U16 xdata uiExtTemp1;
|
||
U16 xdata uiExtTemp2;
|
||
U8 xdata ucExtRTC[7];
|
||
U8 xdata ucExtcaliSwitch1;
|
||
|
||
/*************************************************************************************************
|
||
* 函数名: CaliVoltage
|
||
* 参 数: 无
|
||
* 返回值: 无
|
||
* 描 述: 校准总电压,更新E2uiVPackGain增益
|
||
*************************************************************************************************/
|
||
void CaliVoltage(void)
|
||
{
|
||
U8 i;
|
||
U16 VPackTemp = 0;
|
||
|
||
for(i=ucCellNumOffset; i<(ucCellNumOffset+ucCellNum); i++)
|
||
{
|
||
VPackTemp += AFE.uiCell[i];
|
||
}
|
||
|
||
E2uiVPackGain = (U32)CALIPACKVOL*VPackTemp/ulExtVPack;
|
||
}
|
||
|
||
|
||
/*************************************************************************************************
|
||
* 函数名: CaliCurrentGain
|
||
* 参 数: 无
|
||
* 返回值: 无
|
||
* 描 述: 校准电流增益E2siCadcGain,连续两次采集的电流求平均后再校准更新
|
||
*************************************************************************************************/
|
||
void CaliCurrentGain(void)
|
||
{
|
||
S16 TempGain;
|
||
|
||
TempGain = (S32)CALICUR*(AFE.siCurr-E2siCadcOffset)/slExtCur;
|
||
if(TempGain != 0)
|
||
{
|
||
E2siCadcGain = TempGain;
|
||
}
|
||
}
|
||
|
||
|
||
/*************************************************************************************************
|
||
* 函数名: CaliCurZero
|
||
* 参 数: 无
|
||
* 返回值: 无
|
||
* 描 述: 校准零电流
|
||
*************************************************************************************************/
|
||
void CaliCurZero(void)
|
||
{
|
||
E2siCadcOffset = AFE.siCurr;
|
||
}
|
||
|
||
|
||
/*************************************************************************************************
|
||
* 函数名: CaliTS1、CaliTS2
|
||
* 参 数: 无
|
||
* 返回值: 无
|
||
* 描 述: 校准温度,温度偏差小于15℃才允许校准
|
||
*************************************************************************************************/
|
||
void CaliTS1(void)
|
||
{
|
||
S16 Tempe;
|
||
|
||
Tempe = uiExtTemp1 - CalcuTemp(AFE.uiTS[0]);
|
||
if(((Tempe-E2siTS0Offset)<150) && ((Tempe-E2siTS0Offset)>-150))
|
||
{
|
||
E2siTS0Offset = Tempe;
|
||
}
|
||
}
|
||
|
||
void CaliTS2(void)
|
||
{
|
||
S16 Tempe;
|
||
|
||
Tempe = uiExtTemp2 - CalcuTemp(AFE.uiTS[1]);
|
||
if(((Tempe-E2siTS1Offset)<150) && ((Tempe-E2siTS1Offset)>-150))
|
||
{
|
||
E2siTS1Offset = Tempe;
|
||
}
|
||
}
|
||
|
||
|
||
|
||
/*************************************************************************************************
|
||
* 函数名: CaliRTCTime
|
||
* 参 数: 无
|
||
* 返回值: 无
|
||
* 描 述: 校准RTC
|
||
*************************************************************************************************/
|
||
void CaliRTCTime(void)
|
||
{
|
||
RTC.Second = ucExtRTC[0];
|
||
RTC.Minute = ucExtRTC[1];
|
||
RTC.Hour = ucExtRTC[2];
|
||
RTC.Date = ucExtRTC[3];
|
||
RTC.Month = ucExtRTC[4];
|
||
RTC.Year = ucExtRTC[5];
|
||
RTC.Week = ucExtRTC[6];
|
||
|
||
RTCModifyTime(&RTC);
|
||
|
||
bE2PProcessFlg = 1; //校准RTC之后,需要保存RTC数据至外部EEP
|
||
bE2PBKRtc = 1;
|
||
}
|
||
|
||
|
||
|
||
/*************************************************************************************************
|
||
* 函数名: CaliProcess
|
||
* 参 数: 无
|
||
* 返回值: 无
|
||
* 描 述: 处理校准,通讯中断会置位当前需要校准模块对应的标志。
|
||
校准结束后,将校准参数写入Flash
|
||
*************************************************************************************************/
|
||
void CaliProcess(void)
|
||
{
|
||
if(bCaliFlg)
|
||
{
|
||
bCaliFlg = 0;
|
||
|
||
if((ucExtcaliSwitch1 & 0x01) != 0) //校准总电压
|
||
{
|
||
CaliVoltage();
|
||
}
|
||
|
||
if((ucExtcaliSwitch1 & 0x10) != 0) //校准电流增益
|
||
{
|
||
CaliCurrentGain();
|
||
}
|
||
|
||
if((ucExtcaliSwitch1 & 0x20) != 0) //校准零电流
|
||
{
|
||
CaliCurZero();
|
||
}
|
||
|
||
if((ucExtcaliSwitch1 & 0x04) != 0) //校准TS1
|
||
{
|
||
CaliTS1();
|
||
}
|
||
|
||
if((ucExtcaliSwitch1 & 0x08) != 0) //校准TS2
|
||
{
|
||
CaliTS2();
|
||
}
|
||
|
||
if((ucExtcaliSwitch1 & 0x80) != 0) //校准RTC
|
||
{
|
||
CaliRTCTime();
|
||
}
|
||
|
||
ucExtcaliSwitch1 = 0;
|
||
bMcuFlashWrWaitFlg = 1; //更新Flash参数
|
||
bMcuFlashWrWaitCnt = MCU_FLASH_WATI_DELAY; //立即写
|
||
}
|
||
}
|
||
|
||
|
||
|
||
|