|
@@ -15,6 +15,7 @@
|
|
|
#include "remain_distance.h"
|
|
|
#include "battery_info.h"
|
|
|
#include "eeprom_24c02.h"
|
|
|
+#include "math_tools.h"
|
|
|
|
|
|
/*电流积分,最小值,单位mA*/
|
|
|
#define CURRENT_MIN 130
|
|
@@ -25,10 +26,10 @@
|
|
|
extern const MC_AvgPower_Struct_t MC_AvgPower_Default;
|
|
|
|
|
|
//续航计算相关参数
|
|
|
-
|
|
|
Remain_Dis_t RemainDis = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0xFFFF, 0, 0, FALSE, 0};
|
|
|
-//电池信息
|
|
|
-Battery_Info_t Battery_Info;
|
|
|
+
|
|
|
+//电池电量计算相关参数
|
|
|
+Battery_Info_t Battery_Info = {0, 0, 0, 0, 0, FALSE, 0, 0, 0};
|
|
|
|
|
|
/******************************************************************************
|
|
|
* @Function: void RD_getQRemainRecord( void )
|
|
@@ -435,41 +436,72 @@ void RD_SaveAndUpdateInfo(MC_GearSt_Struct_t GearSt, MC_AssistRunMode_Struct_t M
|
|
|
MC_AssistRunMode_Old = MC_AssistRunMode;
|
|
|
}
|
|
|
|
|
|
-//运行周期200ms
|
|
|
-uint8_t Battery_SocCal(uint16_t Voltage_mV)
|
|
|
+/*
|
|
|
+根据电池电压计算剩余电量,运行周期200ms
|
|
|
+*/
|
|
|
+uint8_t Battery_SocCal(Battery_Info_t* p_Battery_Info, uint8_t SOC_Old, uint8_t Vol_Design)
|
|
|
{
|
|
|
static uint16_t TimeDelayCnt = 0;
|
|
|
- static uint32_t FiltSum = 0;
|
|
|
- static uint8_t FiltCnt = 0;
|
|
|
static uint8_t Result = 0, Result_Pre=0;
|
|
|
static TrueOrFalse_Flag_Struct_t InitFlag = FALSE;
|
|
|
uint16_t i;
|
|
|
uint16_t TableNum;
|
|
|
uint32_t batteryTotalQ, batteryRemainQ;
|
|
|
- uint16_t Vol_Avg = 0;
|
|
|
+ static uint8_t u8LoopCnt = 0;
|
|
|
+ static uint16_t u16MaxVoltage = 0;
|
|
|
+ static TrueOrFalse_Flag_Struct_t FlagFristCal = TRUE;
|
|
|
|
|
|
TableNum = sizeof(battery_VoltageQuantity) / 4;
|
|
|
batteryTotalQ = battery_VoltageQuantity[TableNum - 1][1];
|
|
|
batteryRemainQ = batteryTotalQ;
|
|
|
|
|
|
- TimeDelayCnt++;
|
|
|
- //初始化电压上升较慢,开机时动态效果
|
|
|
- if(TimeDelayCnt <= 10) return 0;
|
|
|
- else if(TimeDelayCnt <= 15) return 10;
|
|
|
- else if(TimeDelayCnt <= 20) return 25;
|
|
|
- else if(TimeDelayCnt <= 25) return 45;
|
|
|
- else if(TimeDelayCnt <= 30) return 65;
|
|
|
- else if(TimeDelayCnt <= 35) return 85;
|
|
|
- else
|
|
|
+ if(InitFlag == FALSE) //初始化动态显示百分比
|
|
|
{
|
|
|
- if(InitFlag == FALSE)//等待约5s后,计算一次初始值
|
|
|
+ TimeDelayCnt++;
|
|
|
+ if(TimeDelayCnt <= 10) return 0;
|
|
|
+ else if(TimeDelayCnt <= 15) return 10;
|
|
|
+ else if(TimeDelayCnt <= 20) return 25;
|
|
|
+ else if(TimeDelayCnt <= 25) return 45;
|
|
|
+ else if(TimeDelayCnt <= 30) return 65;
|
|
|
+ else if(TimeDelayCnt <= 35) return 85;
|
|
|
+ else
|
|
|
{
|
|
|
InitFlag = TRUE;
|
|
|
+ return 100;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else //初始化后根据电压平均值计算百分比
|
|
|
+ {
|
|
|
+ Result_Pre = SOC_Old;
|
|
|
+ Result = Result_Pre;
|
|
|
+
|
|
|
+ if(p_Battery_Info->BFlagCalSoc == TRUE)
|
|
|
+ {
|
|
|
+ if(FlagFristCal == TRUE) //第一次计算采用当前值
|
|
|
+ {
|
|
|
+ u16MaxVoltage = (Vol_Design == 24) ? (uint16_t)(p_Battery_Info->u32TotalBusVoltage / 15000) * 10 / 7
|
|
|
+ : ((Vol_Design == 48) ? (uint16_t)(p_Battery_Info->u32TotalBusVoltage / 15000) * 10 / 13
|
|
|
+ : (uint16_t)(p_Battery_Info->u32TotalBusVoltage / 15000));
|
|
|
+ FlagFristCal = FALSE;
|
|
|
+ }
|
|
|
+ else //后面取12个值的最大值
|
|
|
+ {
|
|
|
+ p_Battery_Info->u16BusAverageVol[u8LoopCnt++] = (uint16_t)(p_Battery_Info->u32TotalBusVoltage / 15000);
|
|
|
+ if(u8LoopCnt >= 12)
|
|
|
+ {
|
|
|
+ u16MaxVoltage = (Vol_Design == 24) ? GetMaxData(p_Battery_Info->u16BusAverageVol, 12) * 10 / 7
|
|
|
+ : ((Vol_Design == 48) ? GetMaxData(p_Battery_Info->u16BusAverageVol, 12) * 10 / 13
|
|
|
+ : GetMaxData(p_Battery_Info->u16BusAverageVol, 12));
|
|
|
+ u8LoopCnt = 0;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ //查表计算SOC
|
|
|
for(i=0; i<TableNum; i++)
|
|
|
{
|
|
|
- if(battery_VoltageQuantity[i][0] <= (Voltage_mV / 10))
|
|
|
+ if(battery_VoltageQuantity[i][0] <= u16MaxVoltage)
|
|
|
{
|
|
|
- batteryRemainQ = batteryTotalQ - battery_VoltageQuantity[i][1];
|
|
|
+ batteryRemainQ = batteryTotalQ - battery_VoltageQuantity[i][1]; //A*s
|
|
|
break;
|
|
|
}
|
|
|
else//电池电压低于最小值
|
|
@@ -478,44 +510,20 @@ uint8_t Battery_SocCal(uint16_t Voltage_mV)
|
|
|
}
|
|
|
}
|
|
|
Result = batteryRemainQ * 100 / batteryTotalQ;
|
|
|
- }
|
|
|
- else//第一次计算后,采用25组电压平均值
|
|
|
- {
|
|
|
- Result_Pre = MC_RunInfo.SOC;
|
|
|
- Result = Result_Pre;
|
|
|
|
|
|
- //取25组数据的平均值计算SOC
|
|
|
- FiltSum += Voltage_mV;
|
|
|
- FiltCnt++;
|
|
|
- if(FiltCnt >= 25)
|
|
|
+ //电量上升时,突变较小,取上次计算值
|
|
|
+ if(Result > Result_Pre)
|
|
|
{
|
|
|
- Vol_Avg = FiltSum / 25;
|
|
|
- FiltSum = 0;
|
|
|
- FiltCnt = 0;
|
|
|
- //查表计算SOC
|
|
|
- for(i=0; i<TableNum; i++)
|
|
|
- {
|
|
|
- if(battery_VoltageQuantity[i][0] <= (Vol_Avg / 10))
|
|
|
- {
|
|
|
- batteryRemainQ = batteryTotalQ - battery_VoltageQuantity[i][1] ; //A*s
|
|
|
- break;
|
|
|
- }
|
|
|
- else//电池电压低于最小值
|
|
|
- {
|
|
|
- batteryRemainQ = 0;
|
|
|
- }
|
|
|
- }
|
|
|
- Result = batteryRemainQ * 100 / batteryTotalQ;
|
|
|
- if(Result > Result_Pre)//电量上升时,突变较小,取上次计算值
|
|
|
+ if((Result < (Result_Pre + 30)) && (Result < 90))
|
|
|
{
|
|
|
- if((Result < (Result_Pre + 30)) && (Result < 90))
|
|
|
- {
|
|
|
- Result = Result_Pre;
|
|
|
- }
|
|
|
+ Result = Result_Pre;
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+ p_Battery_Info->u32TotalBusVoltage = 0;
|
|
|
+ p_Battery_Info->BFlagCalSoc = FALSE;
|
|
|
}
|
|
|
+
|
|
|
return Result;
|
|
|
}
|
|
|
}
|
|
|
-
|