Kaynağa Gözat

生产模式下WALK模式可调速;前后灯分离控制;NTC温度估算;续航里程初始化;过压欠压阈值更新;故障恢复时间改为5s;开关机控制协议中增加开关机延时;i2c历史数据读写方式与i2c参数一致;平均功耗计算;SOC估计;Trip计算;

Ye Jin 1 yıl önce
ebeveyn
işleme
d065153e75
29 değiştirilmiş dosya ile 920 ekleme ve 283 silme
  1. 20 19
      User project/1.FrameLayer/Source/FSM_2nd.c
  2. 14 9
      User project/1.FrameLayer/Source/TimeTask_Event.c
  3. 6 7
      User project/1.FrameLayer/Source/app.c
  4. 9 0
      User project/1.FrameLayer/Source/tbc.c
  5. 7 7
      User project/2.MotorDrive/Include/adc.h
  6. 17 13
      User project/2.MotorDrive/Source/adc.c
  7. 1 1
      User project/2.MotorDrive/Source/alarm.c
  8. 1 1
      User project/2.MotorDrive/Source/pwm.c
  9. 2 2
      User project/2.MotorDrive/Source/spdctrmode.c
  10. 7 1
      User project/3.BasicFunction/Include/AssistCurve.h
  11. 2 2
      User project/3.BasicFunction/Include/bikelight.h
  12. 1 0
      User project/3.BasicFunction/Include/canAppl.h
  13. 9 13
      User project/3.BasicFunction/Include/i2c_master.h
  14. 52 0
      User project/3.BasicFunction/Include/ntc_sensor.h
  15. 1 1
      User project/3.BasicFunction/Include/power.h
  16. 55 32
      User project/3.BasicFunction/Source/AssistCurve.c
  17. 5 1
      User project/3.BasicFunction/Source/Cadence.c
  18. 32 18
      User project/3.BasicFunction/Source/bikelight.c
  19. 5 3
      User project/3.BasicFunction/Source/bikespeed.c
  20. 12 10
      User project/3.BasicFunction/Source/can.c
  21. 116 99
      User project/3.BasicFunction/Source/canAppl.c
  22. 29 3
      User project/3.BasicFunction/Source/i2c_master.c
  23. 445 0
      User project/3.BasicFunction/Source/ntc_sensor.c
  24. 11 3
      User project/3.BasicFunction/Source/power.c
  25. 23 21
      User project/3.BasicFunction/Source/spi_master.c
  26. 12 0
      User project/3.BasicFunction/Source/torquesensor.c
  27. 11 11
      User project/4.BasicHardwSoftwLayer/2.BasicSoftwLayer/Include/user.h
  28. 8 5
      User project/4.BasicHardwSoftwLayer/2.BasicSoftwLayer/Source/CodePara.c
  29. 7 1
      WLMCP_PACKED.ewp

+ 20 - 19
User project/1.FrameLayer/Source/FSM_2nd.c

@@ -17,6 +17,7 @@
 #include "FSM_1st.h"
 #include "FSM_2nd.h"
 #include "sys_ctrl.h"
+#include "cmdgennew.h"
 /******************************
  *
  *  Parameter
@@ -93,15 +94,15 @@ void FSM_2nd_Main(void)
             Switch_Second_FSM(&Exit_state);
         }
 
-//        if(signal_state.Assist)
-//        {
-//            /* Initial Value of ASR Output */
-//            asr_stSpdPIOut.slIqRefPu = (SLONG)scm_swIqFdbLpfPu << 16;
-//            /* Initial Value of SpeedCmd Output */
-//            cmd_stCmdOut.slIntRefPu = (SLONG)scm_stSpdFbkLpf.slY.sw.hi << 14; //Q29
-//            /* Switch to Boost FSM */
-//            Switch_Second_FSM(&Boost_state);
-//        }
+        if(signal_state.Assist)
+        {
+            /* Initial Value of ASR Output */
+            asr_stSpdPIOut.slIqRefPu = (SLONG)scm_swIqFdbLpfPu << 16;
+            /* Initial Value of SpeedCmd Output */
+            cmd_stCmdOut.slIntRefPu = (SLONG)scm_stSpdFbkLpf.slY.sw.hi << 14; //Q29
+            /* Switch to Boost FSM */
+            Switch_Second_FSM(&Boost_state);
+        }
 
         break;
 
@@ -112,16 +113,16 @@ void FSM_2nd_Main(void)
             Switch_Second_FSM(&Exit_state);
         }
 
-//        if(signal_state.Sensor && (!signal_state.Assist))
-//        {
-//            /* Initial Value of Assit Output */
-//            ass_stCalOut.swAssitCurRef = scm_swIqFdbLpfPu;    // scm_swIqFdbLpfPu need filter? In case of big ripple?
-//            ass_pvt_stCurLpf.slY.sw.hi = scm_swIqFdbLpfPu;
-//            /* SpdRef Clear */
-//            scm_swSpdRefPu = 0;
-//            /* Switch to Assist FSM */
-//            Switch_Second_FSM(&Assistance_state);
-//        }
+        if(signal_state.Sensor && (!signal_state.Assist))
+        {
+            /* Initial Value of Assit Output */
+            ass_stCalOut.swAssitCurRef = scm_swIqFdbLpfPu;    // scm_swIqFdbLpfPu need filter? In case of big ripple?
+            ass_pvt_stCurLpf.slY.sw.hi = scm_swIqFdbLpfPu;
+            /* SpdRef Clear */
+            scm_swSpdRefPu = 0;
+            /* Switch to Assist FSM */
+            Switch_Second_FSM(&Assistance_state);
+        }
 
         break;
 

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

@@ -64,7 +64,7 @@ void  Event_1ms(void)
     FSM1st_Sys_state.Event_hook();
 
     // Power Management
-    power_voPowerManagement(ass_stParaCong.uwAutoPowerOffTime * 60, cp_ulSystickCnt, OBC_ButtonStatus.ulButtonSetTimeCnt, \
+    power_voPowerManagement(ass_stParaCong.uwAutoPowerOffTime, cp_ulSystickCnt, OBC_ButtonStatus.ulButtonSetTimeCnt, \
                             MC_RunInfo.Torque, MC_RunInfo.Cadence, MC_RunInfo.BikeSpeed, \
                             cp_stFlg.ParaHistorySaveEEFinishFlg, cp_stFlg.ParaSaveEEFlg);
     
@@ -221,18 +221,23 @@ void  Event_1ms(void)
                 //6km/H = 100m/min  1.67m/s
                 if(cp_stFlg.RunModelSelect == CityBIKE)
                 {
-                    uart_slSpdRefRpm = -(10000/(ass_stParaCong.uwWheelPerimeter))*ass_stParaCong.uwNmBackChainring*ass_stParaCong.uwMechRationMotor/ass_stParaCong.uwNmFrontChainring;
+                    if(MC_WorkMode == 1)
+                      uart_slSpdRefRpm = -((SLONG)MC_MotorSPD_rpm_Percent * 5000) / 100;
+                    else
+                      uart_slSpdRefRpm = -(10000/(ass_stParaCong.uwWheelPerimeter))*ass_stParaCong.uwNmBackChainring*ass_stParaCong.uwMechRationMotor/ass_stParaCong.uwNmFrontChainring;
                 }
                 else if(cp_stFlg.RunModelSelect == MountainBIKE)
                 {
-                    uart_slSpdRefRpm = (10000/(ass_stParaCong.uwWheelPerimeter))*ass_stParaCong.uwNmBackChainring*ass_stParaCong.uwMechRationMotor/ass_stParaCong.uwNmFrontChainring;
+                    if(MC_WorkMode == 1)
+                      uart_slSpdRefRpm = ((SLONG)MC_MotorSPD_rpm_Percent * 5000) / 100;
+                    else
+                      uart_slSpdRefRpm = (10000/(ass_stParaCong.uwWheelPerimeter))*ass_stParaCong.uwNmBackChainring*ass_stParaCong.uwMechRationMotor/ass_stParaCong.uwNmFrontChainring;
                 }
                 else
                 {
                     //do nothing
-                }
-
-            }
+                }      
+            }  
             else
             {
                 uart_slSpdRefRpm = 0;
@@ -289,7 +294,7 @@ void Event_10ms(void)
       
         // Bike light control
         Can_Light_switch();
-        bikelight_voBikeLightControl(cp_stBikeRunInfoPara.uwLightSwitch, BikeBrake_blGetstate(), (UBYTE)one_byte);
+        bikelight_voBikeLightControl(cp_stBikeRunInfoPara.uwLightSwitch, BikeBrake_blGetstate(), ass_stParaCong.uwLightVoltage);
 
         // Trip cal when open
         bikespeed_votempTripCal();
@@ -405,12 +410,12 @@ void  Event_200ms(void)
             alm_stBikeIn.swMotorSpdPu = scm_stSpdFbkLpf.slY.sw.hi;
             alm_stBikeIn.uwBikeSpdPu = bikespeed_stFreGetOut.uwFrequencyPu;
             alm_stBikeIn.uwCadenceFreqPu = cadence_stFreGetOut.uwFrequencyPu;
-            alm_stBikeIn.uwMotorNTCReg = adc_stUpOut.MotorTempReg;
+            alm_stBikeIn.uwMotorNTCReg = adc_stUpOut.PCBTempReg;
             alm_stBikeIn.uwPCBNTCReg = adc_stUpOut.PCBTempReg;
             alm_stBikeIn.uwThrottleReg = adc_stUpOut.uwThrottleReg;
             alm_stBikeIn.blThrottleExistFlg = FALSE;
             alm_stBikeIn.blMotorNTCExistFlg = FALSE;
-//            alm_voDetec200MS(&alm_stBikeIn, &alm_stDetect200MSCoef);   
+            alm_voDetec200MS(&alm_stBikeIn, &alm_stDetect200MSCoef);   
         }
         
         if (switch_flg.SysFault_Flag == TRUE)

+ 6 - 7
User project/1.FrameLayer/Source/app.c

@@ -64,15 +64,16 @@ void AppInit()
     CodeParaInit();
     /* AssitPara Init */
     ass_voAssitEEInit();
-    /* PowerInit */
-    power_voPowerInit();
+
     /* DisplayInit */
     display_voDisplayInit();
 #ifdef RUN_ARCH_SIM
     cp_stFlg.SpiOffsetFirstSetFlg = 1;
 #else
     /* Para Copy */
-    mn_voParaSet();
+    mn_voParaSet();   
+    /* PowerInit */
+    power_voPowerInit();
     //cp_stFlg.ParaFirstSetFlg = 0;  //eeprom save test
     if(cp_stFlg.ParaFirstSetFlg == 0)
     {
@@ -80,10 +81,8 @@ void AppInit()
         /* Parameter Default Value Write*/ 
         i2c_voDefaultWriteBuffer();
         i2c_voInfoWrite2EE(&i2c_stTXCoef, &i2c_stTXOut);
-        /* Cycling History Info clear */ 
-        CodeHistoryParaDelete();
-        mn_voEEHistoryParaUpdate();
-        i2c_voHistoryWriteBuffer();
+        /* History Default Value Write */ 
+        i2c_voHistoryDefaultWriteBuffer();
         i2c_voHistoryWrite2EE(&i2c_stTXCoef, &i2c_stTXOut); 
         /* Read EE and Update code para */
         mn_voParaSet();

+ 9 - 0
User project/1.FrameLayer/Source/tbc.c

@@ -33,6 +33,7 @@ Revising History (ECL of this file):
 #include "queue.h"
 #include "canAppl.h"
 #include "alarm.h"
+#include "torquesensor.h"
 /*************************************************************************
  Exported Functions (N/A)
 *************************************************************************/
@@ -71,9 +72,13 @@ void tbc_voUpIsr(void)
     
 #ifdef RUN_ARCH_SIM
     SWORD elecOmega = 0;
+    UWORD gearstate = 0;
     INJ_PT(INT16, uart_slSpdRefRpm, 4);
     INJ_PT(INT16, spi_stResolverOut.uwSpiThetaPu, 0);
     INJ_PT(INT16, elecOmega, 1);
+    INJ_PT(INT16, gearstate, 5);
+    MC_ControlCode.GearSt =gearstate;
+
 
     spi_stResolverOut.swSpdFbkPu = ((SLONG)elecOmega << 15) / cof_uwWebRadps * 10;
     
@@ -91,6 +96,10 @@ void tbc_voUpIsr(void)
     TEST_PT(INT, adc_stDownOut.swIaPu, 9);
     TEST_PT(INT, adc_stUpOut.swCalibIaPu, 10);
     TEST_PT(INT, crd_stCurParkOut.swQPu, 11);
+    TEST_PT(INT, cadence_stFreGetOut.uwFrequencyPu, 12);
+    TEST_PT(INT, bikespeed_stFreGetOut.uwFrequencyPu, 13);  
+    TEST_PT(INT, torsensor_stTorSensorOut.uwTorquePu, 14); 
+    TEST_PT(INT, cp_stBikeRunInfoPara.uwBikeGear, 15); 
 
 #endif
 }

+ 7 - 7
User project/2.MotorDrive/Include/adc.h

