Ye Jin 5 mesiacov pred
rodič
commit
004cd35797
24 zmenil súbory, kde vykonal 1054 pridanie a 163 odobranie
  1. 18 14
      User project/1.FrameLayer/Source/TimeTask_Event.c
  2. 134 6
      User project/1.FrameLayer/Source/main.c
  3. 1 1
      User project/2.MotorDrive/Include/spdctrmode.h
  4. 37 0
      User project/2.MotorDrive/Source/spdctrmode.c
  5. 23 2
      User project/3.BasicFunction/Include/AssistCurve.h
  6. 1 1
      User project/3.BasicFunction/Include/bikelight.h
  7. 1 0
      User project/3.BasicFunction/Include/bikespeed.h
  8. 0 1
      User project/3.BasicFunction/Include/bikethrottle.h
  9. 2 0
      User project/3.BasicFunction/Include/can.h
  10. 73 11
      User project/3.BasicFunction/Include/canAppl.h
  11. 261 14
      User project/3.BasicFunction/Include/i2c_master.h
  12. 66 17
      User project/3.BasicFunction/Source/AssistCurve.c
  13. 15 5
      User project/3.BasicFunction/Source/bikelight.c
  14. 43 6
      User project/3.BasicFunction/Source/bikespeed.c
  15. 57 56
      User project/3.BasicFunction/Source/bikethrottle.c
  16. 117 1
      User project/3.BasicFunction/Source/can.c
  17. 64 11
      User project/3.BasicFunction/Source/canAppl.c
  18. 3 3
      User project/3.BasicFunction/Source/giant_can.c
  19. 112 4
      User project/3.BasicFunction/Source/i2c_master.c
  20. 7 0
      User project/4.BasicHardwSoftwLayer/2.BasicSoftwLayer/Include/CodePara.h
  21. 7 4
      User project/4.BasicHardwSoftwLayer/2.BasicSoftwLayer/Include/user.h
  22. 6 0
      User project/4.BasicHardwSoftwLayer/2.BasicSoftwLayer/Source/CodePara.c
  23. 2 2
      User project/5.Api_rt/api_rt_i2c.c
  24. 4 4
      User project/5.Api_rt/api_rt_pwm.c

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

@@ -69,7 +69,7 @@ void  Event_1ms(void) /* parasoft-suppress METRICS-28 "本项目圈复杂度无
     
     /* Bike light control */
     Can_Light_switch();
-    bikelight_voBikeLightControl(cp_stBikeRunInfoPara.uwLightSwitch, BikeBrake_blGetstate(), ass_stParaCong.uwLightVoltage);
+    bikelight_voBikeLightControl(cp_stBikeRunInfoPara.uwLightSwitch, BikeBrake_blGetstate(), ass_stParaCong.uwLightVoltage, ass_stParaCong.uwRearLightCycle, ass_stParaCong.uwRearLightDuty);
 
     /* Power control */
     power_voPowerManagement(ass_stParaCong.uwAutoPowerOffTime, cp_ulSystickCnt, OBC_ButtonStatus.ulButtonSetTimeCnt, \
@@ -264,17 +264,20 @@ void  Event_1ms(void) /* parasoft-suppress METRICS-28 "本项目圈复杂度无
                 }
                 
                 //Limit max speed
-                if(cp_stBikeRunInfoPara.BikeSpeedKmH > ((ass_stParaCong.uwThrottleMaxSpdKmH + 2) * 10))
+                if(MC_WorkMode != 1)
                 {
-                    uart_slSpdRefRpm = 0;
-                }
-                else if(cp_stBikeRunInfoPara.BikeSpeedKmH > (ass_stParaCong.uwThrottleMaxSpdKmH * 10))
-                { 
-                    uart_slSpdRefRpm = uart_slSpdRefRpm - uart_slSpdRefRpm * (cp_stBikeRunInfoPara.BikeSpeedKmH - ass_stParaCong.uwThrottleMaxSpdKmH * 10)/20;
-                }
-                else
-                {
-                    //do nothing
+                    if(cp_stBikeRunInfoPara.BikeSpeedKmH > ((ass_stParaCong.uwCartSpdKmH + 2) * 10))
+                    {
+                        uart_slSpdRefRpm = 0;
+                    }
+                    else if(cp_stBikeRunInfoPara.BikeSpeedKmH > (ass_stParaCong.uwCartSpdKmH * 10))
+                    { 
+                        uart_slSpdRefRpm = uart_slSpdRefRpm - uart_slSpdRefRpm * (cp_stBikeRunInfoPara.BikeSpeedKmH - ass_stParaCong.uwCartSpdKmH * 10)/20;
+                    }
+                    else
+                    {
+                        //do nothing
+                    }
                 }
             }  
             else
@@ -401,7 +404,7 @@ void Event_100ms(void)
             }
             
             {
-                Event_pvt_uwBikeSpdRefTarget = (UWORD)((((ULONG)ass_stParaCong.uwAssistMaxSpdKmH - (ULONG)4) *(uwThrottlePercent - 200)/690 + 4) * bikespeed_stFreGetCof.uwBikespeedKmh2Pu); // Q20   
+                Event_pvt_uwBikeSpdRefTarget = (UWORD)((((ULONG)ass_stParaCong.uwThrottleMaxSpdKmH - (ULONG)4) *(uwThrottlePercent - 200)/690 + 4) * bikespeed_stFreGetCof.uwBikespeedKmh2Pu); // Q20   
             }
             
             /* Bike Speed Ref Ramp */
@@ -428,7 +431,8 @@ void Event_100ms(void)
             bikespeed_stPIIn.slSpdRefPu = Event_pvt_uwBikeSpdRef;
             bikespeed_stPIIn.slSpdFdkPu = bikespeed_stFreGetOut.uwLPFFrequencyPu; //bikespeed_stFreGetOut.uwFrequencyPu; 
             bikespeed_stPIIn.swIqMaxPu = swIqLowerPu; // ((SLONG)55 << 14)/60;
-            bikespeed_stPIIn.swIqMinPu = 0;           
+            bikespeed_stPIIn.swIqMinPu = 0;
+            bikespeed_voSetThrottleMaxSpd(cp_stBikeRunInfoPara.uwBikeGear);
             bikespeed_voPI(&bikespeed_stPIIn, &bikespeed_stPIOut);
             
             Event_pvt_swIqRefTarget = bikespeed_stPIOut.swIqRefPu;
@@ -467,7 +471,7 @@ void  Event_200ms(void)
     /* Upper Computer Info Update */
     Can_voMC_Run_200ms();
 #if(GIANT_ENABLE == 1)
-    if ((switch_flg.SysFault_Flag == TRUE) && (MC_BC_COM > 0))
+    if ((switch_flg.SysFault_Flag == TRUE) && (MC_WorkMode > 0))
     {
         SendData(ID_MC_BC, MODE_REPORT, 0x1104, (uint8_t *)&MC_ErrorCode.Code);
     }

+ 134 - 6
User project/1.FrameLayer/Source/main.c

@@ -187,8 +187,8 @@ void mn_voParaSet(void)
             {
                 ass_stParaCong.uwWheelPerimeter = I2C_uwBikeParaRead[0];
                 ass_stParaCong.uwMechRationMotor = I2C_uwBikeParaRead[1];
-                ass_stParaCong.uwAssistMaxSpdKmH = I2C_uwBikeParaRead[2];
-                ass_stParaCong.uwThrottleMaxSpdKmH = I2C_uwBikeParaRead[3];
+                ass_stParaCong.uwThrottleMaxSpdKmH = I2C_uwBikeParaRead[2];
+                ass_stParaCong.uwCartSpdKmH = I2C_uwBikeParaRead[3];
                 ass_stParaCong.uwNmFrontChainring = I2C_uwBikeParaRead[4];
                 ass_stParaCong.uwNmBackChainring = I2C_uwBikeParaRead[5];
                 ass_stParaCong.uwAssistSelect1 = I2C_uwBikeParaRead[6];
@@ -215,6 +215,11 @@ void mn_voParaSet(void)
                 cp_stControlPara.swAlmOverHeatCeVal = (SWORD)I2C_uwMControlRead[9];
                 cp_stControlPara.swAlmRecOHeatVal = (SWORD)I2C_uwMControlRead[10];
                 cp_stControlPara.swAlmPwrLimitStartTempVal = (SWORD)I2C_uwMControlRead[11];
+//                cp_stControlPara.swAlmMotorOverHeatCeVal = (SWORD)I2C_uwMControlRead[12];
+//                cp_stControlPara.swAlmMotorRecOHeatVal = (SWORD)I2C_uwMControlRead[13];
+//                cp_stControlPara.swAlmPwrLimitMotorStartTempVal = (SWORD)I2C_uwMControlRead[14];
+                cp_stControlPara.uwControlFunEN = I2C_uwMControlRead[15];
+                cp_stControlPara.uwThrottleGearEN = I2C_uwMControlRead[16];
                 
                 cp_stControlPara.swAlmRecOVVal = (SWORD)(cp_stControlPara.swAlmOverVolVal1 - ALM_VLT_REC_ERRVAL);//updata recover data
                 cp_stControlPara.swAlmRecUVVal = (SWORD)(cp_stControlPara.swAlmUnderVolVal1 + ALM_VLT_REC_ERRVAL);
@@ -252,8 +257,8 @@ void mn_voParaSet(void)
             {
                 ass_stParaSet.uwStartupCoef = I2C_uwAssistParaRead[0];
                 ass_stParaSet.uwStartupCruiseCoef = I2C_uwAssistParaRead[1];
-                ass_stParaSet.uwAssistStartNm = 70;//I2C_uwAssistParaRead[2];
-                ass_stParaSet.uwAssistStopNm = 30;//I2C_uwAssistParaRead[3];
+                ass_stParaSet.uwAssistStartNm = I2C_uwAssistParaRead[2];
+                ass_stParaSet.uwAssistStopNm = I2C_uwAssistParaRead[3];
                 ass_stParaSet.uwStartUpGainStep = I2C_uwAssistParaRead[4];
                 ass_stParaSet.uwStartUpCadNm = I2C_uwAssistParaRead[5];
                 ass_stParaSet.uwTorLPFCadNm = I2C_uwAssistParaRead[6];
@@ -266,6 +271,41 @@ void mn_voParaSet(void)
             }
             else
             {}
+            
+            if (i2c_stRXCRCOut.blRideParaFltFlg == FALSE)
+            {
+                for(int i=0;i<5;i++)
+                {
+                    ass_stCalCoef.ucAssistRatioGain[i] = (UBYTE)(I2C_uwRideParaRead[i]>>8);
+                    ass_stCalCoef.ucAssistAccelerationGain[i] = (UBYTE)(I2C_uwRideParaRead[i]);
+                    ass_stCalCoef.ucMaxCurrentGain[i] = (UBYTE)(I2C_uwRideParaRead[i+5]>>8);
+                    ass_stCalCoef.ucMaxTorqueGain[i] = (UBYTE)(I2C_uwRideParaRead[i+5]);
+                }
+            }
+            else
+            {
+            }
+            if(ass_stCalCoef.ucAssistRatioGain[0] == 0)
+            {
+                for(int i=0;i<5;i++)
+                {
+                    ass_stCalCoef.ucAssistRatioGain[i] = 100;
+                    ass_stCalCoef.ucAssistAccelerationGain[i] = 100;
+                    ass_stCalCoef.ucMaxCurrentGain[i] = 100;
+                    ass_stCalCoef.ucMaxTorqueGain[i] = 100;
+                }
+            }
+            
+            if (i2c_stRXCRCOut.blBikePara2FltFlg == FALSE)
+            {
+                ass_stParaCong.uwNoneOBCEnable = I2C_uwBikePara2Read[0];
+                ass_stParaCong.uwRearLightCycle = I2C_uwBikePara2Read[1];
+                ass_stParaCong.uwRearLightDuty = I2C_uwBikePara2Read[2];
+                ass_stParaCong.swDeltaBikeSpeedLimit = (SWORD) I2C_uwBikePara2Read[3];
+            }
+            else
+            {
+            }
         }
         cp_stFlg.ParaUseEEFinishFlg = TRUE;
     }
@@ -317,8 +357,8 @@ void mn_voParaUpdate(void)
     {
         ass_stParaCong.uwWheelPerimeter = MC_UpcInfo.stBikeInfo.uwWheelPerimeter;
         ass_stParaCong.uwMechRationMotor = MC_UpcInfo.stBikeInfo.uwMechRationMotor;
-        ass_stParaCong.uwAssistMaxSpdKmH = MC_UpcInfo.stBikeInfo.uwAssistMaxSpdKmH;
         ass_stParaCong.uwThrottleMaxSpdKmH = MC_UpcInfo.stBikeInfo.uwThrottleMaxSpdKmH;
+        ass_stParaCong.uwCartSpdKmH = MC_UpcInfo.stBikeInfo.uwCartSpdKmH;
         ass_stParaCong.uwNmFrontChainring = MC_UpcInfo.stBikeInfo.uwNmFrontChainring;
         ass_stParaCong.uwNmBackChainring = MC_UpcInfo.stBikeInfo.uwNmBackChainring;
         ass_stParaCong.uwAssistSelect1 = MC_UpcInfo.stBikeInfo.uwAssistSelect1;
@@ -347,6 +387,11 @@ void mn_voParaUpdate(void)
         cp_stControlPara.swAlmOverHeatCeVal = (SWORD)MC_UpcInfo.stMContorlInfo.uwAlamOverHeatCe;
         cp_stControlPara.swAlmRecOHeatVal = (SWORD)MC_UpcInfo.stMContorlInfo.uwAlamRecHeatCe;
         cp_stControlPara.swAlmPwrLimitStartTempVal = (SWORD)MC_UpcInfo.stMContorlInfo.uwPwrLimitStartCe;
+//        cp_stControlPara.swAlmMotorOverHeatCeVal = MC_UpcInfo.stMContorlInfo.uwAlamMotorOverHeatCe;
+//        cp_stControlPara.swAlmMotorRecOHeatVal = MC_UpcInfo.stMContorlInfo.uwAlamMotorRecHeatCe;
+//        cp_stControlPara.swAlmPwrLimitMotorStartTempVal = MC_UpcInfo.stMContorlInfo.uwPwrLimitMotorStartCe;
+        cp_stControlPara.uwControlFunEN = MC_UpcInfo.stMContorlInfo.uwControlFunEN;
+        cp_stControlPara.uwThrottleGearEN = MC_UpcInfo.stMContorlInfo.uwThrottleGearEN;
         
         cp_stControlPara.swAlmRecOVVal = (SWORD)(cp_stControlPara.swAlmOverVolVal1 - ALM_VLT_REC_ERRVAL);
         cp_stControlPara.swAlmRecUVVal = (SWORD)(cp_stControlPara.swAlmUnderVolVal1 + ALM_VLT_REC_ERRVAL);
@@ -426,6 +471,47 @@ void mn_voParaUpdate(void)
         cp_stFlg.ParaMotorDriveUpdateFinishFlg = TRUE;
         // cp_stFlg.TestParaInfoUpdateFlg = FALSE;
     }
