CDM.c 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. #include "CDM.h"
  2. #define cdmd_L_rls 51
  3. void CDM_Init(void)
  4. {
  5. cdmd_flg_firstRun = true;
  6. }
  7. void CDM(void)
  8. {
  9. real_T temp_curr;
  10. real_T cmdn_V_cellUDelt;
  11. static real_T cdmn_M_P[2][2][cmnc_num_cellUNumMax];
  12. real_T P[2][2];
  13. real_T A[2];
  14. real_T K[2];
  15. real_T arf;
  16. real_T theta[2];
  17. static real_T deltaE[cmnc_num_cellUNumMax];
  18. static real_T deltaR[cmnc_num_cellUNumMax];
  19. static int16_T cdmn_I_curr[cdmd_L_rls];
  20. uint16_T i;
  21. static uint8_T cmdn_st_workStat_Delay;
  22. static uint8_T cdmn_num_Cnt;
  23. //------模式切换后重置--------------------
  24. if (cmdn_st_workStat_Delay != 1 && ihd_st_workStat == 1)
  25. {
  26. cdmd_flg_firstRun = true;
  27. }
  28. //初值归零---------------------------------
  29. if (cdmd_flg_firstRun)
  30. {
  31. cdmn_num_Cnt = 0;
  32. for (i = 0; i < cmnc_num_cellUNum; i++)
  33. {
  34. cdmn_M_P[0][0][i] = 10;
  35. cdmn_M_P[0][1][i] = 0;
  36. cdmn_M_P[1][0][i] = 0;
  37. cdmn_M_P[1][1][i] = 10;
  38. deltaE[i] = 0;
  39. deltaR[i] = 0;
  40. cdmv_flg_inval[i] = 1;
  41. }
  42. }
  43. //记忆区间-----------------------------------
  44. if (cdmd_flg_firstRun)
  45. {
  46. for (i = 0; i < cdmd_L_rls; i++)
  47. {
  48. cdmn_I_curr[i] = sfmd_I_curr;
  49. }
  50. }
  51. else
  52. {
  53. for (i = 0; i < cdmd_L_rls - 1; i++)
  54. {
  55. cdmn_I_curr[i] = cdmn_I_curr[i + 1];
  56. }
  57. cdmn_I_curr[i] = sfmd_I_curr;
  58. }
  59. //放电使能----------------------------------------
  60. if (cmdn_st_workStat_Delay == 1 && ihd_st_heatStat == 0)
  61. {
  62. for (i = 1; i < cmnc_num_cellUNum; i++)
  63. {
  64. //新增
  65. cmdn_V_cellUDelt = (real_T)(sfmv_V_cellU[i] - sfmv_V_cellU[0]) * 0.001; // #0单体为基准
  66. A[0] = 1;
  67. A[1] = (real_T)cdmn_I_curr[cdmd_L_rls - 1] * 0.1;
  68. theta[0] = deltaE[i];
  69. theta[1] = deltaR[i];
  70. 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]);
  71. 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]);
  72. arf = cmdn_V_cellUDelt - (theta[0] * A[0] + theta[1] * A[1]);
  73. theta[0] = theta[0] + K[0] * arf;
  74. theta[1] = theta[1] + K[1] * arf;
  75. 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]);
  76. 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]);
  77. 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]);
  78. 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]);
  79. cdmn_M_P[0][0][i] = P[0][0];
  80. cdmn_M_P[0][1][i] = P[0][1];
  81. cdmn_M_P[1][0][i] = P[1][0];
  82. cdmn_M_P[1][1][i] = P[1][1];
  83. //删去
  84. if (cdmn_num_Cnt > cdmd_L_rls + 1)
  85. {
  86. A[0] = 1;
  87. A[1] = (real_T)cdmn_I_curr[0] * 0.1;
  88. 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]);
  89. 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]);
  90. 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]);
  91. 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]);
  92. 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]);
  93. 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]);
  94. cdmn_M_P[0][0][i] = P[0][0];
  95. cdmn_M_P[0][1][i] = P[0][1];
  96. cdmn_M_P[1][0][i] = P[1][0];
  97. cdmn_M_P[1][1][i] = P[1][1];
  98. }
  99. cdmv_flg_inval[i] = (arf > 0.04 || arf < -0.04);
  100. deltaE[i] = theta[0];
  101. deltaR[i] = theta[1];
  102. cdmv_V_deltOCV[i] = (int16_T)(deltaE[i] * 1000);
  103. cdmv_R_deltOhm[i] = (int16_T)(deltaR[i] * 1000 * 1000);
  104. }
  105. //
  106. cdmn_num_Cnt = cdmn_num_Cnt + 1;
  107. }
  108. else
  109. {
  110. memset(cdmv_V_deltOCV, 0, sizeof(cdmv_V_deltOCV));
  111. memset(cdmv_R_deltOhm, 0, sizeof(cdmv_R_deltOhm));
  112. }
  113. cdmd_flg_firstRun = false;
  114. cmdn_st_workStat_Delay = ihd_st_workStat;
  115. }