123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132 |
- #include "CDM.h"
- #define cdmd_L_rls 51
- void CDM_Init(void)
- {
- cdmd_flg_firstRun = true;
- }
- void CDM(void)
- {
- real_T temp_curr;
- real_T cmdn_V_cellUDelt;
- static real_T cdmn_M_P[2][2][cmnc_num_cellUNumMax];
- real_T P[2][2];
- real_T A[2];
- real_T K[2];
- real_T arf;
- real_T theta[2];
- static real_T deltaE[cmnc_num_cellUNumMax];
- static real_T deltaR[cmnc_num_cellUNumMax];
- static int16_T cdmn_I_curr[cdmd_L_rls];
- uint16_T i;
- static uint8_T cmdn_st_workStat_Delay;
- static uint8_T cdmn_num_Cnt;
- //------模式切换后重置--------------------
- if (cmdn_st_workStat_Delay != 1 && ihd_st_workStat == 1)
- {
- cdmd_flg_firstRun = true;
- }
- //初值归零---------------------------------
- if (cdmd_flg_firstRun)
- {
- cdmn_num_Cnt = 0;
- for (i = 0; i < cmnc_num_cellUNum; i++)
- {
- cdmn_M_P[0][0][i] = 10;
- cdmn_M_P[0][1][i] = 0;
- cdmn_M_P[1][0][i] = 0;
- cdmn_M_P[1][1][i] = 10;
- deltaE[i] = 0;
- deltaR[i] = 0;
- cdmv_flg_inval[i] = 1;
- }
- }
- //记忆区间-----------------------------------
- if (cdmd_flg_firstRun)
- {
- for (i = 0; i < cdmd_L_rls; i++)
- {
- cdmn_I_curr[i] = sfmd_I_curr;
- }
- }
- else
- {
- for (i = 0; i < cdmd_L_rls - 1; i++)
- {
- cdmn_I_curr[i] = cdmn_I_curr[i + 1];
- }
- cdmn_I_curr[i] = sfmd_I_curr;
- }
- //放电使能----------------------------------------
- if (cmdn_st_workStat_Delay == 1 && ihd_st_heatStat == 0)
- {
- for (i = 1; i < cmnc_num_cellUNum; i++)
- {
- //新增
- cmdn_V_cellUDelt = (real_T)(sfmv_V_cellU[i] - sfmv_V_cellU[0]) * 0.001; // #0单体为基准
- A[0] = 1;
- A[1] = (real_T)cdmn_I_curr[cdmd_L_rls - 1] * 0.1;
- theta[0] = deltaE[i];
- theta[1] = deltaR[i];
- K[0] = (cdmn_M_P[0][0][i] * A[0] + cdmn_M_P[0][1][i] * A[1]) / (1 + (A[0] * cdmn_M_P[0][0][i] + A[1] * cdmn_M_P[1][0][i]) * A[0] + (A[0] * cdmn_M_P[0][1][i] + A[1] * cdmn_M_P[1][1][i]) * A[1]);
- K[1] = (cdmn_M_P[1][0][i] * A[0] + cdmn_M_P[1][1][i] * A[1]) / (1 + (A[0] * cdmn_M_P[0][0][i] + A[1] * cdmn_M_P[1][0][i]) * A[0] + (A[0] * cdmn_M_P[0][1][i] + A[1] * cdmn_M_P[1][1][i]) * A[1]);
- arf = cmdn_V_cellUDelt - (theta[0] * A[0] + theta[1] * A[1]);
- theta[0] = theta[0] + K[0] * arf;
- theta[1] = theta[1] + K[1] * arf;
- P[0][0] = cdmn_M_P[0][0][i] - K[0] * (A[0] * cdmn_M_P[0][0][i] + A[1] * cdmn_M_P[1][0][i]);
- P[0][1] = cdmn_M_P[0][1][i] - K[0] * (A[0] * cdmn_M_P[0][1][i] + A[1] * cdmn_M_P[1][1][i]);
- P[1][0] = cdmn_M_P[1][0][i] - K[1] * (A[0] * cdmn_M_P[0][0][i] + A[1] * cdmn_M_P[1][0][i]);
- P[1][1] = cdmn_M_P[1][1][i] - K[1] * (A[0] * cdmn_M_P[0][1][i] + A[1] * cdmn_M_P[1][1][i]);
- cdmn_M_P[0][0][i] = P[0][0];
- cdmn_M_P[0][1][i] = P[0][1];
- cdmn_M_P[1][0][i] = P[1][0];
- cdmn_M_P[1][1][i] = P[1][1];
- //删去
- if (cdmn_num_Cnt > cdmd_L_rls + 1)
- {
- A[0] = 1;
- A[1] = (real_T)cdmn_I_curr[0] * 0.1;
- K[0] = (cdmn_M_P[0][0][i] * A[0] + cdmn_M_P[0][1][i] * A[1]) / (1 + (A[0] * cdmn_M_P[0][0][i] + A[1] * cdmn_M_P[1][0][i]) * A[0] + (A[0] * cdmn_M_P[0][1][i] + A[1] * cdmn_M_P[1][1][i]) * A[1]);
- K[1] = (cdmn_M_P[1][0][i] * A[0] + cdmn_M_P[1][1][i] * A[1]) / (1 + (A[0] * cdmn_M_P[0][0][i] + A[1] * cdmn_M_P[1][0][i]) * A[0] + (A[0] * cdmn_M_P[0][1][i] + A[1] * cdmn_M_P[1][1][i]) * A[1]);
- P[0][0] = cdmn_M_P[0][0][i] + K[0] * (A[0] * cdmn_M_P[0][0][i] + A[1] * cdmn_M_P[1][0][i]);
- P[0][1] = cdmn_M_P[0][1][i] + K[0] * (A[0] * cdmn_M_P[0][1][i] + A[1] * cdmn_M_P[1][1][i]);
- P[1][0] = cdmn_M_P[1][0][i] + K[1] * (A[0] * cdmn_M_P[0][0][i] + A[1] * cdmn_M_P[1][0][i]);
- P[1][1] = cdmn_M_P[1][1][i] + K[1] * (A[0] * cdmn_M_P[0][1][i] + A[1] * cdmn_M_P[1][1][i]);
- cdmn_M_P[0][0][i] = P[0][0];
- cdmn_M_P[0][1][i] = P[0][1];
- cdmn_M_P[1][0][i] = P[1][0];
- cdmn_M_P[1][1][i] = P[1][1];
- }
- cdmv_flg_inval[i] = (arf > 0.04 || arf < -0.04);
- deltaE[i] = theta[0];
- deltaR[i] = theta[1];
-
- cdmv_V_deltOCV[i] = (int16_T)(deltaE[i] * 1000);
- cdmv_R_deltOhm[i] = (int16_T)(deltaR[i] * 1000 * 1000);
- }
- //
- cdmn_num_Cnt = cdmn_num_Cnt + 1;
- }
- else
- {
-
- memset(cdmv_V_deltOCV, 0, sizeof(cdmv_V_deltOCV));
- memset(cdmv_R_deltOhm, 0, sizeof(cdmv_R_deltOhm));
- }
- cdmd_flg_firstRun = false;
- cmdn_st_workStat_Delay = ihd_st_workStat;
- }
|