ZDBMS/code_gasguage/GasGaugeInter_V4_13.c

253 lines
10 KiB
C
Raw 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: 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;
}