@@ -85,13 +85,14 @@ typedef struct
 {
     UWORD uwVdcPu;        // Q14, Vdc
     UWORD uwVdcLpfPu;     // Q14, Vdc after LPF
-    UWORD uwU6VPu;        // Q14, 12V power
-    UWORD uwU5VPu;        // Q14, 5V power
-    UWORD uwU12VPu;       // Q14, 5V power
-    UWORD uwTrottlePu;    // Q14, 5V power
+    UWORD uwRU6VPu;        // Q14, rear light 12V power
+    UWORD uwU5VPu;        // Q14, bikespeed sensor 5V power
+    UWORD uwU12VPu;       // Q14, display 12V power
+    UWORD uwTrottlePu;    // Q14, throttle
     UWORD PCBTempR;       // Not Pu 0.1kOhm
     UWORD MotorTempR;     // Not Pu 0.1kOhm
     SWORD PCBTemp;        // Not Pu, centigrade
+    UWORD uwFU6VPu;        // Q14, rear light 12V power
     SWORD MotorTemp;      // Not Pu, centigrade
     SWORD MosfestTempEst; // Not Pu, centigrade
 
@@ -100,13 +101,12 @@ typedef struct
     SWORD swCalibIcPu;
 
     UWORD uwVdcReg;      // Vdc register value
-    UWORD uwU6VReg;      // 12 V register value
+    UWORD uwRU6VReg;      // 12 V register value
     UWORD uwU5VReg;      // 5 V register value
     UWORD uwU12VReg;     // Q14, 5V power
     UWORD uwThrottleReg; // Q14, 5V power
     UWORD PCBTempReg;
-    UWORD MotorTempReg;
-    UWORD TorqTempReg;
+    UWORD uwFU6VReg;
     
     UWORD uwADCCalibCt;  // Current calib count
     BOOL  blADCCalibFlg; // ADC calib flag

+ 17 - 13
User project/2.MotorDrive/Source/adc.c

@@ -30,6 +30,7 @@ Revising History (ECL of this file):
 #include "Temp.h"
 #include "api.h"
 #include "sys_ctrl.h"
+#include "ntc_sensor.h"
 /************************************************************************
  Constant Table:
 *************************************************************************/
@@ -329,10 +330,10 @@ void adc_voSampleUp(const ADC_COF *cof, ADC_UP_OUT *out)
 {
     /* Register value */
     out->uwVdcReg = iAdc_GetResultPointer(0)[HW_ADC_UDC_CH]; 
-    out->uwU6VReg = iAdc_GetResultPointer(0)[HW_ADC_U6V_CH]; 
+    out->uwRU6VReg = iAdc_GetResultPointer(0)[HW_ADC_U6V_CH]; 
     out->uwU5VReg = iAdc_GetResultPointer(0)[HW_ADC_U5V_CH]; 
     out->PCBTempReg = iAdc_GetResultPointer(0)[HW_ADC_PCBTEMP_CH]; 
-    out->TorqTempReg = iAdc_GetResultPointer(0)[HW_ADC_MOTTEMP_CH]; 
+    out->uwFU6VReg = iAdc_GetResultPointer(0)[HW_ADC_MOTTEMP_CH]; 
     out->uwU12VReg = iAdc_GetResultPointer(0)[HW_ADC_U12V_CH]; 
     out->uwThrottleReg = iAdc_GetResultPointer(0)[HW_ADC_THRO_CH]; 
 
@@ -341,11 +342,12 @@ void adc_voSampleUp(const ADC_COF *cof, ADC_UP_OUT *out)
     /* Vdc LPF */
     out->uwVdcLpfPu = ((out->uwVdcPu - out->uwVdcLpfPu) >> 1) + out->uwVdcLpfPu;
 
-    out->uwU6VPu = (UWORD)((ULONG)out->uwU6VReg * cof->uwU6VReg2Pu >> 10);    // Q14=Q24-Q10;
+    out->uwRU6VPu = (UWORD)((ULONG)out->uwRU6VReg * cof->uwU6VReg2Pu >> 10);    // Q14=Q24-Q10;
     out->uwU5VPu = (UWORD)((ULONG)out->uwU5VReg * cof->uwU5VReg2Pu >> 10);    // Q14=Q24-Q10;
+    out->PCBTemp = GetPCBTemp(out->PCBTempReg);
+    out->uwFU6VPu = (UWORD)((ULONG)out->uwFU6VReg * cof->uwU6VReg2Pu >> 10); // Q14=Q24-Q10;
     out->uwU12VPu = (UWORD)((ULONG)out->uwU12VReg * cof->uwU12VReg2Pu >> 10); // Q14=Q24-Q10;
     
-    out->MotorTempR = out->MotorTempReg * cof->swMotorTempKcof >> 10; // Q14=Q24-Q10;
     
     ////////////////// Single Resitance Current Sample//////////////////////////////////////////////////////
     if (pwm_stGenOut.blSampleCalibFlag == TRUE)
@@ -372,12 +374,13 @@ void adc_voSampleUp(const ADC_COF *cof, ADC_UP_OUT *out)
     }
 
     ////////////////// PCB TEMP//////////////////////////////////////////////////////
-    if(out->PCBTempReg != 0)
-    {
-        out->PCBTempR = (UWORD)((ULONG)4096 * PCB_TEMP_SAMPLER / out->PCBTempReg - PCB_TEMP_SAMPLER); // Q14=Q24-Q10;
-    }
-    PcbTempCal((SWORD)out->PCBTempR);
-    out->PCBTemp = tmp_PcbTemp;
+//    if(out->PCBTempReg != 0)
+//    {
+//        out->PCBTempR = (UWORD)((ULONG)4096 * PCB_TEMP_SAMPLER / out->PCBTempReg - PCB_TEMP_SAMPLER); // Q14=Q24-Q10;
+//    }
+//    PcbTempCal((SWORD)out->PCBTempR);
+//    out->PCBTemp = tmp_PcbTemp;
+    
 }
 
 static SWORD adc_pvt_swSingleReg = 0;
@@ -573,19 +576,20 @@ void adc_voSampleInit(void)
 
     adc_stUpOut.uwVdcPu = 0;
     adc_stUpOut.uwVdcLpfPu = 0;
-    adc_stUpOut.uwU6VPu = 0;
+    adc_stUpOut.uwRU6VPu = 0;
     adc_stUpOut.uwU5VPu = 0;
     adc_stUpOut.uwU12VPu = 0;
     adc_stUpOut.uwTrottlePu = 0;
     adc_stUpOut.PCBTemp = 0;
+    adc_stUpOut.uwFU6VPu = 0;
     adc_stUpOut.MotorTemp = 0;
     adc_stUpOut.uwVdcReg = 0;
-    adc_stUpOut.uwU6VReg = 0;
+    adc_stUpOut.uwRU6VReg = 0;
     adc_stUpOut.uwU5VReg = 0;
     adc_stUpOut.uwU12VReg = 0;
     adc_stUpOut.uwThrottleReg = 0;
     adc_stUpOut.PCBTempReg = 0;
-    adc_stUpOut.MotorTempReg = 0;
+    adc_stUpOut.uwFU6VReg = 0;
     adc_stUpOut.swCalibIaPu = 0;
     adc_stUpOut.swCalibIbPu = 0;
     adc_stUpOut.swCalibIcPu = 0;

+ 1 - 1
User project/2.MotorDrive/Source/alarm.c

@@ -472,7 +472,7 @@ void alm_voDetecTBC(const ALM_IN *in, const ALM_DETECTBC_COF *coef)
     }
 
     /*========================== Alarm flag set ===========================*/
-    if ((alm_unCode.all != 0) || (alm_pvt_blIPMOTReCheckFlg == TRUE)|| (alm_unBikeCode.all != 0))
+    if ((alm_unCode.all != 0) || (alm_pvt_blIPMOTReCheckFlg == TRUE) || (alm_unBikeCode.all != 0))
     {
         alm_blAlmOccrFlg = TRUE;
     }

+ 1 - 1
User project/2.MotorDrive/Source/pwm.c

@@ -524,7 +524,7 @@ void pwm_voGen(PWM_GEN_IN *in, const PWM_CALC_COF *coef, PWM_GEN_OUT *out)
         out->swUalphaPu = (swUaPu + swUaPu - swUbPu - swUcPu) * PWM_1DIV3 >> 14; // Q14=Q14+Q14-Q14
         out->swUbetaPu = (swUbPu - swUcPu) * PWM_SQRT3_INV >> 14;                // Q14=Q14+Q14-Q14
 
