|
@@ -20,7 +20,6 @@ void SOC(void)
|
|
real_T battcurr;
|
|
real_T battcurr;
|
|
boolean_T socn_flg_ekfInvalidMin;
|
|
boolean_T socn_flg_ekfInvalidMin;
|
|
boolean_T socn_flg_ekfInvalidMax;
|
|
boolean_T socn_flg_ekfInvalidMax;
|
|
- boolean_T socn_flg_ekfInvalidAvrg;
|
|
|
|
boolean_T socn_flg_ekfInvalid;
|
|
boolean_T socn_flg_ekfInvalid;
|
|
real_T ocv;
|
|
real_T ocv;
|
|
real_T Ro;
|
|
real_T Ro;
|
|
@@ -28,34 +27,26 @@ void SOC(void)
|
|
real_T RC;
|
|
real_T RC;
|
|
real_T deltU;
|
|
real_T deltU;
|
|
real_T UL;
|
|
real_T UL;
|
|
- real_T A[4];
|
|
|
|
|
|
+ real_T A[2][2];
|
|
real_T B[2];
|
|
real_T B[2];
|
|
real_T H[2];
|
|
real_T H[2];
|
|
real_T K[2];
|
|
real_T K[2];
|
|
- real_T P1[4];
|
|
|
|
- static real_T P_Min_Delay[4];
|
|
|
|
- static real_T P_Max_Delay[4];
|
|
|
|
- static real_T P_avrg_Delay[4];
|
|
|
|
|
|
+ real_T P1[2][2];
|
|
|
|
+ static real_T P_Min_Delay[2][2];
|
|
|
|
+ static real_T P_Max_Delay[2][2];
|
|
real_T soc1;
|
|
real_T soc1;
|
|
static real_T soc_Min_Delay;
|
|
static real_T soc_Min_Delay;
|
|
- static real_T soc_Avrg_Delay;
|
|
|
|
static real_T soc_Max_Delay;
|
|
static real_T soc_Max_Delay;
|
|
real_T Up1;
|
|
real_T Up1;
|
|
static real_T Up_Min_Delay;
|
|
static real_T Up_Min_Delay;
|
|
static real_T Up_Max_Delay;
|
|
static real_T Up_Max_Delay;
|
|
- static real_T Up_Avrg_Delay;
|
|
|
|
uint16_T EKFSOCMin;
|
|
uint16_T EKFSOCMin;
|
|
uint16_T EKFSOCMax;
|
|
uint16_T EKFSOCMax;
|
|
-
|
|
|
|
- uint16_T EKFSOCAvrg;
|
|
|
|
- uint16_T cellSocMax;
|
|
|
|
- uint16_T cellSocMin;
|
|
|
|
uint16_T factor;
|
|
uint16_T factor;
|
|
//
|
|
//
|
|
static real_T ahDelay;
|
|
static real_T ahDelay;
|
|
int16_T ahSoc;
|
|
int16_T ahSoc;
|
|
//
|
|
//
|
|
- boolean_T socn_flg_ekfDisable;
|
|
|
|
static uint16_T ekfInvalidCntl;
|
|
static uint16_T ekfInvalidCntl;
|
|
static boolean_T onceFlg_est;
|
|
static boolean_T onceFlg_est;
|
|
static int16_T ahSoc0_est;
|
|
static int16_T ahSoc0_est;
|
|
@@ -97,6 +88,7 @@ void SOC(void)
|
|
static uint16_T socn_pct_battSoc_save;
|
|
static uint16_T socn_pct_battSoc_save;
|
|
static uint16_T socn_pct_bcuSoc_save;
|
|
static uint16_T socn_pct_bcuSoc_save;
|
|
uint16_T i;
|
|
uint16_T i;
|
|
|
|
+ static uint16_T kk;
|
|
//
|
|
//
|
|
if (socd_flg_firstRun)
|
|
if (socd_flg_firstRun)
|
|
{
|
|
{
|
|
@@ -118,7 +110,9 @@ void SOC(void)
|
|
onceFlg_dischrg = true;
|
|
onceFlg_dischrg = true;
|
|
socn_pct_battSoc_save = 0;
|
|
socn_pct_battSoc_save = 0;
|
|
socn_pct_bcuSoc_save = 0;
|
|
socn_pct_bcuSoc_save = 0;
|
|
|
|
+ kk=0;
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
|
|
//=====================================================================
|
|
//=====================================================================
|
|
////////////////////////初始值获取/EE校验//////////////////////////////
|
|
////////////////////////初始值获取/EE校验//////////////////////////////
|
|
@@ -143,6 +137,8 @@ void SOC(void)
|
|
}
|
|
}
|
|
socn_Q_cap = (uint16_T)((uint16_T)((uint32_T)sohd_pct_bcuSoh * cmnc_Q_ratedCp / 2000U) << 1);
|
|
socn_Q_cap = (uint16_T)((uint16_T)((uint32_T)sohd_pct_bcuSoh * cmnc_Q_ratedCp / 2000U) << 1);
|
|
}
|
|
}
|
|
|
|
+ //socn_pct_battSocEE =600;
|
|
|
|
+
|
|
//printf("1---- battSocEi:%d,bcuSocEi:%d,battSocEE:%d,bcuSocEE:%d\n",socd_pct_battSocEi,socd_pct_bcuSocEi,socn_pct_battSocEE,socn_pct_bcuSocEE);
|
|
//printf("1---- battSocEi:%d,bcuSocEi:%d,battSocEE:%d,bcuSocEE:%d\n",socd_pct_battSocEi,socd_pct_bcuSocEi,socn_pct_battSocEE,socn_pct_bcuSocEE);
|
|
//======================================================================
|
|
//======================================================================
|
|
////////////////////////EKFSOC//////////////////////////////////////////
|
|
////////////////////////EKFSOC//////////////////////////////////////////
|
|
@@ -155,75 +151,77 @@ void SOC(void)
|
|
{
|
|
{
|
|
soc_Min_Delay = (real_T)socn_pct_battSocEE * 0.1;
|
|
soc_Min_Delay = (real_T)socn_pct_battSocEE * 0.1;
|
|
Up_Min_Delay = 0;
|
|
Up_Min_Delay = 0;
|
|
- P_Min_Delay[0] = 10;
|
|
|
|
- P_Min_Delay[1] = 0;
|
|
|
|
- P_Min_Delay[2] = 0;
|
|
|
|
- P_Min_Delay[3] = 10;
|
|
|
|
|
|
+ P_Min_Delay[0][0] = 1000;
|
|
|
|
+ P_Min_Delay[0][1] = 0;
|
|
|
|
+ P_Min_Delay[1][0] = 0;
|
|
|
|
+ P_Min_Delay[1][1] = 1000;
|
|
}
|
|
}
|
|
//参数查表
|
|
//参数查表
|
|
ocv = (real_T)look1_u16tu16((uint16_T)(soc_Min_Delay * 10), cmnm_pct_soc, cmnm_V_ocv, 13) * 0.001;
|
|
ocv = (real_T)look1_u16tu16((uint16_T)(soc_Min_Delay * 10), cmnm_pct_soc, cmnm_V_ocv, 13) * 0.001;
|
|
Ro = (real_T)look1_u16tu16((uint16_T)(soc_Min_Delay * 10), cmnm_pct_soc, cmnm_R_ohm, 13) * 0.001 * 0.001;
|
|
Ro = (real_T)look1_u16tu16((uint16_T)(soc_Min_Delay * 10), cmnm_pct_soc, cmnm_R_ohm, 13) * 0.001 * 0.001;
|
|
Rp = (real_T)look1_u16tu16((uint16_T)(soc_Min_Delay * 10), cmnm_pct_soc, cmnm_R_polar,13) * 0.001 * 0.001;
|
|
Rp = (real_T)look1_u16tu16((uint16_T)(soc_Min_Delay * 10), cmnm_pct_soc, cmnm_R_polar,13) * 0.001 * 0.001;
|
|
RC = (real_T)look1_u16tu16((uint16_T)(soc_Min_Delay * 10), cmnm_pct_soc, cmnm_F_polar,13) * 0.001;
|
|
RC = (real_T)look1_u16tu16((uint16_T)(soc_Min_Delay * 10), cmnm_pct_soc, cmnm_F_polar,13) * 0.001;
|
|
- A[0] = 1;
|
|
|
|
- A[1] = 0;
|
|
|
|
- A[2] = 0;
|
|
|
|
- A[3] = exp(-1 / RC);
|
|
|
|
-
|
|
|
|
|
|
+ A[0][0] = 1;
|
|
|
|
+ A[0][1] = 0;
|
|
|
|
+ A[1][0] = 0;
|
|
|
|
+ A[1][1] = exp(-1 / RC);
|
|
|
|
+
|
|
B[0] = 1 / Q / 3600 * 100;
|
|
B[0] = 1 / Q / 3600 * 100;
|
|
B[1] = Rp * (1 - exp(-1 / RC));
|
|
B[1] = Rp * (1 - exp(-1 / RC));
|
|
-
|
|
|
|
|
|
+
|
|
H[0] = docvmath(soc_Min_Delay);
|
|
H[0] = docvmath(soc_Min_Delay);
|
|
H[1] = 1;
|
|
H[1] = 1;
|
|
-
|
|
|
|
|
|
+
|
|
//先验
|
|
//先验
|
|
- soc1 = soc_Min_Delay * A[0] + B[0] * battcurr;
|
|
|
|
- Up1 = Up_Min_Delay * A[3] + B[1] * battcurr;
|
|
|
|
|
|
+ soc1 = soc_Min_Delay * A[0][0] + B[0] * battcurr;
|
|
|
|
+ Up1 = Up_Min_Delay * A[1][1] + B[1] * battcurr;
|
|
UL = ocv + battcurr * Ro + Up1;
|
|
UL = ocv + battcurr * Ro + Up1;
|
|
- P1[0] = P_Min_Delay[0] + 0.001;
|
|
|
|
- P1[1] = P_Min_Delay[1] * A[3] + 0.001;
|
|
|
|
- P1[2] = P_Min_Delay[2] * A[3] + 0.001;
|
|
|
|
- P1[3] = P_Min_Delay[3] * A[3] * A[3] + 0.001;
|
|
|
|
-
|
|
|
|
- //增益
|
|
|
|
- K[0] = (P1[0] * H[0] + P1[2]) / (H[0] * P1[0] * H[0] + P1[1] * H[0] + H[0] * P1[2] + P1[3] + 0.5);
|
|
|
|
- K[1] = (P1[1] * H[0] + P1[3]) / (H[0] * P1[0] * H[0] + P1[1] * H[0] + H[0] * P1[2] + P1[3] + 0.5);
|
|
|
|
-
|
|
|
|
|
|
+ P1[0][0] = A[0][0] * P_Min_Delay[0][0] * A[0][0] + 0.001;
|
|
|
|
+ P1[0][1] = A[0][0] * P_Min_Delay[0][1] * A[1][1] + 0.001;
|
|
|
|
+ P1[1][0] = A[1][1] * P_Min_Delay[1][0] * A[0][0] + 0.001;
|
|
|
|
+ P1[1][1] = A[1][1] * P_Min_Delay[1][1] * A[1][1] + 0.001;
|
|
|
|
+
|
|
|
|
+ //增益PH/(HPH'+ 0.5)
|
|
|
|
+ K[0] = (P1[0][0] * H[0] + P1[1][0] * H[1]) / (H[0] * P1[0][0] * H[0] + H[1] * P1[0][1] * H[0] + H[0] * P1[1][0] * H[1] + H[1] * P1[1][1] * H[1] + 0.5);
|
|
|
|
+ K[1] = (P1[1][0] * H[0] + P1[1][1] * H[1]) / (H[0] * P1[0][0] * H[0] + H[1] * P1[0][1] * H[0] + H[0] * P1[1][0] * H[1] + H[1] * P1[1][1] * H[1] + 0.5);
|
|
|
|
+
|
|
//后验
|
|
//后验
|
|
deltU = (real_T)sfmd_V_cellUMin * 0.001 - UL;
|
|
deltU = (real_T)sfmd_V_cellUMin * 0.001 - UL;
|
|
soc_Min_Delay = soc1 + K[0] * deltU;
|
|
soc_Min_Delay = soc1 + K[0] * deltU;
|
|
soc_Min_Delay = Saturation_r(soc_Min_Delay, (real_T)socc_pct_battSocLow * 0.1, (real_T)socc_pct_battSocUp * 0.1);
|
|
soc_Min_Delay = Saturation_r(soc_Min_Delay, (real_T)socc_pct_battSocLow * 0.1, (real_T)socc_pct_battSocUp * 0.1);
|
|
Up_Min_Delay = Up1 + K[1] * deltU;
|
|
Up_Min_Delay = Up1 + K[1] * deltU;
|
|
|
|
+
|
|
|
|
+
|
|
//P更新
|
|
//P更新
|
|
- P_Min_Delay[0] = (1 - K[0] * H[0]) * P1[0] - K[0] * P1[1];
|
|
|
|
- P_Min_Delay[1] = -K[1] * H[0] * P1[0] + P1[1] * (1 - K[1]);
|
|
|
|
- P_Min_Delay[2] = (1 - K[0] * H[0]) * P1[2] - K[0] * P1[3];
|
|
|
|
- P_Min_Delay[3] = -K[1] * H[0] * P1[2] + P1[3] * (1 - K[1]);
|
|
|
|
-
|
|
|
|
|
|
+ P_Min_Delay[0][0] = (1 - K[0] * H[0]) * P1[0][0] + (0 - K[0] * H[1]) * P1[1][0];
|
|
|
|
+ P_Min_Delay[0][1] = (1 - K[0] * H[0]) * P1[0][1] + (0 - K[0] * H[1]) * P1[1][1];
|
|
|
|
+ P_Min_Delay[1][0] = (0 - K[1] * H[0]) * P1[0][0] + (1 - K[1] * H[1]) * P1[1][0];
|
|
|
|
+ P_Min_Delay[1][1] = (0 - K[1] * H[0]) * P1[0][1] + (1 - K[1] * H[1]) * P1[1][1];
|
|
|
|
+
|
|
//输出
|
|
//输出
|
|
EKFSOCMin = (uint16_T)(soc_Min_Delay * 10);
|
|
EKFSOCMin = (uint16_T)(soc_Min_Delay * 10);
|
|
socn_flg_ekfInvalidMin = (deltU > 0.02) || (deltU < -0.02);
|
|
socn_flg_ekfInvalidMin = (deltU > 0.02) || (deltU < -0.02);
|
|
- //printf("2----socmin:%f,U:%d,R:%f\n",soc_Min_Delay,sfmd_V_cellUMin,Ro);
|
|
|
|
|
|
+ //printf("2----socmin:%f,U:%d %f\n",soc_Min_Delay,sfmd_V_cellUMin,deltU);
|
|
//------------------------EKFSOCmax-----------------------------------
|
|
//------------------------EKFSOCmax-----------------------------------
|
|
- if (socd_flg_firstRun)
|
|
|
|
|
|
+ if (socd_flg_firstRun)
|
|
{
|
|
{
|
|
soc_Max_Delay = (real_T)socn_pct_battSocEE * 0.1;
|
|
soc_Max_Delay = (real_T)socn_pct_battSocEE * 0.1;
|
|
Up_Max_Delay = 0;
|
|
Up_Max_Delay = 0;
|
|
- P_Max_Delay[0] = 10;
|
|
|
|
- P_Max_Delay[1] = 0;
|
|
|
|
- P_Max_Delay[2] = 0;
|
|
|
|
- P_Max_Delay[3] = 10;
|
|
|
|
|
|
+ P_Max_Delay[0][0] = 1000;
|
|
|
|
+ P_Max_Delay[0][1] = 0;
|
|
|
|
+ P_Max_Delay[1][0] = 0;
|
|
|
|
+ P_Max_Delay[1][1] = 1000;
|
|
}
|
|
}
|
|
- // 参数查表
|
|
|
|
|
|
+ //参数查表
|
|
ocv = (real_T)look1_u16tu16((uint16_T)(soc_Max_Delay * 10), cmnm_pct_soc, cmnm_V_ocv, 13) * 0.001;
|
|
ocv = (real_T)look1_u16tu16((uint16_T)(soc_Max_Delay * 10), cmnm_pct_soc, cmnm_V_ocv, 13) * 0.001;
|
|
Ro = (real_T)look1_u16tu16((uint16_T)(soc_Max_Delay * 10), cmnm_pct_soc, cmnm_R_ohm, 13) * 0.001 * 0.001;
|
|
Ro = (real_T)look1_u16tu16((uint16_T)(soc_Max_Delay * 10), cmnm_pct_soc, cmnm_R_ohm, 13) * 0.001 * 0.001;
|
|
Rp = (real_T)look1_u16tu16((uint16_T)(soc_Max_Delay * 10), cmnm_pct_soc, cmnm_R_polar,13) * 0.001 * 0.001;
|
|
Rp = (real_T)look1_u16tu16((uint16_T)(soc_Max_Delay * 10), cmnm_pct_soc, cmnm_R_polar,13) * 0.001 * 0.001;
|
|
RC = (real_T)look1_u16tu16((uint16_T)(soc_Max_Delay * 10), cmnm_pct_soc, cmnm_F_polar,13) * 0.001;
|
|
RC = (real_T)look1_u16tu16((uint16_T)(soc_Max_Delay * 10), cmnm_pct_soc, cmnm_F_polar,13) * 0.001;
|
|
|
|
|
|
- A[0] = 1;
|
|
|
|
- A[1] = 0;
|
|
|
|
- A[2] = 0;
|
|
|
|
- A[3] = exp(-1 / RC);
|
|
|
|
|
|
+ A[0][0] = 1;
|
|
|
|
+ A[0][1] = 0;
|
|
|
|
+ A[1][0] = 0;
|
|
|
|
+ A[1][1] = exp(-1 / RC);
|
|
|
|
|
|
B[0] = 1 / Q / 3600 * 100;
|
|
B[0] = 1 / Q / 3600 * 100;
|
|
B[1] = Rp * (1 - exp(-1 / RC));
|
|
B[1] = Rp * (1 - exp(-1 / RC));
|
|
@@ -232,34 +230,35 @@ void SOC(void)
|
|
H[1] = 1;
|
|
H[1] = 1;
|
|
|
|
|
|
//先验
|
|
//先验
|
|
- soc1 = soc_Max_Delay * A[0] + B[0] * battcurr;
|
|
|
|
- Up1 = Up_Max_Delay * A[3] + B[1] * battcurr;
|
|
|
|
|
|
+ soc1 = soc_Max_Delay * A[0][0] + B[0] * battcurr;
|
|
|
|
+ Up1 = Up_Max_Delay * A[1][1] + B[1] * battcurr;
|
|
UL = ocv + battcurr * Ro + Up1;
|
|
UL = ocv + battcurr * Ro + Up1;
|
|
|
|
+
|
|
|
|
+ P1[0][0] = A[0][0] * P_Max_Delay[0][0] * A[0][0] + 0.001;
|
|
|
|
+ P1[0][1] = A[0][0] * P_Max_Delay[0][1] * A[1][1] + 0.001;
|
|
|
|
+ P1[1][0] = A[1][1] * P_Max_Delay[1][0] * A[0][0] + 0.001;
|
|
|
|
+ P1[1][1] = A[1][1] * P_Max_Delay[1][1] * A[1][1] + 0.001;
|
|
|
|
|
|
- P1[0] = P_Max_Delay[0] + 0.001;
|
|
|
|
- P1[1] = P_Max_Delay[1] * A[3] + 0.001;
|
|
|
|
- P1[2] = P_Max_Delay[2] * A[3] + 0.002;
|
|
|
|
- P1[3] = P_Max_Delay[3] * A[3] * A[3] + 0.001;
|
|
|
|
-
|
|
|
|
- //增益
|
|
|
|
- K[0] = (P1[0] * H[0] + P1[2]) / (H[0] * P1[0] * H[0] + P1[1] * H[0] + H[0] * P1[2] + P1[3] + 0.5);
|
|
|
|
- K[1] = (P1[1] * H[0] + P1[3]) / (H[0] * P1[0] * H[0] + P1[1] * H[0] + H[0] * P1[2] + P1[3] + 0.5);
|
|
|
|
|
|
+ //增益PH/(HPH'+ 0.5)
|
|
|
|
+ K[0] = (P1[0][0] * H[0] + P1[1][0] * H[1]) / (H[0] * P1[0][0] * H[0] + H[1] * P1[0][1] * H[0] + H[0] * P1[1][0] * H[1] + H[1] * P1[1][1] * H[1] + 0.5);
|
|
|
|
+ K[1] = (P1[1][0] * H[0] + P1[1][1] * H[1]) / (H[0] * P1[0][0] * H[0] + H[1] * P1[0][1] * H[0] + H[0] * P1[1][0] * H[1] + H[1] * P1[1][1] * H[1] + 0.5);
|
|
|
|
|
|
//后验
|
|
//后验
|
|
deltU = (real_T)sfmd_V_cellUMax * 0.001 - UL;
|
|
deltU = (real_T)sfmd_V_cellUMax * 0.001 - UL;
|
|
soc_Max_Delay = soc1 + K[0] * deltU;
|
|
soc_Max_Delay = soc1 + K[0] * deltU;
|
|
- soc_Max_Delay = Saturation_r(soc_Max_Delay, (real_T)socc_pct_battSocLow * 0.1, (real_T)socc_pct_battSocUp * 0.1);
|
|
|
|
- Up_Max_Delay = Up1 + K[1] * deltU;
|
|
|
|
-
|
|
|
|
|
|
+ soc_Max_Delay = Saturation_r(soc_Max_Delay, (real_T)socc_pct_battSocLow * 0.1, (real_T)socc_pct_battSocUp * 0.1);
|
|
|
|
+ Up_Max_Delay = Up1 + K[1] * deltU;
|
|
//P更新
|
|
//P更新
|
|
- P_Max_Delay[0] = (1 - K[0] * H[0]) * P1[0] - K[0] * P1[1];
|
|
|
|
- P_Max_Delay[1] = -K[1] * H[0] * P1[0] + P1[1] * (1 - K[1]);
|
|
|
|
- P_Max_Delay[2] = (1 - K[0] * H[0]) * P1[2] - K[0] * P1[3];
|
|
|
|
- P_Max_Delay[3] = -K[1] * H[0] * P1[2] + P1[3] * (1 - K[1]);
|
|
|
|
|
|
+ P_Max_Delay[0][0] = (1 - K[0] * H[0]) * P1[0][0] + (0 - K[0] * H[1]) * P1[1][0];
|
|
|
|
+ P_Max_Delay[0][1] = (1 - K[0] * H[0]) * P1[0][1] + (0 - K[0] * H[1]) * P1[1][1];
|
|
|
|
+ P_Max_Delay[1][0] = (0 - K[1] * H[0]) * P1[0][0] + (1 - K[1] * H[1]) * P1[1][0];
|
|
|
|
+ P_Max_Delay[1][1] = (0 - K[1] * H[0]) * P1[0][1] + (1 - K[1] * H[1]) * P1[1][1];
|
|
|
|
+
|
|
//输出
|
|
//输出
|
|
EKFSOCMax = (uint16_T)(soc_Max_Delay * 10);
|
|
EKFSOCMax = (uint16_T)(soc_Max_Delay * 10);
|
|
socn_flg_ekfInvalidMax = (deltU > 0.02) || (deltU < -0.02);
|
|
socn_flg_ekfInvalidMax = (deltU > 0.02) || (deltU < -0.02);
|
|
- //printf("3----socmax:%f,U:%d,R:%f\n\n",soc_Max_Delay,sfmd_V_cellUMax,Ro);
|
|
|
|
|
|
+ //printf("3----socmax:%f,U:%d %f\n",soc_Max_Delay,sfmd_V_cellUMax,deltU);
|
|
|
|
+
|
|
//-----------------------EKFSOC----------------------------------------
|
|
//-----------------------EKFSOC----------------------------------------
|
|
socn_flg_ekfInvalid = socn_flg_ekfInvalidMax || socn_flg_ekfInvalidMin;
|
|
socn_flg_ekfInvalid = socn_flg_ekfInvalidMax || socn_flg_ekfInvalidMin;
|
|
if (EKFSOCMax > 800)
|
|
if (EKFSOCMax > 800)
|
|
@@ -277,88 +276,7 @@ void SOC(void)
|
|
socd_pct_ekfSoc = (uint16_T)(((1 - (real_T)(factor * 0.01)) * (real_T)(EKFSOCMin * 0.1) + (real_T)(factor * 0.01) * (real_T)(EKFSOCMax * 0.1)) * 10);
|
|
socd_pct_ekfSoc = (uint16_T)(((1 - (real_T)(factor * 0.01)) * (real_T)(EKFSOCMin * 0.1) + (real_T)(factor * 0.01) * (real_T)(EKFSOCMax * 0.1)) * 10);
|
|
|
|
|
|
//printf("4----socd_pct_ekfSoc:%d,EKFSOCMax:%d,EKFSOCMin:%d,\n",socd_pct_ekfSoc,EKFSOCMax,EKFSOCMin);
|
|
//printf("4----socd_pct_ekfSoc:%d,EKFSOCMax:%d,EKFSOCMin:%d,\n",socd_pct_ekfSoc,EKFSOCMax,EKFSOCMin);
|
|
-/*
|
|
|
|
- //-------------------------EKFavrg---------------------------------------
|
|
|
|
- if (socd_flg_firstRun)
|
|
|
|
- {
|
|
|
|
- soc_Avrg_Delay = (real_T)socn_pct_battSocEE * 0.1;
|
|
|
|
- Up_Avrg_Delay = 0;
|
|
|
|
- P_avrg_Delay[0] = 10;
|
|
|
|
- P_avrg_Delay[1] = 0;
|
|
|
|
- P_avrg_Delay[2] = 0;
|
|
|
|
- P_avrg_Delay[3] = 10;
|
|
|
|
- }
|
|
|
|
- //参数查表
|
|
|
|
- ocv = (real_T)look1_u16tu16((uint16_T)(soc_Avrg_Delay * 10), cmnm_pct_soc, cmnm_V_ocv, 13) * 0.001;
|
|
|
|
- Ro = (real_T)look1_u16tu16((uint16_T)(soc_Avrg_Delay * 10), cmnm_pct_soc, cmnm_R_ohm, 13) * 0.001 * 0.001;
|
|
|
|
- Rp = (real_T)look1_u16tu16((uint16_T)(soc_Avrg_Delay * 10), cmnm_pct_soc, cmnm_R_polar,13) * 0.001 * 0.001;
|
|
|
|
- RC = (real_T)look1_u16tu16((uint16_T)(soc_Avrg_Delay * 10), cmnm_pct_soc, cmnm_F_polar,13) * 0.001;
|
|
|
|
|
|
|
|
- A[0] = 1;
|
|
|
|
- A[1] = 0;
|
|
|
|
- A[2] = 0;
|
|
|
|
- A[3] = exp(-1 / RC);
|
|
|
|
-
|
|
|
|
- B[0] = 1 / Q / 3600 * 100;
|
|
|
|
- B[1] = Rp * (1 - exp(-1 / RC));
|
|
|
|
-
|
|
|
|
- H[0] = docvmath(soc_Avrg_Delay);
|
|
|
|
- H[1] = 1;
|
|
|
|
-
|
|
|
|
- //先验
|
|
|
|
- soc1 = soc_Avrg_Delay * A[0] + B[0] * battcurr;
|
|
|
|
- Up1 = Up_Avrg_Delay * A[3] + B[1] * battcurr;
|
|
|
|
- UL = ocv + battcurr * Ro + Up1;
|
|
|
|
- P1[0] = P_avrg_Delay[0] + 0.001;
|
|
|
|
- P1[1] = P_avrg_Delay[1] * A[3] + 0.001;
|
|
|
|
- P1[2] = P_avrg_Delay[2] * A[3] + 0.001;
|
|
|
|
- P1[3] = P_avrg_Delay[3] * A[3] * A[3] + 0.001;
|
|
|
|
-
|
|
|
|
- //增益
|
|
|
|
- K[0] = (P1[0] * H[0] + P1[2]) / (H[0] * P1[0] * H[0] + P1[1] * H[0] + H[0] * P1[2] + P1[3] + 0.5);
|
|
|
|
- K[1] = (P1[1] * H[0] + P1[3]) / (H[0] * P1[0] * H[0] + P1[1] * H[0] + H[0] * P1[2] + P1[3] + 0.5);
|
|
|
|
-
|
|
|
|
- //后验
|
|
|
|
- deltU = (real_T)sfmd_V_cellUAvrg * 0.001 - UL;
|
|
|
|
- soc_Avrg_Delay = soc1 + K[0] * deltU;
|
|
|
|
-
|
|
|
|
- soc_Avrg_Delay = Saturation_r(soc_Avrg_Delay, (real_T)socc_pct_battSocLow * 0.1, (real_T)socc_pct_battSocUp * 0.1);
|
|
|
|
- Up_Avrg_Delay = Up1 + K[1] * deltU;
|
|
|
|
- //P更新
|
|
|
|
- P_avrg_Delay[0] = (1 - K[0] * H[0]) * P1[0] - K[0] * P1[1];
|
|
|
|
- P_avrg_Delay[1] = -K[1] * H[0] * P1[0] + P1[1] * (1 - K[1]);
|
|
|
|
- P_avrg_Delay[2] = (1 - K[0] * H[0]) * P1[2] - K[0] * P1[3];
|
|
|
|
- P_avrg_Delay[3] = -K[1] * H[0] * P1[2] + P1[3] * (1 - K[1]);
|
|
|
|
-
|
|
|
|
- //输出
|
|
|
|
- EKFSOCAvrg = (uint16_T)(soc_Avrg_Delay * 10);
|
|
|
|
- socn_flg_ekfInvalidAvrg = (deltU > 0.01) || (deltU < -0.01);
|
|
|
|
- //printf("4----soc:%f,Up:%f,U:%d,deltU:%f,K[0]:%f,K[1]:%f\n\n",soc_Avrg_Delay,Up_Avrg_Delay,sfmd_V_cellUAvrg,deltU,K[0],K[1]);
|
|
|
|
- //
|
|
|
|
- for(i = 0;i < cmnc_num_cellUNum;i++)
|
|
|
|
- {
|
|
|
|
- socv_pct_cellSoc[i] = look1_u16tu16((look1_u16tu16(EKFSOCAvrg, cmnm_pct_soc, cmnm_V_ocv, 13) + cdmv_V_deltOCV[i]), cmnm_V_ocv, cmnm_pct_soc, 13);
|
|
|
|
- }
|
|
|
|
- socd_flg_cellSocDisable = socn_flg_ekfInvalidAvrg || cdmd_flg_deltOCVDisable;
|
|
|
|
-
|
|
|
|
- cellSocMax = ArrMax(socv_pct_cellSoc,cmnc_num_cellUNum);
|
|
|
|
- cellSocMin = ArrMin(socv_pct_cellSoc,cmnc_num_cellUNum);
|
|
|
|
-
|
|
|
|
- if (cellSocMax > 800)
|
|
|
|
- {
|
|
|
|
- factor = 100;
|
|
|
|
- }
|
|
|
|
- else if (cellSocMin < 200)
|
|
|
|
- {
|
|
|
|
- factor = 0;
|
|
|
|
- }
|
|
|
|
- else
|
|
|
|
- {
|
|
|
|
- factor = (uint16_T)(((uint16_T)(((uint32_T)(cellSocMin - 200) << 6) / (800 - (cellSocMax - cellSocMin) - 200)) * 25U) >> 4);
|
|
|
|
- }
|
|
|
|
- socd_pct_cellBattSoc = (uint16_T)(((1 - (real_T)(factor * 0.01)) * (real_T)(cellSocMin * 0.1) + (real_T)(factor * 0.01) * (real_T)(cellSocMax * 0.1)) * 10);
|
|
|
|
-
|
|
|
|
-*/
|
|
|
|
//======================================================================
|
|
//======================================================================
|
|
////////////////////////AhSOC//////////////////////////////////////////
|
|
////////////////////////AhSOC//////////////////////////////////////////
|
|
//======================================================================
|
|
//======================================================================
|
|
@@ -368,18 +286,18 @@ void SOC(void)
|
|
}
|
|
}
|
|
else
|
|
else
|
|
{
|
|
{
|
|
- ahDelay = ahDelay + battcurr / (real_T)(cmnc_Q_ratedCp * 0.1) / 36.0;//cmnc_Q_ratedCp
|
|
|
|
|
|
+ ahDelay = ahDelay + battcurr / (real_T)(socn_Q_cap * 0.1) / 36.0;//cmnc_Q_ratedCp
|
|
}
|
|
}
|
|
ahSoc = (int16_T)(ahDelay * 10);
|
|
ahSoc = (int16_T)(ahDelay * 10);
|
|
|
|
|
|
- socd_pct_ahSoc = Saturation_u(ahSoc < 0 ? 0 : (uint16_T)ahSoc, socc_pct_battSocLow, socc_pct_battSocUp);
|
|
|
|
|
|
+ socd_pct_ahSoc = Saturation_u((ahSoc < 0 ? 0 : (uint16_T)ahSoc), socc_pct_battSocLow, socc_pct_battSocUp);
|
|
//printf("5----ahDelay:%f,ahSoc:%d,battcurr:%f,sfmd_I_curr:%d\n",ahDelay,ahSoc,battcurr,sfmd_I_curr);
|
|
//printf("5----ahDelay:%f,ahSoc:%d,battcurr:%f,sfmd_I_curr:%d\n",ahDelay,ahSoc,battcurr,sfmd_I_curr);
|
|
|
|
|
|
//======================================================================
|
|
//======================================================================
|
|
///////////////////////estSOC//////////////////////////////////////////
|
|
///////////////////////estSOC//////////////////////////////////////////
|
|
//======================================================================
|
|
//======================================================================
|
|
- socn_flg_ekfDisable = !JudgeTimeSystem(1,!socn_flg_ekfInvalid,&ekfInvalidCntl,2);
|
|
|
|
- if (socn_flg_ekfDisable)
|
|
|
|
|
|
+
|
|
|
|
+ if (!JudgeTimeSystem(1,!socn_flg_ekfInvalid,&ekfInvalidCntl,2))
|
|
{
|
|
{
|
|
if (onceFlg_est)
|
|
if (onceFlg_est)
|
|
{
|
|
{
|
|
@@ -415,8 +333,8 @@ void SOC(void)
|
|
if (onceFlg_utrckOver)
|
|
if (onceFlg_utrckOver)
|
|
{
|
|
{
|
|
onceFlg_utrckOver = false;
|
|
onceFlg_utrckOver = false;
|
|
- ahSoc0_utrckOver = ahSoc;
|
|
|
|
- estSoc0_utrckOver = socd_pct_estSoc > socc_pct_chrgCor ? socd_pct_estSoc : socc_pct_chrgCor;
|
|
|
|
|
|
+ ahSoc0_utrckOver = ahSoc;
|
|
|
|
+ estSoc0_utrckOver = socc_pct_chrgCor;
|
|
}
|
|
}
|
|
socTemp = (uint16_T)(ahSoc - ahSoc0_utrckOver + estSoc0_utrckOver);
|
|
socTemp = (uint16_T)(ahSoc - ahSoc0_utrckOver + estSoc0_utrckOver);
|
|
}
|
|
}
|
|
@@ -564,15 +482,13 @@ void SOC(void)
|
|
|
|
|
|
socd_pct_bcuSoc = DataFilt(bcuSoc, &socd_pct_bcuSoc, 1);
|
|
socd_pct_bcuSoc = DataFilt(bcuSoc, &socd_pct_bcuSoc, 1);
|
|
|
|
|
|
- //printf("11-----x:[%d-%d-%d],y:[%d-%d-%d],bcusoc:%d,socd_pct_bcuSoc:%d\n",x[0],x[1],x[2],y[0],y[1],y[2],bcuSoc,socd_pct_bcuSoc);
|
|
|
|
|
|
+ //printf("11-----x:[%d-%d-%d],y:[%d-%d-%d],bcusoc:%d,socd_pct_bcuSoc:%d\n",x[0],x[1],x[2],y[0],y[1],y[2],bcuSoc,socd_pct_bcuSoc);
|
|
}
|
|
}
|
|
socd_pct_bcuSoc = Saturation_u(socd_pct_bcuSoc, socc_pct_battSocLow, socc_pct_battSocUp);
|
|
socd_pct_bcuSoc = Saturation_u(socd_pct_bcuSoc, socc_pct_battSocLow, socc_pct_battSocUp);
|
|
socd_pct_bcuSocEo = socd_pct_bcuSoc;
|
|
socd_pct_bcuSocEo = socd_pct_bcuSoc;
|
|
|
|
|
|
//=======================================VCUSOC========================================================================================
|
|
//=======================================VCUSOC========================================================================================
|
|
-
|
|
|
|
socd_pct_vcuSoc = (uint16_T)((uint32_T)((socd_pct_bcuSoc - socc_pct_battSocLow) * 1000) / (socc_pct_battSocUp - socc_pct_battSocLow));
|
|
socd_pct_vcuSoc = (uint16_T)((uint32_T)((socd_pct_bcuSoc - socc_pct_battSocLow) * 1000) / (socc_pct_battSocUp - socc_pct_battSocLow));
|
|
-
|
|
|
|
//================================================================================================
|
|
//================================================================================================
|
|
//------------------EEsave-------------------------------------------=============================
|
|
//------------------EEsave-------------------------------------------=============================
|
|
//================================================================================================
|
|
//================================================================================================
|
|
@@ -586,7 +502,6 @@ void SOC(void)
|
|
{
|
|
{
|
|
socd_flg_EEsave = 0;
|
|
socd_flg_EEsave = 0;
|
|
}
|
|
}
|
|
-
|
|
|
|
|
|
|
|
socd_flg_firstRun = false;
|
|
socd_flg_firstRun = false;
|
|
|
|
|
|
@@ -601,10 +516,9 @@ void SOC(void)
|
|
real_T docvmath(real_T soc)
|
|
real_T docvmath(real_T soc)
|
|
{
|
|
{
|
|
real_T docv;
|
|
real_T docv;
|
|
- docv = ((((((-1.0936E-13 * pow(soc, 7.0) +3.9249E-11 * pow(soc, 6.0)) +
|
|
|
|
- -5.5776E-9 * pow(soc, 5.0)) + 3.996E-7 * pow(soc, 4.0)) +
|
|
|
|
- -1.5332E-5 * pow(soc, 3.0)) +soc * soc * 0.0003192) +
|
|
|
|
- -0.00371 * soc) +0.02732;
|
|
|
|
|
|
+ docv = 6.725e-16 * 9.0 * pow(soc, 8.0) + (-3.304e-13) * 8.0 * pow(soc, 7.0) + 6.833e-11 * 7.0 * pow(soc, 6.0) + (-7.706e-09 ) * 6.0 * pow(soc, 5.0) + 5.133e-07 * 5.0 * pow(soc, 4.0) +
|
|
|
|
+ (-2.047e-05) * 4.0 * pow(soc, 3.0) + 0.0004758 * 3.0 * pow(soc, 2.0) + (-0.006105) * 2.0 * pow(soc, 1.0) + 0.04572;
|
|
|
|
+
|
|
return docv;
|
|
return docv;
|
|
}
|
|
}
|
|
|
|
|