+    
+    if (cp_stFlg.ParaRideInfoUpdateFlg == TRUE)
+    {
+        ass_stCalCoef.ucAssistRatioGain[0] = MC_UpcInfo.stRideParaInfo.ucAssistRatioGain1;
+        ass_stCalCoef.ucAssistRatioGain[1] = MC_UpcInfo.stRideParaInfo.ucAssistRatioGain2;
+        ass_stCalCoef.ucAssistRatioGain[2] = MC_UpcInfo.stRideParaInfo.ucAssistRatioGain3;
+        ass_stCalCoef.ucAssistRatioGain[3] = MC_UpcInfo.stRideParaInfo.ucAssistRatioGain4;
+        ass_stCalCoef.ucAssistRatioGain[4] = MC_UpcInfo.stRideParaInfo.ucAssistRatioGain5;
+        
+        ass_stCalCoef.ucAssistAccelerationGain[0] = MC_UpcInfo.stRideParaInfo.ucAssistAccelerationGain1;
+        ass_stCalCoef.ucAssistAccelerationGain[1] = MC_UpcInfo.stRideParaInfo.ucAssistAccelerationGain2;
+        ass_stCalCoef.ucAssistAccelerationGain[2] = MC_UpcInfo.stRideParaInfo.ucAssistAccelerationGain3;
+        ass_stCalCoef.ucAssistAccelerationGain[3] = MC_UpcInfo.stRideParaInfo.ucAssistAccelerationGain4;
+        ass_stCalCoef.ucAssistAccelerationGain[4] = MC_UpcInfo.stRideParaInfo.ucAssistAccelerationGain5;
+        
+        ass_stCalCoef.ucMaxCurrentGain[0] = MC_UpcInfo.stRideParaInfo.ucMaxCurrentGain1;
+        ass_stCalCoef.ucMaxCurrentGain[1] = MC_UpcInfo.stRideParaInfo.ucMaxCurrentGain2;
+        ass_stCalCoef.ucMaxCurrentGain[2] = MC_UpcInfo.stRideParaInfo.ucMaxCurrentGain3;
+        ass_stCalCoef.ucMaxCurrentGain[3] = MC_UpcInfo.stRideParaInfo.ucMaxCurrentGain4;
+        ass_stCalCoef.ucMaxCurrentGain[4] = MC_UpcInfo.stRideParaInfo.ucMaxCurrentGain5;
+        
+        ass_stCalCoef.ucMaxTorqueGain[0] = MC_UpcInfo.stRideParaInfo.ucMaxTorqueGain1;
+        ass_stCalCoef.ucMaxTorqueGain[1] = MC_UpcInfo.stRideParaInfo.ucMaxTorqueGain2;
+        ass_stCalCoef.ucMaxTorqueGain[2] = MC_UpcInfo.stRideParaInfo.ucMaxTorqueGain3;
+        ass_stCalCoef.ucMaxTorqueGain[3] = MC_UpcInfo.stRideParaInfo.ucMaxTorqueGain4;
+        ass_stCalCoef.ucMaxTorqueGain[4] = MC_UpcInfo.stRideParaInfo.ucMaxTorqueGain5;
+
+        cp_stFlg.ParaAssistUpdateFinishFlg = TRUE;
+        cp_stFlg.ParaRideInfoUpdateFlg = FALSE;
+    }
+    
+    if (cp_stFlg.ParaBikeInfo2UpdateFlg == TRUE)
+    {
+        ass_stParaCong.uwNoneOBCEnable = MC_UpcInfo.stBikeInfo2.uwNoneOBCEnable;
+        ass_stParaCong.uwRearLightCycle = MC_UpcInfo.stBikeInfo2.uwRearLightCycle;
+        ass_stParaCong.uwRearLightDuty = MC_UpcInfo.stBikeInfo2.uwRearLightDuty;
+        ass_stParaCong.swDeltaBikeSpeedLimit = MC_UpcInfo.stBikeInfo2.swDeltaBikeSpeedLimit;
+
+        cp_stFlg.ParaAssistUpdateFinishFlg = TRUE;
+        cp_stFlg.ParaBikeInfo2UpdateFlg = FALSE;
+    }
 }
 /***************************************************************
  Function: mn_voSoftwareInit;
@@ -459,8 +545,8 @@ void mn_voEEUperParaUpdate(void)
     {
         Syspara2.stBikePara.uwWheelPerimeter.uwReal = ass_stParaCong.uwWheelPerimeter;
         Syspara2.stBikePara.uwMechRationMotor.uwReal = ass_stParaCong.uwMechRationMotor;
-        Syspara2.stBikePara.uwAssistMaxSpdKmH.uwReal = ass_stParaCong.uwAssistMaxSpdKmH;
         Syspara2.stBikePara.uwThrottleMaxSpdKmH.uwReal = ass_stParaCong.uwThrottleMaxSpdKmH;
+        Syspara2.stBikePara.uwCartSpdKmH.uwReal = ass_stParaCong.uwCartSpdKmH;
         Syspara2.stBikePara.uwNmFrontChainring.uwReal = ass_stParaCong.uwNmFrontChainring;
         Syspara2.stBikePara.uwNmBackChainring.uwReal = ass_stParaCong.uwNmBackChainring;
         Syspara2.stBikePara.uwAssistSelect1.uwReal = ass_stParaCong.uwAssistSelect1;
@@ -485,6 +571,11 @@ void mn_voEEUperParaUpdate(void)
         Syspara2.stMControlPara.uwAlamOverHeatCe.uwReal = (UWORD)cp_stControlPara.swAlmOverHeatCeVal;
         Syspara2.stMControlPara.uwAlamRecHeatCe.uwReal = (UWORD)cp_stControlPara.swAlmRecOHeatVal;
         Syspara2.stMControlPara.uwPwrLimitStartCe.uwReal = (UWORD)cp_stControlPara.swAlmPwrLimitStartTempVal;
+//        Syspara2.stMControlPara.uwAlamMotorOverHeatCe.uwReal = (UWORD)cp_stControlPara.swAlmMotorOverHeatCeVal;
+//        Syspara2.stMControlPara.uwAlamMotorRecHeatCe.uwReal = (UWORD)cp_stControlPara.swAlmMotorRecOHeatVal;
+//        Syspara2.stMControlPara.uwPwrLimitMotorStartCe.uwReal = (UWORD)cp_stControlPara.swAlmPwrLimitMotorStartTempVal;
+        Syspara2.stMControlPara.uwControlFunEN.uwReal = cp_stControlPara.uwControlFunEN;
+        Syspara2.stMControlPara.uwThrottleGearEN.uwReal = cp_stControlPara.uwThrottleGearEN;
     }
     if (MC_UpcInfo.stSensorInfo.uwSaveFlg == TRUE)
     {
@@ -573,6 +664,43 @@ void mn_voEEHistoryParaUpdate(void)
     Syspara2.stHistoryPara.uwRealODOTripL.uwReal = (UWORD)cp_stHistoryPara.ulRealODOTrip;
     Syspara2.stHistoryPara.uwRealODOTimeH.uwReal = (UWORD)(cp_stHistoryPara.ulRealODOTime >> 16);
     Syspara2.stHistoryPara.uwRealODOTimeL.uwReal = (UWORD)cp_stHistoryPara.ulRealODOTime;
+    
+    if (MC_UpcInfo.stRideParaInfo.uwSaveFlg == TRUE)
+    {       
+        Syspara2.stRidePara.ucAssistRatioGain1.ucReal = ass_stCalCoef.ucAssistRatioGain[0];
+        Syspara2.stRidePara.ucAssistRatioGain2.ucReal = ass_stCalCoef.ucAssistRatioGain[1];
+        Syspara2.stRidePara.ucAssistRatioGain3.ucReal = ass_stCalCoef.ucAssistRatioGain[2];
+        Syspara2.stRidePara.ucAssistRatioGain4.ucReal = ass_stCalCoef.ucAssistRatioGain[3];
+        Syspara2.stRidePara.ucAssistRatioGain5.ucReal = ass_stCalCoef.ucAssistRatioGain[4];
+        
+        Syspara2.stRidePara.ucAssistAccelerationGain1.ucReal = ass_stCalCoef.ucAssistAccelerationGain[0];
+        Syspara2.stRidePara.ucAssistAccelerationGain2.ucReal = ass_stCalCoef.ucAssistAccelerationGain[1];
+        Syspara2.stRidePara.ucAssistAccelerationGain3.ucReal = ass_stCalCoef.ucAssistAccelerationGain[2];
+        Syspara2.stRidePara.ucAssistAccelerationGain4.ucReal = ass_stCalCoef.ucAssistAccelerationGain[3];
+        Syspara2.stRidePara.ucAssistAccelerationGain5.ucReal = ass_stCalCoef.ucAssistAccelerationGain[4];
+        
+        Syspara2.stRidePara.ucMaxCurrentGain1.ucReal = ass_stCalCoef.ucMaxCurrentGain[0];
+        Syspara2.stRidePara.ucMaxCurrentGain2.ucReal = ass_stCalCoef.ucMaxCurrentGain[1];
+        Syspara2.stRidePara.ucMaxCurrentGain3.ucReal = ass_stCalCoef.ucMaxCurrentGain[2];
+        Syspara2.stRidePara.ucMaxCurrentGain4.ucReal = ass_stCalCoef.ucMaxCurrentGain[3];
+        Syspara2.stRidePara.ucMaxCurrentGain5.ucReal = ass_stCalCoef.ucMaxCurrentGain[4];
+        
+        Syspara2.stRidePara.ucMaxTorqueGain1.ucReal = ass_stCalCoef.ucMaxTorqueGain[0];
+        Syspara2.stRidePara.ucMaxTorqueGain2.ucReal = ass_stCalCoef.ucMaxTorqueGain[1];
+        Syspara2.stRidePara.ucMaxTorqueGain3.ucReal = ass_stCalCoef.ucMaxTorqueGain[2];
+        Syspara2.stRidePara.ucMaxTorqueGain4.ucReal = ass_stCalCoef.ucMaxTorqueGain[3];
+        Syspara2.stRidePara.ucMaxTorqueGain5.ucReal = ass_stCalCoef.ucMaxTorqueGain[4];
+        
+    }
+    
+    //Syspara2.stBikePara2.swDeltaBikeSpeedLimit.swReal = (SWORD)ass_stParaCong.swDeltaBikeSpeedLimit;
+    if (MC_UpcInfo.stBikeInfo2.uwSaveFlg == TRUE)
+    {
+        Syspara2.stBikePara2.uwNoneOBCEnable.uwReal = (UWORD)ass_stParaCong.uwNoneOBCEnable;
+        Syspara2.stBikePara2.uwRearLightCycle.uwReal = (UWORD)ass_stParaCong.uwRearLightCycle;
+        Syspara2.stBikePara2.uwRearLightDuty.uwReal = (UWORD)ass_stParaCong.uwRearLightDuty;
+        Syspara2.stBikePara2.swDeltaBikeSpeedLimit.swReal = (SWORD)ass_stParaCong.swDeltaBikeSpeedLimit;
+    }
 }
 
 /***************************************************************

+ 1 - 1
User project/2.MotorDrive/Include/spdctrmode.h

@@ -62,7 +62,7 @@ _SPDCTRMODE_EXT void scm_voSpdCtrMdTbs(void);
 _SPDCTRMODE_EXT void scm_voSpdCtrMdUpTbc(void);
 _SPDCTRMODE_EXT void scm_voSpdCtrMdDownTbc(void);
 _SPDCTRMODE_EXT void scm_voTorqCtrMdTbs(void);
-
+_SPDCTRMODE_EXT void scm_voLimit_Power(UWORD uwBikeGear, UWORD *uwCurLim, UBYTE *ucCurrentGain);
 /************************************************************************
  Exported Variables
 *************************************************************************/

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

@@ -378,6 +378,43 @@ void scm_voSpdCtrMdCoef(void)
         scm_uwUdcpLimCof = (UWORD)((ULONG)cp_stControlPara.swPWMMaxDuty * cp_stControlPara.uwAcrUdcpOutLim / 1000); // Q15
     }
 }
+/***************************************************************
+ Function: scm_voLimit_Power;
+ Description: Limit motor power
+ Call by: tbs_voIsr();
+ Input Variables: uwCurLim-Q10    ucCurrentGain-%
+ Output/Return Variables: N/A
+ Subroutine Call: ...;
+ Reference: N/A
+****************************************************************/
+void scm_voLimit_Power(UWORD uwBikeGear, UWORD *uwCurLim, UBYTE *ucCurrentGain)
+{
+    if((uwBikeGear <= 5) && (uwBikeGear > 0))
+    {
+        pwr_stPwrLimCofIn.swPwrLimW = (SWORD)(((((SLONG)cp_stControlPara.swPwrLimitValWt * uwCurLim[uwBikeGear]) >> 10) * ucCurrentGain[uwBikeGear-1] * 10) >>10);
+    }
+    else if(uwBikeGear == 0x22)
+    {
+        pwr_stPwrLimCofIn.swPwrLimW = cp_stControlPara.swPwrLimitValWt>>1;
+    }
+    else
+    {
+        pwr_stPwrLimCofIn.swPwrLimW = cp_stControlPara.swPwrLimitValWt; // Q0, unit: 0.1w, Power limit value
+    }
+    if(pwr_stPwrLimCofIn.swPwrLimW > cp_stControlPara.swPwrLimitValWt)
+    {
+        pwr_stPwrLimCofIn.swPwrLimW = cp_stControlPara.swPwrLimitValWt;
+    }
+    pwr_stPwrLimCofIn.uwPwrErrW = cp_stControlPara.swPwrLimitErrWt; // Q0, unit: 0.1w, Start power limit when "VAL - ERR"
+    pwr_stPwrLimCofIn.swIqMaxAp = cp_stMotorPara.swIpeakMaxA;       // Q0, unit: 0.01A, Max phase current (peak value)
+    pwr_stPwrLimCofIn.uwIBaseAp = IBASE;                            // Q0,unit: 0.01A, Base Current
+    pwr_stPwrLimCofIn.uwUbVt = VBASE;                               // Q0,unit: 0.1V, Voltage base
+    pwr_stPwrLimCofIn.uwPwrLimPIKp = cp_stControlPara.swPwrLimitKpPu;
+    pwr_stPwrLimCofIn.uwPwrLimPIKi = cp_stControlPara.swPwrLimitKiPu;
+    pwr_stPwrLimCofIn.swPwrLimStartTempCe = cp_stControlPara.swAlmPwrLimitStartTempVal;
+    pwr_stPwrLimCofIn.swAlarmTempCe = cp_stControlPara.swAlmOverHeatCeVal;
+    pwr_voPwrLimCof(&pwr_stPwrLimCofIn, &pwr_stPwrLimCof);
+}
 /***************************************************************
  Function: scm_voSpdCtrMdTbs;
  Description: Speed control mode TBS scheduler

+ 23 - 2
User project/3.BasicFunction/Include/AssistCurve.h

@@ -52,6 +52,10 @@ extern "C" {
 #define BIKE_THROTTLE_SMOOTH_INCREASE 15     //*10
 #define BIKE_THROTTLE_SMOOTH_DECREASE 30     //*10
 #define BIKE_THROTTLE_SMOOTH           ((BIKE_THROTTLE_SMOOTH_INCREASE<<8)|(BIKE_THROTTLE_SMOOTH_DECREASE))
+#define BIKE_NONEOBCEBNABLE           0x00    //0xAA-支持,其他不支持
+#define BIKE_REARLIGHTCYCLE           8         //低亮尾灯周期
+#define BIKE_REARLIGHTDUTY            4         //低亮尾灯占空比
+#define BIKE_DELTASPEEDLIMITION       0         //只能是负数
 #define BIKE_ASSIST_MODE1              0x0155
 #define BIKE_ASSIST_MODE2              0x02AA
 #define TORQUE_START_THRESHOLD   70 // 0.1Nm
@@ -63,6 +67,10 @@ extern "C" {
 #define BIKE_SPD_MOTOR_CURRENT_MAX      5  /* 电流系数初始值 */
 #define BIKE_SPD_MOTOR_CONSTANT_COMMAND 4096  /* 速度波动补偿系数初始值 */
 
+#define CUR_LIM_DEFAULT                    \
+    {                                      \
+        1024, 512, 716, 870, 1024, 1024 \
+    } // 电流0-100% 1-50% 2-70% 3-85% 4-100% 5-100% Q10  
 #define ASS_LIM_DEFAULT                    \
     {                                      \
         {0, 716, 870, 1024, 1024, 1024}, 0 \
@@ -184,8 +192,8 @@ typedef struct
     // Bike info
     UWORD uwWheelPerimeter;     // Q0  0.1cm    
     UWORD uwMechRationMotor;
-    UWORD uwAssistMaxSpdKmH;
     UWORD uwThrottleMaxSpdKmH;
+    UWORD uwCartSpdKmH;
     UWORD uwNmFrontChainring;
     UWORD uwNmBackChainring;
     UWORD uwAssistSelect1;
@@ -195,6 +203,11 @@ typedef struct
     UWORD uwStartMode;
     UWORD uwAutoPowerOffTime;
     UWORD uwThrottleSmooth;
+    
+    UWORD uwNoneOBCEnable;
+    UWORD uwRearLightCycle;
+    UWORD uwRearLightDuty;
+    SWORD swDeltaBikeSpeedLimit;
 
     UWORD uwCadPulsePerCirc;
     UWORD uwBikeAssTorMaxPu;
@@ -262,9 +275,14 @@ typedef struct
 {
     POLY_COEF uwTorqueAssGain[GEAR_NUM];
     POLY_COEF uwCadencAsseGain[GEAR_NUM];
+    UBYTE  ucAssistRatioGain[5];
+    UBYTE  ucAssistAccelerationGain[5];
+    UBYTE  ucMaxCurrentGain[5];
+    UBYTE  ucMaxTorqueGain[5];
     UWORD     uwStartupGain;
     UWORD     uwStartupCruiseGain; // Q12     assist gain during startup cruise
     SWORD     swCoefStep;
+    UWORD     uwSpeedAssistIMaxA;
 
     UWORD uwAssThreshold;
     UWORD uwAssStopThreshold;
@@ -351,7 +369,9 @@ typedef struct
     UWORD uwBikeSpdThresHold2; // Q15 the end bike speed to limit iqref
     ULONG ulBikeSpdDeltInv;    // Q14
     UWORD uwBikeSpdIqLimitK;
-    UWORD uwMotorSpdThresHold;
+    UWORD uwMotorSpdThresHold1;// Q15 the start motor speed to limit iqref
+    UWORD uwMotorSpdThresHold2;// Q15 the start motor speed to limit iqref
+    ULONG ulMotorSpdDeltInv;    // Q14
 } ASS_CURLIM_COEF;
 
 typedef struct
@@ -433,6 +453,7 @@ extern MAF_IN ass_stTorqMafValue;
 extern SWORD  ass_swUqLimMafBuf[64];
 extern MAF_IN ass_stUqLimMafValue;
 extern LPF_OUT ass_pvt_stCurLpf;
+extern UWORD   ass_uwPwrCurLim[6];
 /************************************************************************
  Ram Allocation
 *************************************************************************/

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

@@ -229,7 +229,7 @@ void bikelight_voBikeLightInit(void); // interface function
 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,UWORD uwLightPara);
+void bikelight_voBikeLightControl(UWORD switchAction, BOOL Brate_Sta,UWORD uwLightPara,UWORD uwCycle,UWORD uwDuty);
 //void bikelight_voBikeLightControl(UWORD switchAction); // interface function
 /************************************************************************
  Flag Define (N/A)

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

@@ -171,6 +171,7 @@ extern BIKESPDLIMIT_COEF bikespeed_stSpdLimCoef;
  ***************************************/
 void bikespeed_voBikeSpeedInit(void); // interface function
 void bikespeed_voBikeSpeedCof(void);
+void bikespeed_voSetThrottleMaxSpd(UWORD uwBikeGear);
 void bikespeed_voBikeSpeedCal(UWORD source);
 void bikespeed_voGetBikeSpeedPwrError(UWORD BikeSpeedPwrVolPu);
 void bikespeed_votempTripCal(void);

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

@@ -31,7 +31,6 @@
 #define BIKETHROTTLE_ERROE_TIMEUNIT      5           // ms
 
 #define BIKETHROTTLE_STARTRUNSPEED       60//6km/h