-        out->uwRdsonTrig = 129 ;
+        out->uwRdsonTrig = 129;
     }
     else if(cp_stFlg.CurrentSampleModelSelect == SINGLERESISITANCE)
     {

+ 2 - 2
User project/2.MotorDrive/Source/spdctrmode.c

@@ -323,11 +323,11 @@ void scm_voSpdCtrMdCoef(void)
         /*Accelaration&Decelaration limit*/
         if (ABS(scm_swSpdRefPu) < USER_MOTOR_300RPM2PU)
         {
-            cmd_stCmdCoefIn.ulAccelPu =  ulAccel100rpmpsPu; // Q29
+            cmd_stCmdCoefIn.ulAccelPu =  ulAccel100rpmpsPu*2; // Q29
         }
         else
         {
-            cmd_stCmdCoefIn.ulAccelPu = ulAccel100rpmpsPu; // Q29
+            cmd_stCmdCoefIn.ulAccelPu = ulAccel100rpmpsPu*2; // Q29
         }
         cmd_stCmdCoefIn.ulDecelPu =  ulAccel100rpmpsPu*10; // Q29
         cmd_stCmdCoefIn.swBrakeSpdDeltaPu = USER_MOTOR_100RPM2PU;

+ 7 - 1
User project/3.BasicFunction/Include/AssistCurve.h

@@ -32,10 +32,16 @@
 #define BIKE_SPEED_THROTTLE_MAX       6                                 // Km/h
 #define BIKE_FRONTTEETH_NMB          38                                 // number
 #define BIKE_BACKTEETH_NMB            11                                 // number
-#define BIKE_LIGHT_VOLTAGE            6     //V
+#define BIKE_BACKLIGHT_MODE           0      //mode 0-5
+#define BIKE_BACKLIGHT_VOLTAGE        6     //6 or 12V
+#define BIKE_FORWARDLEDLIGHT_VOLTAGE  6     //6 or 12V
+#define BIKE_LIGHT_PARA               ((BIKE_BACKLIGHT_MODE<<12)|(BIKE_BACKLIGHT_VOLTAGE<<8)|BIKE_FORWARDLEDLIGHT_VOLTAGE)     
 #define BIKE_WHEEL_SIZE_ADJUST        0     //cm
 #define BIKE_START_MODE               2     //Normal
+#define BIKE_POWERSTART_DELAY_TIME    0     //0.2s
+#define BIKE_POWEROFF_DELAY_TIME      0     //0.2s
 #define BIKE_AUTO_POWER_OFF_TIME      15     //min
+#define BIKE_POWER_PARA               ((BIKE_POWERSTART_DELAY_TIME<<12)|(BIKE_POWEROFF_DELAY_TIME<<8)|BIKE_AUTO_POWER_OFF_TIME)     
 
 #define BIKE_ASSIST_MODE1              0x0155
 #define BIKE_ASSIST_MODE2              0x02AA

+ 2 - 2
User project/3.BasicFunction/Include/bikelight.h

@@ -226,10 +226,10 @@ typedef struct
  *
  ***************************************/
 void bikelight_voBikeLightInit(void); // interface function
-void bikelight_voBikeLightCoef(UWORD volt);
+void bikelight_voBikeLightCoef(UWORD uwLightPara);
 void bikelight_voGetBikeLightError(UWORD LightPowerVolPu,BOOL Ledsta,BIKELEDCHECK_STR *p);
 //void bikelight_voGetBikeLightError(UWORD LightPowerVolPu);
-void bikelight_voBikeLightControl(UWORD switchAction, BOOL Brate_Sta,UBYTE BackLedMode);
+void bikelight_voBikeLightControl(UWORD switchAction, BOOL Brate_Sta,UWORD uwLightPara);
 //void bikelight_voBikeLightControl(UWORD switchAction); // interface function
 /************************************************************************
  Flag Define (N/A)

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

@@ -646,6 +646,7 @@ extern OBC_SetCustomPara_Struct_t OBC_SetCustomPara;
 extern OBC_ButtonStatus_Struct_t OBC_ButtonStatus;
 
 extern ULONG ulOBC_ComTimeOutCount;
+extern ULONG ulBMS_ComTimeOutCount;
 extern UBYTE MC_MotorSPD_rpm_Percent;
 extern UBYTE MC_WorkMode;
 extern UBYTE MC_BC_COM;

+ 9 - 13
User project/3.BasicFunction/Include/i2c_master.h

@@ -205,7 +205,7 @@
     }
 #define I2CuwLightVoltage                    \
     {                                         \
-        ((UWORD)BIKE_LIGHT_VOLTAGE), 0, 0, 0, 0 \
+        ((UWORD)BIKE_LIGHT_PARA), 0, 0, 0, 0 \
     }
 #define I2CuwDeltDiameter \
     {                     \
@@ -217,7 +217,7 @@
     }
 #define I2CuwAutoPowerOffTime                    \
     {                                         \
-        ((UWORD)BIKE_AUTO_POWER_OFF_TIME), 0, 0, 0, 0 \
+        ((UWORD)BIKE_POWER_PARA), 0, 0, 0, 0 \
     }
 
 #define I2CBikePara                                                                                                                           \
@@ -617,23 +617,23 @@
 
 #define I2CuwG1AvgPwrConsumption \
     {                            \
-        0, 0, 0, 0, 0            \
+        100, 0, 0, 0, 0            \
     }
 #define I2CuwG2AvgPwrConsumption \
     {                            \
-        0, 0, 0, 0, 0            \
+        160, 0, 0, 0, 0            \
     }
 #define I2CuwG3AvgPwrConsumption \
     {                            \
-        0, 0, 0, 0, 0            \
+        190, 0, 0, 0, 0            \
     }
 #define I2CuwG4AvgPwrConsumption \
     {                            \
-        0, 0, 0, 0, 0            \
+        270, 0, 0, 0, 0            \
     }
 #define I2CuwG5AvgPwrConsumption \
     {                            \
-        0, 0, 0, 0, 0            \
+        180, 0, 0, 0, 0            \
     }
 
 #define I2CuwODOTripH \
@@ -981,13 +981,10 @@ _I2C_MASTER_EXT BOOL  I2C_EE_ComuFltFlg;
  Exported Function Call Prototypes
 *************************************************************************/
 #ifdef _I2C_MASTER_C_
-_I2C_MASTER_EXT void  i2c_voWaitEEReady(UBYTE SlaveAddr);
-_I2C_MASTER_EXT void  i2c_voTXCoef(I2C_TX_COF *out);
-_I2C_MASTER_EXT void  i2c_voInfoWriteBuffer(void);
 _I2C_MASTER_EXT void  i2c_voDefaultWriteBuffer(void);
 _I2C_MASTER_EXT void  i2c_voParaWriteBuffer(void);
+_I2C_MASTER_EXT void  i2c_voHistoryDefaultWriteBuffer(void);
 _I2C_MASTER_EXT void  i2c_voHistoryWriteBuffer(void);
-_I2C_MASTER_EXT void  i2c_voDefaultWrite2EE(I2C_TX_COF *coef, I2C_TX_OUT *out);
 _I2C_MASTER_EXT void  i2c_voInfoWrite2EE(const I2C_TX_COF *coef, I2C_TX_OUT *out);
 _I2C_MASTER_EXT void  i2c_voHistoryWrite2EE(const I2C_TX_COF *coef, I2C_TX_OUT *out);
 _I2C_MASTER_EXT void  i2c_voSysparaReadFromEE(I2C_RXCRC_OUT *out);
@@ -996,10 +993,9 @@ _I2C_MASTER_EXT void  i2c_voReadBufferCRC(I2C_RXCRC_OUT *out);
 _I2C_MASTER_EXT void  i2c_voGetValueFrmBuffer(const I2C_RXCRC_OUT *out);
 
 #else
-_I2C_MASTER_EXT void  i2c_voWaitEEReady(UBYTE SlaveAddr);
-_I2C_MASTER_EXT void  i2c_voTXCoef(I2C_TX_COF *out);
 _I2C_MASTER_EXT void  i2c_voDefaultWriteBuffer(void);
 _I2C_MASTER_EXT void  i2c_voParaWriteBuffer(void);
+_I2C_MASTER_EXT void  i2c_voHistoryDefaultWriteBuffer(void);
 _I2C_MASTER_EXT void  i2c_voHistoryWriteBuffer(void);
 _I2C_MASTER_EXT void  i2c_voInfoWrite2EE(const I2C_TX_COF *coef, I2C_TX_OUT *out);
 _I2C_MASTER_EXT void  i2c_voHistoryWrite2EE(const I2C_TX_COF *coef, I2C_TX_OUT *out);

+ 52 - 0
User project/3.BasicFunction/Include/ntc_sensor.h

@@ -0,0 +1,52 @@
+/**
+ * @file ntc_sensor.h
+ * @author Zhou xiong(zhouxiong9@midea.com)
+ * @brief 
+ * @version 0.1
+ * @date 2023-03-09
+ *
+ * @copyright Copyright (c) 2021
+ *
+ */
+/************************************************************************
+ Beginning of File, do not put anything above here except notes
+ Compiler Directives:
+*************************************************************************/
+#ifndef NTCSENSOR_H
+#define NTCSENSOR_H
+ 
+#include "typedefine.h"
+/****************************************
+ *
+ *          Definitions & Macros
+ *
+ ****************************************/
+
+
+/***************************************
+ *
+ *          Type  Definations
+ *
+ ***************************************/
+
+
+/*****************************************
+ *
+ *           Exported variable
+ *
+ ****************************************/
+
+/***************************************
+ *
+ *          Function  Definations
+ *
+ ***************************************/
+extern SWORD GetPCBTemp(UWORD ADC_Result);
+extern SWORD GetTorqueTemp(UWORD ADC_Result);
+/************************************************************************/
+
+#endif
+/************************************************************************
+ End of this File (EOF):
+ Do not put anything after this part!
+*************************************************************************/

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

@@ -101,7 +101,7 @@ extern ULONG PowerOffDTimeOut;
  *
  ***************************************/
 void power_voPowerInit(void);
-void power_voPowerManagement(ULONG ulAutoPowerOffDelayTime, ULONG SysTickCnt, ULONG OBC_ButtonSetTimeCnt, UWORD uwTorqueIn, UWORD CadenceIn, UWORD BikeSpeed, BOOL EESaveFinishFlg, BOOL ParaSaveEEFlg);
+void power_voPowerManagement(UWORD uwPowerPara, ULONG SysTickCnt, ULONG OBC_ButtonSetTimeCnt, UWORD uwTorqueIn, UWORD CadenceIn, UWORD BikeSpeed, BOOL EESaveFinishFlg, BOOL ParaSaveEEFlg);
 
 /************************************************************************/
 

+ 55 - 32
User project/3.BasicFunction/Source/AssistCurve.c

@@ -55,6 +55,9 @@ MAF_IN ass_stUqLimMafValue = {0, 64, 0, 0, ass_swUqLimMafBuf, 0, FALSE};
 static TOR2CURRENT_CAL_COEF ass_Tor2CurCalCoef;
 static UWORD StartUpGainArray[5] = START_GAIN_DEFAULT;
 static UWORD LinerAssist[5] = ASS_LINER_TORQUE_DEFAULT;
+static SWORD ass_pvt_swVoltCnt=0;
+static UWORD ass_pvt_uwTorqAccCnt=0,ass_pvt_uwTorqDecCnt=0,ass_pvt_uwSpd2TorqCnt=0;
+static UWORD AssCnt1ms; 
 /******************************
  *
  *  Function
@@ -156,10 +159,26 @@ static void ass_voAssistModeSelect(void) // 上电运行一次or助力参数更
     {
         TempAssit = ASSISTMOD_SELECT_DEFAULT;
     }
-    
+    SLONG slTorqGainSum =0;
+
+    for(UWORD i = 0; i < 4; i++)
+    {
+        slTorqGainSum += flash_stPara.slTorqAssGain[0][i];
+    }
+    if(slTorqGainSum == 0)
+    {
+        SLONG slTorqAssGain[15][4] = TORQUE_ASSIST_DEFAULT;
+        SLONG slCadAssGain[5][4] = CADENCE_ASSIST_DEFAULT;
+        UWORD a ;
+        a =sizeof( slTorqAssGain);
+        memcpy(&flash_stPara.slTorqAssGain[0], &slTorqAssGain[0], sizeof(slTorqAssGain));
+        memcpy(&flash_stPara.slCadAssGain[0], &slCadAssGain[0], sizeof(slCadAssGain));
+    }
+
     for (gear = 0; gear < 5; gear++)
     {
         TempGear = gear * 3 + ((TempAssit >> (UWORD)(gear << 1)) & 0x0003);
+
         memcpy(&ass_stCalCoef.uwTorqueAssGain[(gear + 1)], &flash_stPara.slTorqAssGain[TempGear], sizeof(POLY_COEF));
     }
     memcpy(&ass_stCalCoef.uwCadencAsseGain[1], &flash_stPara.slCadAssGain[0], sizeof(flash_stPara.slCadAssGain));
@@ -184,10 +203,10 @@ void ass_voAssitEEInit(void)
     ass_stParaCong.uwNmBackChainring = BIKE_BACKTEETH_NMB;     // min number of back gear
     ass_stParaCong.uwAssistSelect1 = BIKE_ASSIST_MODE1;
     ass_stParaCong.uwAssistSelect2 = BIKE_ASSIST_MODE2;
-    ass_stParaCong.uwLightVoltage = BIKE_LIGHT_VOLTAGE;
+    ass_stParaCong.uwLightVoltage = BIKE_LIGHT_PARA;
     ass_stParaCong.swDeltPerimeter = BIKE_WHEEL_SIZE_ADJUST;
     ass_stParaCong.uwStartMode = BIKE_START_MODE;
-    ass_stParaCong.uwAutoPowerOffTime = BIKE_AUTO_POWER_OFF_TIME;
+    ass_stParaCong.uwAutoPowerOffTime = BIKE_POWER_PARA;
 
     ass_stParaSet.uwStartupCoef = 8194;       // Q12 percentage Min 1-4096  1.5-6144
     ass_stParaSet.uwStartupCruiseCoef = 4096; // Q12 percentage Min 1-4096  1-6144
@@ -214,6 +233,13 @@ void ass_voAssitEEInit(void)
     ass_stParaSet.uwSpdRegionGain[0] = 4094;
     ass_stParaSet.uwSpdRegionGain[1] = 4094;
     ass_stParaSet.uwSpdRegionGain[2] = 4094;
+    
+    /* 函数私有变量初始化 */
+    ass_pvt_swVoltCnt = 0;
+    ass_pvt_uwTorqAccCnt = 0;
+    ass_pvt_uwTorqDecCnt = 0;
+    ass_pvt_uwSpd2TorqCnt = 0;
+    AssCnt1ms = 0; 
 }
 
 /**
@@ -432,18 +458,14 @@ void ass_voAssitCoef(void)
 //    out->swIRefPu = out->slIRefPu >> 15; // Q29-Q15=Q14
 //    out->swErrZ1Pu = (SWORD)slErrPu;
 //}
-
-static SWORD ass_pvt_swVoltCnt=0;
-static UWORD ass_pvt_uwTorqAccCnt=0,ass_pvt_uwTorqDecCnt=0,ass_pvt_uwSpd2TorqCnt=0;
-UWORD AssCnt1ms; 
+SLONG slTeTorAssitTmpPu,slTeTorAssitLinerPu,slTeCadAssitTmpPu;
+SWORD swTeTorAssitPu1, swTeTorAssitPu2;
+SWORD swTeCadAssitPu1, swTeCadAssitPu2;
+SWORD swTmpSpdtoTorqCur;   
+SLONG slTmpSmoothCur;
+SWORD swTorqCmd1, swTorqCmd, swCadCmd;
 static void AssitCuvApplPerVolt(void) /* parasoft-suppress METRICS-28 "本项目圈复杂度无法更改,后续避免" */
