|
@@ -10,16 +10,16 @@ void PIM_Init(void)
|
|
|
|
|
|
void PIM(void)
|
|
|
{
|
|
|
- static uint8_T ihd_st_workStat_Delay;
|
|
|
+ static uint8_T pimn_st_workStat_Delay;
|
|
|
uint16_T i;
|
|
|
uint16_T j;
|
|
|
static uint16_T pimn_V_volt[pimd_L_rls];
|
|
|
- static int16_T pimn_I_curr[pimd_L_rls];
|
|
|
- static real_T pimn_V_ocv;
|
|
|
- static real_T pimn_R_ohm;
|
|
|
- static real_T pimn_R_polar;
|
|
|
- static real_T pimn_F_polar;
|
|
|
-
|
|
|
+ static int16_T pimn_I_curr[pimd_L_rls];
|
|
|
+ static real_T pimn_V_ocv;
|
|
|
+ static real_T pimn_R_ohm;
|
|
|
+ static real_T pimn_R_polar;
|
|
|
+ static real_T pimn_F_polar;
|
|
|
+
|
|
|
static uint16_T pimn_N_ctn;
|
|
|
static real_T pimn_M_P[4][4];
|
|
|
static real_T theta[4];
|
|
@@ -29,151 +29,154 @@ void PIM(void)
|
|
|
real_T S[4];
|
|
|
real_T temp;
|
|
|
//重置
|
|
|
- if (ihd_st_workStat_Delay != 1 && ihd_st_workStat == 1)
|
|
|
+ if (pimn_st_workStat_Delay != 1 && ihd_st_workStat == 1)
|
|
|
{
|
|
|
FirstRun_PIM = true;
|
|
|
}
|
|
|
-
|
|
|
-
|
|
|
+
|
|
|
//限定记忆长度
|
|
|
if (FirstRun_PIM)
|
|
|
{
|
|
|
for (i = 0; i < pimd_L_rls; i++)
|
|
|
{
|
|
|
- pimn_V_volt[i] = sfmv_V_cellU[0];
|
|
|
+ pimn_V_volt[i] = sfmv_V_cellU[1];
|
|
|
pimn_I_curr[i] = sfmd_I_curr;
|
|
|
}
|
|
|
- }
|
|
|
+ }
|
|
|
else
|
|
|
{
|
|
|
for (i = 0; i < pimd_L_rls - 1; i++)
|
|
|
{
|
|
|
- pimn_V_volt[i] = pimn_V_volt[i+1];
|
|
|
- pimn_I_curr[i] = pimn_I_curr[i+1];
|
|
|
+ pimn_V_volt[i] = pimn_V_volt[i + 1];
|
|
|
+ pimn_I_curr[i] = pimn_I_curr[i + 1];
|
|
|
}
|
|
|
- pimn_V_volt[i] = sfmv_V_cellU[0];
|
|
|
+ pimn_V_volt[i] = sfmv_V_cellU[1];
|
|
|
pimn_I_curr[i] = sfmd_I_curr;
|
|
|
}
|
|
|
|
|
|
-
|
|
|
//初值
|
|
|
if (FirstRun_PIM)
|
|
|
{
|
|
|
- pimn_M_P[0][0] = 10; pimn_M_P[0][1] = 0; pimn_M_P[0][2] = 0; pimn_M_P[0][3] = 0;
|
|
|
- pimn_M_P[1][0] = 0; pimn_M_P[1][1] = 10; pimn_M_P[1][2] = 0; pimn_M_P[1][3] = 0;
|
|
|
- pimn_M_P[2][0] = 0; pimn_M_P[2][1] = 0; pimn_M_P[2][2] = 10; pimn_M_P[2][3] = 0;
|
|
|
- pimn_M_P[3][0] = 0; pimn_M_P[3][1] = 0; pimn_M_P[3][2] = 0; pimn_M_P[3][3] = 10;
|
|
|
-
|
|
|
- pimn_V_ocv = 3.6;
|
|
|
- pimn_R_ohm = 0.002;
|
|
|
- pimn_R_polar = 0.001;
|
|
|
- pimn_F_polar = 10;
|
|
|
+ pimn_M_P[0][0] = 10;
|
|
|
+ pimn_M_P[0][1] = 0;
|
|
|
+ pimn_M_P[0][2] = 0;
|
|
|
+ pimn_M_P[0][3] = 0;
|
|
|
+ pimn_M_P[1][0] = 0;
|
|
|
+ pimn_M_P[1][1] = 10;
|
|
|
+ pimn_M_P[1][2] = 0;
|
|
|
+ pimn_M_P[1][3] = 0;
|
|
|
+ pimn_M_P[2][0] = 0;
|
|
|
+ pimn_M_P[2][1] = 0;
|
|
|
+ pimn_M_P[2][2] = 10;
|
|
|
+ pimn_M_P[2][3] = 0;
|
|
|
+ pimn_M_P[3][0] = 0;
|
|
|
+ pimn_M_P[3][1] = 0;
|
|
|
+ pimn_M_P[3][2] = 0;
|
|
|
+ pimn_M_P[3][3] = 10;
|
|
|
+
|
|
|
+ pimn_V_ocv = (real_T)look1_iu16lu16n16tu16_binlcase((uint16_T)(socd_pct_battSoc * 10), (&(cmnm_pct_soc[0])), (&(cmnm_V_ocv[0])), 12U) * 0.001;
|
|
|
+ pimn_R_ohm = (real_T)look1_iu16lu16n16tu16_binlcase((uint16_T)(socd_pct_battSoc * 10), (&(cmnm_pct_soc[0])), (&(cmnm_R_ohm[0])), 12U) * 0.001 * 0.001;
|
|
|
+ pimn_R_polar = (real_T)look1_iu16lu16n16tu16_binlcase((uint16_T)(socd_pct_battSoc * 10), (&(cmnm_pct_soc[0])), (&(cmnm_R_polar[0])), 12U) * 0.001 * 0.001;
|
|
|
+ pimn_F_polar = (real_T)look1_iu16lu16n16tu16_binlcase((uint16_T)(socd_pct_battSoc * 10), (&(cmnm_pct_soc[0])), (&(cmnm_F_polar[0])), 12U) * 0.001;
|
|
|
pimn_N_ctn = 0;
|
|
|
-
|
|
|
}
|
|
|
//
|
|
|
- if(ihd_st_workStat_Delay == 1)
|
|
|
+ if (pimn_st_workStat_Delay == 1)
|
|
|
{
|
|
|
pimn_N_ctn = pimn_N_ctn + 1;
|
|
|
//输入
|
|
|
A[0] = (real_T)pimn_V_volt[pimd_L_rls - 2] * 0.001;
|
|
|
A[1] = (real_T)pimn_I_curr[pimd_L_rls - 1] * 0.1;
|
|
|
- A[2] =-(real_T)pimn_I_curr[pimd_L_rls - 2] * 0.1;
|
|
|
+ A[2] = -(real_T)pimn_I_curr[pimd_L_rls - 2] * 0.1;
|
|
|
A[3] = 1;
|
|
|
//参数形变
|
|
|
- temp = exp(- (pimn_R_ohm + pimn_R_polar)/pimn_R_ohm/pimn_F_polar);
|
|
|
- theta[0] = 1- pimn_R_ohm * (1 - temp)/(pimn_R_ohm + pimn_R_polar);
|
|
|
+ temp = exp(-(pimn_R_ohm + pimn_R_polar) / pimn_R_ohm / pimn_F_polar);
|
|
|
+ theta[0] = 1 - pimn_R_ohm * (1 - temp) / (pimn_R_ohm + pimn_R_polar);
|
|
|
theta[1] = pimn_R_ohm;
|
|
|
theta[2] = pimn_R_ohm * temp;
|
|
|
- theta[3] = (1 -theta[0]) * pimn_V_ocv;
|
|
|
+ theta[3] = (1 - theta[0]) * pimn_V_ocv;
|
|
|
|
|
|
//增益矩阵
|
|
|
- temp = (A[0] * pimn_M_P[0][0] +A[1] * pimn_M_P[1][0] + A[2] * pimn_M_P[2][0] + A[3] * pimn_M_P[3][0]) * A[0] +
|
|
|
- (A[0] * pimn_M_P[0][1] +A[1] * pimn_M_P[1][1] + A[2] * pimn_M_P[2][1] + A[3] * pimn_M_P[3][1]) * A[1] +
|
|
|
- (A[0] * pimn_M_P[0][2] +A[1] * pimn_M_P[1][2] + A[2] * pimn_M_P[2][2] + A[3] * pimn_M_P[3][2]) * A[2] +
|
|
|
- (A[0] * pimn_M_P[0][3] +A[1] * pimn_M_P[1][3] + A[2] * pimn_M_P[2][3] + A[3] * pimn_M_P[3][3]) * A[3];
|
|
|
- for(i = 0;i < 4;i++)
|
|
|
+ temp = (A[0] * pimn_M_P[0][0] + A[1] * pimn_M_P[1][0] + A[2] * pimn_M_P[2][0] + A[3] * pimn_M_P[3][0]) * A[0] +
|
|
|
+ (A[0] * pimn_M_P[0][1] + A[1] * pimn_M_P[1][1] + A[2] * pimn_M_P[2][1] + A[3] * pimn_M_P[3][1]) * A[1] +
|
|
|
+ (A[0] * pimn_M_P[0][2] + A[1] * pimn_M_P[1][2] + A[2] * pimn_M_P[2][2] + A[3] * pimn_M_P[3][2]) * A[2] +
|
|
|
+ (A[0] * pimn_M_P[0][3] + A[1] * pimn_M_P[1][3] + A[2] * pimn_M_P[2][3] + A[3] * pimn_M_P[3][3]) * A[3];
|
|
|
+ for (i = 0; i < 4; i++)
|
|
|
{
|
|
|
- K[i] = (pimn_M_P[i][0] * A[0] + pimn_M_P[i][1] * A[1] + pimn_M_P[i][2] * A[2] + pimn_M_P[i][3] * A[3])/(1 + temp);
|
|
|
+ K[i] = (pimn_M_P[i][0] * A[0] + pimn_M_P[i][1] * A[1] + pimn_M_P[i][2] * A[2] + pimn_M_P[i][3] * A[3]) / (1 + temp);
|
|
|
}
|
|
|
//参数更新
|
|
|
temp = (real_T)pimn_V_volt[pimd_L_rls - 1] * 0.001 - (theta[0] * A[0] + theta[1] * A[1] + theta[2] * A[2] + theta[3] * A[3]);
|
|
|
- for(i = 0;i < 4;i++)
|
|
|
+ for (i = 0; i < 4; i++)
|
|
|
{
|
|
|
theta[i] = theta[i] + K[i] * temp;
|
|
|
}
|
|
|
//协方差更新
|
|
|
- for(i = 0;i < 4;i++)
|
|
|
+ for (i = 0; i < 4; i++)
|
|
|
{
|
|
|
- for(j = 0;j < 4;j++)
|
|
|
+ for (j = 0; j < 4; j++)
|
|
|
{
|
|
|
P[i][j] = pimn_M_P[i][j] - K[i] * (A[0] * pimn_M_P[0][j] + A[1] * pimn_M_P[1][j] + A[2] * pimn_M_P[2][j] + A[3] * pimn_M_P[3][j]);
|
|
|
}
|
|
|
-
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
//传递下循环
|
|
|
- for(i = 0;i < 4;i++)
|
|
|
+ for (i = 0; i < 4; i++)
|
|
|
{
|
|
|
- for(j = 0;j < 4;j++)
|
|
|
+ for (j = 0; j < 4; j++)
|
|
|
{
|
|
|
pimn_M_P[i][j] = P[i][j];
|
|
|
}
|
|
|
-
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
//=======================================================================
|
|
|
- if(pimn_N_ctn > pimd_L_rls)
|
|
|
+ if (pimn_N_ctn > pimd_L_rls)
|
|
|
{
|
|
|
//输入
|
|
|
A[0] = (real_T)pimn_V_volt[0] * 0.001;
|
|
|
A[1] = (real_T)pimn_I_curr[1] * 0.1;
|
|
|
- A[2] =-(real_T)pimn_I_curr[0] * 0.1;
|
|
|
+ A[2] = -(real_T)pimn_I_curr[0] * 0.1;
|
|
|
A[3] = 1;
|
|
|
|
|
|
//增益矩阵
|
|
|
- temp = (A[0] * pimn_M_P[0][0] +A[1] * pimn_M_P[1][0] + A[2] * pimn_M_P[2][0] + A[3] * pimn_M_P[3][0]) * A[0] +
|
|
|
- (A[0] * pimn_M_P[0][1] +A[1] * pimn_M_P[1][1] + A[2] * pimn_M_P[2][1] + A[3] * pimn_M_P[3][1]) * A[1] +
|
|
|
- (A[0] * pimn_M_P[0][2] +A[1] * pimn_M_P[1][2] + A[2] * pimn_M_P[2][2] + A[3] * pimn_M_P[3][2]) * A[2] +
|
|
|
- (A[0] * pimn_M_P[0][3] +A[1] * pimn_M_P[1][3] + A[2] * pimn_M_P[2][3] + A[3] * pimn_M_P[3][3]) * A[3];
|
|
|
- for(i = 0;i <4;i++)
|
|
|
+ temp = (A[0] * pimn_M_P[0][0] + A[1] * pimn_M_P[1][0] + A[2] * pimn_M_P[2][0] + A[3] * pimn_M_P[3][0]) * A[0] +
|
|
|
+ (A[0] * pimn_M_P[0][1] + A[1] * pimn_M_P[1][1] + A[2] * pimn_M_P[2][1] + A[3] * pimn_M_P[3][1]) * A[1] +
|
|
|
+ (A[0] * pimn_M_P[0][2] + A[1] * pimn_M_P[1][2] + A[2] * pimn_M_P[2][2] + A[3] * pimn_M_P[3][2]) * A[2] +
|
|
|
+ (A[0] * pimn_M_P[0][3] + A[1] * pimn_M_P[1][3] + A[2] * pimn_M_P[2][3] + A[3] * pimn_M_P[3][3]) * A[3];
|
|
|
+ for (i = 0; i < 4; i++)
|
|
|
{
|
|
|
- K[i] = (pimn_M_P[i][0] * A[0] + pimn_M_P[i][1] * A[1] + pimn_M_P[i][2] * A[2] + pimn_M_P[i][3] * A[3])/(1 + temp);
|
|
|
+ K[i] = (pimn_M_P[i][0] * A[0] + pimn_M_P[i][1] * A[1] + pimn_M_P[i][2] * A[2] + pimn_M_P[i][3] * A[3]) / (1 + temp);
|
|
|
}
|
|
|
|
|
|
//协方差更新
|
|
|
- for(i = 0;i < 4;i++)
|
|
|
+ for (i = 0; i < 4; i++)
|
|
|
{
|
|
|
- for(j = 0;j < 4;j++)
|
|
|
+ for (j = 0; j < 4; j++)
|
|
|
{
|
|
|
P[i][j] = pimn_M_P[i][j] + K[i] * (A[0] * pimn_M_P[0][j] + A[1] * pimn_M_P[1][j] + A[2] * pimn_M_P[2][j] + A[3] * pimn_M_P[3][j]);
|
|
|
}
|
|
|
}
|
|
|
//传递下一循环
|
|
|
- for(i = 0;i < 4;i++)
|
|
|
+ for (i = 0; i < 4; i++)
|
|
|
{
|
|
|
- for(j = 0;j < 4;j++)
|
|
|
+ for (j = 0; j < 4; j++)
|
|
|
{
|
|
|
pimn_M_P[i][j] = P[i][j];
|
|
|
}
|
|
|
-
|
|
|
}
|
|
|
}
|
|
|
//参数求解
|
|
|
- pimn_V_ocv = theta[3]/(1 - theta[0]);
|
|
|
- pimn_R_ohm = theta[1];
|
|
|
- pimn_R_polar = (theta[1] - theta[2])/(1 - theta[0]) - theta[1];
|
|
|
- pimn_F_polar = theta[2] * theta[1] > 0 ? (pimn_R_ohm + pimn_R_polar)/pimn_R_ohm/ (-log(theta[2]/theta[1])) : (pimn_R_ohm + pimn_R_polar)/pimn_R_ohm;
|
|
|
-
|
|
|
- pimd_V_ocv = (uint16_T)(pimn_V_ocv * 1000);
|
|
|
- pimd_R_ohm = (uint16_T)(pimn_R_ohm * 1000 * 1000);
|
|
|
+ pimn_V_ocv = theta[3] / (1 - theta[0]);
|
|
|
+ pimn_R_ohm = theta[1];
|
|
|
+ pimn_R_polar = (theta[1] - theta[2]) / (1 - theta[0]) - theta[1];
|
|
|
+ pimn_F_polar = theta[2] * theta[1] > 0 ? (pimn_R_ohm + pimn_R_polar) / pimn_R_ohm / (-log(theta[2] / theta[1])) : (pimn_R_ohm + pimn_R_polar) / pimn_R_ohm;
|
|
|
+
|
|
|
+ pimd_V_ocv = (uint16_T)(pimn_V_ocv * 1000);
|
|
|
+ pimd_R_ohm = (uint16_T)(pimn_R_ohm * 1000 * 1000);
|
|
|
pimd_R_polar = (uint16_T)(pimn_R_polar * 1000 * 1000);
|
|
|
pimd_F_polar = (uint16_T)(pimn_F_polar * 1000);
|
|
|
}
|
|
|
//
|
|
|
- ihd_st_workStat_Delay = ihd_st_workStat;
|
|
|
- FirstRun_PIM = false;
|
|
|
+ pimn_st_workStat_Delay = ihd_st_workStat;
|
|
|
+ FirstRun_PIM = false;
|
|
|
}
|
|
|
-
|
|
|
-
|
|
|
-
|