-#define BIKETHROTTLE_RESETTRUNSPEEDPU    190//190-1km/h
 
 #define BIKETHROTTLE_OUT_DEFAULT    \
     {                               \

+ 2 - 0
User project/3.BasicFunction/Include/can.h

@@ -237,6 +237,7 @@ CAN_EXT void     CAN_RxData_Process(CAN_Buf_TypeDef *ptCANRx, UWORD TimeOutCnt);
 CAN_EXT void     CanRx_Process(void);
 CAN_EXT void     DataProcess(UWORD ID, UBYTE Mode, UWORD Cmd, UBYTE Data[]);
 CAN_EXT ULONG    CRC32_Calculate(const UBYTE pData[], UWORD Length);
+CAN_EXT void     LimtRidePara(void);
 #else
 CAN_EXT void     CAN_Rx_ISR(CAN_Buf_TypeDef *ptCANRx, UBYTE ucLength);
 CAN_EXT void     CAN_SendData(UWORD ID, const UBYTE Data[], UWORD Length);
@@ -248,6 +249,7 @@ CAN_EXT void     CAN_RxData_Process(CAN_Buf_TypeDef *ptCANRx, UWORD TimeOutCnt);
 CAN_EXT void     CanRx_Process(void);
 CAN_EXT void     DataProcess(UWORD ID, UBYTE Mode, UWORD Cmd, UBYTE Data[]);
 CAN_EXT ULONG    CRC32_Calculate(const UBYTE pData[], UWORD Length);
+CAN_EXT void     LimtRidePara(void);
 #endif
 
 

+ 73 - 11
User project/3.BasicFunction/Include/canAppl.h

@@ -358,8 +358,8 @@ typedef struct
     UWORD uwSaveFlg;
     UWORD uwWheelPerimeter;       //轮胎周长 cm
     UWORD uwMechRationMotor;    //传动比 0.1
-    UWORD uwAssistMaxSpdKmH;     //限速 1km/h
-    UWORD uwThrottleMaxSpdKmH;   //推行模式限速 1km/h
+    UWORD uwThrottleMaxSpdKmH;     //转把限速 1km/h
+    UWORD uwCartSpdKmH;   //推行模式限速 1km/h
     UWORD uwNmFrontChainring;    //前牙盘 T
     UWORD uwNmBackChainring;     //后牙盘 T
     UWORD uwAssistSelect1;       //助力方案1
@@ -384,14 +384,12 @@ typedef struct
     UWORD uwAlamOverHeatCe;
     UWORD uwAlamRecHeatCe;
     UWORD uwPwrLimitStartCe;
+    UWORD uwAlamMotorOverHeatCe;
+    UWORD uwAlamMotorRecHeatCe;
+    UWORD uwPwrLimitMotorStartCe;
+    UWORD uwControlFunEN;
+    UWORD uwThrottleGearEN;
     UWORD reserve1;
-    UWORD reserve2;
-    UWORD reserve3;
-    UWORD reserve4;
-    UWORD reserve5;
-    UWORD reserve6;
-    UWORD reserve7;
-    UWORD reserve8;
 
 } UPC_MControlInfo_Struct_t;
 
@@ -566,6 +564,69 @@ typedef struct
 
 } UPC_TestParaInfo_Struct_t;
 
+typedef struct
+{
+    UWORD uwSaveFlg;
+    UBYTE ucAssistRatioGain1;           //1%
+    UBYTE ucAssistAccelerationGain1;    //1%
+    UBYTE ucAssistRatioGain2;           //1%
+    UBYTE ucAssistAccelerationGain2;    //1%
+    UBYTE ucAssistRatioGain3;           //1%
+    UBYTE ucAssistAccelerationGain3;    //1%
+    UBYTE ucAssistRatioGain4;           //1%
+    UBYTE ucAssistAccelerationGain4;    //1%
+    UBYTE ucAssistRatioGain5;           //1%
+    UBYTE ucAssistAccelerationGain5;    //1%
+
+    UBYTE ucMaxCurrentGain1;           //1%
+    UBYTE ucMaxTorqueGain1;            //1%
+    UBYTE ucMaxCurrentGain2;           //1%
+    UBYTE ucMaxTorqueGain2;            //1%
+    UBYTE ucMaxCurrentGain3;           //1%
+    UBYTE ucMaxTorqueGain3;            //1%
+    UBYTE ucMaxCurrentGain4;           //1%
+    UBYTE ucMaxTorqueGain4;            //1%
+    UBYTE ucMaxCurrentGain5;           //1%
+    UBYTE ucMaxTorqueGain5;            //1%
+    
+    UBYTE reserve1;
+    UBYTE reserve2;
+    UBYTE reserve3;
+    UBYTE reserve4;
+    UBYTE reserve5;
+    UBYTE reserve6;
+    UBYTE reserve7;
+    UBYTE reserve8;
+    UBYTE reserve9;
+    UBYTE reserve10;
+    UBYTE reserve11;
+    UBYTE reserve12;
+
+} UPC_RideParaInfo_Struct_t;
+
+typedef struct
+{
+    UWORD uwSaveFlg;
+    UWORD uwNoneOBCEnable;                
+    UWORD uwRearLightCycle;             
+    UWORD uwRearLightDuty;
+    SWORD swDeltaBikeSpeedLimit;
+    
+    UWORD reserve1;
+    UWORD reserve2;
+    UWORD reserve3;
+    UWORD reserve4;
+    UWORD reserve5;
+    UWORD reserve6;
+    UWORD reserve7;
+    UWORD reserve8;
+    UWORD reserve9;
+    UWORD reserve10;
+    UWORD reserve11;
+    UWORD reserve12;
+
+} UPC_BikeInfo2_Struct_t;
+
 typedef struct
 {
 
@@ -577,7 +638,8 @@ typedef struct
     UPC_AssistInfo_Struct_t     stAssistInfo;
     UPC_HistoryInfo_Struct_t    stHistoryInfo;
     UPC_TestParaInfo_Struct_t   stTestParaInfo;
-
+    UPC_RideParaInfo_Struct_t   stRideParaInfo;
+    UPC_BikeInfo2_Struct_t      stBikeInfo2;
 } MC_UpperPCInfo_Struct_t;
 
 typedef struct
@@ -588,8 +650,8 @@ typedef struct
     SBYTE  DeltDiameter;    ///>有符型,单位1cm,±10.0cm  1Nm,地址偏移0
     UBYTE AssistMod;       ///>助力模式1-2,地址偏移2
     UBYTE AutoPowerOffTime;
+    SBYTE scDeltaBikeSpeedLimit;
     UBYTE reserve1;
-    UBYTE reserve2;
 } OBC_SetCustomPara_Struct_t;
 
 //仪表按键状态

+ 261 - 14
User project/3.BasicFunction/Include/i2c_master.h

@@ -64,10 +64,11 @@
 #define I2C_MCONTROL_PARA_N_WORDS I2C_MCONTROL_PARA_N_BYTES / 2  // I2C_SLAVEADDR_BLOCK1
 #define I2C_SENSOR_PARA_N_WORDS   I2C_SENSOR_PARA_N_BYTES / 2    // I2C_SLAVEADDR_BLOCK1
 #define I2C_ASSIST_PARA_N_WORDS   I2C_ASSIST_PARA_N_BYTES / 2    // I2C_SLAVEADDR_BLOCK1
-#define I2C_GEARBOX_PARA_N_WORDS  I2C_GEARBOX_PARA_N_BYTES / 2  // I2C_SLAVEADDR_BLOCK2
+#define I2C_GEARBOX_PARA_N_WORDS  I2C_GEARBOX_PARA_N_BYTES / 2  // I2C_SLAVEADDR_BLOCK1
 #define I2C_HISTORY_PARA_N_WORDS  I2C_HISTORY_PARA_N_BYTES / 2   // I2C_SLAVEADDR_BLOCK2
 
 #define I2C_PBUFFER_NWORDS 5
+#define I2C_PBUFFERBYTE_BYTES 6
 
 /* Address of parameter written to EEPROM */
 #define I2C_MOTOR_PARA_ARDDR    0X00
@@ -86,11 +87,21 @@
 #define I2C_GEARBOX_PARA_CRC_ADDR   I2C_ASSIST_PARA_CRC_ARDDR + 2
 #define I2C_HISTORY_PARA_CRC_ARDDR  I2C_HISTORY_PARA_ARDDR + I2C_HISTORY_PARA_N_BYTES
 
+#define I2C_RIDE_PARA_N_BYTES     32  // I2C_SLAVEADDR_BLOCK2
+#define I2C_RIDE_PARA_N_WORDS     I2C_RIDE_PARA_N_BYTES / 2  // I2C_SLAVEADDR_BLOCK2
+#define I2C_RIDE_PARA_ADDR        I2C_HISTORY_PARA_CRC_ARDDR + 2 
+#define I2C_RIDE_PARA_CRC_ADDR    I2C_RIDE_PARA_ADDR + I2C_RIDE_PARA_N_BYTES
+
+#define I2C_BIKE_PARA2_N_BYTES    32  // I2C_SLAVEADDR_BLOCK2
+#define I2C_BIKE_PARA2_N_WORDS    I2C_BIKE_PARA2_N_BYTES / 2      // I2C_SLAVEADDR_BLOCK2
+#define I2C_BIKE_PARA2_ADDR       I2C_RIDE_PARA_CRC_ADDR + 2 
+#define I2C_BIKE_PARA2_CRC_ADDR   I2C_BIKE_PARA2_ADDR + I2C_BIKE_PARA2_N_BYTES
+
 /* I2C TX size: cannot exceed 255, CRC: 6 Bytes */
 #define I2C_TX1_NBYTES \
         12 + I2C_MOTOR_PARA_N_BYTES + I2C_BIKE_PARA_N_BYTES + I2C_MCONTROL_PARA_N_BYTES + I2C_SENSOR_PARA_N_BYTES + I2C_ASSIST_PARA_N_BYTES + I2C_GEARBOX_PARA_N_BYTES // 172 bytes
 #define I2C_RETX1_TIMES 1
-#define I2C_TX2_NBYTES  2 + I2C_HISTORY_PARA_N_BYTES // 78 Bytes
+#define I2C_TX2_NBYTES  6 + I2C_HISTORY_PARA_N_BYTES + I2C_RIDE_PARA_N_BYTES + I2C_BIKE_PARA2_N_BYTES// 78 Bytes
 #define I2C_RETX2_TIMES 1
 #define I2C1_TX_DMA_NUM (I2C_TX1_NBYTES > I2C_TX2_NBYTES ? I2C_TX1_NBYTES : I2C_TX2_NBYTES)
 
@@ -113,7 +124,10 @@
     {                     \
         0, 0, 0, 0, 0 \
     }
-
+#define I2CReserve_Byte        \
+    {                     \
+        0, 0, 0, 0, 0 \
+    }
 /* Motor Para */
 #define I2CuwPolePairs                    \
     {                                     \
@@ -283,11 +297,18 @@
     {                                                    \
         ((UWORD)PWRLIM_START_THRESHOLD_TEMP), 0, 0, 0, 0 \
     }
-
+#define I2CuwCONTROLFUNCRUISE                            \
+    {                                                    \
+        ((UWORD)THOTTLECRUISE_EN) \
+    }
+#define I2CuwThrottleGear                            \
+    {                                                    \
+        ((UWORD)THOTTLECRUISE_EN) \
+    }
 #define I2CMControlPara                                                                                                                           \
     {                                                                                                                                             \
         I2CParaFirstSetFlg,I2CSpiOffsetFirstSetFlg,I2CswSPIPosOffsetOrigin, I2CswSPIPosOffsetNow, I2CuwIPeakMaxA, I2CuwAlamOCurA, I2CuwAlamOVolV, I2CuwAlamUVolV, I2CuwAlamOverSpdRpm,       \
-        I2CuwAlamOverHeatCe, I2CuwAlamRecHeatCe, I2CuwPwrLimitStartCe, I2CReserve, I2CReserve, I2CReserve, I2CReserve, I2CReserve, I2CReserve \
+        I2CuwAlamOverHeatCe, I2CuwAlamRecHeatCe, I2CuwPwrLimitStartCe, I2CReserve, I2CReserve, I2CReserve, I2CuwCONTROLFUNCRUISE, I2CuwThrottleGear, I2CReserve \
     }
 
 /* Sensor Para */
@@ -725,11 +746,150 @@
         I2CuwTripSumTimeL, I2CuwTorSensorAlamTimes, I2CuwCadSensorAlamTimes, I2CuwBikeSpdSensorAlamTimes, I2CuwPosSensorAlamTimes, I2CReserve, \
         I2CReserve, I2CReserve, I2CReserve, I2CReserve, I2CReserve, I2CReserve, I2CReserve                                                     \
     }
+/*Ride Params*/
+#define I2CucRidePara_AssistRatioGain1 \
+    {                                  \
+        100, 0, 0, 0, 0                   \
+    }
+
+#define I2CucRidePara_AssistAccelerationGain1 \
+    {                                     \
+        100, 0, 0, 0, 0                     \
+    }
+
+#define I2CucRidePara_AssistRatioGain2 \
+    {                                  \
+        100, 0, 0, 0, 0                  \
+    }
+
+#define I2CucRidePara_AssistAccelerationGain2 \
+    {                                     \
+        100, 0, 0, 0, 0                     \
+    }
+
+#define I2CucRidePara_AssistRatioGain3 \
+    {                                  \
+        100, 0, 0, 0, 0                  \
+    }
+
+#define I2CucRidePara_AssistAccelerationGain3 \
+    {                                     \
+        100, 0, 0, 0, 0                      \
+    }
+
+#define I2CucRidePara_AssistRatioGain4 \
+    {                                  \
+        100, 0, 0, 0, 0                   \
+    }
+
+#define I2CucRidePara_AssistAccelerationGain4 \
+    {                                     \
+        100, 0, 0, 0, 0                     \
+    }
+
+#define I2CucRidePara_AssistRatioGain5 \
+    {                                  \
+        100, 0, 0, 0, 0                   \
+    }
+
+#define I2CucRidePara_AssistAccelerationGain5 \
+    {                                     \
+        100, 0, 0, 0, 0                     \
+    }
+
+#define I2CucRidePara_MaxCurrentGain1 \
+    {                                     \
+        100, 0, 0, 0, 0                     \
+    }
+
+#define I2CucRidePara_MaxTorqueGain1 \
+    {                                     \
+        100, 0, 0, 0, 0                     \
+    }
+
+#define I2CucRidePara_MaxCurrentGain2 \
+    {                                     \
+        100, 0, 0, 0, 0                     \
+    }
+
+#define I2CucRidePara_MaxTorqueGain2 \
+    {                                     \
+        100, 0, 0, 0, 0                     \
+    }
+
+#define I2CucRidePara_MaxCurrentGain3 \
+    {                                     \
+        100, 0, 0, 0, 0                     \
+    }
+
+#define I2CucRidePara_MaxTorqueGain3 \
+    {                                     \
+        100, 0, 0, 0, 0                      \
+    }
+
+#define I2CucRidePara_MaxCurrentGain4 \
+    {                                     \
+        100, 0, 0, 0, 0                      \
+    }
 