-{  
-    SLONG slTeTorAssitTmpPu,slTeTorAssitLinerPu,slTeCadAssitTmpPu;
-    SWORD swTeTorAssitPu1, swTeTorAssitPu2;
-    SWORD swTeCadAssitPu1, swTeCadAssitPu2;
-    SWORD swTmpSpdtoTorqCur;   
-    SLONG slTmpSmoothCur;
-    SWORD swTorqCmd1, swTorqCmd, swCadCmd;
+{      
     UWORD uwTorqAccStep = 50,uwTorqDecStep = 80;
     SWORD swCurSwitch = 0;
     SWORD swTmpVoltPu,swTmpVoltPu2;
@@ -563,7 +585,7 @@ static void AssitCuvApplPerVolt(void) /* parasoft-suppress METRICS-28 "本项目
             ass_stCalCoef.swSmoothGain = Q12_1;
         }
          
-        swSpdKpPu = 2000;  //ass_stParaSet.uwStartUpCadNm;
+        swSpdKpPu = 1000;  //ass_stParaSet.uwStartUpCadNm;
         slSpdErr = (SLONG)ass_stCalOut.swCadSpd2MotSpd - (SLONG)ass_stCalIn.uwSpdFbkAbsPu;
         if(slSpdErr < 0)
         {
@@ -588,23 +610,23 @@ static void AssitCuvApplPerVolt(void) /* parasoft-suppress METRICS-28 "本项目
             }          
             ass_stCalOut.swVoltLimitPu = (SWORD)slTmpVoltLim;
             
-//            if(slSpdErr <= 1000)
-//            {
-//                ass_stCalCoef.StartFlag = 1;
-//            }  
-            if(ABS(scm_swIqRefPu- scm_swIqFdbLpfPu) > 200)
+            if(slSpdErr <= 1000)
             {
-                ass_pvt_swVoltCnt++;  
-            }    
-            else
-            {
-                ass_pvt_swVoltCnt=0;
-            }
-            if(ass_pvt_swVoltCnt > 10)
-            {
-                ass_pvt_swVoltCnt=0;
                 ass_stCalCoef.StartFlag = 1;
-            }      
+            }  
+//            if(ABS(scm_swIqRefPu- scm_swIqFdbLpfPu) > 200)
+//            {
+//                ass_pvt_swVoltCnt++;  
+//            }    
+//            else
+//            {
+//                ass_pvt_swVoltCnt=0;
+//            }
+//            if(ass_pvt_swVoltCnt > 10)
+//            {
+//                ass_pvt_swVoltCnt=0;
+//                ass_stCalCoef.StartFlag = 1;
+//            }      
         }
         else if(ass_stCalCoef.StartFlag ==1 )
         {
@@ -668,8 +690,9 @@ static void AssitCuvApplPerVolt(void) /* parasoft-suppress METRICS-28 "本项目
             
             if(ass_stCalCoef.swAss2SpdCNT > uwTmpStopCnt)
             {
-                ass_stCalCoef.swAss2SpdCNT = 0;
                 Ass_FSM = ReduceCurrent;
+                ass_stCalCoef.swAss2SpdCNT = 0;
+                ass_stCalCoef.StartFlag=0;
             } 
         }
         else
@@ -1039,7 +1062,7 @@ static void ass_voAssistCurLimBMS(UWORD uwSOCvalue)
 void ass_voAssist(void)
 {
     /* Start Assist Jduge */
-    if (((ass_stCalIn.uwtorquePer > ass_stCalCoef.uwAssThreshold && ass_stCalIn.uwcadancePer > 0) || ass_stCalIn.uwtorquePer > 3000) && (ass_stCalIn.uwGearSt > 0 && ass_stCalIn.uwGearSt != 0x22))
+    if ((ass_stCalIn.uwtorquePer > ass_stCalCoef.uwAssThreshold && ass_stCalIn.uwcadancePer > 0) && (ass_stCalIn.uwGearSt > 0 && ass_stCalIn.uwGearSt != 0x22))
     {
         ass_stCalCoef.blAssistflag = TRUE;
     }

+ 5 - 1
User project/3.BasicFunction/Source/Cadence.c

@@ -41,7 +41,9 @@ static ULONG cad_pvt_ulCapValErrLast = 0;
 ****************************************************************/
 void cadence_voCadenceCof(void)
 {
-    // cadence_stFreGetCof.uwNumbersPulses = CADENCE_NUMBERS_PULSES;
+#ifdef RUN_ARCH_SIM 
+    cadence_stFreGetCof.uwNumbersPulses = CADENCE_NUMBERS_PULSES;
+#endif
     cadence_stFreGetCof.uwSartIntervalTimeCnt = CADENCE_START_INTERVALTIME / CADENCE_TIM_TIMERUNIT;
     cadence_stFreGetCof.uwNumbersValidPulse2Start = CADENCE_NUMBERS_VALIDPULSE2START;
     cadence_stFreGetCof.uwLfRecordTimeCnt = CADENCE_LF_RECORDTIME / CADENCE_TIM_TIMERUNIT;
@@ -170,6 +172,7 @@ static void cadence_voCadenceHighFrequencyWork(UWORD source)
         cadence_stFreGetOut.cadence_dir = CADENCE_DIR_ERROR;
         cadence_stFreGetOut.cadence_fsm = CADENCE_ERROR;
         cadence_stFreGetOut.uwFreqPercent = 0;
+        cad_pvt_ulCadFreqPu = 0;
     }
     else if (cadence_stFreGetOut.uwCaputureOverflowCnt > cadence_stFreGetCof.uwHfMaxTimeCnt)
     {
@@ -184,6 +187,7 @@ static void cadence_voCadenceHighFrequencyWork(UWORD source)
         cadence_stFreGetOut.cadence_dir = CADENCE_DIR_IDLE;
         cadence_stFreGetOut.cadence_fsm = CADENCE_IDLE;
         cadence_stFreGetOut.uwFreqPercent = 0;
+        cad_pvt_ulCadFreqPu = 0;
     }
     else 
     {

+ 32 - 18
User project/3.BasicFunction/Source/bikelight.c

@@ -164,32 +164,44 @@ void bikelight_voBikeLightInit(void)
  Subroutine Call: N/A;
  Reference: N/A
 ****************************************************************/
-void bikelight_voBikeLightCoef(UWORD volt)
+void bikelight_voBikeLightCoef(UWORD uwLightPara)
 {
-      
-
-    if( volt == 12)
+    UBYTE ubBackLedVolt;
+    UBYTE ubForwardLedVolt;
+
+    ubBackLedVolt = (UBYTE)((uwLightPara & 0x0F00) >> 8);
+    ubForwardLedVolt = (UBYTE)((uwLightPara & 0x00FF));
+    
+    //后灯
+    if( ubBackLedVolt == 12)
     {
-        BikeLedCheckF.LedOnVoltMin = ((ULONG)LIGHT_ERR_VOLTAGE_MIN << 15) / VBASE;
-        BikeLedCheckF.LedOnVoltMax  =  ((ULONG)LIGHT_ERR_VOLTAGE_MAX << 15) / VBASE;
-        
         BikeLedCheckB.LedOnVoltMin = ((ULONG)LIGHT_ERR_VOLTAGE_MIN << 15) / VBASE;
         BikeLedCheckB.LedOnVoltMax  =  ((ULONG)LIGHT_ERR_VOLTAGE_MAX << 15) / VBASE;
 
-        IO_FORWARDLED_12V_ENABLE();//12V使能
-        IO_BACKLED_12V_ENABLE();
+        IO_BACKLED_12V_ENABLE();//12V使能 
+    }
+    else
+    {
+        BikeLedCheckB.LedOnVoltMin = ((ULONG)LIGHT_ERR_VOLTAGE_MIN << 14) / VBASE;
+        BikeLedCheckB.LedOnVoltMax = ((ULONG)LIGHT_ERR_VOLTAGE_MAX << 14) / VBASE;
+
+        IO_BACKLED_12V_DISABLE();//6V输出使能
+    }
+    
+    //前灯
+    if( ubForwardLedVolt == 12)
+    {
+        BikeLedCheckF.LedOnVoltMin = ((ULONG)LIGHT_ERR_VOLTAGE_MIN << 15) / VBASE;
+        BikeLedCheckF.LedOnVoltMax  =  ((ULONG)LIGHT_ERR_VOLTAGE_MAX << 15) / VBASE;
         
+        IO_FORWARDLED_12V_ENABLE();//12V使能     
     }
     else
     {
         BikeLedCheckF.LedOnVoltMin = ((ULONG)LIGHT_ERR_VOLTAGE_MIN << 14) / VBASE;
         BikeLedCheckF.LedOnVoltMax = ((ULONG)LIGHT_ERR_VOLTAGE_MAX << 14) / VBASE;
         
-        BikeLedCheckB.LedOnVoltMin = ((ULONG)LIGHT_ERR_VOLTAGE_MIN << 14) / VBASE;
-        BikeLedCheckB.LedOnVoltMax = ((ULONG)LIGHT_ERR_VOLTAGE_MAX << 14) / VBASE;
-
         IO_FORWARDLED_12V_DISABLE();//6V输出使能
-        IO_BACKLED_12V_DISABLE();
     }
 
 }
@@ -202,9 +214,11 @@ void bikelight_voBikeLightCoef(UWORD volt)
  Subroutine Call: N/A;
  Reference: N/A
 ****************************************************************/
-void bikelight_voBikeLightControl(UWORD switchAction, BOOL Brate_Sta,UBYTE BackLedMode) /* parasoft-suppress METRICS-28 "本项目圈复杂度无法更改,后续避免" */
+void bikelight_voBikeLightControl(UWORD switchAction, BOOL Brate_Sta,UWORD uwLightPara) /* parasoft-suppress METRICS-28 "本项目圈复杂度无法更改,后续避免" */
 {
-
+   UBYTE ubBackLedMode;
+   
+   ubBackLedMode = (UBYTE)((uwLightPara & 0xF000) >> 12);
  //if( power_stPowStateOut.powerstate != POWER_ON) //关机状态
    if( power_stPowStateOut.blPowerStartupFlg  ==FALSE)
   {
@@ -218,7 +232,7 @@ void bikelight_voBikeLightControl(UWORD switchAction, BOOL Brate_Sta,UBYTE BackL
   else
   {
     // ---------------尾灯6个状态处理------------
-    switch( BackLedMode)
+    switch( ubBackLedMode)
     {
         case one_byte:  //模式1
         {
@@ -396,8 +410,8 @@ void bikelight_voBikeLightControl(UWORD switchAction, BOOL Brate_Sta,UBYTE BackL
     }
 
     //--------------LED电路检测----------
-    bikelight_voGetBikeLightError(adc_stUpOut.uwU6VPu,BikeLedGloFun.blBike_ForwardLedSta,&BikeLedCheckF); //前灯检测
-       bikelight_voGetBikeLightError(adc_stUpOut.uwU6VPu,BikeLedGloFun.blBike_BackLedSta,&BikeLedCheckB); //尾灯检测
+    bikelight_voGetBikeLightError(adc_stUpOut.uwRU6VPu,BikeLedGloFun.blBike_ForwardLedSta,&BikeLedCheckF); //前灯检测
+       bikelight_voGetBikeLightError(adc_stUpOut.uwFU6VPu,BikeLedGloFun.blBike_BackLedSta,&BikeLedCheckB); //尾灯检测
 
     if((BikeLedCheckF.blBike_LedOffErr == TRUE) ||(BikeLedCheckF.blBike_LedOnErr==TRUE) )
     {

+ 5 - 3
User project/3.BasicFunction/Source/bikespeed.c

@@ -18,7 +18,7 @@
 #include "CodePara.h"
 #include "api.h"
 #include "board_config.h"
-
+#include "AssistCurve.h"
 /******************************
  *
  *  Parameter
@@ -43,7 +43,9 @@ static ULONG bikespeed_pvt_FreqPu = 0;
 ****************************************************************/
 void bikespeed_voBikeSpeedCof(void)
 {
-    // bikespeed_stFreGetCof.uwNumbersPulses = BIKESPEED_NUMBERS_PULSES;
+#ifdef RUN_ARCH_SIM 
+    bikespeed_stFreGetCof.uwNumbersPulses = BIKESPEED_NUMBERS_PULSES;
+#endif
     bikespeed_stFreGetCof.uwSartIntervalTimeCnt = BIKESPEED_START_INTERVALTIME / BIKESPEED_TIM_TIMERUNIT;
     bikespeed_stFreGetCof.uwNumbersValidPulse2Start = BIKESPEED_NUMBERS_VALIDPULSE2START;
     bikespeed_stFreGetCof.uwHfMinTimeCnt = BIKESPEED_HF_MINTIME / BIKESPEED_TIM_TIMERUNIT;
@@ -268,7 +270,7 @@ void bikespeed_voGetBikeSpeedPwrError(UWORD BikeSpeedPwrVolPu)
 void bikespeed_votempTripCal(void)
 {
     UWORD Temptrip;
-    Temptrip = (UWORD)(((ULONG)bikespeed_stFreGetCof.uwWheelPerimeter * 3216 * bikespeed_stFreGetOut.uwBikeForwardCnt / 1000) >> 10); // 3216 = Q10(3.1415926) m
+    Temptrip = (ULONG)(ass_stParaCong.uwWheelPerimeter + ass_stParaCong.swDeltPerimeter)* bikespeed_stFreGetOut.uwBikeForwardCnt /100; //219cm
     if (Temptrip > bikespeed_stFreGetCof.uwMinTriptoUpdate)
     {
         bikespeed_stFreGetOut.uwBikeForwardCnt = 0;

+ 12 - 10
User project/3.BasicFunction/Source/can.c

@@ -392,7 +392,8 @@ void DataProcess(UWORD ID, UBYTE Mode, UWORD Cmd, UBYTE Data[]) /* parasoft-supp
         {
             //更新电池运行信息
             memcpy(&BMS_RunInfo.Voltage, Data, DataLength);
-            MC_RunInfo.SOC = BMS_RunInfo.SOC;
+            //MC_RunInfo.SOC = BMS_RunInfo.SOC;
+            ulBMS_ComTimeOutCount = cp_ulSystickCnt;
             break;
         }
         case 0x1308: //关机指令
@@ -462,11 +463,13 @@ void DataProcess(UWORD ID, UBYTE Mode, UWORD Cmd, UBYTE Data[]) /* parasoft-supp
             ass_stParaCong.swDeltPerimeter = OBC_SetCustomPara.DeltDiameter;
             ass_stParaCong.uwStartMode = OBC_SetCustomPara.StartUpMod;
             ass_stParaSet.uwAsssistSelectNum = OBC_SetCustomPara.AssistMod;
-            ass_stParaCong.uwAutoPowerOffTime = OBC_SetCustomPara.AutoPowerOffTime;
+            ass_stParaCong.uwAutoPowerOffTime = ass_stParaCong.uwAutoPowerOffTime & 0xFF00;
+            ass_stParaCong.uwAutoPowerOffTime |= OBC_SetCustomPara.AutoPowerOffTime;
             MC_UpcInfo.stBikeInfo.uwSaveFlg = 1;
             MC_UpcInfo.stBikeInfo.swWheelSizeAdjust = OBC_SetCustomPara.DeltDiameter;
             MC_UpcInfo.stBikeInfo.uwStartMode = OBC_SetCustomPara.StartUpMod;
-            MC_UpcInfo.stBikeInfo.uwAutoPowerOffTime =  OBC_SetCustomPara.AutoPowerOffTime; 
+            MC_UpcInfo.stBikeInfo.uwAutoPowerOffTime = ass_stParaCong.uwAutoPowerOffTime & 0xFF00;
+            MC_UpcInfo.stBikeInfo.uwAutoPowerOffTime |= OBC_SetCustomPara.AutoPowerOffTime; 
             cp_stFlg.ParaUpdateFlg = TRUE;
             cp_stFlg.ParaBikeInfoUpdateFlg = TRUE;            
             cp_stFlg.ParaAssistUpdateFinishFlg = TRUE;
@@ -496,7 +499,7 @@ void DataProcess(UWORD ID, UBYTE Mode, UWORD Cmd, UBYTE Data[]) /* parasoft-supp
         case 0x3900: //返回电机版本信息
         {
             SendData(ID_MC_BC, MODE_REPORT, 0x1240, (UBYTE *)MC_VerInfo.Mode);
-            SendData(ID_MC_BC, MODE_REPORT, 0x1720, (UBYTE*)Firmware_Special);
+            SendData(ID_MC_BC, MODE_REPORT, 0x1720, (UBYTE *)Firmware_Special);
             break;
         }
         case 0x3A02: //OBC按键状态
@@ -631,9 +634,8 @@ void DataProcess(UWORD ID, UBYTE Mode, UWORD Cmd, UBYTE Data[]) /* parasoft-supp
                 i2c_voDefaultWriteBuffer();
                 i2c_voInfoWrite2EE(&i2c_stTXCoef, &i2c_stTXOut);
 
-                CodeHistoryParaDelete();
-                mn_voEEHistoryParaUpdate();
-                i2c_voHistoryWriteBuffer();
+                /* History Default Value Write */ 
+                i2c_voHistoryDefaultWriteBuffer();
                 i2c_voHistoryWrite2EE(&i2c_stTXCoef, &i2c_stTXOut);
 
                 ENABLE_IRQ;
@@ -702,7 +704,7 @@ void DataProcess(UWORD ID, UBYTE Mode, UWORD Cmd, UBYTE Data[]) /* parasoft-supp
             SendData(ID_MC_BC, MODE_REPORT, 0x1510, (UBYTE *)&MC_RideLog.ODO_Km);
             break;
         }
-        case 0x3909: 
+        case 0x3909: //历史信息清除
         {
             if (strncmp("LOG CLEAR", (char *)Data, DataLength) == 0)
             {
@@ -716,8 +718,8 @@ void DataProcess(UWORD ID, UBYTE Mode, UWORD Cmd, UBYTE Data[]) /* parasoft-supp
                 cp_stHistoryPara.ulODOTrip = 0;
                 cp_stHistoryPara.ulODOTime = 0;
                 DISABLE_IRQ;
-                mn_voEEHistoryParaUpdate();
-                i2c_voHistoryWriteBuffer();
+                /* History Default Value Write */ 
+                i2c_voHistoryDefaultWriteBuffer();
                 i2c_voHistoryWrite2EE(&i2c_stTXCoef, &i2c_stTXOut);
                 ENABLE_IRQ;
                 if (I2C_EE_ComuFltFlg != TRUE)

+ 116 - 99
User project/3.BasicFunction/Source/canAppl.c

@@ -50,6 +50,7 @@ BMS_VoltEstimat_Struct_t         BMS_VoltEstimat;
 OBC_SetCustomPara_Struct_t OBC_SetCustomPara;
 OBC_ButtonStatus_Struct_t  OBC_ButtonStatus = {0, 0, 0};
 ULONG                      ulOBC_ComTimeOutCount = 0;
+ULONG                      ulBMS_ComTimeOutCount = 0;
 UBYTE                    MC_MotorSPD_rpm_Percent = 0;
 UBYTE                    MC_WorkMode;
 UBYTE                    MC_BC_COM = 1;
@@ -534,7 +535,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)
@@ -562,22 +563,24 @@ void Can_voMC_Run_200ms(void)
 
     MC_RunInfo.BikeSpeed = cp_stBikeRunInfoPara.BikeSpeedKmH;                ///>车速 0.1km/h,地址偏移0
     MC_RunInfo.MotorSpeed = (SWORD)((SLONG)scm_uwSpdFbkLpfAbsPu * (SLONG)cof_uwVbRpm >> 15); ///>输出转速 1rpm,地址偏移2
-    if (scm_swMotorPwrInLpfWt > 5000)
-    {
-        scm_swMotorPwrInLpfWt = 5000;
-    }
-    if (scm_swMotorPwrInLpfWt < 0)
-    {
-        scm_swMotorPwrInLpfWt = 0;
-    }
-    if (sysctrl_stPwmState.blPwmOnflg == FALSE)
-    {
-        scm_swMotorPwrInLpfWt = 0;
-    }
-    else
-    {
-    }
-    MC_RunInfo.Power = scm_swMotorPwrInLpfWt / 10;                                                                    ///>电功率 1W,地址偏移4
+//    TempPower = scm_swMotorPwrInLpfWt;
+//    if (TempPower > 5000)
+//    {
+//        TempPower = 5000;
+//    }
+//    if (TempPower < 0)
+//    {
+//        TempPower = 0;
+//    }
+//    if (sysctrl_stPwmState.blPwmOnflg == FALSE)
+//    {
+//        TempPower = 0;
+//    }
+//    else
+//    {
+//    }
+//    MC_RunInfo.Power = TempPower / 10;                                                                    ///>电功率 1W,地址偏移4
+    MC_RunInfo.Power = (scm_swIqFdbLpfPu * 250 * cof_uwIbAp / 1500) >> 14;                                      //MaxIq = 15A,MaxPower=250W
     MC_RunInfo.BusVoltage = (UWORD)((((ULONG)adc_stUpOut.uwVdcLpfPu + (ULONG)BMS_VoltEstimat.uwVdcCompPu) * cof_uwUbVt * 100) >> 14); ///>母线电压 1mV,地址偏移6
     //MC_RunInfo.BusCurrent = (UWORD)((ULONG)BMS_VoltEstimat.swIdcPu * cof_uwIbAp * 100 >> 14);                                  ///>母线电流 1mA,地址偏移8
     MC_RunInfo.BusCurrent = (scm_swIqFdbLpfPu * cof_uwIbAp * 10) >> 14;
@@ -592,8 +595,17 @@ void Can_voMC_Run_200ms(void)
 
     if (cp_stBikeRunInfoPara.blGearStUpdate)
     {
-        MC_RunInfo.PowerPerKm =
-        		(UBYTE)(*(&cp_stHistoryPara.uwG1AvgPwrConsumption + (cp_stBikeRunInfoPara.uwBikeGear - 1)) / 10); ///>平均功耗 0.01Ah/km ,地址偏移20 /* parasoft-suppress MISRA2004-17_4 "本项目无法更改,后续避免非数组索引指针运算" */
+        if((cp_stBikeRunInfoPara.uwBikeGear > 0) && (cp_stBikeRunInfoPara.uwBikeGear <= 5))
+        {
+            MC_RunInfo.PowerPerKm =
+                *(&cp_stHistoryPara.uwG1AvgPwrConsumption + (cp_stBikeRunInfoPara.uwBikeGear - 1)) / 10; ///>楠炲啿娼庨崝鐔烩偓?0.01Ah/km 閿涘苯婀撮崸鈧�崑蹇曅�20
+            MC_RunInfo.RemainDistance = BMS_RunInfo.RC / MC_RunInfo.PowerPerKm / 10;
+        }
+        else
+        {
+          MC_RunInfo.PowerPerKm = 0;         
+          MC_RunInfo.RemainDistance = 0xffff;                           //invalid value
+        }
         cp_stBikeRunInfoPara.BMSRestChargeLast = BMS_RunInfo.RC;
         cp_stBikeRunInfoPara.uwPowerPerKm = 0;
         cp_stBikeRunInfoPara.uwAvePowerPerKm = 0;
@@ -659,61 +671,64 @@ void Can_RemainTrip_Cal(void)
             cp_stBikeRunInfoPara.uwAvePowerCNT = 0;
         }
 
-        if (cp_stBikeRunInfoPara.uwBikeGear == 1)
-        {
-            uwCruisCoef = (UWORD)(((ULONG)cp_stBikeRunInfoPara.uwAvePowerPerKm << 12) / cp_stHistoryPara.uwG1AvgPwrConsumption);
-            cp_stHistoryPara.uwG1AvgPwrConsumption = (UWORD)((ULONG)cp_stHistoryPara.uwG1AvgPwrConsumption * uwCruisCoef >> 12);
-            cp_stHistoryPara.uwG2AvgPwrConsumption = (UWORD)((ULONG)cp_stHistoryPara.uwG2AvgPwrConsumption * uwCruisCoef >> 12);
-            cp_stHistoryPara.uwG3AvgPwrConsumption = (UWORD)((ULONG)cp_stHistoryPara.uwG3AvgPwrConsumption * uwCruisCoef >> 12);
-            cp_stHistoryPara.uwG4AvgPwrConsumption = (UWORD)((ULONG)cp_stHistoryPara.uwG4AvgPwrConsumption * uwCruisCoef >> 12);
-            cp_stHistoryPara.uwG5AvgPwrConsumption = (UWORD)((ULONG)cp_stHistoryPara.uwG5AvgPwrConsumption * uwCruisCoef >> 12);
-            MC_RunInfo.PowerPerKm = (UBYTE)(cp_stHistoryPara.uwG1AvgPwrConsumption / 10);
-        }
-        else if (cp_stBikeRunInfoPara.uwBikeGear == 2)
-        {
-            uwCruisCoef = (UWORD)(((ULONG)cp_stBikeRunInfoPara.uwAvePowerPerKm << 12) / cp_stHistoryPara.uwG2AvgPwrConsumption);
-            cp_stHistoryPara.uwG1AvgPwrConsumption = (UWORD)((ULONG)cp_stHistoryPara.uwG1AvgPwrConsumption * uwCruisCoef >> 12);
-            cp_stHistoryPara.uwG2AvgPwrConsumption = (UWORD)((ULONG)cp_stHistoryPara.uwG2AvgPwrConsumption * uwCruisCoef >> 12);
-            cp_stHistoryPara.uwG3AvgPwrConsumption = (UWORD)((ULONG)cp_stHistoryPara.uwG3AvgPwrConsumption * uwCruisCoef >> 12);
-            cp_stHistoryPara.uwG4AvgPwrConsumption = (UWORD)((ULONG)cp_stHistoryPara.uwG4AvgPwrConsumption * uwCruisCoef >> 12);
-            cp_stHistoryPara.uwG5AvgPwrConsumption = (UWORD)((ULONG)cp_stHistoryPara.uwG5AvgPwrConsumption * uwCruisCoef >> 12);
-            MC_RunInfo.PowerPerKm = (UBYTE)(cp_stHistoryPara.uwG2AvgPwrConsumption / 10);
-        }
-        else if (cp_stBikeRunInfoPara.uwBikeGear == 3)
-        {
-            uwCruisCoef = (UWORD)(((ULONG)cp_stBikeRunInfoPara.uwAvePowerPerKm << 12) / cp_stHistoryPara.uwG3AvgPwrConsumption);
-            cp_stHistoryPara.uwG1AvgPwrConsumption = (UWORD)((ULONG)cp_stHistoryPara.uwG1AvgPwrConsumption * uwCruisCoef >> 12);
-            cp_stHistoryPara.uwG2AvgPwrConsumption = (UWORD)((ULONG)cp_stHistoryPara.uwG2AvgPwrConsumption * uwCruisCoef >> 12);
-            cp_stHistoryPara.uwG3AvgPwrConsumption = (UWORD)((ULONG)cp_stHistoryPara.uwG3AvgPwrConsumption * uwCruisCoef >> 12);
-            cp_stHistoryPara.uwG4AvgPwrConsumption = (UWORD)((ULONG)cp_stHistoryPara.uwG4AvgPwrConsumption * uwCruisCoef >> 12);
-            cp_stHistoryPara.uwG5AvgPwrConsumption = (UWORD)((ULONG)cp_stHistoryPara.uwG5AvgPwrConsumption * uwCruisCoef >> 12);
-            MC_RunInfo.PowerPerKm = (UBYTE)(cp_stHistoryPara.uwG3AvgPwrConsumption / 10);
-        }
-        else if (cp_stBikeRunInfoPara.uwBikeGear == 4)
-        {
-            uwCruisCoef = (UWORD)(((ULONG)cp_stBikeRunInfoPara.uwAvePowerPerKm << 12) / cp_stHistoryPara.uwG4AvgPwrConsumption);
-            cp_stHistoryPara.uwG1AvgPwrConsumption = (UWORD)((ULONG)cp_stHistoryPara.uwG1AvgPwrConsumption * uwCruisCoef >> 12);
-            cp_stHistoryPara.uwG2AvgPwrConsumption = (UWORD)((ULONG)cp_stHistoryPara.uwG2AvgPwrConsumption * uwCruisCoef >> 12);
-            cp_stHistoryPara.uwG3AvgPwrConsumption = (UWORD)((ULONG)cp_stHistoryPara.uwG3AvgPwrConsumption * uwCruisCoef >> 12);
-            cp_stHistoryPara.uwG4AvgPwrConsumption = (UWORD)((ULONG)cp_stHistoryPara.uwG4AvgPwrConsumption * uwCruisCoef >> 12);
-            cp_stHistoryPara.uwG5AvgPwrConsumption = (UWORD)((ULONG)cp_stHistoryPara.uwG5AvgPwrConsumption * uwCruisCoef >> 12);
-            MC_RunInfo.PowerPerKm = (UBYTE)(cp_stHistoryPara.uwG4AvgPwrConsumption / 10);
-        }
-        else if (cp_stBikeRunInfoPara.uwBikeGear == 5)
+        if(cp_stBikeRunInfoPara.uwAvePowerPerKm > 0)
         {
-            uwCruisCoef = (UWORD)(((ULONG)cp_stBikeRunInfoPara.uwAvePowerPerKm << 12) / cp_stHistoryPara.uwG5AvgPwrConsumption);
-            cp_stHistoryPara.uwG1AvgPwrConsumption = (UWORD)((ULONG)cp_stHistoryPara.uwG1AvgPwrConsumption * uwCruisCoef >> 12);
-            cp_stHistoryPara.uwG2AvgPwrConsumption = (UWORD)((ULONG)cp_stHistoryPara.uwG2AvgPwrConsumption * uwCruisCoef >> 12);
-            cp_stHistoryPara.uwG3AvgPwrConsumption = (UWORD)((ULONG)cp_stHistoryPara.uwG3AvgPwrConsumption * uwCruisCoef >> 12);
-            cp_stHistoryPara.uwG4AvgPwrConsumption = (UWORD)((ULONG)cp_stHistoryPara.uwG4AvgPwrConsumption * uwCruisCoef >> 12);
-            cp_stHistoryPara.uwG5AvgPwrConsumption = (UWORD)((ULONG)cp_stHistoryPara.uwG5AvgPwrConsumption * uwCruisCoef >> 12);
-            MC_RunInfo.PowerPerKm = (UBYTE)(cp_stHistoryPara.uwG5AvgPwrConsumption / 10);
-        }
-        else
-        {
-            uwCruisCoef = 4096;
+            if (cp_stBikeRunInfoPara.uwBikeGear == 1)
+            {
+                uwCruisCoef = (UWORD)(((ULONG)cp_stBikeRunInfoPara.uwAvePowerPerKm << 12) / cp_stHistoryPara.uwG1AvgPwrConsumption);
+                cp_stHistoryPara.uwG1AvgPwrConsumption = (UWORD)((ULONG)cp_stHistoryPara.uwG1AvgPwrConsumption * uwCruisCoef >> 12);
+                cp_stHistoryPara.uwG2AvgPwrConsumption = (UWORD)((ULONG)cp_stHistoryPara.uwG2AvgPwrConsumption * uwCruisCoef >> 12);
+                cp_stHistoryPara.uwG3AvgPwrConsumption = (UWORD)((ULONG)cp_stHistoryPara.uwG3AvgPwrConsumption * uwCruisCoef >> 12);
+                cp_stHistoryPara.uwG4AvgPwrConsumption = (UWORD)((ULONG)cp_stHistoryPara.uwG4AvgPwrConsumption * uwCruisCoef >> 12);
+                cp_stHistoryPara.uwG5AvgPwrConsumption = (UWORD)((ULONG)cp_stHistoryPara.uwG5AvgPwrConsumption * uwCruisCoef >> 12);
+                MC_RunInfo.PowerPerKm = (UBYTE)(cp_stHistoryPara.uwG1AvgPwrConsumption / 10);
+            }
+            else if (cp_stBikeRunInfoPara.uwBikeGear == 2)
+            {
+                uwCruisCoef = (UWORD)(((ULONG)cp_stBikeRunInfoPara.uwAvePowerPerKm << 12) / cp_stHistoryPara.uwG2AvgPwrConsumption);
+                cp_stHistoryPara.uwG1AvgPwrConsumption = (UWORD)((ULONG)cp_stHistoryPara.uwG1AvgPwrConsumption * uwCruisCoef >> 12);
+                cp_stHistoryPara.uwG2AvgPwrConsumption = (UWORD)((ULONG)cp_stHistoryPara.uwG2AvgPwrConsumption * uwCruisCoef >> 12);
+                cp_stHistoryPara.uwG3AvgPwrConsumption = (UWORD)((ULONG)cp_stHistoryPara.uwG3AvgPwrConsumption * uwCruisCoef >> 12);
+                cp_stHistoryPara.uwG4AvgPwrConsumption = (UWORD)((ULONG)cp_stHistoryPara.uwG4AvgPwrConsumption * uwCruisCoef >> 12);
+                cp_stHistoryPara.uwG5AvgPwrConsumption = (UWORD)((ULONG)cp_stHistoryPara.uwG5AvgPwrConsumption * uwCruisCoef >> 12);
+                MC_RunInfo.PowerPerKm = (UBYTE)(cp_stHistoryPara.uwG2AvgPwrConsumption / 10);
+            }
+            else if (cp_stBikeRunInfoPara.uwBikeGear == 3)
+            {
+                uwCruisCoef = (UWORD)(((ULONG)cp_stBikeRunInfoPara.uwAvePowerPerKm << 12) / cp_stHistoryPara.uwG3AvgPwrConsumption);
+                cp_stHistoryPara.uwG1AvgPwrConsumption = (UWORD)((ULONG)cp_stHistoryPara.uwG1AvgPwrConsumption * uwCruisCoef >> 12);
+                cp_stHistoryPara.uwG2AvgPwrConsumption = (UWORD)((ULONG)cp_stHistoryPara.uwG2AvgPwrConsumption * uwCruisCoef >> 12);
+                cp_stHistoryPara.uwG3AvgPwrConsumption = (UWORD)((ULONG)cp_stHistoryPara.uwG3AvgPwrConsumption * uwCruisCoef >> 12);
+                cp_stHistoryPara.uwG4AvgPwrConsumption = (UWORD)((ULONG)cp_stHistoryPara.uwG4AvgPwrConsumption * uwCruisCoef >> 12);
+                cp_stHistoryPara.uwG5AvgPwrConsumption = (UWORD)((ULONG)cp_stHistoryPara.uwG5AvgPwrConsumption * uwCruisCoef >> 12);
+                MC_RunInfo.PowerPerKm = (UBYTE)(cp_stHistoryPara.uwG3AvgPwrConsumption / 10);
+            }
+            else if (cp_stBikeRunInfoPara.uwBikeGear == 4)
+            {
+                uwCruisCoef = (UWORD)(((ULONG)cp_stBikeRunInfoPara.uwAvePowerPerKm << 12) / cp_stHistoryPara.uwG4AvgPwrConsumption);
+                cp_stHistoryPara.uwG1AvgPwrConsumption = (UWORD)((ULONG)cp_stHistoryPara.uwG1AvgPwrConsumption * uwCruisCoef >> 12);
+                cp_stHistoryPara.uwG2AvgPwrConsumption = (UWORD)((ULONG)cp_stHistoryPara.uwG2AvgPwrConsumption * uwCruisCoef >> 12);
+                cp_stHistoryPara.uwG3AvgPwrConsumption = (UWORD)((ULONG)cp_stHistoryPara.uwG3AvgPwrConsumption * uwCruisCoef >> 12);
+                cp_stHistoryPara.uwG4AvgPwrConsumption = (UWORD)((ULONG)cp_stHistoryPara.uwG4AvgPwrConsumption * uwCruisCoef >> 12);
+                cp_stHistoryPara.uwG5AvgPwrConsumption = (UWORD)((ULONG)cp_stHistoryPara.uwG5AvgPwrConsumption * uwCruisCoef >> 12);
+                MC_RunInfo.PowerPerKm = (UBYTE)(cp_stHistoryPara.uwG4AvgPwrConsumption / 10);
+            }
+            else if (cp_stBikeRunInfoPara.uwBikeGear == 5)
+            {
+                uwCruisCoef = (UWORD)(((ULONG)cp_stBikeRunInfoPara.uwAvePowerPerKm << 12) / cp_stHistoryPara.uwG5AvgPwrConsumption);
+                cp_stHistoryPara.uwG1AvgPwrConsumption = (UWORD)((ULONG)cp_stHistoryPara.uwG1AvgPwrConsumption * uwCruisCoef >> 12);
+                cp_stHistoryPara.uwG2AvgPwrConsumption = (UWORD)((ULONG)cp_stHistoryPara.uwG2AvgPwrConsumption * uwCruisCoef >> 12);
+                cp_stHistoryPara.uwG3AvgPwrConsumption = (UWORD)((ULONG)cp_stHistoryPara.uwG3AvgPwrConsumption * uwCruisCoef >> 12);
+                cp_stHistoryPara.uwG4AvgPwrConsumption = (UWORD)((ULONG)cp_stHistoryPara.uwG4AvgPwrConsumption * uwCruisCoef >> 12);
+                cp_stHistoryPara.uwG5AvgPwrConsumption = (UWORD)((ULONG)cp_stHistoryPara.uwG5AvgPwrConsumption * uwCruisCoef >> 12);
+                MC_RunInfo.PowerPerKm = (UBYTE)(cp_stHistoryPara.uwG5AvgPwrConsumption / 10);
+            }
+            else
+            {
+                uwCruisCoef = 4096;
+            }
+            MC_RunInfo.RemainDistance = BMS_RunInfo.RC / MC_RunInfo.PowerPerKm / 10;
         }
-        MC_RunInfo.RemainDistance = BMS_RunInfo.RC / MC_RunInfo.PowerPerKm;
     }
 }
 
@@ -727,6 +742,7 @@ static SLONG slBMSMinVol = 41600;
 static SWORD SOC_Cnt, SOC_Value, SOC_MIN;
 static ULONG Voltage_Sum;
 static BOOL  blSOCfirstSet = FALSE;
+static BOOL  blSOCSWitch = FALSE;
 UWORD        Can_SOC_Cal(void)
 {
     UWORD templenght, VoltageAvg = 0;
@@ -736,21 +752,18 @@ UWORD        Can_SOC_Cal(void)
         return (UWORD)0;
     }
     //开机初始化一次电量
-    if (blSOCfirstSet == FALSE)
+    if((cp_ulSystickCnt - ulBMS_ComTimeOutCount) > 3000)
     {
-        if (MC_RunInfo.BusVoltage >= slBMSMaxVol)
-        {
-            SOC_Value = 100;
-        }
-        else if (MC_RunInfo.BusVoltage <= slBMSMinVol)
-        {
-            SOC_Value = 0;
-        }
-        else
-        {
-            SOC_Value = (SWORD)(((SLONG)MC_RunInfo.BusVoltage - slBMSMinVol) * 100 / (slBMSMaxVol - slBMSMinVol));
-        }
-        SOC_MIN = SOC_Value;
+      blSOCSWitch = TRUE;       // communication abnormal
+    }
+    
+    if(blSOCSWitch == FALSE)
+    {
+      SOC_Value = BMS_RunInfo.SOC;                      
+    }
+    else if (blSOCfirstSet == FALSE)
+    {
+        SOC_MIN = BMS_RunInfo.SOC;
         blSOCfirstSet = TRUE;
     }
     //1min更新一次电量
@@ -781,20 +794,21 @@ UWORD        Can_SOC_Cal(void)
             SOC_Cnt = 0;
             Voltage_Sum = 0;
         }
+        
+        if (SOC_Value > SOC_MIN)
+        {
+            SOC_Value = SOC_MIN;
+        }
+        else if (SOC_Value < 0)
+        {
+            SOC_Value = 0;
+        }
+        else
+        {
+            // do nothing
+        }
     }
-    //电量仅递减
-    if (SOC_Value > SOC_MIN)
-    {
-        SOC_Value = SOC_MIN;
-    }
-    else if (SOC_Value < 0)
-    {
-        SOC_Value = 0;
-    }
-    else
-    {
-        // do nothing
-    }
+    
     return (UWORD)SOC_Value;
 }
 
@@ -806,6 +820,9 @@ void Can_GearSt_switch(void)
     {
         ulOBC_ComTimeOutCount = cp_ulSystickCnt;
     }
+#ifdef RUN_ARCH_SIM 
+    ulOBC_ComTimeOutCount = cp_ulSystickCnt;
+#endif
     if ((cp_ulSystickCnt - ulOBC_ComTimeOutCount) < 3000) // 控制器与仪表通信中断超过3s,关闭助力
     {
         if (MC_ControlCode.GearSt <= 0x05)

+ 29 - 3
User project/3.BasicFunction/Source/i2c_master.c

@@ -189,16 +189,17 @@ void i2c_voParaWriteBuffer(void)
  Subroutine Call:
  Reference:
 *************************************************************************/
-void i2c_voHistoryWriteBuffer(void)
+void i2c_voHistoryDefaultWriteBuffer(void)
 {
+    /* History default value write*/ 
     UWORD *I2C_pBuffer;
     UBYTE  i;
 
     I2C_pBuffer = &Syspara2.stHistoryPara.uwAssModSelect.uwDefault1;
     for (i = 0; i < I2C_HISTORY_PARA_N_WORDS; i++)
     {
-        I2C_ubHistoyWriteBuffer[I2C_HISTORY_PARA_ARDDR + 2 * i] = (UBYTE)(*(I2C_pBuffer + 1) >> 8); /* parasoft-suppress MISRA2004-17_1 "本项目无法更改,后续避免未指向数组的指针运算" */ /* parasoft-suppress MISRA2004-17_4 "本项目无法更改,后续避免非数组索引指针运算" */
-        I2C_ubHistoyWriteBuffer[I2C_HISTORY_PARA_ARDDR + 2 * i + 1] = (UBYTE)(*(I2C_pBuffer + 1)); /* parasoft-suppress MISRA2004-17_1 "本项目无法更改,后续避免未指向数组的指针运算" */ /* parasoft-suppress MISRA2004-17_4 "本项目无法更改,后续避免非数组索引指针运算" */
+        I2C_ubHistoyWriteBuffer[I2C_HISTORY_PARA_ARDDR + 2 * i] = (UBYTE)(*(I2C_pBuffer) >> 8); /* parasoft-suppress MISRA2004-17_1 "本项目无法更改,后续避免未指向数组的指针运算" */ /* parasoft-suppress MISRA2004-17_4 "本项目无法更改,后续避免非数组索引指针运算" */
+        I2C_ubHistoyWriteBuffer[I2C_HISTORY_PARA_ARDDR + 2 * i + 1] = (UBYTE)(*(I2C_pBuffer)); /* parasoft-suppress MISRA2004-17_1 "本项目无法更改,后续避免未指向数组的指针运算" */ /* parasoft-suppress MISRA2004-17_4 "本项目无法更改,后续避免非数组索引指针运算" */
         I2C_pBuffer += I2C_PBUFFER_NWORDS; /* parasoft-suppress MISRA2004-17_1 "本项目无法更改,后续避免未指向数组的指针运算" */ /* parasoft-suppress MISRA2004-17_4 "本项目无法更改,后续避免非数组索引指针运算" */
     }
 
@@ -206,7 +207,32 @@ void i2c_voHistoryWriteBuffer(void)
     I2C_ubHistoyWriteBuffer[I2C_HISTORY_PARA_CRC_ARDDR] = (UBYTE)(i2c_uwCRCCcitt(I2C_pHistoryWriteBuffer, I2C_HISTORY_PARA_N_BYTES) >> 8);
     I2C_ubHistoyWriteBuffer[I2C_HISTORY_PARA_CRC_ARDDR + 1] = (UBYTE)(i2c_uwCRCCcitt(I2C_pHistoryWriteBuffer, I2C_HISTORY_PARA_N_BYTES));
 }
+/*************************************************************************
+ Function:
+ Description:
+ Call by:
+ Input Variables:
+ Output/Return Variables:
+ Subroutine Call:
+ Reference:
+*************************************************************************/
+void i2c_voHistoryWriteBuffer(void)
+{
+    UWORD *I2C_pBuffer;
+    UBYTE  i;
+
+    I2C_pBuffer = &Syspara2.stHistoryPara.uwAssModSelect.uwDefault1;
+    for (i = 0; i < I2C_HISTORY_PARA_N_WORDS; i++)
+    {
+        I2C_ubHistoyWriteBuffer[I2C_HISTORY_PARA_ARDDR + 2 * i] = *(I2C_pBuffer + 1) >> 8;
+        I2C_ubHistoyWriteBuffer[I2C_HISTORY_PARA_ARDDR + 2 * i + 1] = *(I2C_pBuffer + 1);
+        I2C_pBuffer += I2C_PBUFFER_NWORDS;
+    }
 
+    I2C_pHistoryWriteBuffer = I2C_ubHistoyWriteBuffer;
+    I2C_ubHistoyWriteBuffer[I2C_HISTORY_PARA_CRC_ARDDR] = i2c_uwCRCCcitt(I2C_pHistoryWriteBuffer, I2C_HISTORY_PARA_N_BYTES) >> 8;
+    I2C_ubHistoyWriteBuffer[I2C_HISTORY_PARA_CRC_ARDDR + 1] = i2c_uwCRCCcitt(I2C_pHistoryWriteBuffer, I2C_HISTORY_PARA_N_BYTES);
+}
 /*************************************************************************
  Function:
  Description:

+ 445 - 0
User project/3.BasicFunction/Source/ntc_sensor.c

@@ -0,0 +1,445 @@
+/**
+ * @file ntc_sensor.c
+ * @author zhouxiong(wangzy49@midea.com)
+ * @brief 
+ * @version 0.1
+ * @date 2021-10-08
+ *
+ * @copyright Copyright (c) 2021
+ *
+ */
+
+/************************************************************************
+ Beginning of File, do not put anything above here except notes
+ Compiler Directives:
+*************************************************************************/
+#include "ntc_sensor.h"
+
+/******************************
+ *
+ *  Parameter
+ *
+ ******************************/
+
+//PCB温度传感器寄存器与温度对照表,-40~140摄氏度
+const UWORD NTC_Table_PCB[181] = 
+{
+  99,
+  107,
+  114,
+  123,
+  131,
+  140,
+  150,
+  160,
+  171,
+  183,
+  195,
+  208,
+  221,
+  235,
+  250,
+  265,
+  282,
+  299,
+  317,
+  335,
+  355,
+  375,
+  397,
+  419,
+  442,
+  466,
+  491,
+  517,
+  544,
+  571,
+  600,
+  630,
+  660,
+  692,
+  724,
+  758,
+  792,
+  828,
+  864,
+  901,
+  939,
+  977,
+  1017,
+  1057,
+  1098,
+  1140,
+  1182,
+  1225,
+  1269,
+  1313,
+  1357,
+  1402,
+  1447,
+  1493,
+  1539,
+  1585,
+  1631,
+  1678,
+  1724,
+  1771,
+  1817,
+  1864,
+  1910,
+  1956,
+  2002,
+  2048,
+  2093,
+  2138,
+  2182,
+  2227,
+  2270,
+  2314,
+  2356,
+  2398,
+  2440,
+  2481,
+  2521,
+  2561,
+  2600,
+  2639,
+  2676,
+  2713,
+  2749,
+  2785,
+  2820,
+  2854,
+  2887,
+  2920,
+  2952,
+  2983,
+  3014,
+  3043,
+  3072,
+  3101,
+  3128,
+  3155,
+  3181,
+  3207,
+  3232,
+  3256,
+  3280,
+  3303,
+  3325,
+  3347,
+  3368,
+  3388,
+  3408,
+  3427,
+  3446,
+  3464,
+  3482,
+  3499,
+  3516,
+  3532,
+  3548,
+  3563,
+  3578,
+  3593,
+  3607,
+  3620,
+  3633,
+  3646,
+  3659,
+  3671,
+  3682,
+  3694,
+  3705,
+  3715,
+  3726,
+  3736,
+  3745,
+  3755,
+  3764,
+  3773,
+  3781,
+  3790,
+  3798,
+  3806,
+  3813,
+  3821,
+  3828,
+  3835,
+  3842,
+  3848,
+  3855,
+  3861,
+  3867,
+  3873,
+  3878,
+  3884,
+  3889,
+  3894,
+  3899,
+  3904,
+  3909,
+  3914,
+  3918,
+  3922,
+  3927,
+  3931,
+  3935,
+  3939,
+  3942,
+  3946,
+  3950,
+  3953,
+  3957,
+  3960,
+  3963,
+  3966,
+  3969,
+  3972,
+  3975,
+  3978,
+  3980,
+  3983,
+  3985,
+  3988,
+  3990,
+  3993,
+  3995
+};
+
+//力矩温度传感器寄存器与温度对照表,-40~140摄氏度
+const UWORD NTC_Table_Torque[181] = 
+{
+  3996,
+  3988,
+  3981,
+  3972,
+  3964,
+  3955,
+  3945,
+  3935,
+  3924,
+  3912,
+  3900,
+  3887,
+  3874,
+  3860,
+  3845,
+  3830,
+  3813,
+  3796,
+  3778,
+  3760,
+  3740,
+  3720,
+  3698,
+  3676,
+  3653,
+  3629,
+  3604,
+  3578,
+  3551,
+  3524,
+  3495,
+  3465,
+  3435,
+  3403,
+  3371,
+  3337,
+  3303,
+  3267,
+  3231,
+  3194,
+  3156,
+  3118,
+  3078,
+  3038,
+  2997,
+  2955,
+  2913,
+  2870,
+  2826,
+  2782,
+  2738,
+  2693,
+  2648,
+  2602,
+  2556,
+  2510,
+  2464,
+  2417,
+  2371,
+  2324,
+  2278,
+  2231,
+  2185,
+  2139,
+  2093,
+  2048,
+  2002,
+  1957,
+  1913,
+  1868,
+  1825,
+  1781,
+  1739,
+  1697,
+  1655,
+  1614,
+  1574,
+  1534,
+  1495,
+  1456,
+  1419,
+  1382,
+  1346,
+  1310,
+  1275,
+  1241,
+  1208,
+  1175,
+  1143,
+  1112,
+  1081,
+  1052,
+  1023,
+  994,
+  967,
+  940,
+  914,
+  888,
+  863,
+  839,
+  815,
+  792,
+  770,
+  748,
+  727,
+  707,
+  687,
+  668,
+  649,
+  631,
+  613,
+  596,
+  579,
+  563,
+  547,
+  532,
+  517,
+  502,
+  488,
+  475,
+  462,
+  449,
+  436,
+  424,
+  413,
+  401,
+  390,
+  380,
+  369,
+  359,
+  350,
+  340,
+  331,
+  322,
+  314,
+  305,
+  297,
+  289,
+  282,
+  274,
+  267,
+  260,
+  253,
+  247,
+  240,
+  234,
+  228,
+  222,
+  217,
+  211,
+  206,
+  201,
+  196,
+  191,
+  186,
+  181,
+  177,
+  173,
+  168,
+  164,
+  160,
+  156,
+  153,
+  149,
+  145,
+  142,
+  138,
+  135,
+  132,
+  129,
+  126,
+  123,
+  120,
+  117,
+  115,
+  112,
+  110,
+  107,
+  105,
+  102,
+  100
+};
+
+/***************************************************************
+ Function: Get PCB Temp
+ Description: 
+ Call by: 
+ Input Variables: N/A
+ Output/Return Variables: N/A
+ Subroutine Call: N/A;
+ Reference: N/A
+****************************************************************/
+SWORD GetPCBTemp(UWORD ADC_Result)
+{
+    UBYTE Count;
+	
+    for(Count=0; Count<181; Count++)
+    {
+        if(ADC_Result <= NTC_Table_PCB[Count])
+        {
+            return (SWORD)(Count - 40);
+        }
+    }
+    return -40;
+}
+
+/***************************************************************
+ Function: Get Torque Temp
+ Description: 
+ Call by: 
+ Input Variables: N/A
+ Output/Return Variables: N/A
+ Subroutine Call: N/A;
+ Reference: N/A
+****************************************************************/
+SWORD GetTorqueTemp(UWORD ADC_Result)
+{
+    UBYTE Count;
+	
+    for(Count=0; Count<181; Count++)
+    {
+        if(ADC_Result >= NTC_Table_Torque[Count])
+        {
+            return (SWORD)(Count - 40);
+        }
+    }
+    return -40;
+}
+
+/*************************************************************************
+ End of this File (EOF)!
+ Do not put anything after this part!
+*************************************************************************/

+ 11 - 3
User project/3.BasicFunction/Source/power.c

@@ -61,8 +61,16 @@ void power_voPowerInit(void)
  Subroutine Call: N/A;
  Reference: N/A
 ****************************************************************/
-void power_voPowerManagement(ULONG ulAutoPowerOffDelayTime, ULONG SysTickCnt, ULONG OBC_ButtonSetTimeCnt, UWORD uwTorqueIn, UWORD CadenceIn, UWORD BikeSpeed, BOOL EESaveFinishFlg, BOOL ParaSaveEEFlg) /* parasoft-suppress METRICS-28 "本项目圈复杂度无法更改,后续避免" */
+void power_voPowerManagement(UWORD uwPowerPara, ULONG SysTickCnt, ULONG OBC_ButtonSetTimeCnt, UWORD uwTorqueIn, UWORD CadenceIn, UWORD BikeSpeed, BOOL EESaveFinishFlg, BOOL ParaSaveEEFlg) /* parasoft-suppress METRICS-28 "本项目圈复杂度无法更改,后续避免" */
 {    
+    ULONG ulAutoPowerOffDelayTime;
+    ULONG ulPowerStartDelayTime;
+    ULONG ulPowerOFFDelayTime;
+    
+    ulPowerStartDelayTime =  (ULONG)(power_stPowStateCof.uwPowerStartTouchTimeCnt + ((uwPowerPara & 0xF000)>>12) * 200);//ms
+    ulPowerStartDelayTime =  (ULONG)(power_stPowStateCof.uwPowerShutTouchTimeCnt + ((uwPowerPara & 0x0F00)>>8) * 200);//ms
+    ulAutoPowerOffDelayTime = (ULONG)((uwPowerPara & 0x00FF) * 60);//s
+    
     switch(power_stPowStateOut.powerstate)
     {
         case POWER_START: // 电源键按下,超过1s进入POWER ON
@@ -70,7 +78,7 @@ void power_voPowerManagement(ULONG ulAutoPowerOffDelayTime, ULONG SysTickCnt, UL
             if(iGpio_Read(HW_GPIO_POWERSTATE_PIN) != 0)
             {
                 power_stPowStateOut.uwPowerStartupCnt++;
-                if (power_stPowStateOut.uwPowerStartupCnt == power_stPowStateCof.uwPowerStartTouchTimeCnt)
+                if (power_stPowStateOut.uwPowerStartupCnt == ulPowerStartDelayTime)
                 {
                     iGpio_Write(HW_GPIO_POWERLOCK_PIN,ApiGpio_HighLevel);
                     power_stPowStateOut.powerstate = POWER_ON;
@@ -101,7 +109,7 @@ void power_voPowerManagement(ULONG ulAutoPowerOffDelayTime, ULONG SysTickCnt, UL
             if (iGpio_Read(HW_GPIO_POWERSTATE_PIN) != 0)
             {
                 power_stPowStateOut.uwPowerShutdnCnt++;
-                if (power_stPowStateOut.uwPowerShutdnCnt >= power_stPowStateCof.uwPowerShutTouchTimeCnt)
+                if (power_stPowStateOut.uwPowerShutdnCnt >= ulPowerStartDelayTime)
                 {
                     power_stPowStateOut.powerstate = POWER_OFF;
                     power_stPowStateOut.blPowerStartupFlg = FALSE;

+ 23 - 21
User project/3.BasicFunction/Source/spi_master.c

@@ -335,9 +335,11 @@ void spi_voResolverLock(void)
 *************************************************************************/
 void spi_voReadWriteSeneorReg(void) /* parasoft-suppress METRICS-28 "本项目圈复杂度无法更改,后续避免" */
 {
+    UWORD BCTValue = 0x30;
+    
     UWORD uwReadBCTReg = 0, uwReadETXY = 0;
     UWORD uwWriteBCTReg = 0, uwWriteETXY = 0, uwWriteRD = 0;
-    UWORD SPI_DelayCnt1 = 0, SPI_DelayCnt2 = 0;
+    UWORD uwDelayCnt1 = 0, uwDelayCnt2 = 0;
 
     /* Read the BCT register value */
     iGpio_Write(HW_GPIO_SPICS_PIN,ApiGpio_LowLevel); /*!< CS signal enable,for data update */
@@ -382,7 +384,7 @@ void spi_voReadWriteSeneorReg(void) /* parasoft-suppress METRICS-28 "本项目
     while (spi_i2s_flag_get(SPI2, SPI_FLAG_RBNE) != SET)
     {}
     uwReadETXY = spi_i2s_data_receive(SPI2); /*!< Read the ETX ETY value */
-    if (uwReadBCTReg == 0x3000 && uwReadETXY == 0x0100)
+    if (uwReadBCTReg == (BCTValue << 8) && uwReadETXY == 0x0100)
     {
         spi_blReadRegCorrectFlg = TRUE;
     }
@@ -399,19 +401,19 @@ void spi_voReadWriteSeneorReg(void) /* parasoft-suppress METRICS-28 "本项目
         iGpio_Write(HW_GPIO_SPICS_PIN,ApiGpio_LowLevel);   // Data update
         while (spi_i2s_flag_get(SPI2, SPI_FLAG_TBE) != SET)// Discontinuous transmission, can not indicate send complete
         {}
-        spi_i2s_data_transmit(SPI2, 0x8230); // LSB,BCT=48
+        spi_i2s_data_transmit(SPI2, (0x8200 | BCTValue)); // LSB,BCT=48
         while (spi_i2s_flag_get(SPI2, SPI_FLAG_RBNE) != SET)
         {}
         uwWriteBCTReg = spi_i2s_data_receive(SPI2);       
         iGpio_Write(HW_GPIO_SPICS_PIN,ApiGpio_HighLevel);
         /* Delay at least 22ms */
-        while (SPI_DelayCnt2 < 20)
+        while (uwDelayCnt2 < 20)
         {
-            SPI_DelayCnt1++;
-            if (SPI_DelayCnt1 == 10000)
+            uwDelayCnt1++;
+            if (uwDelayCnt1 == 10000)
             {
-                SPI_DelayCnt2++;
-                SPI_DelayCnt1 = 0;
+                uwDelayCnt2++;
+                uwDelayCnt1 = 0;
             }
         }
         iGpio_Write(HW_GPIO_SPICS_PIN,ApiGpio_LowLevel);
@@ -432,14 +434,14 @@ void spi_voReadWriteSeneorReg(void) /* parasoft-suppress METRICS-28 "本项目
         uwWriteETXY = spi_i2s_data_receive(SPI2);
         iGpio_Write(HW_GPIO_SPICS_PIN,ApiGpio_HighLevel);
         /* Delay at least 22ms */
-        SPI_DelayCnt2 = 0;
-        while (SPI_DelayCnt2 < 20)
+        uwDelayCnt2 = 0;
+        while (uwDelayCnt2 < 20)
         {
-            SPI_DelayCnt1++;
-            if (SPI_DelayCnt1 == 10000)
+            uwDelayCnt1++;
+            if (uwDelayCnt1 == 10000)
             {
-                SPI_DelayCnt2++;
-                SPI_DelayCnt1 = 0;
+                uwDelayCnt2++;
+                uwDelayCnt1 = 0;
             }
         }
         iGpio_Write(HW_GPIO_SPICS_PIN,ApiGpio_LowLevel);
@@ -461,14 +463,14 @@ void spi_voReadWriteSeneorReg(void) /* parasoft-suppress METRICS-28 "本项目
         uwWriteRD = spi_i2s_data_receive(SPI2);
         iGpio_Write(HW_GPIO_SPICS_PIN,ApiGpio_HighLevel);
         /* Delay at least 22ms */
-        SPI_DelayCnt2 = 0;
-        while (SPI_DelayCnt2 < 20)
+        uwDelayCnt2 = 0;
+        while (uwDelayCnt2 < 20)
         {
-            SPI_DelayCnt1++;
-            if (SPI_DelayCnt1 == 10000)
+            uwDelayCnt1++;
+            if (uwDelayCnt1 == 10000)
             {
-                SPI_DelayCnt2++;
-                SPI_DelayCnt1 = 0;
+                uwDelayCnt2++;
+                uwDelayCnt1 = 0;
             }
         }
         iGpio_Write(HW_GPIO_SPICS_PIN,ApiGpio_LowLevel);
@@ -480,7 +482,7 @@ void spi_voReadWriteSeneorReg(void) /* parasoft-suppress METRICS-28 "本项目
         uwWriteRD = spi_i2s_data_receive(SPI2);
         iGpio_Write(HW_GPIO_SPICS_PIN,ApiGpio_HighLevel);
         
-        if (uwWriteBCTReg == 0x3000 && uwWriteETXY == 0x0100 && uwWriteRD == 0x8000) // MSB
+        if (uwWriteBCTReg == (BCTValue << 8) && uwWriteETXY == 0x0100 && uwWriteRD == 0x8000) // MSB
         {
             spi_blWriteRegFinishFlg = TRUE; // Need stored in EEPROM
         }

+ 12 - 0
User project/3.BasicFunction/Source/torquesensor.c

@@ -161,6 +161,18 @@ void torsensor_voTorSensorCof(void)
         torsensor_stTorSensorCof.uwTorqueOffsetConfirmFlg = TRUE;
     }
     
+#ifdef RUN_ARCH_SIM
+    torsensor_stTorSensorCof.uwTorqueOffset = 868;
+    torsensor_stTorSensorCof.uwBikeTorStep1ADC = 1427;
+    torsensor_stTorSensorCof.uwBikeTorStep1RealNm = 250;
+    torsensor_stTorSensorCof.uwBikeTorStep2ADC = 1985;
+    torsensor_stTorSensorCof.uwBikeTorStep2RealNm = 500;
+    torsensor_stTorSensorCof.uwBikeTorStep3ADC = 2544;
+    torsensor_stTorSensorCof.uwBikeTorStep3RealNm = 750;
+    torsensor_stTorSensorCof.uwBikeTorStep4ADC = 3103;
+    torsensor_stTorSensorCof.uwBikeTorStep4RealNm = 1000;
+#endif
+    
     torsensor_stTorSensorCof.uwSensorVolPerTorqDefault = TORQUE_VOLTAGE_PER_NM;
 
     torsensor_stTorSensorCof.ulTorqueReg2PuDefault = (ULONG)((((UQWORD)33 << 24) / 10) / (1 << ADC_RESOLUTION_BIT) / TORQUE_VOLTAGE_SEN2MCUGAIN * 100 * 1000 /

+ 11 - 11
User project/4.BasicHardwSoftwLayer/2.BasicSoftwLayer/Include/user.h

@@ -197,30 +197,30 @@ Update Time
 
 #if ((MOTOR_ID_SEL == MOTOR_WELLING_CITY_36V) || (MOTOR_ID_SEL == MOTOR_WELLING_MTB_36V))
 /* Over voltage */
-#define ALM_OVR_VLT_LVL1_VAL 550 // unit: 0.1V, Threshold value level1
+#define ALM_OVR_VLT_LVL1_VAL 450 // unit: 0.1V, Threshold value level1
 #define ALM_OVR_VLT_LVL1_TM  2   // unit: s, Time of duration level1(TBS)
-#define ALM_OVR_VLT_LVL2_VAL 560 // unit: 0.1V, Threshold value level2
+#define ALM_OVR_VLT_LVL2_VAL 460 // unit: 0.1V, Threshold value level2
 #define ALM_OVR_VLT_LVL2_TM  100 // unit: ms, Time of duration level2(TBS)
-#define ALM_OVR_VLT_LVL3_VAL 570 // unit: 0.1V, Threshold value level3
+#define ALM_OVR_VLT_LVL3_VAL 470 // unit: 0.1V, Threshold value level3
 #define ALM_OVR_VLT_LVL3_TM  5   // unit: ms, Time of duration level3(TBS)
 /* Under voltage */
-#define ALM_UNDR_VLT_LVL1_VAL 260 // unit: 0.1V, Threshold value level1
+#define ALM_UNDR_VLT_LVL1_VAL 300 // unit: 0.1V, Threshold value level1
 #define ALM_UNDR_VLT_LVL1_TM  2   // unit: s, Time of duration level1(TBS)
-#define ALM_UNDR_VLT_LVL2_VAL 240 // unit: 0.1V, Threshold value level2
+#define ALM_UNDR_VLT_LVL2_VAL 280 // unit: 0.1V, Threshold value level2
 #define ALM_UNDR_VLT_LVL2_TM  2   // unit: ms, Time of duration level2(TBS)
 
 #elif ((MOTOR_ID_SEL == MOTOR_WELLING_CITY_48V) || (MOTOR_ID_SEL == MOTOR_WELLING_MTB_48V))
 /* Over voltage */
-#define ALM_OVR_VLT_LVL1_VAL 598 // unit: 0.1V, Threshold value level1
+#define ALM_OVR_VLT_LVL1_VAL 585 // unit: 0.1V, Threshold value level1
 #define ALM_OVR_VLT_LVL1_TM  2   // unit: s, Time of duration level1(TBS)
-#define ALM_OVR_VLT_LVL2_VAL 611 // unit: 0.1V, Threshold value level2
+#define ALM_OVR_VLT_LVL2_VAL 598 // unit: 0.1V, Threshold value level2
 #define ALM_OVR_VLT_LVL2_TM  100 // unit: ms, Time of duration level2(TBS)
-#define ALM_OVR_VLT_LVL3_VAL 624 // unit: 0.1V, Threshold value level3
+#define ALM_OVR_VLT_LVL3_VAL 611 // unit: 0.1V, Threshold value level3
 #define ALM_OVR_VLT_LVL3_TM  5   // unit: ms, Time of duration level3(TBS)
 /* Under voltage */
-#define ALM_UNDR_VLT_LVL1_VAL 364 // unit: 0.1V, Threshold value level1
+#define ALM_UNDR_VLT_LVL1_VAL 390 // unit: 0.1V, Threshold value level1
 #define ALM_UNDR_VLT_LVL1_TM  2   // unit: s, Time of duration level1(TBS)
-#define ALM_UNDR_VLT_LVL2_VAL 338 // unit: 0.1V, Threshold value level2
+#define ALM_UNDR_VLT_LVL2_VAL 364 // unit: 0.1V, Threshold value level2
 #define ALM_UNDR_VLT_LVL2_TM  2   // unit: ms, Time of duration level2(TBS)
 
 #endif
@@ -248,7 +248,7 @@ Update Time
 #define ALM_STOP_IPM_OVER_CUR_TM 100 // unit: ms, Time of duration(TBC)
 
 /* Recover time of global */
-#define ALM_REC_ALL_TM 200 // unit: ms, Time of duration(TBC)
+#define ALM_REC_ALL_TM 5000 // unit: ms, Time of duration(TBC)
 /* Recover time of IPM OC */
 #define ALM_IPM_OC_REC_TM 200 // unit: ms, Time of duration(TBC)
 /* Recover time & value of over voltage */

+ 8 - 5
User project/4.BasicHardwSoftwLayer/2.BasicSoftwLayer/Source/CodePara.c

@@ -55,6 +55,9 @@ void CodeParaInit(void)
   
     cp_stFlg.RunPermitFlg = TRUE;
     cp_stFlg.ParaUseEEFlg = TRUE; //FALSE; //TRUE;
+#ifdef RUN_ARCH_SIM 
+    cp_stFlg.ParaUseEEFlg = FALSE; //FALSE, TRUE;
+#endif
     cp_stFlg.ParaUseEEFinishFlg = FALSE;
     cp_stFlg.ParaSaveEEFlg = FALSE;
     cp_stFlg.ParaSaveEEFinishFlg = FALSE;
@@ -279,11 +282,11 @@ void CodeHistoryParaDelete(void)
     cp_stHistoryPara.uwAlamUVolTimes = 0;
     cp_stHistoryPara.uwAlamComOTimeTimes = 0;
 
-    cp_stHistoryPara.uwG1AvgPwrConsumption = 0;
-    cp_stHistoryPara.uwG2AvgPwrConsumption = 0;
-    cp_stHistoryPara.uwG3AvgPwrConsumption = 0;
-    cp_stHistoryPara.uwG4AvgPwrConsumption = 0;
-    cp_stHistoryPara.uwG5AvgPwrConsumption = 0;
+    cp_stHistoryPara.uwG1AvgPwrConsumption = 100;
+    cp_stHistoryPara.uwG2AvgPwrConsumption = 160;
+    cp_stHistoryPara.uwG3AvgPwrConsumption = 190;
+    cp_stHistoryPara.uwG4AvgPwrConsumption = 270;
+    cp_stHistoryPara.uwG5AvgPwrConsumption = 180;
 
     cp_stHistoryPara.ulODOTrip = 0;
     cp_stHistoryPara.ulODOTime = 0;

+ 7 - 1
WLMCP_PACKED.ewp

@@ -690,7 +690,7 @@
             <name>BUILDACTION</name>
             <archiveVersion>1</archiveVersion>
             <data>
-                <prebuild></prebuild>
+                <prebuild>powershell $PROJ_DIR$\tools\gen_fingerprint.ps1</prebuild>
                 <postbuild></postbuild>
             </data>
         </settings>
@@ -2657,6 +2657,9 @@
                 <file>
                     <name>$PROJ_DIR$\User project\3.BasicFunction\Include\InputCapture.h</name>
                 </file>
+                <file>
+                    <name>$PROJ_DIR$\User project\3.BasicFunction\Include\ntc_sensor.h</name>
+                </file>
                 <file>
                     <name>$PROJ_DIR$\User project\3.BasicFunction\Include\power.h</name>
                 </file>
@@ -2714,6 +2717,9 @@
                 <file>
                     <name>$PROJ_DIR$\User project\3.BasicFunction\Source\InputCapture.c</name>
                 </file>
+                <file>
+                    <name>$PROJ_DIR$\User project\3.BasicFunction\Source\ntc_sensor.c</name>
+                </file>
                 <file>
                     <name>$PROJ_DIR$\User project\3.BasicFunction\Source\power.c</name>
                 </file>