/******************************************************************************** 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; //立即写 } }