ZDBMS/code_drv/Calibrate.c

176 lines
4.1 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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