253 lines
10 KiB
C
253 lines
10 KiB
C
/********************************************************************************
|
||
Copyright (C), Sinowealth Electronic. Ltd.
|
||
Author: Sino
|
||
Version: V0.0
|
||
Date: 2022/12/08
|
||
History:
|
||
V0.0 2022/12/08 Preliminary
|
||
********************************************************************************/
|
||
#include "Main.h"
|
||
|
||
|
||
//***************************容量计部分相关变量,可直接移动至其他.c文件,其他容量计变量也可以定义在此处,也可以在其他文件中定义**************************************
|
||
|
||
|
||
U16 xdata Info_uiRSOC; //对外显示的电量(%),变量类型:U16 xdata(输出)
|
||
U32 xdata Info_ulFCC; //对外显示的满充容量(mAh),变量类型:U32 xdata(输出)
|
||
U32 xdata Info_ulRC; //对外显示的剩余容量(mAh),变量类型:U32 xdata(输出)
|
||
U16 xdata Info_uiCycleCount; //对外显示的放电循环次数(次),变量类型:U16 xdata(输出)
|
||
|
||
U32 xdata Info_ulDfilterRC; //滤波前的剩余容量值对外显示,变量类型:U32(输出)
|
||
U32 xdata Info_ulTempDsgFcc; //计算的可放电容量值对外显示,变量类型:U32(输出)
|
||
U16 xdata Info_uiSocDecTime; //剩余电量百分比(%)的变化率对外显示,变量类型:U16(输出)
|
||
U16 xdata Info_uiRsocCnt; //剩余电量百分比(%)变化计时对外显示,变量类型:U16(输出)
|
||
|
||
//BOOL bOCD1; //放电过流1标志,变量类型:BOOL(输入)
|
||
//BOOL bOCD2; //放电过流2标志,变量类型:BOOL(输入)
|
||
//BOOL bOCC; //充电过流标志,变量类型:BOOL(输入)
|
||
//BOOL bAFE_SC; //短路标志,变量类型:BOOL(输入)
|
||
//BOOL bUV; //单节电芯欠压标志,变量类型:BOOL(输入)
|
||
//BOOL bOV; //单节电芯过压标志,变量类型:BOOL(输入)
|
||
|
||
//U16 xdata E2uiVOC[10]; //OCV电压数组,分别对应静置时10%容量~100%容量共10个电压点,且E2uiVOC_D[0]对应10%、E2uiVOC_D[9]对应100%,变量类型:U16 xdata(输入)
|
||
//U32 xdata E2ulDesignCapacity; //设计容量,变量类型:U32 xdata(输入)
|
||
//U32 xdata E2ulFCC; //满充容量,变量类型:U32 xdata(输入\输出存入E2)
|
||
//U32 xdata E2ulDfRC; //RSOC滤波前的剩余容量,变量类型:U32 xdata(输入\输出存入E2)
|
||
//U8 xdata E2ucSOC; //滤波后用于对外显示的RSOC,变量类型:U8 xdata(输入\输出存入E2)
|
||
|
||
//U16 xdata E2uiChgEndVol; //充电截止电压,变量类型:U16 xdata(输入)
|
||
//S16 xdata E2siChgEndCurr; //充电截止电流,变量类型:S16 xdata(输入)
|
||
//U8 xdata E2ucChgEndDelay; //充电截止延时,变量类型:U8 xdata(输入)
|
||
//U16 xdata E2uiDsgEndVol; //放电截止电压,变量类型:U16 xdata(输入)
|
||
//S32 xdata E2slDsgEndCurr; //放电截止电流,变量类型:S32 xdata(输入)
|
||
//U8 xdata E2ucDsgEndDelay; //放电截止延时,变量类型:U8 xdata(输入)
|
||
//U8 xdata E2ucDsgEndFlg; //放电截止标志,变量类型:U8 xdata(输入\输出存入E2)
|
||
//U16 xdata E2uiOVvol; //单节过压阈值,变量类型:U16 xdata(输入)
|
||
//U16 xdata E2uiUVvol; //单节欠压阈值,变量类型:U16 xdata(输入)
|
||
|
||
//U32 xdata E2ulCycleThreshold; //循环次数更新阈值,变量类型:U32 xdata(输入)
|
||
//U32 xdata E2ulCycleThresholdCount;//循环电量计数,变量类型:U32 xdata(输入\输出存入E2)
|
||
//U16 xdata E2uiCycleCount; //循环次数,变量类型:U16 xdata(输入\输出存入E2)
|
||
//U16 xdata E2uiLastCCount; //上次更新容量时的循环次数 ,变量类型:U16 xdata(输入\输出存入E2)
|
||
//S16 xdata E2siDfilterCur; //零电流窗口,变量类型:S16 xdata(输入)
|
||
|
||
U16 xdata E2uiDsgAdjLowTemp; //放电末端调节的最低温度,数值 = 温度(度)×10 + 2731,变量类型:U16 xdata(输入)
|
||
S32 xdata E2slDsgAdjMaxCurr; //放电末端调节的最大放电电流(mA),变量类型:S32 xdata(输入)
|
||
U8 xdata E2ucDsgAdjLowFlg; //低温或大电流放电欠压时允许SOC跳至1%的标志(1:允许,0:禁止),变量类型:U8 xdata(输入)
|
||
U8 xdata E2ucDsgAdjLowSoc; //低温或大电流放电欠压时允许SOC跳至1%的阈值(%),变量类型:U8 xdata(输入)
|
||
|
||
U8 xdata E2ucFullDsgDelay; //静置时判断满放的延时(S),变量类型:U8 xdata(输入)
|
||
U32 xdata E2ulLoadEndVol; //负载或电芯总压截止总电压(mV),变量类型:U32 xdata(输入)
|
||
U32 xdata E2ulChgerEndVol; //充电器或电芯总压截止总电压(mV),变量类型:U32 xdata(输入)
|
||
U8 xdata E2ucChgerEndDelay; //充电器或电芯总压截止延时(S),变量类型:U8 xdata(输入)
|
||
U32 xdata E2ulIdleSocTimes; //需要调节SOC的自唤醒次数,变量类型:U32 xdata(输入)
|
||
|
||
U8 xdata E2ucInitSocDif; //第一次上电容量条件差值30%,一般不用修改,变量类型:U8 xdata(输入)
|
||
U8 xdata E2ucInitUpSoc; //第一次上电上调容量的OCV容量阈值,变量类型:U8 xdata(输入)
|
||
U8 xdata E2ucChgAdjRatio; //充电末端调节的比例系数,约等于充电时电压从OCV 100%电压~充电截止电压充进的电量百分比(%)(暂定),变量类型:U8 xdata(输入)
|
||
U16 xdata E2uiTempFCC_K1; //根据温度调节FCC一阶系数,变量类型:U16 xdata(输入)
|
||
U16 xdata E2uiTempFCC_K2; //根据温度调节FCC二阶系数,变量类型:U16 xdata(输入)
|
||
U16 xdata E2uiTempFCC_B; //根据温度调节FCC偏移量,变量类型:U16 xdata(输入)
|
||
U16 xdata E2uiDsgCorrectVol; //开始放电末端修调的电压(mV),变量类型:U16 xdata(输入)
|
||
U8 xdata E2ucDsgCorrectSOC; //开始放电末端修调的容量(%),变量类型:U8 xdata(输入)
|
||
|
||
U8 xdata E2ucDsgVolDet; //放电末端电压检测幅度(mV),变量类型:U8 xdata(输入)
|
||
|
||
U16 xdata E2uiChgCorrectVol; //开始充电末端修调的电压(mV),变量类型:U16 xdata(输入)
|
||
U8 xdata E2ucChgCorrectSOC; //开始充电末端修调的容量(%),变量类型:U8 xdata(输入)
|
||
U8 xdata E2ucChg100Ratio; //满足满充条件后上调1%间隔时间(S),变量类型:U8 xdata(输入)
|
||
U8 xdata E2ucChgCurRatio; //充电时调节滤波前剩余容量的充电倍率(单位:0.1C),变量类型:U8 xdata(输入)
|
||
U8 xdata E2ucChgChangeSocDif; //充电时修改滤波前剩余容量的容量差值(%),变量类型:U8 xdata(输入)
|
||
U8 xdata E2ucChgChangeSocRatio; //充电时在CHGCUR_RATIO充电倍率下OCV容量上抬的大致幅度(%),变量类型:U8 xdata(输入)
|
||
|
||
U8 xdata E2ucFccUpdatePercent; //单次容量学习更新的最大百分比(%),变量类型:U8 xdata(输入)
|
||
U16 xdata E2uiChgEndTemp; //充电截止温度,数值 = X(度)×10 + 2731,变量类型:U16 xdata(输入)
|
||
U16 xdata E2uiDsgEndTemp; //放电截止温度,数值 = X(度)×10 + 2731,变量类型:U16 xdata(输入)
|
||
|
||
U16 xdata E2ui_CYCLECOUNTA; //根据循环次数调节FCC的衰减阶段一:起始循环次数,变量类型:U16 xdata(输入)
|
||
U16 xdata E2ui_CYCLECOUNTA_K; //根据循环次数调节FCC的衰减阶段一:衰减斜率=(CYCLECOUNTB - CYCLECOUNTA)/10,变量类型:U16 xdata(输入)
|
||
U16 xdata E2ui_CYCLECOUNTA_B; //根据循环次数调节FCC的衰减阶段一:衰减截距=(CYCLECOUNTB *100 -CYCLECOUNTA *95) / (CYCLECOUNTB - CYCLECOUNTA),变量类型:U16 xdata(输入)
|
||
U16 xdata E2ui_CYCLECOUNTB; //调节FCC的衰减阶段二:起始循环次数,变量类型:U16 xdata(输入)
|
||
U16 xdata E2ui_CYCLECOUNTB_K; //调节FCC的衰减阶段二:衰减斜率=(CYCLECOUNTC -CYCLECOUNTB)/10,变量类型:U16 xdata(输入)
|
||
U16 xdata E2ui_CYCLECOUNTB_B; //调节FCC的衰减阶段二:衰减截距=(CYCLECOUNTC *95 -CYCLECOUNTB *85) /(CYCLECOUNTC -CYCLECOUNTB),变量类型:U16 xdata(输入)
|
||
U16 xdata E2ui_CYCLECOUNTC; //调节FCC的衰减阶段三:起始循环次数,变量类型:U16 xdata(输入)
|
||
U16 xdata E2uiUpdateCycleCount; //上次更新容量后,需再次更新容量的循环次数,变量类型:U16 xdata(输入)
|
||
|
||
S32 xdata Info_slCurr; //经零电流窗口过滤后用于判断充放电状态的主控回路电流(mA),变量类型:S32 xdata(输入)
|
||
U16 xdata Info_uiTemp; //对外显示的电芯温度,数值 = X(度)×10 + 2731,变量类型:U16 xdata(输入)
|
||
U32 xdata Info_ulVoltage; //电芯总电压:U32 xdata(输入)
|
||
|
||
U16 data uiCellVmaxG; //当前电压最高的电芯电压,变量类型:U16 data(输入)
|
||
U16 data uiCellVminG; //当前电压最低的电芯电压,变量类型:U16 data(输入)
|
||
//U8 data ucCellNum; //电芯串数,变量类型:U8 data(输入)
|
||
//S32 xdata slCadcCurAverage; //用于库伦积分的平均电流(主控充放电回路),变量类型:S32 xdata(输入)
|
||
S32 xdata slAdcCur2; //用于库伦积分的平均电流(辅控放电回路,如没有可以恒为0),变量类型:S32 xdata(输入)
|
||
S16 xdata siCurCompens; //系统功耗电流补偿(预留),可以恒为0,变量类型:U16 xdata(输入)
|
||
//*****************************************************************
|
||
|
||
/*************************************************************************************************
|
||
* 函数名: GasGaugeVarIn
|
||
* 参 数: 无
|
||
* 返回值: 无
|
||
* 描 述: 外部值赋给容量计相关变量,每个容量计功能函数执行时均在第一步调用该接口函数
|
||
*************************************************************************************************/
|
||
void GasGaugeVarIn(void)
|
||
{
|
||
BOOL eabak;
|
||
|
||
eabak = EA;
|
||
IrqDis();
|
||
Info_uiRSOC = Info.uiRSOC;
|
||
Info_ulFCC = Info.ulFCC;
|
||
Info_ulRC = Info.ulRC;
|
||
Info_uiCycleCount = Info.uiCycleCount;
|
||
Info_slCurr = Info.slCurr;
|
||
Info_uiTemp = Info.uiTS[0];
|
||
Info_ulVoltage = Info.ulVoltage;
|
||
uiCellVmaxG = uiCellVmax;
|
||
uiCellVminG = uiCellVmin;
|
||
|
||
slAdcCur2 = 0;
|
||
siCurCompens = 0;
|
||
|
||
EA = eabak;
|
||
|
||
E2ucInitSocDif = 30;
|
||
E2ucInitUpSoc = 90;
|
||
E2uiDsgAdjLowTemp = (10*10 + 2731);
|
||
E2slDsgAdjMaxCurr = -35000;
|
||
E2ucDsgAdjLowFlg = 0;
|
||
E2ucDsgAdjLowSoc = 1;
|
||
E2ucChgAdjRatio = 20;
|
||
E2uiTempFCC_K1 = 16000;
|
||
E2uiTempFCC_K2 = 17;
|
||
E2uiTempFCC_B = 1570;
|
||
E2ucFullDsgDelay = 60;
|
||
E2uiDsgCorrectVol = E2uiVOC[0] - 200;
|
||
E2ucDsgCorrectSOC = 15;
|
||
E2ucDsgVolDet = 10;
|
||
|
||
E2uiChgCorrectVol = E2uiVOC[9];
|
||
E2ucChgCorrectSOC = 90;
|
||
E2ulChgerEndVol = 4500 * ucCellNum;
|
||
E2ulLoadEndVol = 3000 * ucCellNum;
|
||
E2ucChgerEndDelay = 60;
|
||
E2ucChg100Ratio = 20;
|
||
|
||
E2ucChgCurRatio = 15;
|
||
E2ucChgChangeSocDif = 20;
|
||
E2ucChgChangeSocRatio = 10;
|
||
|
||
E2ulIdleSocTimes = 40;
|
||
|
||
E2ucFccUpdatePercent = 30;
|
||
E2uiChgEndTemp = (15*10 + 2731);
|
||
E2uiDsgEndTemp = (15*10 + 2731);
|
||
|
||
E2ui_CYCLECOUNTA = 50;
|
||
E2ui_CYCLECOUNTA_K = 5;
|
||
E2ui_CYCLECOUNTA_B = 105;
|
||
E2ui_CYCLECOUNTB = 100;
|
||
E2ui_CYCLECOUNTB_K = 30;
|
||
E2ui_CYCLECOUNTB_B = 98;
|
||
E2ui_CYCLECOUNTC = 400;
|
||
E2uiUpdateCycleCount = 75;
|
||
|
||
//
|
||
// if( bOV )
|
||
// {
|
||
// E2ucSOC = 100;
|
||
// E2ulDfRC = E2ulFCC;
|
||
//
|
||
// Info_uiRSOC = 100;
|
||
// Info_ulRC = E2ulFCC;
|
||
//
|
||
// Info.uiRSOC = 100;
|
||
// Info.ulRC = E2ulFCC;
|
||
// }
|
||
//
|
||
//
|
||
// if( bUV )
|
||
// {
|
||
// E2ucSOC = 0;
|
||
// E2ulDfRC = 0;
|
||
//
|
||
// Info_uiRSOC = 0;
|
||
// Info_ulRC = 0;
|
||
//
|
||
// Info.uiRSOC = 0;
|
||
// Info.ulRC = 0;
|
||
// }
|
||
//}
|
||
// bAFE_SC = bSC;
|
||
}
|
||
|
||
/*************************************************************************************************
|
||
* 函数名: GasGaugeVarOut
|
||
* 参 数: 无
|
||
* 返回值: 无
|
||
* 描 述: 容量计相关变量赋给外部值,每个容量计功能函数执行时均在最后一步调用该接口函数
|
||
*************************************************************************************************/
|
||
void GasGaugeVarOut(void)
|
||
{
|
||
BOOL eabak;
|
||
|
||
eabak = EA;
|
||
IrqDis();
|
||
Info.uiRSOC = Info_uiRSOC;
|
||
Info.ulFCC = Info_ulFCC;
|
||
Info.ulRC = Info_ulRC;
|
||
Info.uiCycleCount = Info_uiCycleCount;
|
||
bVDQ = bVDQFlg;
|
||
bFC = bCHGEndFlg;
|
||
bFD = E2ucDsgEndFlg;
|
||
EA = eabak;
|
||
|
||
// if( bOV )
|
||
// {
|
||
// E2ucSOC = 100;
|
||
// E2ulDfRC = E2ulFCC;
|
||
//
|
||
// Info_uiRSOC = 100;
|
||
// Info_ulRC = E2ulFCC;
|
||
//
|
||
// Info.uiRSOC = 100;
|
||
// Info.ulRC = E2ulFCC;
|
||
// }
|
||
//
|
||
//
|
||
// if( bUV )
|
||
// {
|
||
// E2ucSOC = 0;
|
||
// E2ulDfRC = 0;
|
||
//
|
||
// Info_uiRSOC = 0;
|
||
// Info_ulRC = 0;
|
||
//
|
||
// Info.uiRSOC = 0;
|
||
// Info.ulRC = 0;
|
||
// }
|
||
//}
|
||
// bAFE_SC = bSC;
|
||
}
|