+#define I2CucRidePara_MaxTorqueGain4 \
+    {                                     \
+        100, 0, 0, 0, 0                     \
+    }
+
+#define I2CucRidePara_MaxCurrentGain5 \
+    {                                     \
+        100, 0, 0, 0, 0                      \
+    }
+
+#define I2CucRidePara_MaxTorqueGain5 \
+    {                                     \
+        100, 0, 0, 0, 0                      \
+    }
+
+#define I2CRidePara                                                                                                                             \
+    {                                                                                                                                               \
+        I2CucRidePara_AssistRatioGain1, I2CucRidePara_AssistAccelerationGain1, I2CucRidePara_AssistRatioGain2, I2CucRidePara_AssistAccelerationGain2, \
+        I2CucRidePara_AssistRatioGain3, I2CucRidePara_AssistAccelerationGain3, I2CucRidePara_AssistRatioGain4, I2CucRidePara_AssistAccelerationGain4, \
+        I2CucRidePara_AssistRatioGain5, I2CucRidePara_AssistAccelerationGain5,      \
+        I2CucRidePara_MaxCurrentGain1, I2CucRidePara_MaxTorqueGain1, I2CucRidePara_MaxCurrentGain2, I2CucRidePara_MaxTorqueGain2, \
+        I2CucRidePara_MaxCurrentGain3, I2CucRidePara_MaxTorqueGain3, I2CucRidePara_MaxCurrentGain4, I2CucRidePara_MaxTorqueGain4, \
+        I2CucRidePara_MaxCurrentGain5, I2CucRidePara_MaxTorqueGain5, \
+        I2CReserve_Byte, I2CReserve_Byte, I2CReserve_Byte, I2CReserve_Byte, I2CReserve_Byte, I2CReserve_Byte,  \
+        I2CReserve_Byte, I2CReserve_Byte, I2CReserve_Byte, I2CReserve_Byte, I2CReserve_Byte, I2CReserve_Byte\
+    }
+
+/*BikePara2 */
+#define I2CucBikePara2_NoneOBCEnable \
+    {                                  \
+        BIKE_NONEOBCEBNABLE, 0, 0, 0, 0                   \
+    }
+
+#define I2CucBikePara2_RearLightCycle \
+    {                                  \
+        BIKE_REARLIGHTCYCLE, 0, 0, 0, 0                   \
+    }
+
+#define I2CucBikePara2_RearLightDuty \
+    {                                  \
+        BIKE_REARLIGHTDUTY, 0, 0, 0, 0                   \
+    }
+
+#define I2CucBikePara2_DeltaBikeSpeedLimit \
+    {                                  \
+        BIKE_DELTASPEEDLIMITION, 0, 0, 0, 0                   \
+    }
+
+#define I2CBikePara2                                                                                                                             \
+    {                                                                                                                                               \
+        I2CucBikePara2_NoneOBCEnable, I2CucBikePara2_RearLightCycle, I2CucBikePara2_RearLightDuty, I2CucBikePara2_DeltaBikeSpeedLimit, \
+        I2CReserve, I2CReserve, I2CReserve, I2CReserve, I2CReserve, I2CReserve, \
+        I2CReserve, I2CReserve, I2CReserve, I2CReserve, I2CReserve, I2CReserve  \
+    }
 /* System Para */
 #define SYSPARA2                                                                                 \
     {                                                                                            \
-        I2CMotorPara, I2CBikePara, I2CMControlPara, I2CSensorPara, I2CAssistPara, I2CGearBoxPara, I2CHistoryPara \
+        I2CMotorPara, I2CBikePara, I2CMControlPara, I2CSensorPara, I2CAssistPara, I2CGearBoxPara, I2CHistoryPara, I2CRidePara, I2CBikePara2 \
     }
 
 /************************************************************************
@@ -756,7 +916,9 @@ typedef struct
     BOOL blAssistParaFltFlg;
     BOOL blGearBoxParaFltFlg;
     BOOL blHistoryParaFltFlg;
-
+    BOOL blRideParaFltFlg;
+    BOOL blBikePara2FltFlg;
+    
     BOOL ReadFinishFlg;
     
     UBYTE ubRdCnt;
@@ -780,6 +942,26 @@ typedef struct
     UWORD uwUnit;
 } SWORD_VALUE;
 
+typedef struct
+{
+    UBYTE ucDefault1;
+    UBYTE ucReal;
+    UBYTE ucMin;
+    UBYTE ucMax;
+    UBYTE ucUnit;
+    UBYTE RS;
+} UBYTE_VALUE;
+
+typedef struct
+{
+    SBYTE scDefault1;
+    SBYTE scReal;
+    SBYTE scMin;
+    SBYTE scMax;
+    UBYTE ucUnit;
+    UBYTE RS;
+} SBYTE_VALUE;
+
 typedef struct
 {
     UWORD_VALUE uwPolePairs;
@@ -807,8 +989,8 @@ typedef struct
 {
     UWORD_VALUE uwWheelPerimeter;
     UWORD_VALUE uwMechRationMotor;
-    UWORD_VALUE uwAssistMaxSpdKmH;
     UWORD_VALUE uwThrottleMaxSpdKmH;
+    UWORD_VALUE uwCartSpdKmH;
     UWORD_VALUE uwNmFrontChainring;
     UWORD_VALUE uwNmBackChainring;
     UWORD_VALUE uwAssistSelect1;
@@ -835,12 +1017,12 @@ typedef struct
     UWORD_VALUE uwAlamOverHeatCe;
     UWORD_VALUE uwAlamRecHeatCe;
     UWORD_VALUE uwPwrLimitStartCe;
+    UWORD_VALUE uwAlamMotorOverHeatCe;
+    UWORD_VALUE uwAlamMotorRecHeatCe;
+    UWORD_VALUE uwPwrLimitMotorStartCe;
+    UWORD_VALUE uwControlFunEN;
+    UWORD_VALUE uwThrottleGearEN;
     UWORD_VALUE reserve1;
-    UWORD_VALUE reserve2;
-    UWORD_VALUE reserve3;
-    UWORD_VALUE reserve4;
-    UWORD_VALUE reserve5;
-    UWORD_VALUE reserve6;
 } MControl_PARAMETER;
 
 typedef struct
@@ -957,6 +1139,65 @@ typedef struct
     UWORD_VALUE reserve4;
 } History_PARAMETER;
 
+typedef struct
+{
+    UBYTE_VALUE ucAssistRatioGain1;           //1%
+    UBYTE_VALUE ucAssistAccelerationGain1;    //1%
+    UBYTE_VALUE ucAssistRatioGain2;           //1%
+    UBYTE_VALUE ucAssistAccelerationGain2;    //1%
+    UBYTE_VALUE ucAssistRatioGain3;           //1%
+    UBYTE_VALUE ucAssistAccelerationGain3;    //1%
+    UBYTE_VALUE ucAssistRatioGain4;           //1%
+    UBYTE_VALUE ucAssistAccelerationGain4;    //1%
+    UBYTE_VALUE ucAssistRatioGain5;           //1%
+    UBYTE_VALUE ucAssistAccelerationGain5;    //1%
+
+    UBYTE_VALUE ucMaxCurrentGain1;           //1%
+    UBYTE_VALUE ucMaxTorqueGain1;            //1%
+    UBYTE_VALUE ucMaxCurrentGain2;           //1%
+    UBYTE_VALUE ucMaxTorqueGain2;            //1%
+    UBYTE_VALUE ucMaxCurrentGain3;           //1%
+    UBYTE_VALUE ucMaxTorqueGain3;            //1%
+    UBYTE_VALUE ucMaxCurrentGain4;           //1%
+    UBYTE_VALUE ucMaxTorqueGain4;            //1%
+    UBYTE_VALUE ucMaxCurrentGain5;           //1%
+    UBYTE_VALUE ucMaxTorqueGain5;            //1%
+    
+    UBYTE_VALUE reserve1;
+    UBYTE_VALUE reserve2;
+    UBYTE_VALUE reserve3;
+    UBYTE_VALUE reserve4;
+    UBYTE_VALUE reserve5;
+    UBYTE_VALUE reserve6;
+    UBYTE_VALUE reserve7;
+    UBYTE_VALUE reserve8;
+    UBYTE_VALUE reserve9;
+    UBYTE_VALUE reserve10;
+    UBYTE_VALUE reserve11;
+    UBYTE_VALUE reserve12;
+}Ride_PARAMETER;
+
+typedef struct
+{
+    UWORD_VALUE uwNoneOBCEnable;
+    UWORD_VALUE uwRearLightCycle;
+    UWORD_VALUE uwRearLightDuty;
+    SWORD_VALUE swDeltaBikeSpeedLimit;
+    
+    UWORD_VALUE reserve1;
+    UWORD_VALUE reserve2;
+    UWORD_VALUE reserve3;
+    UWORD_VALUE reserve4;
+    UWORD_VALUE reserve5;
+    UWORD_VALUE reserve6;
+    UWORD_VALUE reserve7;
+    UWORD_VALUE reserve8;
+    UWORD_VALUE reserve9;
+    UWORD_VALUE reserve10;
+    UWORD_VALUE reserve11;
+    UWORD_VALUE reserve12;
+} BIKE_PARAMETER2;
+
 typedef struct
 {
     MOTOR_PARAMETER    stMotorPara;
@@ -966,6 +1207,8 @@ typedef struct
     Assist_PARAMETER   stAssistPara;
     GearBox_PARAMETER  stGearBoxPara;
     History_PARAMETER  stHistoryPara;
+    Ride_PARAMETER     stRidePara;
+    BIKE_PARAMETER2    stBikePara2;
 } SYSTEM_PARAMETER2;
 
 /************************************************************************
@@ -979,7 +1222,7 @@ Constant Table
 _I2C_MASTER_EXT SYSTEM_PARAMETER2 Syspara2 = SYSPARA2;
 _I2C_MASTER_EXT I2C_TX_COF        i2c_stTXCoef;
 _I2C_MASTER_EXT I2C_TX_OUT        i2c_stTXOut;
-_I2C_MASTER_EXT I2C_RXCRC_OUT     i2c_stRXCRCOut = {FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE};
+_I2C_MASTER_EXT I2C_RXCRC_OUT     i2c_stRXCRCOut = {FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, 0};
 
 _I2C_MASTER_EXT UBYTE I2C_ubReadBuffer[I2C_RX_TIMES][I2C1_RX_DMA_NUM];
 _I2C_MASTER_EXT UWORD I2C_uwMotorParaRead[I2C_MOTOR_PARA_N_WORDS];
@@ -989,6 +1232,8 @@ _I2C_MASTER_EXT UWORD I2C_uwSensorRead[I2C_SENSOR_PARA_N_WORDS];
 _I2C_MASTER_EXT UWORD I2C_uwAssistParaRead[I2C_ASSIST_PARA_N_WORDS];
 _I2C_MASTER_EXT UWORD I2C_uwGearBoxParaRead[I2C_GEARBOX_PARA_N_WORDS];
 _I2C_MASTER_EXT UWORD I2C_uwHistoryParaRead[I2C_HISTORY_PARA_N_WORDS];
+_I2C_MASTER_EXT UWORD I2C_uwRideParaRead[I2C_RIDE_PARA_N_WORDS];
+_I2C_MASTER_EXT UWORD I2C_uwBikePara2Read[I2C_BIKE_PARA2_N_WORDS];
 
 _I2C_MASTER_EXT UBYTE I2C_ubWriteBuffer[I2C_TX1_NBYTES];
 _I2C_MASTER_EXT UBYTE I2C_ubHistoyWriteBuffer[I2C_TX2_NBYTES];
@@ -1012,6 +1257,8 @@ _I2C_MASTER_EXT UWORD I2C_uwSensorRead[I2C_SENSOR_PARA_N_WORDS];
 _I2C_MASTER_EXT UWORD I2C_uwAssistParaRead[I2C_ASSIST_PARA_N_WORDS];
 _I2C_MASTER_EXT UWORD I2C_uwGearBoxParaRead[I2C_GEARBOX_PARA_N_WORDS];
 _I2C_MASTER_EXT UWORD I2C_uwHistoryParaRead[I2C_HISTORY_PARA_N_WORDS];
+_I2C_MASTER_EXT UWORD I2C_uwRideParaRead[I2C_RIDE_PARA_N_WORDS];
+_I2C_MASTER_EXT UWORD I2C_uwBikePara2Read[I2C_BIKE_PARA2_N_WORDS];
 
 _I2C_MASTER_EXT UBYTE I2C_ubWriteBuffer[I2C_TX1_NBYTES];
 _I2C_MASTER_EXT UBYTE I2C_ubHistoyWriteBuffer[I2C_TX2_NBYTES];

+ 66 - 17
User project/3.BasicFunction/Source/AssistCurve.c

@@ -52,6 +52,7 @@ SWORD ass_swTorqMafBuf[64];
 MAF_IN ass_stTorqMafValue = {0, 32, 0, 0, ass_swTorqMafBuf, 0, FALSE};
 SWORD ass_swUqLimMafBuf[64];
 MAF_IN ass_stUqLimMafValue = {0, 64, 0, 0, ass_swUqLimMafBuf, 0, FALSE};
+UWORD   ass_uwPwrCurLim[6] = CUR_LIM_DEFAULT;
 
 static TOR2CURRENT_CAL_COEF ass_Tor2CurCalCoef;
 static UWORD StartUpGainArray[5] = START_GAIN_DEFAULT;
@@ -198,8 +199,8 @@ void ass_voAssitEEInit(void)
     ass_stParaCong.uwCadPulsePerCirc = CADENCE_PULSES_PER_CIRC;
     ass_stParaCong.uwMechRationMotor = 35; //   Q0
 
-    ass_stParaCong.uwAssistMaxSpdKmH = BIKE_SPEED_THROTTLE_MAX;
-    ass_stParaCong.uwThrottleMaxSpdKmH = BIKE_SPEED_WALK_MAX;
+    ass_stParaCong.uwThrottleMaxSpdKmH = BIKE_SPEED_THROTTLE_MAX;
+    ass_stParaCong.uwCartSpdKmH = BIKE_SPEED_WALK_MAX;
     ass_stParaCong.uwNmFrontChainring = BIKE_FRONTTEETH_NMB;    // front gear
     ass_stParaCong.uwNmBackChainring = BIKE_BACKTEETH_NMB;     // min number of back gear
     ass_stParaCong.uwAssistSelect1 = BIKE_ASSIST_MODE1;
@@ -209,6 +210,11 @@ void ass_voAssitEEInit(void)
     ass_stParaCong.uwStartMode = BIKE_START_MODE;
     ass_stParaCong.uwAutoPowerOffTime = BIKE_POWER_PARA;
     ass_stParaCong.uwThrottleSmooth = BIKE_THROTTLE_SMOOTH;
+    
+    ass_stParaCong.uwNoneOBCEnable = BIKE_NONEOBCEBNABLE;
+    ass_stParaCong.uwRearLightCycle = BIKE_REARLIGHTCYCLE;
+    ass_stParaCong.uwRearLightDuty = BIKE_REARLIGHTDUTY;
+    ass_stParaCong.swDeltaBikeSpeedLimit = BIKE_DELTASPEEDLIMITION;
 
     ass_stParaSet.uwStartupCoef = 8194;       // Q12 percentage Min 1-4096  1.5-6144
     ass_stParaSet.uwStartupCruiseCoef = 4096; // Q12 percentage Min 1-4096  1-6144
@@ -236,6 +242,14 @@ void ass_voAssitEEInit(void)
     ass_stParaSet.uwSpdRegionGain[1] = 4094;
     ass_stParaSet.uwSpdRegionGain[2] = 4094;
     
+    for(int i=0;i<5;i++)
+    {
+        ass_stCalCoef.ucAssistRatioGain[i] = 100;
+        ass_stCalCoef.ucAssistAccelerationGain[i] = 100;
+        ass_stCalCoef.ucMaxCurrentGain[i] = 100;
+        ass_stCalCoef.ucMaxTorqueGain[i] = 100;
+    }
+    
     /* 函数私有变量初始化 */
     ass_pvt_swVoltCnt = 0;
     ass_pvt_uwTorqAccCnt = 0;
@@ -354,20 +368,22 @@ void ass_voAssitCoef(void)
     ass_stCurLimCoef.uwSpdThresHold = 21845;
 
     /*设置车速限幅*/
