|
@@ -0,0 +1,232 @@
|
|
|
+#include "CM.h"
|
|
|
+
|
|
|
+boolean_T FirstRun_CM;
|
|
|
+void CM_Init(void)
|
|
|
+{
|
|
|
+ FirstRun_CM = true;
|
|
|
+}
|
|
|
+
|
|
|
+void CM(void)
|
|
|
+{
|
|
|
+ static uint16_T cmn_V_cellUMax;
|
|
|
+ static uint16_T cmn_V_cellUMin;
|
|
|
+ static uint16_T chrgFulCnt;
|
|
|
+ static boolean_T cmn_flg_chrgFul;
|
|
|
+ static uint16_T chrgCnt;
|
|
|
+ static uint16_T noChrgCnt;
|
|
|
+ int16_T cmd_I_chrgCurrReq1 = 0;
|
|
|
+ int16_T cmd_I_chrgCurrReq2 = 0;
|
|
|
+ int16_T cmd_I_chrgCurrReq3 = 0;
|
|
|
+ int16_T cmd_I_chrgCurrReq4 = 0;
|
|
|
+ static boolean_T First;
|
|
|
+ static uint8_T cmd_st_chrgSt_end;
|
|
|
+ static boolean_T chrgFul;
|
|
|
+ if(FirstRun_CM)
|
|
|
+ {
|
|
|
+ cmn_V_cellUMax = 0;
|
|
|
+ cmn_V_cellUMin = 0;
|
|
|
+ chrgFulCnt = 0;
|
|
|
+ chrgCnt = 0;
|
|
|
+ noChrgCnt = 0;
|
|
|
+ cmn_flg_chrgFul = false;
|
|
|
+ cmd_st_chrgSt = 0;
|
|
|
+ chrgFul = 0;
|
|
|
+ }
|
|
|
+ //=====================================================================
|
|
|
+ //============================充电模式=================================
|
|
|
+ //=====================================================================
|
|
|
+ if(ihd_st_chrgConnect > 0)
|
|
|
+ {
|
|
|
+ cmd_st_chrgMod = 1;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ cmd_st_chrgMod = 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ //=====================================================================
|
|
|
+ //============================充电需求电流=============================
|
|
|
+ //=====================================================================
|
|
|
+ if (cmd_st_chrgMod)
|
|
|
+ {
|
|
|
+ if(sfmd_V_cellUMin > cmn_V_cellUMin)
|
|
|
+ {
|
|
|
+ cmn_V_cellUMin = sfmd_V_cellUMin;
|
|
|
+ }
|
|
|
+ if(sfmd_V_cellUMax > cmn_V_cellUMax)
|
|
|
+ {
|
|
|
+ cmn_V_cellUMax = sfmd_V_cellUMax;
|
|
|
+ }
|
|
|
+ cmd_I_chrgCurrReq1 = lookupChrgCurr((int16_T)sfmd_T_modTMin,(int16_T)cmn_V_cellUMin,3,6);
|
|
|
+ cmd_I_chrgCurrReq2 = lookupChrgCurr((int16_T)sfmd_T_modTMax,(int16_T)cmn_V_cellUMin,3,6);
|
|
|
+ cmd_I_chrgCurrReq3 = lookupChrgCurr((int16_T)sfmd_T_modTMin,(int16_T)cmn_V_cellUMax,3,6);
|
|
|
+ cmd_I_chrgCurrReq4 = lookupChrgCurr((int16_T)sfmd_T_modTMax,(int16_T)cmn_V_cellUMax,3,6);
|
|
|
+ cmd_I_chrgCurrReq = min( min(cmd_I_chrgCurrReq1, cmd_I_chrgCurrReq2),min(cmd_I_chrgCurrReq3,cmd_I_chrgCurrReq4));
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ cmd_I_chrgCurrReq = 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ //=====================================================================
|
|
|
+ //============================充电状态=================================
|
|
|
+ //=====================================================================
|
|
|
+ if (cmd_st_chrgMod > 0)
|
|
|
+ {
|
|
|
+ noChrgCnt = 0;
|
|
|
+ if (sfmd_I_curr > 1)
|
|
|
+ {
|
|
|
+ cmd_st_chrgSt = 1;
|
|
|
+ }
|
|
|
+ if(JudgeTimeSystem(1,sfmd_V_cellUMax >= cmnc_V_chrgFul ,&chrgFulCnt ,20))
|
|
|
+ {
|
|
|
+ chrgFul = true;
|
|
|
+ cmn_flg_chrgFul = true;
|
|
|
+ }
|
|
|
+ if(cmn_flg_chrgFul)
|
|
|
+ {
|
|
|
+ cmd_st_chrgSt = 2;
|
|
|
+ cmd_I_chrgCurrReq = 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ //
|
|
|
+ if (cmd_st_chrgSt != 2 && JudgeTimeSystem(1,sfmd_I_curr < 1 ,&chrgCnt ,100) )
|
|
|
+ {
|
|
|
+ cmd_st_chrgSt = 3;
|
|
|
+ cmd_I_chrgCurrReq = 0;
|
|
|
+ }
|
|
|
+ //
|
|
|
+ if((sfmd_st_fltAct >> 6) & 0x01)
|
|
|
+ {
|
|
|
+ cmd_st_chrgSt = 3;
|
|
|
+ cmd_I_chrgCurrReq = 0;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ cmd_st_chrgSt_end = cmd_st_chrgSt;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ cmn_flg_chrgFul = false;
|
|
|
+ chrgCnt = 0;
|
|
|
+ noChrgCnt ++;
|
|
|
+ if(cmd_st_chrgSt_end == 1 && noChrgCnt <= 100 )
|
|
|
+ {
|
|
|
+ cmd_st_chrgSt = 3;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ cmd_st_chrgSt = 0;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // ===================================================================
|
|
|
+ // =================故障结束原因========================================
|
|
|
+ // ===================================================================
|
|
|
+ if(cmd_st_chrgSt == 3 )
|
|
|
+ {
|
|
|
+ if (ihd_st_chrgConnect == 0 && First)
|
|
|
+ {
|
|
|
+ cmd_idx_chrgEndReason = 1 ; // 用户主动停止
|
|
|
+ }
|
|
|
+ if((sfmd_st_fltAct >> 6) & 0x01 && First)
|
|
|
+ {
|
|
|
+ cmd_idx_chrgEndReason = 2 ; // 因电池故障限制充电;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ First = false;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ First = true ;
|
|
|
+ cmd_idx_chrgEndReason = 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ FirstRun_CM = false;
|
|
|
+ //printf("fltAct:%d,chrgMod:%d,chrgSt:%d,chrgCurrReq:%d,chrgEndReason:%d\n\n",sfmd_st_fltAct,cmd_st_chrgMod,cmd_st_chrgSt,cmd_I_chrgCurrReq,cmd_idx_chrgEndReason);
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+//==============================================================================================================================
|
|
|
+//==============================================================================================================================
|
|
|
+int16_T lookupChrgCurr(int16_T X,int16_T Y,uint16_T cmm_T_ChrgCurrN,uint16_T cmm_V_ChrgCurrN)
|
|
|
+{
|
|
|
+ int16_T Z;
|
|
|
+ int16_T temp1;
|
|
|
+ int16_T temp2;
|
|
|
+ uint16_T i;
|
|
|
+ uint16_T j;
|
|
|
+
|
|
|
+ //===================================
|
|
|
+ if (X <= cmm_T_ChrgCurr[0])
|
|
|
+ {
|
|
|
+ if(Y <= cmm_V_ChrgCurr[0])
|
|
|
+ {
|
|
|
+ Z = cmm_I_ChrgCurr[0][0];
|
|
|
+ }
|
|
|
+ for(j = 0;j < cmm_V_ChrgCurrN - 1;j++)
|
|
|
+ {
|
|
|
+ if (Y > cmm_V_ChrgCurr[j] && Y <= cmm_V_ChrgCurr[j+1])
|
|
|
+ {
|
|
|
+ Z = (int16_T) ( (int32_T)(Y - cmm_V_ChrgCurr[i]) * (cmm_I_ChrgCurr[0][j+1] -cmm_I_ChrgCurr[0][j]) /(cmm_V_ChrgCurr[j+1] - cmm_V_ChrgCurr[j]) ) + cmm_I_ChrgCurr[0][j];
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if(Y > cmm_V_ChrgCurr[cmm_V_ChrgCurrN-1])
|
|
|
+ {
|
|
|
+ Z = cmm_I_ChrgCurr[0][cmm_V_ChrgCurrN-1];
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //======================================================================
|
|
|
+ for (i = 0; i < cmm_T_ChrgCurrN - 1;i++ )
|
|
|
+ {
|
|
|
+ if (X > cmm_T_ChrgCurr[i] && X <= cmm_T_ChrgCurr[i+1])
|
|
|
+ {
|
|
|
+ if(Y <= cmm_V_ChrgCurr[0])
|
|
|
+ {
|
|
|
+ Z = (int16_T) ((int32_T)(X - cmm_T_ChrgCurr[i]) * (cmm_I_ChrgCurr[i+1][0] -cmm_I_ChrgCurr[i][0])/(cmm_T_ChrgCurr[i+1] - cmm_T_ChrgCurr[i])) + cmm_I_ChrgCurr[i][0] ;
|
|
|
+ }
|
|
|
+ for(j = 0;j < cmm_V_ChrgCurrN - 1;j++)
|
|
|
+ {
|
|
|
+ if (Y > cmm_V_ChrgCurr[j] && Y <= cmm_V_ChrgCurr[j+1])
|
|
|
+ {
|
|
|
+ temp1 = (int16_T) ( (int32_T)( (X - cmm_T_ChrgCurr[i]) * (cmm_I_ChrgCurr[i+1][j] - cmm_I_ChrgCurr[i][j]) )/(cmm_T_ChrgCurr[i+1] - cmm_T_ChrgCurr[i])) + cmm_I_ChrgCurr[i][j];
|
|
|
+ temp2 = (int16_T) ( (int32_T)( (X - cmm_T_ChrgCurr[i]) * (cmm_I_ChrgCurr[i+1][j+1] - cmm_I_ChrgCurr[i][j+1]) )/(cmm_T_ChrgCurr[i+1] - cmm_T_ChrgCurr[i])) + cmm_I_ChrgCurr[i][j+1];
|
|
|
+ Z = (int16_T) ( (int32_T)( (Y - cmm_V_ChrgCurr[j]) * (temp2 -temp1) )/(cmm_V_ChrgCurr[j+1] - cmm_V_ChrgCurr[j])) + temp1 ;
|
|
|
+
|
|
|
+ //break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if(Y > cmm_V_ChrgCurr[cmm_V_ChrgCurrN-1])
|
|
|
+ {
|
|
|
+ Z = (int16_T) ( (int32_T)( (X - cmm_T_ChrgCurr[i]) * (cmm_I_ChrgCurr[i+1][cmm_V_ChrgCurrN-1] -cmm_I_ChrgCurr[i][cmm_V_ChrgCurrN-1]) )/(cmm_T_ChrgCurr[i+1] - cmm_T_ChrgCurr[i]))+ cmm_I_ChrgCurr[i][cmm_V_ChrgCurrN-1];
|
|
|
+ }
|
|
|
+ // break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //=====================================================================
|
|
|
+ if (X > cmm_T_ChrgCurr[cmm_T_ChrgCurrN-1])
|
|
|
+ {
|
|
|
+ if(Y <= cmm_V_ChrgCurr[0])
|
|
|
+ {
|
|
|
+ Z = cmm_I_ChrgCurr[cmm_T_ChrgCurrN-1][0];
|
|
|
+ }
|
|
|
+ for(j = 0;j < cmm_V_ChrgCurrN - 1;j++)
|
|
|
+ {
|
|
|
+ if (Y > cmm_V_ChrgCurr[j] && Y <= cmm_V_ChrgCurr[j+1])
|
|
|
+ {
|
|
|
+ Z = (int16_T) ( (int32_T)( (Y - cmm_V_ChrgCurr[i]) * (cmm_I_ChrgCurr[cmm_T_ChrgCurrN-1][j+1] -cmm_I_ChrgCurr[cmm_T_ChrgCurrN-1][j]) )/(cmm_V_ChrgCurr[j+1] - cmm_V_ChrgCurr[j])) + cmm_I_ChrgCurr[cmm_T_ChrgCurrN-1][j];
|
|
|
+ // break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if(Y > cmm_V_ChrgCurr[cmm_V_ChrgCurrN-1])
|
|
|
+ {
|
|
|
+ Z = cmm_I_ChrgCurr[cmm_T_ChrgCurrN-1][cmm_V_ChrgCurrN-1];
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return Z;
|
|
|
+}
|