ZDBMS/code_drv/Balance.c

254 lines
7.3 KiB
C
Raw Permalink Normal View History

2025-02-06 07:35:32 +00:00
/********************************************************************************
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 bBalanceFlg;
BOOL bBalancingFlg;
BOOL bBalanceOddFlg;
BOOL bCTOValidFlg; //<2F><><EFBFBD><EFBFBD>оѹ<D0BE><EFBFBD><EEB3AC>1200mVʱ<56><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD>ڶ<EFBFBD><DAB6>ߣ<EFBFBD><DFA3><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>о<EFBFBD><D0BE>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD>2V<32><56><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
BOOL bCellOpenDecFlag;
U16 xdata uiBalanceChannel;
U8 xdata ucBalanceTimeCnt;
U8 xdata ucBalanceStep;
U8 xdata ucCellOpenDecCnt;
U8 xdata ucCtoCnt;
/*************************************************************************************************
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: BalTurnOnCheck
* <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>: <EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ: <EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>:
1. ƽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǵ<EFBFBD>ѹ<EFBFBD><EFBFBD>ѹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ͬʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
2. ƽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>У<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ٽ<EFBFBD><EFBFBD><EFBFBD>ƽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
3. <EFBFBD><EFBFBD><EFBFBD>߼<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƽ<EFBFBD><EFBFBD>
*************************************************************************************************/
void BalTurnOnCheck(void)
{
U8 i;
if(!bBalancingFlg && !bCellOpenDecFlag) //<2F><>һ<EFBFBD><D2BB>ƽ<EFBFBD><C6BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>л<EFBFBD><D0BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߼<EFBFBD><DFBC><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>ж<EFBFBD><D0B6>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>ƽ<EFBFBD><C6BD>
{
if(bBAL_EN)
{
uiBalanceChannel = 0;
if(((uiCellVmax>E2uiOVvol)&&(!bOV)) //<2F><><EFBFBD><EFBFBD><EFBFBD>¶ȱ<C2B6><C8B1><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƽ<EFBFBD><C6BD>,<2C>ж<EFBFBD><D0B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD>ѹ<EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֹʱ<D6B9><CAB1>ͣƽ<CDA3><C6BD>
||((uiCellVmax < E2uiOVRvol)&&(bOV))
|| bOTC || bUTC || bOTD || bUTD)
{
bBalanceFlg = 0;
ucBalanceTimeCnt = 0;
}
else
{
if(((uiCellVmax>E2uiBalanceVol) && (uiCellVmax-uiCellVmin)>=E2uiBalanceVolDiff) && (Info.slCurr>=E2siBalCurrent))
{
if(!bBalanceFlg)
{
ucBalanceTimeCnt++;
}
if(ucBalanceTimeCnt >= BAL_DELAY_CNT)
{
for(i=ucCellNumOffset; i<ucCellNumOffset+ucCellNum; i++)
{
if(((Info.uiVCell[i]-uiCellVmin)>=E2uiBalanceVolDiff)&&(Info.uiVCell[i]>=E2uiBalanceVol)) //<2F><>о<EFBFBD><D0BE>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD>ƽ<EFBFBD><C6BD><EFBFBD><EFBFBD>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>õ<EFBFBD>оƽ<D0BE><C6BD>
{
uiBalanceChannel |= (1<<i);
}
}
bBalanceFlg = 1;
}
}
else
{
bBalanceFlg = 0;
ucBalanceTimeCnt = 0;
}
}
}
}
}
/*******************************************************************************
Function: CTOCheckVol(void)
Description:
Input:
Output:
Others:
*******************************************************************************/
BOOL CTOCheckVol(void)
{
BOOL bResult=0;
if(bCTO_EN) //<2F>ж<EFBFBD><D0B6>Ƿ<EFBFBD>֧<EFBFBD>ֶ<EFBFBD><D6B6>߼<EFBFBD><DFBC><EFBFBD>
{
if(!bCTO) //<2F><><EFBFBD><EFBFBD><EFBFBD>Ѿ<EFBFBD><D1BE><EFBFBD><EFBFBD><EFBFBD><E2B5BD><EFBFBD>ߣ<EFBFBD><DFA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ټ<EFBFBD><D9BC><EFBFBD>
{
if(bCTOValidFlg) //<2F>жϵ<D0B6>ѹѹ<D1B9><D1B9><EFBFBD>Ƿ񳬹<C7B7>1.2V
{
if(uiVadcVmin < VOL_CELL_CUT_180MV) //180mV
{
bResult = 1;
if(++ucCtoCnt >= TIME_50MS_500MS) //<2F><><EFBFBD><EFBFBD> 500mS
{
bCTO = 1;
}
}
else
{
bCTOValidFlg = 0;
ucCtoCnt = 0;
}
}
}
#ifdef SP_CTO_RECOVER
else //<2F><><EFBFBD>߻ָ<DFBB><D6B8><EFBFBD><EFBFBD>ܣ<EFBFBD>ÿ250mSһ<53><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD><D0B6><EFBFBD>С<EFBFBD><D0A1>ѹ
{
if(uiVadcVmin >= VOL_CELL_CUT_180MV) //180mV
{
if(++ucCtoRCnt >= TIME_250MS_1S)
{
bCTO = 0;
}
}
else
{
ucCtoRCnt = 0;
}
}
#endif
}
return bResult;
}
/*************************************************************************************************
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: BalProcess
* <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>: <EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ: <EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>:
1. ƽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڷ<EFBFBD>Ϊ5<EFBFBD><EFBFBD>STEP<EFBFBD><EFBFBD><EFBFBD>ϼ<EFBFBD>250mS
2. ƽ<EFBFBD><EFBFBD>Ч<EFBFBD><EFBFBD><100/(250mS*2)(<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>żƽ<EFBFBD><EFBFBD>)
3. <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ߣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD><EFBFBD>߼<EFBFBD><EFBFBD><EFBFBD>
4. ƽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD>ѹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD>ܻ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ250mS(һ<EFBFBD><EFBFBD>ƽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
*************************************************************************************************/
void BalProcess(void)
{
U16 BalChTemp;
//<2F>жϵ<D0B6>о<EFBFBD><D0BE>ѹѹ<D1B9><D1B9><EFBFBD>Ƿ񳬹<C7B7>1.2V<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж϶<EFBFBD><EFBFBD>ߣ<EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>о<EFBFBD><EFBFBD>ѹ<2V<32><56><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƽ<EFBFBD><C6BD><EFBFBD><EFBFBD><E1B4A5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD><D0B6><EFBFBD><EFBFBD><EFBFBD>
//<2F>жϵ<D0B6>о<EFBFBD><D0BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѹ<EFBFBD>Ƿ<EFBFBD>С<EFBFBD><D0A1>1.38V<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж϶<EFBFBD><EFBFBD>ߣ<EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>δ<EFBFBD><EFBFBD>Ч<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>о<EFBFBD><EFBFBD>ѹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if((uiCellVmax-uiCellVmin>=VOL_CELL_CUT_1200MV) || (uiCellVmax<=VOL_CELL_CUT_1380MV))
{
bCTOValidFlg = 1;
}
switch(ucBalanceStep)
{
case BALANCE_ENABLE: //VADC<44>ɼ<EFBFBD><C9BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѹ<EFBFBD>ж<EFBFBD>
if(bCellOpenDecFlag || bBalanceFlg)
{
if(bBalanceOddFlg) //odd balance
{
BalChTemp = uiBalanceChannel&0x5555;
}
else //even balance
{
BalChTemp = uiBalanceChannel&0xAAAA;
}
AfeBalCtl(BalChTemp); //<2F><><EFBFBD><EFBFBD>ƽ<EFBFBD><C6BD>
ucBalanceStep = BALANCE_START;
bBalancingFlg = 1;
}
break;
case BALANCE_START: //VADC<44>ɼ<EFBFBD><C9BC>ĵ<EFBFBD>ѹ<EFBFBD><D1B9><EFBFBD>ݶ<EFBFBD><DDB6><EFBFBD>
ucBalanceStep = BALANCING;
break;
case BALANCING: //VADC<44>ɼ<EFBFBD><C9BC>ĵ<EFBFBD>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD><EFBFBD>ж϶<D0B6><CFB6><EFBFBD>
if(!CTOCheckVol()) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD><D0B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
AfeBalCtl(0); //<2F>ر<EFBFBD>ƽ<EFBFBD><C6BD>
ucBalanceStep = BALANCE_DISABLE;
bBalanceOddFlg = ~bBalanceOddFlg;
}
break;
case BALANCE_DISABLE: //VADC<44>ɼ<EFBFBD><C9BC>ĵ<EFBFBD>ѹ<EFBFBD><D1B9><EFBFBD>ݶ<EFBFBD><DDB6><EFBFBD>
if(!CTOCheckVol()) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD><D0B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
ucBalanceStep = BALANCE_NULL;
}
else
{
ucBalanceStep = BALANCE_ENABLE;
bBalanceOddFlg = ~bBalanceOddFlg;
}
break;
case BALANCE_NULL: //VADC<44>ɼ<EFBFBD><C9BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѹ<EFBFBD>ж<EFBFBD>
ucBalanceStep = BALANCE_ENABLE;
bCellOpenDecFlag = 0;
bBalanceFlg = 0;
bBalancingFlg = 0;
break;
}
}
/*************************************************************************************************
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: CellOpenProcess
* <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>: <EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ: <EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>: ÿ2S<EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD>ζ<EFBFBD><EFBFBD>߼<EFBFBD><EFBFBD><EFBFBD>
*************************************************************************************************/
void CTOTurnOnCheck(void)
{
#ifdef SP_CTO_RECOVER
if(bCTO_EN) //֧<>ֶ<EFBFBD><D6B6>߻ָ<DFBB>
#else
if(bCTO_EN && !bCTO) //<2F><><EFBFBD><EFBFBD><EFBFBD>ѷ<EFBFBD><D1B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>򲻼<EFBFBD><F2B2BBBC><EFBFBD>
#endif
{
if(++ucCellOpenDecCnt >= TIME_50MS_2250MS) //2S
{
ucCellOpenDecCnt = TIME_50MS_2250MS; //<2F><><EFBFBD><EFBFBD><EFBFBD>ü<EFBFBD><C3BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƽ<EFBFBD><C6BD><EFBFBD><EFBFBD>ż<EFBFBD><C5BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵ
if(!bBalancingFlg) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƽ<EFBFBD><EFBFBD><E2A3AC><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>ƽ<EFBFBD><C6BD><EFBFBD><EFBFBD><EFBFBD>ڽ<EFBFBD><DABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ٿ<EFBFBD><D9BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߼<EFBFBD><DFBC><EFBFBD>
{
ucCellOpenDecCnt = 0;
bCellOpenDecFlag = 1;
uiBalanceChannel = 0x03ff;
}
}
}
}
/*************************************************************************************************
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: BalanceProcess
* <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>: <EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ: <EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>: ƽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߼<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*************************************************************************************************/
void BalanceProcess(void)
{
BalTurnOnCheck(); //<2F><><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>ƽ<EFBFBD><EFBFBD><E2BFAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
CTOTurnOnCheck(); //<2F><>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߼<EFBFBD><DFBC><EFBFBD>
BalProcess(); //<2F><><EFBFBD><EFBFBD>ƽ<EFBFBD><C6BD><EFBFBD>Ͷ<EFBFBD><CDB6><EFBFBD>ʱ<EFBFBD><CAB1>
}