-    ass_stCurLimCoef.uwBikeSpdThresHold1 = (UWORD)(((UQWORD)1000 << 20) * ass_stParaSet.uwAssistLimitBikeSpdStart /
+    ass_stCurLimCoef.uwBikeSpdThresHold1 = (UWORD)(((UQWORD)1000 << 20) * (ass_stParaSet.uwAssistLimitBikeSpdStart + ass_stParaCong.swDeltaBikeSpeedLimit)/
                                          ((UQWORD)36 * (ass_stParaCong.uwWheelPerimeter + ass_stParaCong.swDeltPerimeter) * FBASE)); // Q20    3216 = Q10(3.1415926)
-    ass_stCurLimCoef.uwBikeSpdThresHold2 = (UWORD)(((UQWORD)1000 << 20) * ass_stParaSet.uwAssistLimitBikeSpdStop /
+    ass_stCurLimCoef.uwBikeSpdThresHold2 = (UWORD)(((UQWORD)1000 << 20) * (ass_stParaSet.uwAssistLimitBikeSpdStop + ass_stParaCong.swDeltaBikeSpeedLimit)/
                                          ((UQWORD)36 * (ass_stParaCong.uwWheelPerimeter + ass_stParaCong.swDeltPerimeter) * FBASE)); // Q20    3216 = Q10(3.1415926)
 
     ass_stCurLimCoef.ulBikeSpdDeltInv = (ULONG)(((UQWORD)1 << 20) / (ass_stCurLimCoef.uwBikeSpdThresHold2 - ass_stCurLimCoef.uwBikeSpdThresHold1)); // Q20;
     ass_stCurLimCoef.uwBikeSpdIqLimitK =
     		(UWORD)((((ULONG)ass_stCurLimCoef.uwBikeSpdThresHold2 - ass_stCurLimCoef.uwBikeSpdThresHold1) << 8) / ass_stParaCong.uwCofCurMaxPu); // Q28-q14 = Q14;
 #if ((MOTOR_ID_SEL == MOTOR_WELLING_MTB_36V) || (MOTOR_ID_SEL == MOTOR_WELLING_MTB_48V))
-    ass_stCurLimCoef.uwMotorSpdThresHold = SPD_RPM2PU(4290);//125Candance
+    ass_stCurLimCoef.uwMotorSpdThresHold1 = SPD_RPM2PU(4290);//125Candance
 #elif ((MOTOR_ID_SEL == MOTOR_WELLING_CITY_36V) || (MOTOR_ID_SEL == MOTOR_WELLING_CITY_48V))
-    ass_stCurLimCoef.uwMotorSpdThresHold = SPD_RPM2PU(3953);//115Candance
+    ass_stCurLimCoef.uwMotorSpdThresHold1 = SPD_RPM2PU(3953);//115Candance
 #endif
-
+    ass_stCurLimCoef.uwMotorSpdThresHold2 = ass_stCurLimCoef.uwMotorSpdThresHold1 + SPD_RPM2PU(200);
+    ass_stCurLimCoef.ulMotorSpdDeltInv = (ULONG)(((UQWORD)1 << 20) / (ass_stCurLimCoef.uwMotorSpdThresHold2 - ass_stCurLimCoef.uwMotorSpdThresHold1)); // Q20;
+    
     /*设置转矩电流标定系数*/
     ass_Tor2CurCalCoef.uwMotorFluxWb = cp_stMotorPara.swFluxWb; // 0.001mWb
     ass_Tor2CurCalCoef.uwMotprPolePairs = ass_stParaCong.uwMotorPoles;
@@ -508,6 +524,15 @@ static void AssitCuvApplPerVolt(void) /* parasoft-suppress METRICS-28 "本项目
     }
     uwTorqDecStep = 80;
     
+    if(ass_stCalIn.uwGearSt == 0)
+    {
+        ass_stCalCoef.uwSpeedAssistIMaxA =  ass_stParaSet.uwSpeedAssistIMaxA;
+    }
+    else
+    {
+        ass_stCalCoef.uwSpeedAssistIMaxA = (UWORD)(((ULONG)ass_stParaSet.uwSpeedAssistIMaxA * ass_stCalCoef.ucMaxTorqueGain[ass_stCalIn.uwGearSt-1] *10) >>10);//助力加速度增益
+    }
+    
     AssCnt1ms ++;
     if(AssCnt1ms >= 10000)
     {
@@ -556,6 +581,15 @@ static void AssitCuvApplPerVolt(void) /* parasoft-suppress METRICS-28 "本项目
     {
         //do nothing;
     }
+    
+    if(ass_stCalIn.uwGearSt == 0)
+    {
+        slTeTorAssitTmpPu = 0;
+    }
+    else
+    {
+        slTeTorAssitTmpPu = ((slTeTorAssitTmpPu * ass_stCalCoef.ucAssistRatioGain[ass_stCalIn.uwGearSt-1] *10) >>10);//助力比增益
+    }
 #else
     slTeTorAssitTmpPu = (SLONG)giant_slPolynomial(&swTorqCmd);
 #endif
@@ -645,8 +679,8 @@ static void AssitCuvApplPerVolt(void) /* parasoft-suppress METRICS-28 "本项目
          /* 启动系数 */
         if(ass_pvt_uwSmoothFlg == 0)
         {
-            ass_stCalCoef.swSmoothGain  += ass_stParaSet.uwSpeedAssistIMaxA; ////ass_stCalCoef.uwStartUpGainAddStep;            
-            if(ass_stCalCoef.swSmoothGain >= ass_stParaSet.uwStartupCoef)
+            ass_stCalCoef.swSmoothGain  += ass_stCalCoef.uwSpeedAssistIMaxA; ////ass_stCalCoef.uwStartUpGainAddStep;            
+            if(ass_stCalCoef.swSmoothGain >= ass_stCalCoef.uwStartupGain)
             {
                 ass_pvt_uwSmoothFlg = 1;
             }
@@ -655,7 +689,7 @@ static void AssitCuvApplPerVolt(void) /* parasoft-suppress METRICS-28 "本项目
         {
             if(ass_stCalCoef.swSmoothGain >= Q12_1)
             {
-                ass_stCalCoef.swSmoothGain  -= (ass_stParaSet.uwSpeedAssistIMaxA >> 1);
+                ass_stCalCoef.swSmoothGain  -= (ass_stCalCoef.uwSpeedAssistIMaxA >> 1);
             }
             else
             {
@@ -789,8 +823,8 @@ static void AssitCuvApplPerVolt(void) /* parasoft-suppress METRICS-28 "本项目
          /* 启动系数 */
         if(ass_pvt_uwSmoothFlg == 0)
         {
-            ass_stCalCoef.swSmoothGain  += ass_stParaSet.uwSpeedAssistIMaxA; ////ass_stCalCoef.uwStartUpGainAddStep;            
-            if(ass_stCalCoef.swSmoothGain >= ass_stParaSet.uwStartupCoef)
+            ass_stCalCoef.swSmoothGain  += ass_stCalCoef.uwSpeedAssistIMaxA; ////ass_stCalCoef.uwStartUpGainAddStep;            
+            if(ass_stCalCoef.swSmoothGain >= ass_stCalCoef.uwStartupGain)
             {
                 ass_pvt_uwSmoothFlg = 1;
             }
@@ -799,7 +833,7 @@ static void AssitCuvApplPerVolt(void) /* parasoft-suppress METRICS-28 "本项目
         {
             if(ass_stCalCoef.swSmoothGain >= Q12_1)
             {
-                ass_stCalCoef.swSmoothGain  -= (ass_stParaSet.uwSpeedAssistIMaxA >> 1);
+                ass_stCalCoef.swSmoothGain  -= (ass_stCalCoef.uwSpeedAssistIMaxA >> 1);
             }
             else
             {
@@ -990,19 +1024,24 @@ static void AssitCuvApplPerVolt(void) /* parasoft-suppress METRICS-28 "本项目
         uwTorqAccStep = 10;
         uwTorqDecStep = 10;
     }
-
-    if (ass_stCalIn.uwSpdFbkAbsPu <= ass_stCurLimCoef.uwMotorSpdThresHold)
+    
+#if MOTORSPEEDLIMIT_ENABLE
+    if (ass_stCalIn.uwSpdFbkAbsPu <= ass_stCurLimCoef.uwMotorSpdThresHold1)
     {
         ass_stCalCoef.swMotorSpeedGain = Q12_1; // Q12
     }
+    else if (ass_stCalIn.uwSpdFbkAbsPu > ass_stCurLimCoef.uwMotorSpdThresHold1 && ass_stCalIn.uwSpdFbkAbsPu <= ass_stCurLimCoef.uwMotorSpdThresHold2)
+    {
+        ass_stCalCoef.swMotorSpeedGain =
+            (SWORD)(Q12_1 - ((((SQWORD)ass_stCalIn.uwSpdFbkAbsPu - (SQWORD)ass_stCurLimCoef.uwMotorSpdThresHold1) * (SQWORD)ass_stCurLimCoef.ulMotorSpdDeltInv) >> 8)); // Q12
+    }
     else
     {
-#if MOTORSPEEDLIMIT_ENABLE
         ass_stCalCoef.swMotorSpeedGain = 0; // Q12
+    }
 #else
         ass_stCalCoef.swMotorSpeedGain = Q12_1; // Q12
 #endif
-    }
     
     /* Assist Current Output in each FSM */
     switch (Ass_FSM)
@@ -1164,6 +1203,16 @@ static void ass_voAssitCurLim(UWORD gear, UWORD uwBikeSpeedHzPu, UWORD uwCurMaxP
     }
 
     uwIqLimitTemp1 = (UWORD)(((ULONG)ass_stCurLimCoef.uwLimitGain[gear] * uwCurMaxPu) >> 10);
+    
+    if(gear > 0)
+    {
+      uwIqLimitTemp1 = (UWORD)(((ULONG)ass_stCalCoef.ucMaxTorqueGain[gear-1] * uwIqLimitTemp1 * 10) >> 10);//最大力矩增益
+    }
+    if(uwIqLimitTemp1 > uwCurMaxPu)
+    {
+      uwIqLimitTemp1 = uwCurMaxPu;//limit to max,can only adjust below max
+    }
+    
 #if(GIANT_ENABLE == 1)
     if(stGiantControlParams.MaximumTorque > 0)
     {

+ 15 - 5
User project/3.BasicFunction/Source/bikelight.c

@@ -213,11 +213,21 @@ void bikelight_voBikeLightCoef(UWORD uwLightPara)
  Subroutine Call: N/A;
  Reference: N/A
 ****************************************************************/
-void bikelight_voBikeLightControl(UWORD switchAction, BOOL Brate_Sta,UWORD uwLightPara) /* parasoft-suppress METRICS-28 "本项目圈复杂度无法更改,后续避免" */
+void bikelight_voBikeLightControl(UWORD switchAction, BOOL Brate_Sta,UWORD uwLightPara,UWORD uwCycle,UWORD uwDuty) /* parasoft-suppress METRICS-28 "本项目圈复杂度无法更改,后续避免" */
 {
    UBYTE ubBackLedMode;
+   UWORD uwBikeLedCycle;
+   UWORD uwBikeLedDuty;
 
    ubBackLedMode = (UBYTE)((uwLightPara & 0xF000) >> 12);
+   uwBikeLedCycle = uwCycle;
+   uwBikeLedDuty = uwDuty;
+   
+   if(uwDuty>uwCycle)
+   {
+      uwBikeLedDuty = uwCycle>>1;
+   }
+   
  //if( power_stPowStateOut.powerstate != POWER_ON) //关机状态
    if( power_stPowStateOut.blPowerStartupFlg  ==FALSE)
   {
@@ -246,11 +256,11 @@ void bikelight_voBikeLightControl(UWORD switchAction, BOOL Brate_Sta,UWORD uwLig
                 if(switchAction==1)
                 {
                     BikeLedPara.uwLedAddcnt++;
-                    if(BikeLedPara.uwLedAddcnt > BikeLedAddCycle)
+                    if(BikeLedPara.uwLedAddcnt > uwBikeLedCycle)
                     {
                         BikeLedPara.uwLedAddcnt=0;
                     }
-                    if(BikeLedPara.uwLedAddcnt<BikeLedAddDuty)
+                    if(BikeLedPara.uwLedAddcnt < uwBikeLedDuty)
                     {
                        // IO_BACKLED_ON();
                         BikeLedGloFun.blBike_BackLedSta=TRUE;
@@ -362,11 +372,11 @@ void bikelight_voBikeLightControl(UWORD switchAction, BOOL Brate_Sta,UWORD uwLig
             if(cp_stBikeRunInfoPara.BikeSpeedKmH>=BikeLedOverSpeedMax)
               {
                   BikeLedPara.uwLedAddcnt++;
-                  if(BikeLedPara.uwLedAddcnt > BikeLedOverSpedCycle)
+                  if(BikeLedPara.uwLedAddcnt > uwBikeLedCycle)
                   {
                       BikeLedPara.uwLedAddcnt=0;
                   }
-                  if(BikeLedPara.uwLedAddcnt<BikeLedOverSpedDuty)
+                  if(BikeLedPara.uwLedAddcnt<uwBikeLedDuty)
                   {
                     //  IO_BACKLED_ON();
                       BikeLedGloFun.blBike_BackLedSta=TRUE;

+ 43 - 6
User project/3.BasicFunction/Source/bikespeed.c

@@ -66,7 +66,7 @@ void bikespeed_voBikeSpeedCof(void)
     bikespeed_stFreGetCof.uwMinTriptoUpdate = 100; // 100m
     bikespeed_stFreGetCof.uwBikespeedKmh2Pu = (1000 << 20)/(FBASE * (ass_stParaCong.uwWheelPerimeter + ass_stParaCong.swDeltPerimeter) * 36);
     
-    if(0 == ass_stParaCong.uwAssistMaxSpdKmH)
+    if(0 == ass_stParaCong.uwThrottleMaxSpdKmH)
     {
         bikespeed_stSpdLimCoef.blThrottleExist = FALSE;
     }
@@ -74,17 +74,54 @@ void bikespeed_voBikeSpeedCof(void)
     {
         bikespeed_stSpdLimCoef.blThrottleExist = TRUE;
     }
-    bikespeed_stSpdLimCoef.uwBikeSpdThresHold1 = (ass_stParaCong.uwAssistMaxSpdKmH-2)*bikespeed_stFreGetCof.uwBikespeedKmh2Pu;
+    bikespeed_stSpdLimCoef.uwBikeSpdThresHold1 = (ass_stParaCong.uwThrottleMaxSpdKmH-2)*bikespeed_stFreGetCof.uwBikespeedKmh2Pu;
 #if(HUAYAO_ENABLE == 1)
-    bikespeed_stSpdLimCoef.uwBikeSpdThresHold2 = ass_stParaCong.uwAssistMaxSpdKmH*bikespeed_stFreGetCof.uwBikespeedKmh2Pu + bikespeed_stFreGetCof.uwBikespeedKmh2Pu/5;
+    bikespeed_stSpdLimCoef.uwBikeSpdThresHold2 = ass_stParaCong.uwThrottleMaxSpdKmH*bikespeed_stFreGetCof.uwBikespeedKmh2Pu + bikespeed_stFreGetCof.uwBikespeedKmh2Pu/5;
 #else
-    bikespeed_stSpdLimCoef.uwBikeSpdThresHold2 = ass_stParaCong.uwAssistMaxSpdKmH*bikespeed_stFreGetCof.uwBikespeedKmh2Pu;
+    bikespeed_stSpdLimCoef.uwBikeSpdThresHold2 = ass_stParaCong.uwThrottleMaxSpdKmH*bikespeed_stFreGetCof.uwBikespeedKmh2Pu;
 #endif
     bikespeed_stSpdLimCoef.ulBikeSpdDeltInv = ((SQWORD)1 << 20) / (bikespeed_stSpdLimCoef.uwBikeSpdThresHold2 - bikespeed_stSpdLimCoef.uwBikeSpdThresHold1); // Q20;
     bikespeed_stSpdLimCoef.uwBikeSpdRefIncrease = (ass_stParaCong.uwThrottleSmooth>>8)*10;
     bikespeed_stSpdLimCoef.uwBikeSpdRefDecrease = (ass_stParaCong.uwThrottleSmooth&0xFF)*10;
 }
-
+/***************************************************************
+ Function: bikespeed_voSetThrottleMaxSpd
+ Description:  
+ Call by: 
+ Input Variables: N/A
+ Output/Return Variables: N/A
+ Subroutine Call: N/A
+ Reference: N/A
+****************************************************************/
+void bikespeed_voSetThrottleMaxSpd(UWORD uwBikeGear)
+{
+    UWORD uwBikeSpdThresHold2;
+    if((cp_stControlPara.uwThrottleGearEN & 0xFF) == 0xAA)
+    {
+        switch(uwBikeGear)
+        {
+            case 0x01:
+                uwBikeSpdThresHold2 = (ass_stParaCong.uwThrottleMaxSpdKmH * bikespeed_stFreGetCof.uwBikespeedKmh2Pu * 9) >> 4;
+                break;
+            case 0x02:
+                uwBikeSpdThresHold2 = (ass_stParaCong.uwThrottleMaxSpdKmH * bikespeed_stFreGetCof.uwBikespeedKmh2Pu * 11) >> 4;
+                break;
+            case 0x03:
+                uwBikeSpdThresHold2 = (ass_stParaCong.uwThrottleMaxSpdKmH * bikespeed_stFreGetCof.uwBikespeedKmh2Pu * 13) >> 4;
+                break;
+            case 0x04:
+                uwBikeSpdThresHold2 = ass_stParaCong.uwThrottleMaxSpdKmH * bikespeed_stFreGetCof.uwBikespeedKmh2Pu;
+                break;
+            default:
+                uwBikeSpdThresHold2 = ass_stParaCong.uwThrottleMaxSpdKmH * bikespeed_stFreGetCof.uwBikespeedKmh2Pu;
+                break;
+        }
+        
+        bikespeed_stSpdLimCoef.uwBikeSpdThresHold1 = uwBikeSpdThresHold2 - 2*bikespeed_stFreGetCof.uwBikespeedKmh2Pu;
+        bikespeed_stSpdLimCoef.uwBikeSpdThresHold2 = uwBikeSpdThresHold2;
+        bikespeed_stSpdLimCoef.ulBikeSpdDeltInv = ((SQWORD)1 << 20) / (bikespeed_stSpdLimCoef.uwBikeSpdThresHold2 - bikespeed_stSpdLimCoef.uwBikeSpdThresHold1); // Q20;
+    }
+}
 /***************************************************************
  Function: bikespeed_voBikeSpeedIdle;
  Description: bike speed function in idel state
@@ -553,7 +590,7 @@ void bikespeed_voPI(const BIKESPDPI_IN *in, BIKESPDPI_OUT *out)
 //    mth_voLPFilter(uwBikeSpeedGain, &bike_pvt_stCurLpf); 
  
 //    out->swIqRefPu = (SWORD)(out->slIqRefPu >> 16); // Q30-Q16=Q14
-    out->swIqRefPu = ((SLONG)(cp_stMotorPara.swIpeakMaxA * in->slSpdRefPu / ass_stParaCong.uwAssistMaxSpdKmH /bikespeed_stFreGetCof.uwBikespeedKmh2Pu) << 14) / IBASE ;
+    out->swIqRefPu = ((SLONG)(cp_stMotorPara.swIpeakMaxA * in->slSpdRefPu / ass_stParaCong.uwThrottleMaxSpdKmH /bikespeed_stFreGetCof.uwBikespeedKmh2Pu) << 14) / IBASE ;
     out->slErrorZ1 = slSpdErrPu;
 }
 /*************************************************************************

+ 57 - 56
User project/3.BasicFunction/Source/bikethrottle.c

@@ -171,66 +171,67 @@ void bikethrottle_voBikeThrottleADC(void) // need to match ADC_StartConversion(A
 ****************************************************************/
 void bikethrottle_voThrottlecruise(void)
 {
-#if(THOTTLECRUISE_EN == 0xAA)
-   if((bikethrottle_stBikeThrottleOut.uwThrottleVolPu < (bikeCruise.ThrottlekeepVault+180)) && (bikethrottle_stBikeThrottleOut.uwThrottleVolPu > (bikeCruise.ThrottlekeepVault-180)))
-   {
-       if((BikeBrake_blGetstate() == FALSE)
-          &&(alm_blAlmOccrFlg == FALSE)
-          &&(cp_stBikeRunInfoPara.uwBikeGear > 0)
-          &&(cp_stBikeRunInfoPara.uwBikeGear <= 5)
-          &&(bikethrottle_stBikeThrottleOut.uwThrottlePercent > 200)
-          &&(bikeCruise.CruiseMode == 0))
-       {
-           if((cp_ulSystickCnt - bikeCruise.KeepInTime) >= CRUISESETINGTIME) //8秒指拨不动进入巡航
+    if((cp_stControlPara.uwControlFunEN & 0xFF) == 0xAA)
+    {
+        if((bikethrottle_stBikeThrottleOut.uwThrottleVolPu < (bikeCruise.ThrottlekeepVault+180)) && (bikethrottle_stBikeThrottleOut.uwThrottleVolPu > (bikeCruise.ThrottlekeepVault-180)))
+        {
+           if((BikeBrake_blGetstate() == FALSE)
+              &&(alm_blAlmOccrFlg == FALSE)
+              &&(cp_stBikeRunInfoPara.uwBikeGear > 0)
+              &&(cp_stBikeRunInfoPara.uwBikeGear <= 5)
+              &&(bikethrottle_stBikeThrottleOut.uwThrottlePercent > 200)
+              &&(bikeCruise.CruiseMode == 0))
            {
-               bikeCruise.CruiseMode = 1;
-               bikeCruise.CruisePercent = bikethrottle_stBikeThrottleOut.uwThrottlePercent;
-               bikeCruise.ThrottleResetCruiseFlag = 1;
+               if((cp_ulSystickCnt - bikeCruise.KeepInTime) >= CRUISESETINGTIME) //8秒指拨不动进入巡航
+               {
+                   bikeCruise.CruiseMode = 1;
+                   bikeCruise.CruisePercent = bikethrottle_stBikeThrottleOut.uwThrottlePercent;
+                   bikeCruise.ThrottleResetCruiseFlag = 1;
+               }
            }
-       }
-       if(bikethrottle_stBikeThrottleOut.uwThrottlePercent < 200)
+           if(bikethrottle_stBikeThrottleOut.uwThrottlePercent < 200)
+           {
+              bikeCruise.KeepInTime = cp_ulSystickCnt;
+           }
+        }
+        else
+        {
+           bikeCruise.ThrottlekeepVault = bikethrottle_stBikeThrottleOut.uwThrottleVolPu;
+           bikeCruise.KeepInTime = cp_ulSystickCnt;
+          // bikeCruise.ThrottleResetCruiseFlag = 0;
+        }
+
+       //有故障退出,刹车退出,0档退出
+       if((alm_blAlmOccrFlg == TRUE)
+           ||(BikeBrake_blGetstate() == TRUE)
+           ||(cp_stBikeRunInfoPara.uwBikeGear == 0)
+           ||(bikeCruise.ThrottleResetCruiseFlag == 3))
        {
-          bikeCruise.KeepInTime = cp_ulSystickCnt;
+           bikeCruise.CruiseMode = 0;
+           bikeCruise.KeepInTime = cp_ulSystickCnt;
+           bikeCruise.ThrottleResetCruiseFlag = 0;
        }
-   }
-   else
-   {
-       bikeCruise.ThrottlekeepVault = bikethrottle_stBikeThrottleOut.uwThrottleVolPu;
-       bikeCruise.KeepInTime = cp_ulSystickCnt;
-      // bikeCruise.ThrottleResetCruiseFlag = 0;
-   }
-
-   //有故障退出,刹车退出,0档退出
-   if((alm_blAlmOccrFlg == TRUE)
-       ||(BikeBrake_blGetstate() == TRUE)
-       ||(cp_stBikeRunInfoPara.uwBikeGear == 0)
-       ||(bikeCruise.ThrottleResetCruiseFlag == 3))
-   {
-       bikeCruise.CruiseMode = 0;
-       bikeCruise.KeepInTime = cp_ulSystickCnt;
-       bikeCruise.ThrottleResetCruiseFlag = 0;
-   }
-   //指拨重新调速退出
-  if(bikethrottle_stBikeThrottleOut.uwThrottlePercent > 350)
-  {
-      if(bikeCruise.ThrottleResetCruiseFlag == 2)
-      {
-          bikeCruise.ThrottleResetCruiseFlag = 3;
-      }
-  }
-  else
-  {
-      if((bikeCruise.CruiseMode) && (bikeCruise.ThrottleResetCruiseFlag == 1) && (bikethrottle_stBikeThrottleOut.uwThrottlePercent < 200))
-      {
-          bikeCruise.ThrottleResetCruiseFlag = 2;
-      }
-  }
-  
-  if(bikeCruise.CruiseMode != 0)
-  {
-     bikethrottle_stBikeThrottleOut.uwThrottlePercent = bikeCruise.CruisePercent;
-  }
-#endif
+         //指拨重新调速退出
+        if(bikethrottle_stBikeThrottleOut.uwThrottlePercent > 350)
+        {
+            if(bikeCruise.ThrottleResetCruiseFlag == 2)
+            {
+                bikeCruise.ThrottleResetCruiseFlag = 3;
+            }
+        }
+        else
+        {
+            if((bikeCruise.CruiseMode) && (bikeCruise.ThrottleResetCruiseFlag == 1) && (bikethrottle_stBikeThrottleOut.uwThrottlePercent < 200))
+            {
+                bikeCruise.ThrottleResetCruiseFlag = 2;
+            }
+        }
+        
+        if(bikeCruise.CruiseMode != 0)
+        {
+           bikethrottle_stBikeThrottleOut.uwThrottlePercent = bikeCruise.CruisePercent;
+        }
+    }
 }
 /***************************************************************
  Function: Throttlecruise;

+ 117 - 1
User project/3.BasicFunction/Source/can.c

@@ -479,6 +479,7 @@ void DataProcess(UWORD ID, UBYTE Mode, UWORD Cmd, UBYTE Data[]) /* parasoft-supp
             OBC_SetCustomPara.DeltDiameter =(SBYTE) ass_stParaCong.swDeltPerimeter;
             OBC_SetCustomPara.AssistMod = (UBYTE)ass_stParaSet.uwAsssistSelectNum;
             OBC_SetCustomPara.AutoPowerOffTime = (UBYTE)ass_stParaCong.uwAutoPowerOffTime;
+            OBC_SetCustomPara.scDeltaBikeSpeedLimit = (SBYTE)ass_stParaCong.swDeltaBikeSpeedLimit;
             SendData(ID_MC_TO_PBU, MODE_REPORT, 0x5408, (UBYTE *)&OBC_SetCustomPara.uwWheelPerimeter);
             break;
         }
@@ -500,19 +501,38 @@ void DataProcess(UWORD ID, UBYTE Mode, UWORD Cmd, UBYTE Data[]) /* parasoft-supp
             {
                 //do nothing
             }
+            OBC_SetCustomPara.scDeltaBikeSpeedLimit = (SBYTE)Data[4];
+            if(OBC_SetCustomPara.scDeltaBikeSpeedLimit > 0)
+            {
+                OBC_SetCustomPara.scDeltaBikeSpeedLimit = 0;
+            }
+            else if(OBC_SetCustomPara.scDeltaBikeSpeedLimit < (-ass_stParaSet.uwAssistLimitBikeSpdStart))
+            {
+                OBC_SetCustomPara.scDeltaBikeSpeedLimit = (-ass_stParaSet.uwAssistLimitBikeSpdStart);
+            }
+            else
+            {
+                //do nothing
+            }
             
             ass_stParaCong.swDeltPerimeter = OBC_SetCustomPara.DeltDiameter;
             ass_stParaCong.uwStartMode = OBC_SetCustomPara.StartUpMod;
             ass_stParaSet.uwAsssistSelectNum = OBC_SetCustomPara.AssistMod;
             ass_stParaCong.uwAutoPowerOffTime = ass_stParaCong.uwAutoPowerOffTime & 0xFF00;
             ass_stParaCong.uwAutoPowerOffTime |= OBC_SetCustomPara.AutoPowerOffTime;
+            ass_stParaCong.swDeltaBikeSpeedLimit = (SWORD)OBC_SetCustomPara.scDeltaBikeSpeedLimit;
+            
             MC_UpcInfo.stBikeInfo.uwSaveFlg = 1;
             MC_UpcInfo.stBikeInfo.swWheelSizeAdjust = OBC_SetCustomPara.DeltDiameter;
             MC_UpcInfo.stBikeInfo.uwStartMode = OBC_SetCustomPara.StartUpMod;
             MC_UpcInfo.stBikeInfo.uwAutoPowerOffTime = ass_stParaCong.uwAutoPowerOffTime & 0xFF00;
             MC_UpcInfo.stBikeInfo.uwAutoPowerOffTime |= OBC_SetCustomPara.AutoPowerOffTime; 
+            MC_UpcInfo.stBikeInfo2.uwSaveFlg = 1;
+            MC_UpcInfo.stBikeInfo2.swDeltaBikeSpeedLimit = (SWORD)OBC_SetCustomPara.scDeltaBikeSpeedLimit;
+            
             cp_stFlg.ParaUpdateFlg = TRUE;
-            cp_stFlg.ParaBikeInfoUpdateFlg = TRUE;            
+            cp_stFlg.ParaBikeInfoUpdateFlg = TRUE;
+            cp_stFlg.ParaBikeInfo2UpdateFlg = TRUE;
             cp_stFlg.ParaAssistUpdateFinishFlg = TRUE;
             cp_stFlg.ParaSaveEEFlg = TRUE;
             GearBox_Init();
@@ -575,6 +595,25 @@ void DataProcess(UWORD ID, UBYTE Mode, UWORD Cmd, UBYTE Data[]) /* parasoft-supp
 	    SendData(ID_MC_TO_PBU, MODE_REPORT, 0x5303, (uint8_t*)"ACK");
             break;
         }
+        case 0x4300: 
+        {
+            SendData(ID_MC_TO_PBU, MODE_REPORT, 0x5620, (UBYTE *)&MC_UpcInfo.stRideParaInfo.ucAssistRatioGain1);
+            break;
+        }
+        case 0x4420: 
+        {
+            memcpy((uint8_t*)&MC_UpcInfo.stRideParaInfo.ucAssistRatioGain1, Data, DataLength);
+            LimtRidePara();
+
+            MC_UpcInfo.stRideParaInfo.uwSaveFlg = 1;
+            cp_stFlg.ParaUpdateFlg = TRUE;
+            cp_stFlg.ParaRideInfoUpdateFlg = TRUE;         
+            cp_stFlg.ParaAssistUpdateFinishFlg = TRUE;
+            cp_stFlg.ParaSaveEEFlg = TRUE;
+            
+            SendData(ID_MC_TO_PBU, MODE_REPORT, 0x5303, (uint8_t*)"ACK");
+            break;
+        }
         default:
             break;
         }
@@ -1079,6 +1118,56 @@ void DataProcess(UWORD ID, UBYTE Mode, UWORD Cmd, UBYTE Data[]) /* parasoft-supp
             SendData(ID_MC_BC, MODE_REPORT, 0xA903, (UBYTE *)"ACK");
             break;
         }
+        case 0x4A00: 
+        {
+            SendData(ID_MC_TO_CDL, MODE_REPORT, 0xBE20, (UBYTE *)&MC_UpcInfo.stRideParaInfo.ucAssistRatioGain1);
+            break;
+        }
+        case 0x4B22: 
+        {
+            memcpy(&MC_UpcInfo.stRideParaInfo.uwSaveFlg, Data, DataLength);
+            LimtRidePara();
+            if (MC_UpcInfo.stRideParaInfo.uwSaveFlg == 1)
+            {
+                cp_stFlg.ParaSaveEEFlg = TRUE;
+            }
+            cp_stFlg.ParaUpdateFlg = TRUE;
+            cp_stFlg.ParaRideInfoUpdateFlg = TRUE;
+            cp_stFlg.ParaAssistUpdateFinishFlg = TRUE;
+            SendData(ID_MC_TO_CDL, MODE_REPORT, 0xA903, (UBYTE *)"ACK");
+            break;
+        }
+        case 0x4C00: 
+        {
+            SendData(ID_MC_TO_CDL, MODE_REPORT, 0xBD20, (UBYTE *)&MC_UpcInfo.stBikeInfo2.uwNoneOBCEnable);
+            break;
+        }
+        case 0x4D22: 
+        {
+            memcpy(&MC_UpcInfo.stBikeInfo2.uwSaveFlg, Data, DataLength);
+            if(MC_UpcInfo.stBikeInfo2.swDeltaBikeSpeedLimit > 0)
+            {
+                MC_UpcInfo.stBikeInfo2.swDeltaBikeSpeedLimit = 0;
+            }
+            else if(MC_UpcInfo.stBikeInfo2.swDeltaBikeSpeedLimit < (-ass_stParaSet.uwAssistLimitBikeSpdStart))
+            {
+                MC_UpcInfo.stBikeInfo2.swDeltaBikeSpeedLimit = (-ass_stParaSet.uwAssistLimitBikeSpdStart);
+            }
+            else
+            {
+                //do nothing
+            }
+            
+            if (MC_UpcInfo.stBikeInfo2.uwSaveFlg == 1)
+            {
+                cp_stFlg.ParaSaveEEFlg = TRUE;
+            }
+            cp_stFlg.ParaUpdateFlg = TRUE;
+            cp_stFlg.ParaBikeInfo2UpdateFlg = TRUE;
+            cp_stFlg.ParaAssistUpdateFinishFlg = TRUE;
+            SendData(ID_MC_TO_CDL, MODE_REPORT, 0xA903, (UBYTE *)"ACK");
+            break;
+        }
         case 0x4E00: 
         {
             SendData(ID_MC_TO_CDL, MODE_REPORT, 0xBB20, (UBYTE *)MC_VerInfo.ProductLabel);
@@ -1116,6 +1205,33 @@ void DataProcess(UWORD ID, UBYTE Mode, UWORD Cmd, UBYTE Data[]) /* parasoft-supp
     }
 }
 
+void LimtRidePara(void)
+{
+    MC_UpcInfo.stRideParaInfo.ucAssistRatioGain1 = (MC_UpcInfo.stRideParaInfo.ucAssistRatioGain1 < 80)? (80): (MC_UpcInfo.stRideParaInfo.ucAssistRatioGain1 > 120 ? 120 : MC_UpcInfo.stRideParaInfo.ucAssistRatioGain1);
+    MC_UpcInfo.stRideParaInfo.ucAssistRatioGain2 = (MC_UpcInfo.stRideParaInfo.ucAssistRatioGain2 < 80)? (80): (MC_UpcInfo.stRideParaInfo.ucAssistRatioGain2 > 120 ? 120 : MC_UpcInfo.stRideParaInfo.ucAssistRatioGain2);
+    MC_UpcInfo.stRideParaInfo.ucAssistRatioGain3 = (MC_UpcInfo.stRideParaInfo.ucAssistRatioGain3 < 80)? (80): (MC_UpcInfo.stRideParaInfo.ucAssistRatioGain3 > 120 ? 120 : MC_UpcInfo.stRideParaInfo.ucAssistRatioGain3);
+    MC_UpcInfo.stRideParaInfo.ucAssistRatioGain4 = (MC_UpcInfo.stRideParaInfo.ucAssistRatioGain4 < 80)? (80): (MC_UpcInfo.stRideParaInfo.ucAssistRatioGain4 > 120 ? 120 : MC_UpcInfo.stRideParaInfo.ucAssistRatioGain4);
+    MC_UpcInfo.stRideParaInfo.ucAssistRatioGain5 = (MC_UpcInfo.stRideParaInfo.ucAssistRatioGain5 < 80)? (80): (MC_UpcInfo.stRideParaInfo.ucAssistRatioGain5 > 120 ? 120 : MC_UpcInfo.stRideParaInfo.ucAssistRatioGain5);
+    
+    MC_UpcInfo.stRideParaInfo.ucAssistAccelerationGain1 = (MC_UpcInfo.stRideParaInfo.ucAssistAccelerationGain1 < 80)? (80): (MC_UpcInfo.stRideParaInfo.ucAssistAccelerationGain1 > 120 ? 120 : MC_UpcInfo.stRideParaInfo.ucAssistAccelerationGain1);
+    MC_UpcInfo.stRideParaInfo.ucAssistAccelerationGain2 = (MC_UpcInfo.stRideParaInfo.ucAssistAccelerationGain2 < 80)? (80): (MC_UpcInfo.stRideParaInfo.ucAssistAccelerationGain2 > 120 ? 120 : MC_UpcInfo.stRideParaInfo.ucAssistAccelerationGain2);
+    MC_UpcInfo.stRideParaInfo.ucAssistAccelerationGain3 = (MC_UpcInfo.stRideParaInfo.ucAssistAccelerationGain3 < 80)? (80): (MC_UpcInfo.stRideParaInfo.ucAssistAccelerationGain3 > 120 ? 120 : MC_UpcInfo.stRideParaInfo.ucAssistAccelerationGain3);
+    MC_UpcInfo.stRideParaInfo.ucAssistAccelerationGain4 = (MC_UpcInfo.stRideParaInfo.ucAssistAccelerationGain4 < 80)? (80): (MC_UpcInfo.stRideParaInfo.ucAssistAccelerationGain4 > 120 ? 120 : MC_UpcInfo.stRideParaInfo.ucAssistAccelerationGain4);
+    MC_UpcInfo.stRideParaInfo.ucAssistAccelerationGain5 = (MC_UpcInfo.stRideParaInfo.ucAssistAccelerationGain5 < 80)? (80): (MC_UpcInfo.stRideParaInfo.ucAssistAccelerationGain5 > 120 ? 120 : MC_UpcInfo.stRideParaInfo.ucAssistAccelerationGain5);
+    
+    MC_UpcInfo.stRideParaInfo.ucMaxCurrentGain1 = (MC_UpcInfo.stRideParaInfo.ucMaxCurrentGain1 < 80)? (80): (MC_UpcInfo.stRideParaInfo.ucMaxCurrentGain1 > 120 ? 120 : MC_UpcInfo.stRideParaInfo.ucMaxCurrentGain1);
+    MC_UpcInfo.stRideParaInfo.ucMaxCurrentGain2 = (MC_UpcInfo.stRideParaInfo.ucMaxCurrentGain2 < 80)? (80): (MC_UpcInfo.stRideParaInfo.ucMaxCurrentGain2 > 120 ? 120 : MC_UpcInfo.stRideParaInfo.ucMaxCurrentGain2);
+    MC_UpcInfo.stRideParaInfo.ucMaxCurrentGain3 = (MC_UpcInfo.stRideParaInfo.ucMaxCurrentGain3 < 80)? (80): (MC_UpcInfo.stRideParaInfo.ucMaxCurrentGain3 > 120 ? 120 : MC_UpcInfo.stRideParaInfo.ucMaxCurrentGain3);
+    MC_UpcInfo.stRideParaInfo.ucMaxCurrentGain4 = (MC_UpcInfo.stRideParaInfo.ucMaxCurrentGain4 < 80)? (80): (MC_UpcInfo.stRideParaInfo.ucMaxCurrentGain4 > 120 ? 120 : MC_UpcInfo.stRideParaInfo.ucMaxCurrentGain4);
+    MC_UpcInfo.stRideParaInfo.ucMaxCurrentGain5 = (MC_UpcInfo.stRideParaInfo.ucMaxCurrentGain5 < 80)? (80): (MC_UpcInfo.stRideParaInfo.ucMaxCurrentGain5 > 120 ? 120 : MC_UpcInfo.stRideParaInfo.ucMaxCurrentGain5);
+    
+    MC_UpcInfo.stRideParaInfo.ucMaxTorqueGain1 = (MC_UpcInfo.stRideParaInfo.ucMaxTorqueGain1 < 80)? (80): (MC_UpcInfo.stRideParaInfo.ucMaxTorqueGain1 > 120 ? 120 : MC_UpcInfo.stRideParaInfo.ucMaxTorqueGain1);
+    MC_UpcInfo.stRideParaInfo.ucMaxTorqueGain2 = (MC_UpcInfo.stRideParaInfo.ucMaxTorqueGain2 < 80)? (80): (MC_UpcInfo.stRideParaInfo.ucMaxTorqueGain2 > 120 ? 120 : MC_UpcInfo.stRideParaInfo.ucMaxTorqueGain2);
+    MC_UpcInfo.stRideParaInfo.ucMaxTorqueGain3 = (MC_UpcInfo.stRideParaInfo.ucMaxTorqueGain3 < 80)? (80): (MC_UpcInfo.stRideParaInfo.ucMaxTorqueGain3 > 120 ? 120 : MC_UpcInfo.stRideParaInfo.ucMaxTorqueGain3);
+    MC_UpcInfo.stRideParaInfo.ucMaxTorqueGain4 = (MC_UpcInfo.stRideParaInfo.ucMaxTorqueGain4 < 80)? (80): (MC_UpcInfo.stRideParaInfo.ucMaxTorqueGain4 > 120 ? 120 : MC_UpcInfo.stRideParaInfo.ucMaxTorqueGain4);
+    MC_UpcInfo.stRideParaInfo.ucMaxTorqueGain5 = (MC_UpcInfo.stRideParaInfo.ucMaxTorqueGain5 < 80)? (80): (MC_UpcInfo.stRideParaInfo.ucMaxTorqueGain5 > 120 ? 120 : MC_UpcInfo.stRideParaInfo.ucMaxTorqueGain5);
+}
+
 ULONG CRC32_Calculate(const UBYTE pData[], UWORD Length)
 {
     ULONG nReg;

+ 64 - 11
User project/3.BasicFunction/Source/canAppl.c

@@ -84,8 +84,8 @@ void Can_voUpdateMC_UpcInfo(void)
 
     MC_UpcInfo.stBikeInfo.uwWheelPerimeter = ass_stParaCong.uwWheelPerimeter;
     MC_UpcInfo.stBikeInfo.uwMechRationMotor = ass_stParaCong.uwMechRationMotor;
-    MC_UpcInfo.stBikeInfo.uwAssistMaxSpdKmH = ass_stParaCong.uwAssistMaxSpdKmH;
     MC_UpcInfo.stBikeInfo.uwThrottleMaxSpdKmH = ass_stParaCong.uwThrottleMaxSpdKmH;
+    MC_UpcInfo.stBikeInfo.uwCartSpdKmH = ass_stParaCong.uwCartSpdKmH;
     MC_UpcInfo.stBikeInfo.uwNmFrontChainring = ass_stParaCong.uwNmFrontChainring;
     MC_UpcInfo.stBikeInfo.uwNmBackChainring = ass_stParaCong.uwNmBackChainring;
     MC_UpcInfo.stBikeInfo.uwAssistSelect1 = ass_stParaCong.uwAssistSelect1;
@@ -106,6 +106,11 @@ void Can_voUpdateMC_UpcInfo(void)
     MC_UpcInfo.stMContorlInfo.uwAlamOverHeatCe = cp_stControlPara.swAlmOverHeatCeVal;
     MC_UpcInfo.stMContorlInfo.uwAlamRecHeatCe = cp_stControlPara.swAlmRecOHeatVal;
     MC_UpcInfo.stMContorlInfo.uwPwrLimitStartCe = cp_stControlPara.swAlmPwrLimitStartTempVal;
+//    MC_UpcInfo.stMContorlInfo.uwAlamMotorOverHeatCe = cp_stControlPara.swAlmMotorOverHeatCeVal;
+//    MC_UpcInfo.stMContorlInfo.uwAlamMotorRecHeatCe = cp_stControlPara.swAlmMotorRecOHeatVal;
+//    MC_UpcInfo.stMContorlInfo.uwPwrLimitMotorStartCe = cp_stControlPara.swAlmPwrLimitMotorStartTempVal;
+    MC_UpcInfo.stMContorlInfo.uwControlFunEN = cp_stControlPara.uwControlFunEN;
+    MC_UpcInfo.stMContorlInfo.uwThrottleGearEN = cp_stControlPara.uwThrottleGearEN;
 
     MC_UpcInfo.stSensorInfo.uwTorSensorOffsetOrigin = torsensor_stTorSensorCof.uwTorqueOffsetOrign;
     MC_UpcInfo.stSensorInfo.uwTorSensorOffsetNow1 = torsensor_stTorSensorCof.uwTorqueOffsetNow1;
@@ -136,13 +141,41 @@ void Can_voUpdateMC_UpcInfo(void)
     MC_UpcInfo.stAssistInfo.uwAssistLimitBikeSpdStart = ass_stParaSet.uwAssistLimitBikeSpdStart;
     MC_UpcInfo.stAssistInfo.uwAssistLimitBikeSpdStop = ass_stParaSet.uwAssistLimitBikeSpdStop;
     MC_UpcInfo.stAssistInfo.uwCadenceAssistWeight = ass_stParaSet.uwCadenceWeight;
+    
+    MC_UpcInfo.stRideParaInfo.ucAssistRatioGain1 = ass_stCalCoef.ucAssistRatioGain[0];
+    MC_UpcInfo.stRideParaInfo.ucAssistRatioGain2 = ass_stCalCoef.ucAssistRatioGain[1];
+    MC_UpcInfo.stRideParaInfo.ucAssistRatioGain3 = ass_stCalCoef.ucAssistRatioGain[2];
+    MC_UpcInfo.stRideParaInfo.ucAssistRatioGain4 = ass_stCalCoef.ucAssistRatioGain[3];
+    MC_UpcInfo.stRideParaInfo.ucAssistRatioGain5 = ass_stCalCoef.ucAssistRatioGain[4];
+    
+    MC_UpcInfo.stRideParaInfo.ucAssistAccelerationGain1 = ass_stCalCoef.ucAssistAccelerationGain[0];
+    MC_UpcInfo.stRideParaInfo.ucAssistAccelerationGain2 = ass_stCalCoef.ucAssistAccelerationGain[1];
+    MC_UpcInfo.stRideParaInfo.ucAssistAccelerationGain3 = ass_stCalCoef.ucAssistAccelerationGain[2];
+    MC_UpcInfo.stRideParaInfo.ucAssistAccelerationGain4 = ass_stCalCoef.ucAssistAccelerationGain[3];
+    MC_UpcInfo.stRideParaInfo.ucAssistAccelerationGain5 = ass_stCalCoef.ucAssistAccelerationGain[4];
+    
+    MC_UpcInfo.stRideParaInfo.ucMaxCurrentGain1 = ass_stCalCoef.ucMaxCurrentGain[0];
+    MC_UpcInfo.stRideParaInfo.ucMaxCurrentGain2 = ass_stCalCoef.ucMaxCurrentGain[1];
+    MC_UpcInfo.stRideParaInfo.ucMaxCurrentGain3 = ass_stCalCoef.ucMaxCurrentGain[2];
+    MC_UpcInfo.stRideParaInfo.ucMaxCurrentGain4 = ass_stCalCoef.ucMaxCurrentGain[3];
+    MC_UpcInfo.stRideParaInfo.ucMaxCurrentGain5 = ass_stCalCoef.ucMaxCurrentGain[4];
+    
+    MC_UpcInfo.stRideParaInfo.ucMaxTorqueGain1 = ass_stCalCoef.ucMaxTorqueGain[0];
+    MC_UpcInfo.stRideParaInfo.ucMaxTorqueGain2 = ass_stCalCoef.ucMaxTorqueGain[1];
+    MC_UpcInfo.stRideParaInfo.ucMaxTorqueGain3 = ass_stCalCoef.ucMaxTorqueGain[2];
+    MC_UpcInfo.stRideParaInfo.ucMaxTorqueGain4 = ass_stCalCoef.ucMaxTorqueGain[3];
+    MC_UpcInfo.stRideParaInfo.ucMaxTorqueGain5 = ass_stCalCoef.ucMaxTorqueGain[4];
+    
+    MC_UpcInfo.stBikeInfo2.uwNoneOBCEnable = ass_stParaCong.uwNoneOBCEnable;
+    MC_UpcInfo.stBikeInfo2.uwRearLightCycle = ass_stParaCong.uwRearLightCycle;
+    MC_UpcInfo.stBikeInfo2.uwRearLightDuty = ass_stParaCong.uwRearLightDuty;
+    MC_UpcInfo.stBikeInfo2.swDeltaBikeSpeedLimit = ass_stParaCong.swDeltaBikeSpeedLimit;
 
     MC_UpcInfo.stHistoryInfo.uwOpenTimes = cp_stHistoryPara.uwOpenTimes;
     MC_UpcInfo.stHistoryInfo.uwUsedTimeH = (UWORD)(cp_stHistoryPara.ulUsedTime >> 16);
     MC_UpcInfo.stHistoryInfo.uwUsedTimeL = (UWORD)(cp_stHistoryPara.ulUsedTime);
     MC_UpcInfo.stHistoryInfo.uwNTCTempMaxCe = cp_stHistoryPara.uwNTCTempMaxCe;
     MC_UpcInfo.stHistoryInfo.uwNTCTempMinCe = cp_stHistoryPara.uwNTCTempMinCe;
-    ;
 
     MC_UpcInfo.stHistoryInfo.uwAlamHOcurTimes = cp_stHistoryPara.uwAlamHOcurTimes;
     MC_UpcInfo.stHistoryInfo.uwAlamSOcurTimes = cp_stHistoryPara.uwAlamSOcurTimes;
@@ -219,6 +252,7 @@ void Can_voUpdateMC_UpcInfo(void)
     OBC_SetCustomPara.DeltDiameter =  (SBYTE)ass_stParaCong.swDeltPerimeter;
     OBC_SetCustomPara.AssistMod =  (UBYTE)ass_stParaSet.uwAsssistSelectNum;
     OBC_SetCustomPara.AutoPowerOffTime =  (UBYTE)ass_stParaCong.uwAutoPowerOffTime;
+    OBC_SetCustomPara.scDeltaBikeSpeedLimit =  (SBYTE)ass_stParaCong.swDeltaBikeSpeedLimit;
     
     if(cp_stMotorPara.swRUdcV == 360)
     {
@@ -244,16 +278,26 @@ void Can_voInitMC_Run(void)
     ULONG MCU_ID_CRC32;
     flash_voRead();
     // Hardware version
-#if(MOTOR_ID_SEL == MOTOR_WELLING_CITY_36V)
-	strncpy(MC_VerInfo.HW_Version, (char *)"CITY-36V", 8);
-#elif(MOTOR_ID_SEL == MOTOR_WELLING_CITY_48V)
-	strncpy(MC_VerInfo.HW_Version, (char *)"CITY-48V", 8);
-#elif(MOTOR_ID_SEL == MOTOR_WELLING_MTB_36V)
-	strncpy(MC_VerInfo.HW_Version, (char *)"MTB-36V ", 8);
-#elif(MOTOR_ID_SEL == MOTOR_WELLING_MTB_48V)
-	strncpy(MC_VerInfo.HW_Version, (char *)"MTB-48V ", 8);
+#if ((MOTOR_ID_SEL == MOTOR_WELLING_CITY_36V) || (MOTOR_ID_SEL == MOTOR_WELLING_CITY_48V))
+      if(cp_stMotorPara.swRUdcV == 480)
+      {
+          strncpy(MC_VerInfo.HW_Version, (char *)"CITY-48V", 8);
+      }
+      else
+      {
+          strncpy(MC_VerInfo.HW_Version, (char *)"CITY-36V", 8);
+      }
+#elif ((MOTOR_ID_SEL == MOTOR_WELLING_MTB_36V) || (MOTOR_ID_SEL == MOTOR_WELLING_MTB_48V))
+      if(cp_stMotorPara.swRUdcV == 480)
+      {
+          strncpy(MC_VerInfo.HW_Version, (char *)"MTB-48V ", 8);
+      }
+      else
+      {
+          strncpy(MC_VerInfo.HW_Version, (char *)"MTB-36V ", 8);
+      }
 #else
-	strncpy(MC_VerInfo.HW_Version, (char *)"TEST    ", 8);
+      strncpy(MC_VerInfo.HW_Version, (char *)"TEST    ", 8);
 #endif
     
     strncpy(MC_VerInfo.HW_Version + 8, (char *)"GD .", 4);
@@ -1023,9 +1067,18 @@ void Can_GearSt_switch(void)
         cp_stBikeRunInfoPara.uwBikeGear = 0x00;
     }
 
+    if((ass_stParaCong.uwNoneOBCEnable & 0xFF) == 0xAA)
+    {
+        ulOBC_ComTimeOutCount = cp_ulSystickCnt;
+        MC_ControlCode.GearSt = MC_GearSt_SMART;
+        MC_RunInfo.GearSt = MC_GearSt_SMART;
+        cp_stBikeRunInfoPara.uwBikeGear = 5;
+    }
+    
     if (cp_stBikeRunInfoPara.uwBikeGear != cp_stBikeRunInfoPara.uwBikeGearLast)
     {
         cp_stBikeRunInfoPara.blGearStUpdate = TRUE;
+        scm_voLimit_Power(cp_stBikeRunInfoPara.uwBikeGear, ass_uwPwrCurLim, ass_stCalCoef.ucMaxCurrentGain);//功率限制
     }
     else
     {

+ 3 - 3
User project/3.BasicFunction/Source/giant_can.c

@@ -839,13 +839,13 @@ void giant_DataProcess(void)
         {
             MC_UpcInfo.stAssistInfo.uwAssistLimitBikeSpdStart = stGiantControlParams.SpeedLimitation/100;
             MC_UpcInfo.stAssistInfo.uwAssistLimitBikeSpdStop = stGiantControlParams.SpeedLimitation/100 + 2;
-            MC_UpcInfo.stBikeInfo.uwThrottleMaxSpdKmH = stGiantControlParams.SpeedLimitation/100;
-            MC_UpcInfo.stBikeInfo.uwSaveFlg = 0;
+            //MC_UpcInfo.stBikeInfo.uwThrottleMaxSpdKmH = stGiantControlParams.SpeedLimitation/100;
+            //MC_UpcInfo.stBikeInfo.uwSaveFlg = 0;
             MC_UpcInfo.stAssistInfo.uwSaveFlg = 0;
             cp_stFlg.ParaSaveEEFlg = FALSE;
             cp_stFlg.ParaUpdateFlg = TRUE;
             cp_stFlg.ParaAInfoUpdateFlg = TRUE;
-            cp_stFlg.ParaBikeInfoUpdateFlg = TRUE;
+            //cp_stFlg.ParaBikeInfoUpdateFlg = TRUE;
             cp_stFlg.ParaAssistUpdateFinishFlg = TRUE;
         }
     }

+ 112 - 4
User project/3.BasicFunction/Source/i2c_master.c

@@ -217,6 +217,7 @@ void i2c_voHistoryDefaultWriteBuffer(void)
 {
     /* History default value write*/ 
     UWORD *I2C_pBuffer;
+    UBYTE *I2C_pBuffer_byte;
     UBYTE  i;
 
     I2C_pBuffer = &Syspara2.stHistoryPara.uwAssModSelect.uwDefault1;
@@ -226,10 +227,33 @@ void i2c_voHistoryDefaultWriteBuffer(void)
         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 "本项目无法更改,后续避免非数组索引指针运算" */
     }
+    
+    I2C_pBuffer_byte = &Syspara2.stRidePara.ucAssistRatioGain1.ucDefault1;
+    for (i = 0; i < I2C_RIDE_PARA_N_BYTES; i++)
+    {
+        I2C_ubHistoyWriteBuffer[I2C_RIDE_PARA_ADDR + i] = (UBYTE)(*I2C_pBuffer_byte);
+        I2C_pBuffer_byte += I2C_PBUFFERBYTE_BYTES;
+    }
+    
+    I2C_pBuffer = &Syspara2.stBikePara2.uwNoneOBCEnable.uwDefault1;
+    for (i = 0; i < I2C_BIKE_PARA2_N_WORDS; i++)
+    {
+        I2C_ubHistoyWriteBuffer[I2C_BIKE_PARA2_ADDR + 2 * i] = (UBYTE)(*I2C_pBuffer >> 8);
+        I2C_ubHistoyWriteBuffer[I2C_BIKE_PARA2_ADDR + 2 * i + 1] = (UBYTE)(*I2C_pBuffer);
+        I2C_pBuffer += I2C_PBUFFER_NWORDS;
+    }
 
     I2C_pHistoryWriteBuffer = I2C_ubHistoyWriteBuffer;
     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));
+    
+    I2C_pHistoryWriteBuffer = I2C_ubHistoyWriteBuffer + I2C_RIDE_PARA_ADDR;
+    I2C_ubHistoyWriteBuffer[I2C_RIDE_PARA_CRC_ADDR] = (UBYTE)(i2c_uwCRCCcitt(I2C_pHistoryWriteBuffer, I2C_RIDE_PARA_N_BYTES) >> 8);
+    I2C_ubHistoyWriteBuffer[I2C_RIDE_PARA_CRC_ADDR + 1] = (UBYTE)(i2c_uwCRCCcitt(I2C_pHistoryWriteBuffer, I2C_RIDE_PARA_N_BYTES));
+    
+    I2C_pHistoryWriteBuffer = I2C_ubHistoyWriteBuffer + I2C_BIKE_PARA2_ADDR;
+    I2C_ubHistoyWriteBuffer[I2C_BIKE_PARA2_CRC_ADDR] = (UBYTE)(i2c_uwCRCCcitt(I2C_pHistoryWriteBuffer, I2C_BIKE_PARA2_N_BYTES) >> 8);
+    I2C_ubHistoyWriteBuffer[I2C_BIKE_PARA2_CRC_ADDR + 1] = (UBYTE)(i2c_uwCRCCcitt(I2C_pHistoryWriteBuffer, I2C_BIKE_PARA2_N_BYTES));
 }
 /*************************************************************************
  Function:
@@ -243,6 +267,7 @@ void i2c_voHistoryDefaultWriteBuffer(void)
 void i2c_voHistoryWriteBuffer(void)
 {
     UWORD *I2C_pBuffer;
+    UBYTE *I2C_pBuffer_byte;
     UBYTE  i;
 
     I2C_pBuffer = &Syspara2.stHistoryPara.uwAssModSelect.uwDefault1;
@@ -252,10 +277,33 @@ void i2c_voHistoryWriteBuffer(void)
         I2C_ubHistoyWriteBuffer[I2C_HISTORY_PARA_ARDDR + 2 * i + 1] = (UBYTE)(*(I2C_pBuffer + 1));
         I2C_pBuffer += I2C_PBUFFER_NWORDS;
     }
+    
+    I2C_pBuffer_byte = &Syspara2.stRidePara.ucAssistRatioGain1.ucDefault1;
+    for (i = 0; i < I2C_RIDE_PARA_N_BYTES; i++)
+    {
+        I2C_ubHistoyWriteBuffer[I2C_RIDE_PARA_ADDR + i] = (UBYTE)(*(I2C_pBuffer_byte + 1));
+        I2C_pBuffer_byte += I2C_PBUFFERBYTE_BYTES;
+    }
+    
+    I2C_pBuffer = &Syspara2.stBikePara2.uwNoneOBCEnable.uwDefault1;
+    for (i = 0; i < I2C_BIKE_PARA2_N_WORDS; i++)
+    {
+        I2C_ubHistoyWriteBuffer[I2C_BIKE_PARA2_ADDR + 2 * i] = (UBYTE)(*(I2C_pBuffer + 1) >> 8);
+        I2C_ubHistoyWriteBuffer[I2C_BIKE_PARA2_ADDR + 2 * i + 1] = (UBYTE)(*(I2C_pBuffer + 1));
+        I2C_pBuffer += I2C_PBUFFER_NWORDS;
+    }
 
     I2C_pHistoryWriteBuffer = I2C_ubHistoyWriteBuffer;
     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));
+    
+    I2C_pHistoryWriteBuffer = I2C_ubHistoyWriteBuffer + I2C_RIDE_PARA_ADDR;
+    I2C_ubHistoyWriteBuffer[I2C_RIDE_PARA_CRC_ADDR] = (UBYTE)(i2c_uwCRCCcitt(I2C_pHistoryWriteBuffer, I2C_RIDE_PARA_N_BYTES) >> 8);
+    I2C_ubHistoyWriteBuffer[I2C_RIDE_PARA_CRC_ADDR + 1] = (UBYTE)(i2c_uwCRCCcitt(I2C_pHistoryWriteBuffer, I2C_RIDE_PARA_N_BYTES));
+    
+    I2C_pHistoryWriteBuffer = I2C_ubHistoyWriteBuffer + I2C_BIKE_PARA2_ADDR;
+    I2C_ubHistoyWriteBuffer[I2C_BIKE_PARA2_CRC_ADDR] = (UBYTE)(i2c_uwCRCCcitt(I2C_pHistoryWriteBuffer, I2C_BIKE_PARA2_N_BYTES) >> 8);
+    I2C_ubHistoyWriteBuffer[I2C_BIKE_PARA2_CRC_ADDR + 1] = (UBYTE)(i2c_uwCRCCcitt(I2C_pHistoryWriteBuffer, I2C_BIKE_PARA2_N_BYTES));
 }
 /*************************************************************************
  Function:
@@ -444,9 +492,9 @@ UWORD i2c_uwCRCCcitt(const UBYTE *ptubBuf, UWORD length)
 void  i2c_voReadBufferCRC(I2C_RXCRC_OUT *out)
 {
     UWORD uwMotorParaCRC, uwBikeParaCRC, uwMControlParaCRC;
-    UWORD uwSensorParaCRC, uwAssistParaCRC, uwGearBoxParaCRC, uwHistoryParaCRC;
+    UWORD uwSensorParaCRC, uwAssistParaCRC, uwGearBoxParaCRC, uwHistoryParaCRC, uwRideParaCRC, uwBikePara2CRC;
     UWORD uwMotorParaRdCRC, uwBikeParaRdCRC, uwMControlParaRdCRC;
-    UWORD uwSensorParaRdCRC, uwAssistParaRdCRC, uwGearBoxParaRdCRC, uwHistoryParaRdCRC;
+    UWORD uwSensorParaRdCRC, uwAssistParaRdCRC, uwGearBoxParaRdCRC, uwHistoryParaRdCRC, uwRideParaRdCRC, uwBikePara2RdCRC;
 
     I2C_pReadBuffer = I2C_ubReadBuffer[0];
     uwMotorParaCRC = i2c_uwCRCCcitt(I2C_pReadBuffer, I2C_MOTOR_PARA_N_BYTES);
@@ -458,6 +506,8 @@ void  i2c_voReadBufferCRC(I2C_RXCRC_OUT *out)
     
     I2C_pReadBuffer = I2C_ubReadBuffer[1];
     uwHistoryParaCRC = i2c_uwCRCCcitt(I2C_pReadBuffer, I2C_HISTORY_PARA_N_BYTES);
+    uwRideParaCRC = i2c_uwCRCCcitt(I2C_pReadBuffer + I2C_RIDE_PARA_ADDR, I2C_RIDE_PARA_N_BYTES);
+    uwBikePara2CRC = i2c_uwCRCCcitt(I2C_pReadBuffer + I2C_BIKE_PARA2_ADDR, I2C_BIKE_PARA2_N_BYTES);
 
     uwMotorParaRdCRC = (UWORD)((UWORD)I2C_ubReadBuffer[0][I2C_MOTOR_PARA_CRC_ARDDR] << 8) + I2C_ubReadBuffer[0][I2C_MOTOR_PARA_CRC_ARDDR + 1];
     uwBikeParaRdCRC = (UWORD)((UWORD)I2C_ubReadBuffer[0][I2C_BIKE_PARA_CRC_ARDDR] << 8) + I2C_ubReadBuffer[0][I2C_BIKE_PARA_CRC_ARDDR + 1];
@@ -466,6 +516,8 @@ void  i2c_voReadBufferCRC(I2C_RXCRC_OUT *out)
     uwAssistParaRdCRC = (UWORD)((UWORD)I2C_ubReadBuffer[0][I2C_ASSIST_PARA_CRC_ARDDR] << 8) + I2C_ubReadBuffer[0][I2C_ASSIST_PARA_CRC_ARDDR + 1];
     uwGearBoxParaRdCRC = (UWORD)((UWORD)I2C_ubReadBuffer[0][I2C_GEARBOX_PARA_CRC_ADDR] << 8) + I2C_ubReadBuffer[0][I2C_GEARBOX_PARA_CRC_ADDR + 1];
     uwHistoryParaRdCRC = (UWORD)((UWORD)I2C_ubReadBuffer[1][I2C_HISTORY_PARA_CRC_ARDDR] << 8) + I2C_ubReadBuffer[1][I2C_HISTORY_PARA_CRC_ARDDR + 1];
+    uwRideParaRdCRC = (UWORD)((UWORD)I2C_ubReadBuffer[1][I2C_RIDE_PARA_CRC_ADDR] << 8) + I2C_ubReadBuffer[1][I2C_RIDE_PARA_CRC_ADDR + 1];
+    uwBikePara2RdCRC = (UWORD)((UWORD)I2C_ubReadBuffer[1][I2C_BIKE_PARA2_CRC_ADDR] << 8) + I2C_ubReadBuffer[1][I2C_BIKE_PARA2_CRC_ADDR + 1];
 
     if (uwMotorParaCRC != uwMotorParaRdCRC)
     {
@@ -495,6 +547,14 @@ void  i2c_voReadBufferCRC(I2C_RXCRC_OUT *out)
     {
         out->blHistoryParaFltFlg = TRUE;
     }
+    if (uwRideParaCRC != uwRideParaRdCRC)
+    {
+        out->blRideParaFltFlg = TRUE;
+    }
+    if (uwBikePara2CRC != uwBikePara2RdCRC)
+    {
+        out->blBikePara2FltFlg = TRUE;
+    }
 }
 /*************************************************************************
  Function:
@@ -583,6 +643,28 @@ void i2c_voGetValueFrmBuffer(const I2C_RXCRC_OUT *out)
     }
     else
     {}
+    
+    if (out->blRideParaFltFlg != TRUE)
+    {
+        for (j = 0; j < I2C_RIDE_PARA_N_WORDS; j++)
+        {
+            I2C_uwRideParaRead[j] =
+                        (UWORD)((UWORD)I2C_ubReadBuffer[1][I2C_RIDE_PARA_ADDR + 2 * j] << 8) + I2C_ubReadBuffer[1][I2C_RIDE_PARA_ADDR + 2 * j + 1];
+        }
+    }
+    else
+    {}
+    
+    if (out->blBikePara2FltFlg != TRUE)
+    {
+        for (j = 0; j < I2C_BIKE_PARA2_N_WORDS; j++)
+        {
+            I2C_uwBikePara2Read[j] =
+                        (UWORD)((UWORD)I2C_ubReadBuffer[1][I2C_BIKE_PARA2_ADDR + 2 * j] << 8) + I2C_ubReadBuffer[1][I2C_BIKE_PARA2_ADDR + 2 * j + 1];
+        }
+    }
+    else
+    {}
 
     Syspara2.stMotorPara.uwPolePairs.uwReal = I2C_uwMotorParaRead[0];
     Syspara2.stMotorPara.uwRsmOhm.uwReal = I2C_uwMotorParaRead[1];
@@ -600,8 +682,8 @@ void i2c_voGetValueFrmBuffer(const I2C_RXCRC_OUT *out)
 
     Syspara2.stBikePara.uwWheelPerimeter.uwReal = I2C_uwBikeParaRead[0];
     Syspara2.stBikePara.uwMechRationMotor.uwReal = I2C_uwBikeParaRead[1];
-    Syspara2.stBikePara.uwAssistMaxSpdKmH.uwReal = I2C_uwBikeParaRead[2];
-    Syspara2.stBikePara.uwThrottleMaxSpdKmH.uwReal = I2C_uwBikeParaRead[3];
+    Syspara2.stBikePara.uwThrottleMaxSpdKmH.uwReal = I2C_uwBikeParaRead[2];
+    Syspara2.stBikePara.uwCartSpdKmH.uwReal = I2C_uwBikeParaRead[3];
     Syspara2.stBikePara.uwNmFrontChainring.uwReal = I2C_uwBikeParaRead[4];
     Syspara2.stBikePara.uwNmBackChainring.uwReal = I2C_uwBikeParaRead[5];
     Syspara2.stBikePara.uwAssistSelect1.uwReal = I2C_uwBikeParaRead[6];
@@ -658,6 +740,32 @@ void i2c_voGetValueFrmBuffer(const I2C_RXCRC_OUT *out)
     Syspara2.stGearBoxPara.uwGearBoxNum.uwReal = I2C_uwGearBoxParaRead[0];
     Syspara2.stGearBoxPara.uwGearBoxCadenceMin.uwReal = I2C_uwGearBoxParaRead[1];
     Syspara2.stGearBoxPara.uwGearBoxCadenceMax.uwReal = I2C_uwGearBoxParaRead[2];
+    
+    Syspara2.stRidePara.ucAssistRatioGain1.ucReal = (UBYTE)(I2C_uwRideParaRead[0]>>8);
+    Syspara2.stRidePara.ucAssistAccelerationGain1.ucReal = (UBYTE)(I2C_uwRideParaRead[0]);
+    Syspara2.stRidePara.ucAssistRatioGain2.ucReal = (UBYTE)(I2C_uwRideParaRead[1]>>8);
+    Syspara2.stRidePara.ucAssistAccelerationGain2.ucReal = (UBYTE)(I2C_uwRideParaRead[1]);
+    Syspara2.stRidePara.ucAssistRatioGain3.ucReal = (UBYTE)(I2C_uwRideParaRead[2]>>8);
+    Syspara2.stRidePara.ucAssistAccelerationGain3.ucReal = (UBYTE)(I2C_uwRideParaRead[2]);
+    Syspara2.stRidePara.ucAssistRatioGain4.ucReal = (UBYTE)(I2C_uwRideParaRead[3]>>8);
+    Syspara2.stRidePara.ucAssistAccelerationGain4.ucReal = (UBYTE)(I2C_uwRideParaRead[3]);
+    Syspara2.stRidePara.ucAssistRatioGain5.ucReal = (UBYTE)(I2C_uwRideParaRead[4]>>8);
+    Syspara2.stRidePara.ucAssistAccelerationGain5.ucReal = (UBYTE)(I2C_uwRideParaRead[4]);
+    Syspara2.stRidePara.ucMaxCurrentGain1.ucReal = (UBYTE)(I2C_uwRideParaRead[5]>>8);
+    Syspara2.stRidePara.ucMaxTorqueGain1.ucReal = (UBYTE)(I2C_uwRideParaRead[5]);
+    Syspara2.stRidePara.ucMaxCurrentGain2.ucReal = (UBYTE)(I2C_uwRideParaRead[6]>>8);
+    Syspara2.stRidePara.ucMaxTorqueGain2.ucReal = (UBYTE)(I2C_uwRideParaRead[6]);
+    Syspara2.stRidePara.ucMaxCurrentGain3.ucReal = (UBYTE)(I2C_uwRideParaRead[7]>>8);
+    Syspara2.stRidePara.ucMaxTorqueGain3.ucReal = (UBYTE)(I2C_uwRideParaRead[7]);
+    Syspara2.stRidePara.ucMaxCurrentGain4.ucReal = (UBYTE)(I2C_uwRideParaRead[8]>>8);
+    Syspara2.stRidePara.ucMaxTorqueGain4.ucReal = (UBYTE)(I2C_uwRideParaRead[8]);
+    Syspara2.stRidePara.ucMaxCurrentGain5.ucReal = (UBYTE)(I2C_uwRideParaRead[9]>>8);
+    Syspara2.stRidePara.ucMaxTorqueGain5.ucReal = (UBYTE)(I2C_uwRideParaRead[9]);
+       
+    Syspara2.stBikePara2.uwNoneOBCEnable.uwReal = I2C_uwBikePara2Read[0];
+    Syspara2.stBikePara2.uwRearLightCycle.uwReal = I2C_uwBikePara2Read[1];
+    Syspara2.stBikePara2.uwRearLightDuty.uwReal = I2C_uwBikePara2Read[2];
+    Syspara2.stBikePara2.swDeltaBikeSpeedLimit.swReal = I2C_uwBikePara2Read[3];
 
     Syspara2.stHistoryPara.uwAssModSelect.uwReal = I2C_uwHistoryParaRead[0];
     Syspara2.stHistoryPara.uwOpenTimes.uwReal = I2C_uwHistoryParaRead[1];

+ 7 - 0
User project/4.BasicHardwSoftwLayer/2.BasicSoftwLayer/Include/CodePara.h

@@ -93,6 +93,8 @@ typedef struct
     BOOL ParaSensorInfoUpdateFlg;
     BOOL ParaAInfoUpdateFlg;
     BOOL TestParaInfoUpdateFlg;
+    BOOL ParaRideInfoUpdateFlg;
+    BOOL ParaBikeInfo2UpdateFlg;
 
     BOOL ParaMotorDriveUpdateFinishFlg;
     BOOL ParaAssistUpdateFinishFlg;
@@ -151,6 +153,11 @@ typedef struct
     SWORD swAlmOverHeatCeVal;
     SWORD swAlmOverHeatTM;
     SWORD swAlmPwrLimitStartTempVal;
+//    SWORD swAlmMotorOverHeatCeVal;
+//    SWORD swAlmMotorOverHeatTM;
+//    SWORD swAlmPwrLimitMotorStartTempVal;
+    UWORD uwControlFunEN;
+    UWORD uwThrottleGearEN;
 
     SWORD swAlmThrPhsShrtFrcTM;
     SWORD swAlmPWMOffTM;

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

@@ -47,7 +47,7 @@ Update Time
 #define MOTOR_WELLING_CITY_48V 0x30
 #define MOTOR_WELLING_MTB_48V  0x31
 
-#define MOTOR_ID_SEL      MOTOR_WELLING_CITY_36V
+#define MOTOR_ID_SEL      MOTOR_WELLING_MTB_48V
 #define GEARSENSOR_ENABLE 1 // 0-Uart,1-GearSensor
 
 // #define TEST  //only use for testing
@@ -77,13 +77,16 @@ Update Time
 巡航Bike Cruise
  //指拨巡航功能   0xAA-指拨维持不动维持8秒,进入巡航功能,仪表出线巡航图标,刹车,0档,有助力踏频,重新调速,有故障会退出,else-无巡航功能
 *=======================================================================*/
-#define  THOTTLECRUISE_EN             0xAA
+#define  THOTTLECRUISE_EN             0x00      //0xAA-enable,else-disable
 /*======================================================================*
   NOT ZERO Ssart
    //0xAA-速度非零起动,速度大于3KM/H,转把才有效 ;else-车速为零可以转把启动
 *=======================================================================*/
-#define  THOTTLE_STARTRUNATSPEED      0xAA      //0xAA-enable,else-disable
- 
+#define  THOTTLE_STARTRUNATSPEED      0x00      //0xAA-enable,else-disable
+/*======================================================================*
+   //转把分档
+*=======================================================================*/  
+#define THROTTLEGEAR_ENABLE           0xAA      //转把分档 0xAA-enable,else-disable
 /*======================================================================*
     Motor Parameters
 *=======================================================================*/

+ 6 - 0
User project/4.BasicHardwSoftwLayer/2.BasicSoftwLayer/Source/CodePara.c

@@ -69,6 +69,8 @@ void CodeParaInit(void)
     cp_stFlg.ParaSensorInfoUpdateFlg = FALSE;
     cp_stFlg.ParaAInfoUpdateFlg = FALSE;
     cp_stFlg.TestParaInfoUpdateFlg = FALSE;
+    cp_stFlg.ParaRideInfoUpdateFlg = FALSE;
+    cp_stFlg.ParaBikeInfo2UpdateFlg = FALSE;
 
     cp_stFlg.ParaMotorDriveUpdateFinishFlg = FALSE;
     cp_stFlg.ParaAssistUpdateFinishFlg = FALSE;
@@ -121,6 +123,10 @@ void CodeParaInit(void)
     cp_stControlPara.swAlmOverHeatCeVal = ALM_IPM_OVR_HEAT_VAL;
     cp_stControlPara.swAlmOverHeatTM = ALM_IPM_OVR_TM;
     cp_stControlPara.swAlmPwrLimitStartTempVal = PWRLIM_START_THRESHOLD_TEMP;
+//    cp_stControlPara.swAlmMotorOverHeatCeVal = ALM_MOTOR_OVR_HEAT_VAL;
+//    cp_stControlPara.swAlmPwrLimitMotorStartTempVal = PWRLIM_START_THRESHOLD_MOTOR_TEMP;
+    cp_stControlPara.uwControlFunEN = THOTTLECRUISE_EN;
+    cp_stControlPara.uwThrottleGearEN = THROTTLEGEAR_ENABLE;
 
     cp_stControlPara.swAlmThrPhsShrtFrcTM = ALM_THR_PHS_SHRT_FRC_TM;
     cp_stControlPara.swAlmPWMOffTM = ALM_PWM_OFF_TM;

+ 2 - 2
User project/5.Api_rt/api_rt_i2c.c

@@ -533,12 +533,12 @@ int iI2C_Read(uint8_t devIndex, uint16_t devAddr, uint16_t memAddr, uint8_t memA
             /* Send a stop condition to I2C bus */
             i2c_stop_on_bus(I2Cs[devIndex].I2CBase);
             /* I2C master sends STOP signal successfully */
-            while((I2C_CTL0(I2Cs[devIndex].I2CBase) & I2C_CTL0_STOP) && (timeoutCnt < I2C_TIME_OUT)) 
+            while((I2C_CTL0(I2Cs[devIndex].I2CBase) & I2C_CTL0_STOP) && (timeoutCnt < (11*I2C_TIME_OUT))) 
             {
                 timeoutCnt++;
             }
 
-            if(timeoutCnt < I2C_TIME_OUT)
+            if(timeoutCnt < (11*I2C_TIME_OUT))
             {
                 timeoutCnt = 0;                 
                 i2c_timeout_flag = 1;

+ 4 - 4
User project/5.Api_rt/api_rt_pwm.c

@@ -385,12 +385,12 @@ void iPwm_SetCompareMode(uint8_t devIndex, uint8_t channelIndex, ApiPwm_CompareM
         TIMER_CHCTL0(base) |= (((uint32_t)conf) << (4 + 8));
         break;
     case 2:
-        TIMER_CHCTL0(base) &= ~((uint32_t)0x000000F0UL);
-        TIMER_CHCTL0(base) |= (((uint32_t)conf) << 4);
+        TIMER_CHCTL1(base) &= ~((uint32_t)0x000000F0UL);
+        TIMER_CHCTL1(base) |= (((uint32_t)conf) << 4);
         break;
     case 3:
-        TIMER_CHCTL0(base) &= ~((uint32_t)0x0000F000UL);
-        TIMER_CHCTL0(base) |= (((uint32_t)conf) << (4 + 8));
+        TIMER_CHCTL1(base) &= ~((uint32_t)0x0000F000UL);
+        TIMER_CHCTL1(base) |= (((uint32_t)conf) << (4 + 8));
         break;
     }
 }