Kaynağa Gözat

fix:电量计算

CN\guohui27 2 yıl önce
ebeveyn
işleme
7e253e8bf8

+ 9 - 9
User project/1.FrameLayer/Source/TimeTask_Event.c

@@ -257,17 +257,17 @@ void Event_10ms(void)
         if(cp_stFlg.RunModelSelect != CityBIKE && cp_stFlg.RunModelSelect != MountainBIKE )
         {
             /* Use instrument */
-           Signal_detect();
+//           Signal_detect();
           
             /* Use upper computer */
-//            if(cp_stFlg.RotateDirectionSelect == ForwardRotate)
-//            {
-//                uart_slSpdRefRpm = ((SLONG)MC_MotorSPD_rpm_Percent*5000)/100;
-//            }
-//            else if(cp_stFlg.RotateDirectionSelect == BackwardRotate)
-//            {
-//                uart_slSpdRefRpm = -((SLONG)MC_MotorSPD_rpm_Percent*5000)/100;
-//            }
+            if(cp_stFlg.RotateDirectionSelect == ForwardRotate)
+            {
+                uart_slSpdRefRpm = ((SLONG)MC_MotorSPD_rpm_Percent*5000)/100;
+            }
+            else if(cp_stFlg.RotateDirectionSelect == BackwardRotate)
+            {
+                uart_slSpdRefRpm = -((SLONG)MC_MotorSPD_rpm_Percent*5000)/100;
+            }
       
              if(abs(uart_slSpdRefRpm) < 300)
              {

+ 1 - 1
User project/3.BasicFunction/Include/canAppl.h

@@ -718,7 +718,7 @@ void Can_RemainTrip_Cal(void);
  * @brief 根据电压估算电量
  *
  */
-void Can_SOC_Cal(void);
+UWORD  Can_SOC_Cal(void);
 
 /**
  * @brief 根据协议显示助力曲线

+ 8 - 8
User project/3.BasicFunction/Source/Temp.c

@@ -61,10 +61,10 @@ static SWORD PCB_swRTempTab_CITY[PCB_TEMP_NUM] = {
  179,  // 0.01kOnm IPM voltage at 60 C
  117, // 0.01kOnm IPM voltage at 70 C
  80,   // 0.01kOnm IPM voltage at 80 C
- 58,  // 0.01kOnm IPM voltage at 90 C
- 41,   // 0.01kOnm IPM voltage at 100 C
- 30, // 0.01kOnm IPM voltage at 110 C
- 20// 40 // 0.01kOnm IPM voltage at 120 C
+ 60,  // 0.01kOnm IPM voltage at 90 C
+ 47,   // 0.01kOnm IPM voltage at 100 C
+ 36, // 0.01kOnm IPM voltage at 110 C
+ 27 // 0.01kOnm IPM voltage at 120 C
 };
 static SWORD PCB_swRTempTab_MTB[PCB_TEMP_NUM] = {
  3000, // 0.01kOnm IPM voltage at 0 C       MTB
@@ -76,10 +76,10 @@ static SWORD PCB_swRTempTab_MTB[PCB_TEMP_NUM] = {
  239,  // 0.01kOnm IPM voltage at 60 C
  176, // 0.01kOnm IPM voltage at 70 C
  121,   // 0.01kOnm IPM voltage at 80 C
- 89,  // 0.01kOnm IPM voltage at 90 C
- 65,   // 0.01kOnm IPM voltage at 100 C
- 49, // 0.01kOnm IPM voltage at 110 C
- 37// 40 // 0.01kOnm IPM voltage at 120 C
+ 90,  // 0.01kOnm IPM voltage at 90 C
+ 70,   // 0.01kOnm IPM voltage at 100 C
+ 55, // 0.01kOnm IPM voltage at 110 C
+ 45  //  0.01kOnm IPM voltage at 120 C
 };
 
 static SWORD PCB_swRTempCofTab[PCB_TEMP_NUM-1] = {

+ 52 - 27
User project/3.BasicFunction/Source/canAppl.c

@@ -23,6 +23,7 @@
 #include "hwsetup.h"
 #include "spi_master.h"
 #include "user.h"
+#include "FSM_2nd.h"
 /******************************
  *
  *  Parameter
@@ -215,7 +216,7 @@ void  Can_voInitMC_Run(void)
     else
         strncpy(MC_VerInfo.HW_Version, (char *)"TEST.           ", 16);
     // Software version
-    strncpy(MC_VerInfo.FW_Version, (char *)"V0r1r9_20230531.", 16);
+    strncpy(MC_VerInfo.FW_Version, (char *)"V0r1r9_20230607.", 16);
     // Firmware Special Info
     strncpy(Firmware_Special, (char*)"TC00000-MC00000-V0r0.           ", 32);
     // Model name
@@ -509,8 +510,16 @@ void Can_voMC_Run_1ms(void)
             MC_ErrorCode.ERROR_Bit.Fault_TorqueSensor = 0;
         }
     }
-
-    BMS_VoltEstimat.swIdcPu = (((ULONG)scm_stMotoPwrInLpf.slY.sw.hi << 13) / adc_stUpOut.uwVdcLpfPu); //Q15+Q13-Q14=Q14  Calculated dc current 
+    UWORD TempPower;
+    if(FSM2nd_Run_state.state == Exit)
+    {
+        TempPower = 0;
+    }
+    else
+    {
+        TempPower = scm_stMotoPwrInLpf.slY.sw.hi;
+    }
+    BMS_VoltEstimat.swIdcPu = (((ULONG)TempPower << 13) / adc_stUpOut.uwVdcLpfPu); //Q15+Q13-Q14=Q14  Calculated dc current 
     if(BMS_VoltEstimat.swIdcPu < 0)
     {
       BMS_VoltEstimat.swIdcPu = 0;
@@ -532,7 +541,7 @@ void Can_voMC_Run_5ms(void)
 
 void Can_voMC_Run_200ms(void)
 {
-    UWORD TempPower;
+   
     Can_GearSt_switch();
     SizeMCUP = sizeof(MC_UpcInfo.stAssistInfo);
     if (MC_BC_COM == 0)
@@ -576,21 +585,14 @@ void Can_voMC_Run_200ms(void)
     }
     MC_RunInfo.Power = scm_swMotorPwrInLpfWt / 10;                                    ///>鐢靛姛鐜� 1W锛屽湴鍧€鍋忕Щ4
     MC_RunInfo.BusVoltage = ((ULONG)(adc_stUpOut.uwVdcLpfPu + BMS_VoltEstimat.uwVdcCompPu) * cof_uwUbVt * 100) >> 14; ///>???? 1mV?????6
-    if (scm_stMotoPwrInLpf.slY.sw.hi < 10)
-    {
-        TempPower = 0;
-    }
-    else
-    {
-        TempPower = scm_stMotoPwrInLpf.slY.sw.hi;
-    }
-    MC_RunInfo.BusCurrent = (((ULONG)TempPower << 13) / adc_stUpOut.uwVdcLpfPu) * cof_uwIbAp * 100 >> 14; ///>姣嶇嚎鐢垫祦 1mA锛屽湴鍧€鍋忕Щ8
+
+    MC_RunInfo.BusCurrent = (ULONG)BMS_VoltEstimat.swIdcPu * cof_uwIbAp * 100 >> 14; ///>姣嶇嚎鐢垫祦 1mA锛屽湴鍧€鍋忕Щ8
     MC_RunInfo.Cadence =(cadence_stFreGetOut.uwLPFFrequencyPu * cof_uwFbHz * 60) >> 20;                  ///>韪忛� 1rpm锛屽湴鍧€鍋忕Щ10
     MC_RunInfo.Torque = ((ULONG)torsensor_stTorSensorOut.uwTorqueLPFPu * cof_uwTorqNm / 10) >> 14;        ///>韪╄笍鍔涚煩 1Nm锛屽湴鍧€鍋忕Щ11
     MC_RunInfo.CadenceDir = (MC_CadenceDir_Struct_t)cadence_stFreGetOut.cadence_dir; ///>韪╄笍鏂瑰悜 0-姝�,1-鍙�,2-鍋滄�锛屽湴鍧€鍋忕Щ12
     MC_RunInfo.GearSt = MC_ControlCode.GearSt;                                       ///>鍔╁姏妗d綅锛屽湴鍧€鍋忕Щ13
     MC_RunInfo.LightSwitch = MC_ControlCode.LightSwitch;                             ///>鐏�紑鍏� 0xF0-鍏筹紝0xF1-寮€锛屽湴鍧€鍋忕Щ14
-    Can_SOC_Cal();                                                                   ///>鍓╀綑鐢甸噺 1%锛屽湴鍧€鍋忕Щ15
+    MC_RunInfo.SOC = Can_SOC_Cal();                                                  ///>剩余电量 1%,地址偏移15
     MC_RunInfo.ODO_Km = MC_RideLog.ODO_Km / 10;                                      ///>鎬婚噷绋� 1km锛屽湴鍧€鍋忕Щ18
     Can_Trip_Cal();
 
@@ -729,30 +731,52 @@ SLONG slBMSMaxVol = 54600;
 SLONG slBMSMinVol = 41600;
 #endif
 SWORD SOC_Cnt, SOC_Value, SOC_MIN;
-SLONG SOC_Sum;
+SLONG Voltage_Sum;
 BOOL  blSOCfirstSet = FALSE;
-void  Can_SOC_Cal(void)
+UWORD  Can_SOC_Cal(void)
 {
-    UWORD templenght;
+    UWORD templenght, VoltageAvg = 0;
+    //开机1s等待电压稳定后初始化电量
+    if(cp_ulSystickCnt < 1000)
+    {
+        return 0;
+    }
+    //开机初始化一次电量
     if (blSOCfirstSet == FALSE)
     {
-        SOC_Value = ((SLONG)MC_RunInfo.BusVoltage - (SLONG)slBMSMinVol) * 100 / ((SLONG)slBMSMaxVol - (SLONG)slBMSMinVol);
-        SOC_MIN = SOC_Value;
-        if (SOC_MIN > 100)
+        if(MC_RunInfo.BusVoltage >= slBMSMaxVol)
+        {
+            SOC_Value = 100;
+        }
+        else if(MC_RunInfo.BusVoltage <= slBMSMinVol)
+        {
+            SOC_Value = 0;
+        }
+        else
         {
-            SOC_MIN = 100;
+            SOC_Value = ((SLONG)MC_RunInfo.BusVoltage - (SLONG)slBMSMinVol) * 100 / ((SLONG)slBMSMaxVol - (SLONG)slBMSMinVol);
         }
+        SOC_MIN = SOC_Value;
         blSOCfirstSet = TRUE;
     }
+    //1min更新一次电量
     else
     {
-        templenght = 60000 / 200; // 60s in 200ms time task
+        templenght = 300; // 60s in 200ms time task
         SOC_Cnt++;
-        SOC_Sum += ((SLONG)MC_RunInfo.BusVoltage - (SLONG)slBMSMinVol) * 100 / ((SLONG)slBMSMaxVol - (SLONG)slBMSMinVol);
+        Voltage_Sum += MC_RunInfo.BusVoltage;
         if (SOC_Cnt >= templenght) // 60s
         {
-
-            SOC_Value = SOC_Sum / templenght;
+            VoltageAvg = Voltage_Sum / templenght;
+            if(VoltageAvg <= slBMSMinVol)
+            {
+                SOC_Value = 0;
+            }
+            else
+            {
+                SOC_Value = ((SLONG)VoltageAvg - (SLONG)slBMSMinVol) * 100 / ((SLONG)slBMSMaxVol - (SLONG)slBMSMinVol);
+            }
+            
             if (SOC_Value < SOC_MIN)
             {
                 SOC_MIN = SOC_Value;
@@ -760,9 +784,10 @@ void  Can_SOC_Cal(void)
             else
             {}
             SOC_Cnt = 0;
-            SOC_Sum = 0;
+            Voltage_Sum = 0;
         }
     }
+    //电量仅递减
     if (SOC_Value > SOC_MIN)
     {
         SOC_Value = SOC_MIN;
@@ -773,7 +798,7 @@ void  Can_SOC_Cal(void)
     }
     else
     {}
-    MC_RunInfo.SOC = SOC_Value;
+    return SOC_Value;
 }
 
 void Can_GearSt_switch(void)