Bläddra i källkod

feat:移植ST平台代码已测试

CN\guohui27 2 år sedan
förälder
incheckning
13822b7b78

+ 24 - 22
User project/1.FrameLayer/Source/TimeTask_Event.c

@@ -18,7 +18,6 @@
 #include "flash_master.h"
 #include "queue.h"
 #include "spdctrmode.h"
-//#include "stm32f30x.h"
 #include "gd32f30x.h"
 #include "string.h"
 #include "syspar.h"
@@ -61,14 +60,17 @@ void  Event_1ms(void)
     
     // cp_history info update
     Can_voMC_Run_1ms();
-    // Torque info update
-    torsensor_voTorADC();
+
     if (cadence_stFreGetOut.uwForwardCnt > 0)
     {
+        torsensor_voCadenceCnt();
         cadence_stFreGetOut.uwForwardCnt = 0;
         maf_torque.value = torsensor_stTorSensorOut.uwTorquePu;
         MoveAverageFilter(&maf_torque);
     }
+    
+    torsensor_voDynamicOffset();
+    torsensor_voTorADCwithTemp();
 
     // Tor assist cal
         // ass_CalIn.swFlxIqLimit = MC_RunInfo.SOC;
@@ -100,9 +102,9 @@ void  Event_1ms(void)
         ass_CalIn.uwtorque = maf_torque.AverValue; // maf_torque.AverValue;//torsensor_stTorSensorOut.uwTorqueLPFPu;
         ass_CalIn.uwtorquelpf = torsensor_stTorSensorOut.uwTorqueLPFPu;
         ass_CalIn.uwtorquePer = torsensor_stTorSensorOut.uwTorquePu;
-
+        ass_CalIn.swCurFdbPu = scm_swIqFdbLpfPu;
+        ass_CalIn.swCurRefPu = scm_swIqRefPu;
         Assist();
-
         
         uart_swTorqRefNm = Assist_torqueper;
 //        if(cp_stFlg.RunModelSelect == CityBIKE )
@@ -293,23 +295,23 @@ void  Event_200ms(void)
     bikespeed_voGetBikeSpeedPwrError(adc_stUpOut.uwU5VPu);
 
     /* Bike faults 200ms detect */
-    if((cp_stFlg.RunModelSelect == MountainBIKE) || (cp_stFlg.RunModelSelect == CityBIKE))
-    {
-        alm_stBikeIn.uwTroqReg = hw_uwADC1[0];
-        alm_stBikeIn.uwTroqPu = torsensor_stTorSensorOut.uwTorquePu;
-        alm_stBikeIn.blBikeSpdOvrFlg = bikespeed_stFreGetOut.blBikeSpeedSensorPwrErrorFlg;
-        alm_stBikeIn.blCadenceFreqOvrFlg = cadence_stFreGetOut.blCadenceSensorErrorFlg;
-        alm_stBikeIn.swMotorSpdDir = ass_CalIn.swDirection;
-        alm_stBikeIn.swMotorSpdPu = scm_stSpdFbkLpf.slY.sw.hi;
-        alm_stBikeIn.uwBikeSpdPu = bikespeed_stFreGetOut.uwFrequencyPu;
-        alm_stBikeIn.uwCadenceFreqPu = cadence_stFreGetOut.uwFrequencyPu;
-        alm_stBikeIn.uwMotorNTCReg = adc_stUpOut.MotorTempReg;
-        alm_stBikeIn.uwPCBNTCReg = adc_stUpOut.PCBTempReg;
-        alm_stBikeIn.uwThrottleReg = adc_stUpOut.uwThrottleReg;
-        alm_stBikeIn.blThrottleExistFlg = FALSE;
-        alm_stBikeIn.blMotorNTCExistFlg = FALSE;
-        alm_voDetec200MS(&alm_stBikeIn, &alm_stDetect200MSCoef);   
-    }
+//    if((cp_stFlg.RunModelSelect == MountainBIKE) || (cp_stFlg.RunModelSelect == CityBIKE))
+//    {
+//        alm_stBikeIn.uwTroqReg = hw_uwADC0[7];
+//        alm_stBikeIn.uwTroqPu = torsensor_stTorSensorOut.uwTorquePu;
+//        alm_stBikeIn.blBikeSpdOvrFlg = bikespeed_stFreGetOut.blBikeSpeedSensorPwrErrorFlg;
+//        alm_stBikeIn.blCadenceFreqOvrFlg = cadence_stFreGetOut.blCadenceSensorErrorFlg;
+//        alm_stBikeIn.swMotorSpdDir = ass_CalIn.swDirection;
+//        alm_stBikeIn.swMotorSpdPu = scm_stSpdFbkLpf.slY.sw.hi;
+//        alm_stBikeIn.uwBikeSpdPu = bikespeed_stFreGetOut.uwFrequencyPu;
+//        alm_stBikeIn.uwCadenceFreqPu = cadence_stFreGetOut.uwFrequencyPu;
+//        alm_stBikeIn.uwMotorNTCReg = adc_stUpOut.MotorTempReg;
+//        alm_stBikeIn.uwPCBNTCReg = adc_stUpOut.PCBTempReg;
+//        alm_stBikeIn.uwThrottleReg = adc_stUpOut.uwThrottleReg;
+//        alm_stBikeIn.blThrottleExistFlg = FALSE;
+//        alm_stBikeIn.blMotorNTCExistFlg = FALSE;
+//        alm_voDetec200MS(&alm_stBikeIn, &alm_stDetect200MSCoef);   
+//    }
     
     if (switch_flg.SysFault_Flag == TRUE)
     {

+ 21 - 15
User project/1.FrameLayer/Source/gd32f30x_it.c

@@ -135,7 +135,7 @@ void SysTick_Handler(void)
 void ADC0_1_IRQHandler(void)
 {
     clasB_uwADCCnt++;
-
+    
     if(cp_stFlg.CurrentSampleModelSelect == SINGLERESISITANCE)
     {
         static UWORD SampleTrigCount = 0;
@@ -195,6 +195,8 @@ void ADC0_1_IRQHandler(void)
                 TIMER_CHCTL1(TIMER0) &= ~0x7000;
                 /* CH3 set to PWMMODE0 */
                 TIMER_CHCTL1(TIMER0) |= 0x6000;
+                
+                
             }                     
             
             adc_interrupt_flag_clear(ADC0 , ADC_INT_FLAG_EOIC);
@@ -238,17 +240,14 @@ void ADC0_1_IRQHandler(void)
     \retval     none
 */
 
-UWORD tst_Timer0Ct;
-
 UWORD tst_DMAStartCt = 0;
 UWORD tst_DMAStartFlag = 0;
-UWORD tmpSigTrigZ1 = 0;
+UWORD tmpSigTrigZ1 = 500;
 void TIMER0_UP_TIMER9_IRQHandler(void)
 {   
     ///////////////
     clasB_uwTIM0Cnt ++;
-    
-    
+     
     if(cp_stFlg.CurrentSampleModelSelect == SINGLERESISITANCE)
     {
       ULONG OVtimeCnt = 0;
@@ -342,18 +341,27 @@ void TIMER0_UP_TIMER9_IRQHandler(void)
             
             if((TIMER_CTL0(TIMER0) & TIMER_CTL0_DIR) == 0) // When Counting Up
             { 
-                adc_enable(ADC0);
-              
-                timer_channel_output_pulse_value_config(TIMER0, TIMER_CH_3, pwm_stGenOut.uwRDSONTrig);
+                 adc_enable(ADC0);
+               // adc_interrupt_enable(ADC0 , ADC_INT_EOIC);
+               //adc_external_trigger_config(ADC0, ADC_INSERTED_CHANNEL, ENABLE);
+                
                 /* Software trigger for regular sampling*/
                 adc_software_trigger_enable(ADC0, ADC_REGULAR_CHANNEL); 
+              
+                timer_channel_output_pulse_value_config(TIMER0, TIMER_CH_3, pwm_stGenOut.uwRDSONTrig);
+
                 /* TBC Up interrupt */
                 tbc_voUpIsr();             
             }
             else
             {
                 adc_disable(ADC0);
+                //adc_interrupt_disable(ADC0 , ADC_INT_EOIC);
+                //adc_external_trigger_config(ADC0, ADC_INSERTED_CHANNEL, DISABLE);
+              
+              
                 
+                             
                 TIMER_CNT(TIMER6) = 0;
                 
                 /* TBC Down interrupt */
@@ -364,11 +372,10 @@ void TIMER0_UP_TIMER9_IRQHandler(void)
                     OVtimeCnt++;
                 };
                 
-                adc_enable(ADC1);
-                
+                /* ADC1 trigger for Ibus sampling*/
+                adc_enable(ADC1);                
                 timer_channel_output_pulse_value_config(TIMER0, TIMER_CH_3, tmpSigTrigZ1);
-                tmpSigTrigZ1 =  pwm_stGenOut.uwSigRTrig;
-            
+                tmpSigTrigZ1 =  pwm_stGenOut.uwSigRTrig;            
 
                 /* Compara value load */    
                 hw_uwPWMCmpr[0] = pwm_stGenOut.uwNewTIM1COMPR[0];
@@ -376,8 +383,7 @@ void TIMER0_UP_TIMER9_IRQHandler(void)
                 hw_uwPWMCmpr[2] = pwm_stGenOut.uwNewTIM1COMPR[2];
                 hw_uwPWMCmpr[3] = pwm_stGenOut.uwNewTIM1COMPR[3];
                 hw_uwPWMCmpr[4] = pwm_stGenOut.uwNewTIM1COMPR[4];
-                hw_uwPWMCmpr[5] = pwm_stGenOut.uwNewTIM1COMPR[5];
-                
+                hw_uwPWMCmpr[5] = pwm_stGenOut.uwNewTIM1COMPR[5];               
                 timer_dma_enable(TIMER0,TIMER_DMA_UPD);
                 dma_channel_enable(DMA0,DMA_CH4);
             }

+ 5 - 4
User project/2.MotorDrive/Include/adc.h

@@ -43,9 +43,9 @@ typedef struct
     SWORD swIaPu;     // Q14, Phase A current value
     SWORD swIbPu;     // Q14, Phase B current value
     SWORD swIcPu;     // Q14, Phase C current value
-    SWORD swSampIaPu; // Q14, Phase A current sampling value
-    SWORD swSampIbPu; // Q14, Phase B current sampling value
-    SWORD swSampIcPu; // Q14, Phase C current sampling value
+    SLONG slSampIaPu; // Q14, Phase A current sampling value
+    SLONG slSampIbPu; // Q14, Phase B current sampling value
+    SLONG slSampIcPu; // Q14, Phase C current sampling value
     UWORD uwIaAbsPu;  // Q14, Phase A current absolute value
     UWORD uwIbAbsPu;  // Q14, Phase B current absolute value
     UWORD uwIcAbsPu;  // Q14, Phase C current absolute value
@@ -102,7 +102,8 @@ typedef struct
     UWORD uwThrottleReg; // Q14, 5V power
     UWORD PCBTempReg;
     UWORD MotorTempReg;
-
+    UWORD TorqTempReg;
+    
     UWORD uwADCCalibCt;  // Current calib count
     BOOL  blADCCalibFlg; // ADC calib flag
     SWORD swIPMTempCe;   // PCB Temp to trig alam

+ 23 - 28
User project/2.MotorDrive/Source/adc.c

@@ -106,7 +106,8 @@ void adc_voCalibration(ADC_COF *cof, ADC_DOWN_OUT *out1, ADC_UP_OUT *out2)
             }
             else if(cp_stFlg.CurrentSampleModelSelect == COMBINATION)
             {
-                pwm_stGenOut.uwRDSONTrig = 108 ;  
+//                pwm_stGenOut.uwRDSONTrig = 108;  
+                pwm_stGenOut.uwRDSONTrig = 129; 
                 pwm_stGenOut.uwSigRTrig = HW_HHHPWM_PERIOD;
                 pwm_stGenOut.blSampleCalibFlag = TRUE;
                 if (out1->uwADCCalibCt < (1 << ADC_CALIB_INDEX))
@@ -269,13 +270,13 @@ void adc_voSampleDown(ADC_COF *cof, ADC_DOWN_OUT *out)
         out->uwIbReg = adc_uwRdsonVReg;
         out->uwIcReg = adc_uwRdsonWReg;
 
-        out->swSampIaPu = -((SLONG)((SLONG)out->uwIaReg - (SLONG)cof->uwIaOffset) * cof->uwCurReg2Pu >> 10); // Q14=Q24-Q10
-        out->swSampIbPu = -((SLONG)((SLONG)out->uwIbReg - (SLONG)cof->uwIbOffset) * cof->uwCurReg2Pu >> 10); // Q14=Q24-Q10
-        out->swSampIcPu = -((SLONG)((SLONG)out->uwIcReg - (SLONG)cof->uwIcOffset) * cof->uwCurReg2Pu >> 10); // Q14=Q24-Q10
+        out->slSampIaPu = -((SLONG)((SLONG)out->uwIaReg - (SLONG)cof->uwIaOffset) * cof->uwCurReg2Pu >> 10); // Q14=Q24-Q10
+        out->slSampIbPu = -((SLONG)((SLONG)out->uwIbReg - (SLONG)cof->uwIbOffset) * cof->uwCurReg2Pu >> 10); // Q14=Q24-Q10
+        out->slSampIcPu = -out->slSampIaPu - out->slSampIbPu;   //-((SLONG)((SLONG)out->uwIcReg - (SLONG)cof->uwIcOffset) * cof->uwCurReg2Pu >> 10); // Q14=Q24-Q10
 //      cof->uwCalibcoef = 1500;
-        out->swIaPu = ((SLONG)out->swSampIaPu * cof->uwCalibcoef) >> 10;
-        out->swIbPu = ((SLONG)out->swSampIbPu * cof->uwCalibcoef) >> 10;
-        out->swIcPu = ((SLONG)out->swSampIcPu * cof->uwCalibcoef) >> 10;
+        out->swIaPu = ((SLONG)out->slSampIaPu * cof->uwCalibcoef) >> 10;
+        out->swIbPu = ((SLONG)out->slSampIbPu * cof->uwCalibcoef) >> 10;
+        out->swIcPu = ((SLONG)out->slSampIcPu * cof->uwCalibcoef) >> 10;
     }
     else
     {}
@@ -318,18 +319,10 @@ void adc_voSampleUp(ADC_COF *cof, ADC_UP_OUT *out)
     out->uwU6VReg = hw_uwADC0[1];
     out->uwU5VReg = hw_uwADC0[2];
     out->PCBTempReg = hw_uwADC0[3];
-    out->MotorTempReg = hw_uwADC0[4];
+    out->TorqTempReg = hw_uwADC0[4];
     out->uwU12VReg = hw_uwADC0[5];
     out->uwThrottleReg = hw_uwADC0[6];
 
-//    out->uwVdcReg = hw_uwADC2[0];
-//    out->uwU6VReg = hw_uwADC2[1];
-//    out->uwU5VReg = hw_uwADC2[2];
-//    out->PCBTempReg = hw_uwADC2[3];
-//    out->MotorTempReg = hw_uwADC2[4];
-//    out->uwU12VReg = hw_uwADC2[5];
-//    out->uwThrottleReg = hw_uwADC2[6];
-
     out->uwVdcPu = (SLONG)out->uwVdcReg * cof->uwVdcReg2Pu >> 10; // Q14=Q24-Q10
     /* Vdc LPF */
     out->uwVdcLpfPu = ((out->uwVdcPu - out->uwVdcLpfPu) >> 1) + out->uwVdcLpfPu;
@@ -369,10 +362,12 @@ void adc_voSampleUp(ADC_COF *cof, ADC_UP_OUT *out)
     PcbTempCal(out->PCBTempR);
     out->PCBTemp = tmp_PcbTemp;
 }
- SWORD swSingleReg,swRdsonReg,GainTemp2;
- LPF_OUT adc_pvt_stRdsonCoefLpf;
- UWORD uwCalGainflg;
- ULONG GainTemp1;
+
+SWORD swSingleReg,GainTemp2;
+SLONG slRdsonReg;
+LPF_OUT adc_pvt_stRdsonCoefLpf;
+UWORD uwCalGainflg;
+ULONG GainTemp1;
 void adc_voSRCalibration(ADC_COF *cof, ADC_UP_OUT *up_out, ADC_DOWN_OUT *down_out)
 { 
 
@@ -388,9 +383,9 @@ void adc_voSRCalibration(ADC_COF *cof, ADC_UP_OUT *up_out, ADC_DOWN_OUT *down_ou
             {
               swSingleReg = up_out->swCalibIaPu;
             }
-            if(swRdsonReg > down_out->swSampIaPu)
+            if(slRdsonReg > down_out->slSampIaPu)
             {
-              swRdsonReg = down_out->swSampIaPu;
+              slRdsonReg = down_out->slSampIaPu;
             }
             
             break;
@@ -399,9 +394,9 @@ void adc_voSRCalibration(ADC_COF *cof, ADC_UP_OUT *up_out, ADC_DOWN_OUT *down_ou
             {
               swSingleReg = up_out->swCalibIbPu;
             }
-            if(swRdsonReg > down_out->swSampIbPu)
+            if(slRdsonReg > down_out->slSampIbPu)
             {
-              swRdsonReg = down_out->swSampIbPu;
+              slRdsonReg = down_out->slSampIbPu;
             }
             break;
         case SampleC:
@@ -409,9 +404,9 @@ void adc_voSRCalibration(ADC_COF *cof, ADC_UP_OUT *up_out, ADC_DOWN_OUT *down_ou
             {
               swSingleReg = up_out->swCalibIcPu;
             }    
-            if(swRdsonReg > down_out->swSampIcPu)
+            if(slRdsonReg > down_out->slSampIcPu)
             {
-              swRdsonReg = down_out->swSampIcPu;
+              slRdsonReg = down_out->slSampIcPu;
             }
             break;
         default:
@@ -432,7 +427,7 @@ void adc_voSRCalibration(ADC_COF *cof, ADC_UP_OUT *up_out, ADC_DOWN_OUT *down_ou
          {
             if(uwCalGainflg ==1)
             {
-                GainTemp1 = (SLONG)((SLONG)swSingleReg << 10) / (SLONG)swRdsonReg;               
+                GainTemp1 = (SLONG)((SLONG)swSingleReg << 10) / (SLONG)slRdsonReg;               
                 if(GainTemp1 > cof->uwCalibcoefMax)
                 {
                     GainTemp1 = cof->uwCalibcoefMax;
@@ -450,7 +445,7 @@ void adc_voSRCalibration(ADC_COF *cof, ADC_UP_OUT *up_out, ADC_DOWN_OUT *down_ou
             else
             {
                 swSingleReg = 0;
-                swRdsonReg = 0;
+                slRdsonReg = 0;
             }
          }
                   

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

@@ -81,7 +81,7 @@ void pwm_voInit(void)
     pwm_stGenOut.uwNewTrig = 0;
     pwm_stGenOut.uwSampleArea = IgnoreNone;
 //    pwm_stGenOut.uwRDSONTrig = 108;
-    pwm_stGenOut.uwRDSONTrig = 108;
+    pwm_stGenOut.uwRDSONTrig = 129;
     pwm_stGenOut.uwSigRTrig = HW_HHHPWM_PERIOD;
 }
 
@@ -646,7 +646,7 @@ void pwm_voGen(PWM_GEN_IN *in, PWM_CALC_COF *coef, PWM_GEN_OUT *out)
         {
             out->uwSampleArea = IgnoreNone;
            // out->uwRDSONTrig = 108;
-            out->uwRDSONTrig = 108;
+            out->uwRDSONTrig = 129;
         }
         else
         {
@@ -873,7 +873,7 @@ void pwm_voGen(PWM_GEN_IN *in, PWM_CALC_COF *coef, PWM_GEN_OUT *out)
         //    {
         //      out->uwSampleArea = IgnoreNone;
        // out->uwRDSONTrig = 108;
-        out->uwRDSONTrig = 108 ;
+        out->uwRDSONTrig = 129 ;
         //    }
         //    else
         //    {

+ 3 - 4
User project/2.MotorDrive/Source/spdctrFSM.c

@@ -104,7 +104,6 @@ void Open2Clz_TbcupHook(void)
     scm_uwAngManuPu = align_stOut.uwAngManuPu;
     scm_uwAngRefPu = align_stOut.uwAngRefPu;
 }
-
 void ClzLoop_TbcupHook(void)
 {
     /*=======================================================================
@@ -127,7 +126,7 @@ void ClzLoop_TbcupHook(void)
     pwr_voPwrLim2(&pwr_stPwrLimIn, &pwr_stPwrLimCof, &pwr_stPwrLimOut2); // Q14
 
     scm_swIqRefPu = swCurRefrompu;
-    scm_swIdRefPu = flx_stCtrlOut.swIdRefPu;
+    scm_swIdRefPu = 0; //flx_stCtrlOut.swIdRefPu;
 }
 
 void Stop_TbcupHook(void)
@@ -300,8 +299,8 @@ void ClzLoop_TbcdownHook(void)
     {
         acr_stUdqDcpIn.swWsPu = spi_stResolverOut.swSpdFbkPu; // Q15
     }
-    acr_stUdqDcpIn.swIdRefPu = scm_swIdRefPu;//scm_swIdRefPu  scm_swIdFdbLpfPu          // Q14
-    acr_stUdqDcpIn.swIqRefPu = scm_swIqRefPu; //scm_swIqRefPu  scm_swIqFdbLpfPu         // Q14  
+    acr_stUdqDcpIn.swIdRefPu = scm_swIdFdbLpfPu;//scm_swIdRefPu  scm_swIdFdbLpfPu          // Q14
+    acr_stUdqDcpIn.swIqRefPu = scm_swIqFdbLpfPu; //scm_swIqRefPu  scm_swIqFdbLpfPu         // Q14  
     acr_stUdqDcpIn.swUdqLimPu = scm_swVsDcpLimPu;      // Q14
     acr_voUdqDcp(&acr_stUdqDcpIn, &acr_stUdqDcpCoef, &acr_stUdqDcpOut);
 }

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

@@ -31,6 +31,7 @@ Revising History (ECL of this file):
 #include "AssistCurve.h"
 #include "cmdgennew.h"
 #include "CodePara.h"
+#include "FSM_2nd.h"
 /************************************************************************
  Constant Table (N/A)
 *************************************************************************/
@@ -712,10 +713,9 @@ void  scm_voSpdCtrMdDownTbc(void)
         acr_stCurIdPIIn.swUminPu = -scm_swVsDcpLimPu; // Q14
     }
     else if (DCPswitch == 0)
-    {
+    {      
         acr_stCurIdPIIn.swUmaxPu = scm_swVsDcpLimPu - acr_stUdqDcpOut.swUdPu;  // Q14
-        acr_stCurIdPIIn.swUminPu = -scm_swVsDcpLimPu - acr_stUdqDcpOut.swUdPu; // Q14
-      
+        acr_stCurIdPIIn.swUminPu = -scm_swVsDcpLimPu - acr_stUdqDcpOut.swUdPu; // Q14    
 //        acr_stCurIdPIIn.swUmaxPu = scm_swVsLimPu - acr_stUdqDcpOut.swUdPu;  // Q14
 //        acr_stCurIdPIIn.swUminPu = -scm_swVsLimPu - acr_stUdqDcpOut.swUdPu; // Q14       
     }
@@ -735,8 +735,16 @@ void  scm_voSpdCtrMdDownTbc(void)
     }
     else if (DCPswitch == 0)
     {
-        acr_stCurIqPIIn.swUmaxPu = scm_swVsDcpLimPu - acr_stUdqDcpOut.swUqPu;  // Q14
-        acr_stCurIqPIIn.swUminPu = -scm_swVsDcpLimPu - acr_stUdqDcpOut.swUqPu; // Q14
+        if(FSM2nd_Run_state.state == Assistance)
+        {
+          acr_stCurIqPIIn.swUmaxPu = ass_CalOut.swVoltLimitPu - acr_stUdqDcpOut.swUqPu;  // Q14
+          acr_stCurIqPIIn.swUminPu = -ass_CalOut.swVoltLimitPu - acr_stUdqDcpOut.swUqPu; // Q14
+        }
+        else
+        {
+           acr_stCurIqPIIn.swUmaxPu = scm_swVsDcpLimPu - acr_stUdqDcpOut.swUqPu;  // Q14
+           acr_stCurIqPIIn.swUminPu = -scm_swVsDcpLimPu - acr_stUdqDcpOut.swUqPu; // Q14
+        }       
         
 //        acr_stCurIqPIIn.swUmaxPu = scm_swVsLimPu - acr_stUdqDcpOut.swUqPu;  // Q14
 //        acr_stCurIqPIIn.swUminPu = -scm_swVsLimPu - acr_stUdqDcpOut.swUqPu; // Q14

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

@@ -21,7 +21,8 @@
  *
  ****************************************/
 #define TIMEUNIT 1 // run time unit  1ms
-
+#define CURSWITCH 1// 开关电流斜坡
+   
 #define GEAR_NUM                6 // number of gear
 #define CADENCE_PULSES_PER_CIRC 64
 
@@ -41,8 +42,8 @@
 #define BIKE_ASSIST_MODE2              0x02AA
 #define TORQUE_START_THRESHOLD   80 // 0.1Nm
 #define TORQUE_STOP_THRESHOLD    20 // 0.1Nm
-#define TORQUE_SWITCH2_THRESHOLD 80 // 0.1Nm
-#define TORQUE_SWITCH1_THRESHOLD 60 // 0.1Nm
+#define TORQUE_SWITCH2_THRESHOLD 120 // 0.1Nm
+#define TORQUE_SWITCH1_THRESHOLD 40 // 0.1Nm
 
 #define BIKE_ASS_MOTOR_CURRENT_MAX      5500 // 0.01A
 #define BIKE_ASS_MOTOR_TORQUE_MAX       20   // 0.1Nm
@@ -64,7 +65,7 @@
 
 #define ASS_LINER_TORQUE_DEFAULT             \
     {                                  \
-        2867, 4096, 6144, 8192, 4096 \
+        2867, 6096, 9000, 14288, 4096 \
     } // Q12
 //#define TORQUE_ASSIST_DEFAULT                                                                                                                      \
 //    {                                                                                                                                              \
@@ -238,6 +239,8 @@ typedef struct
     SWORD swFlxIqLimit; // Q14
     SWORD swPwrIqLimit; // Q14
     UWORD SOCValue;
+    SWORD swCurFdbPu; //Q14
+    SWORD swCurRefPu;
 } ASS_PER_IN;
 
 typedef struct
@@ -299,10 +302,13 @@ typedef struct
     SWORD swTorAssistCurrentTemp;
     SWORD swTorSpdLoopCurrentTemp;
     SWORD swTorAssistCurrent;
-
+    SWORD swTorRefTarget;
+    SWORD swTorRefEnd;
     SWORD swSpeedRef;
     SWORD swCadSpd2MotSpd;
-
+    
+    SWORD swVoltLimitPu;
+    BOOL blAssHoldFlag;
 } ASS_PER_OUT;
 
 /**
@@ -368,7 +374,7 @@ extern ASS_LIMIT_ACCORDING_VOL_COF ass_CurLimCalBMSCoef;
 
 extern ASS_FSM_STATUS Ass_FSM;
 
-
+extern ASS_PER_OUT  ass_CalOut;
 extern SWORD Assist_torqueper;
 
 
@@ -409,6 +415,7 @@ void Assist(void);
 void MoveAverageFilter(MAF_IN *in);
 void MoveAverageFilterClear(MAF_IN *in);
 void AssistCurrentLimitAccordingBMS(UWORD uwSOCvalue);
+
 /**
  * @brief 选择相应档位曲线
  *

+ 3 - 3
User project/3.BasicFunction/Include/Temp.h

@@ -25,8 +25,8 @@ WLBDM_M0_SR_20170814-new FSM1.1, by cyf, create this file;
  Definitions & Macros
 *************************************************************************/
 #define PCB_TEMP_SAMPLER 1000 // 0.01kOhm
-#define TEMPNUM          13
-#define TEMPNUM1         9
+#define PCB_TEMP_NUM       13
+#define TORQ_TEMP_NUM      7
 #define CURCALIBNUM      8
 #define CURCALIBUNIT     10 // centidegree
 /************************************************************************
@@ -70,7 +70,7 @@ extern SWORD tmp_CurCalibLimitDeta[];
 extern void TempInit(void);
 extern void PcbTempCal(SWORD PcbR);
 extern void MotorTempCal(void);
-
+SWORD temp_swTorqTempCal(UWORD Reg);
 /************************************************************************
  Flag Define (N/A)
 *************************************************************************/

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

@@ -22,6 +22,7 @@ Revising History (ECL of this file):
 #define CAN_H
 
 #include "typedefine.h"
+#include "gd32F30x.h"
 /************************************************************************
  Compiler Directives (N/A)
 *************************************************************************/

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

@@ -16,7 +16,6 @@
 #define CANAPPL_H
 
 #include "typedefine.h"
-//#include "stm32f30x.h"
 #include "gd32f30x.h"
 #include "AssistCurve.h"
 /****************************************

+ 3 - 3
User project/3.BasicFunction/Include/classB.h

@@ -36,17 +36,17 @@ WLBDM_M0_SR_20170814-new FSM1.1, by cyf, create this file;
 /* 1:enable FLASH CRC selftest 
    0:disable 
    */
-#define FLASHSTEN 1
+#define FLASHSTEN 0
 
 /* 1:enable clock selftest 
    0:disable 
    */
-#define CLOCKSTEN 1
+#define CLOCKSTEN 0
 
 /* 1:enable microchip fault detection 
    0:disable 
    */
-#define CHIP_FAULT_DETECTION 1
+#define CHIP_FAULT_DETECTION 0
 
 /************************************************************************
  TypeDefs & Structure defines (N/A)

+ 17 - 6
User project/3.BasicFunction/Include/torquesensor.h

@@ -14,7 +14,8 @@
 *************************************************************************/
 #ifndef TORQUESENSOR_H
 #define TORQUESENSOR_H
-#include "user.h"
+
+#include "typedefine.h"
 /****************************************
  *
  *          Definitions & Macros
@@ -33,6 +34,8 @@
 #define TORQUE_SENSOR_LPF_FRQ      1           // Hz
 #define TORQUE_LPF_DISCRETEHZ      1000        // Hz   T=1/f,T is used in discreting LPF s function
 
+#define TORQ_OFFSET_NUM 7
+
 #define TORQUESENSOR_OUT_DEFAULT    \
     {                               \
         0, 0, 0, 0, 0, FALSE, FALSE \
@@ -41,6 +44,11 @@
     {                                                                    \
         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, FALSE, FALSE, 1,1,2,2,3,3,4,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0 \
     } // Default value of CADENCE_OUT
+
+#define TORQUESENSITIVE_COF_DEFAULT                                         \
+    {                                                                    \
+       2976, -6948, 6410, 6021 \
+    } // Default value of CADENCE_OUT
 /***************************************
  *
  *          Type  Definations
@@ -111,7 +119,7 @@ typedef struct
     ULONG uwTorqueReg2Pu2; // Gain2 of register to Pu
     ULONG uwTorqueReg2Pu3; // Gain3 of register to Pu
     ULONG uwTorqueReg2Pu4; // Gain4 of register to Pu
-
+    
 } TORQUESENSOR_COF;
 
 /****************************************
@@ -119,8 +127,8 @@ typedef struct
  *           Exported variable
  *
  ****************************************/
-extern TORQUESENSOR_OUT torsensor_stTorSensorOut;
-extern TORQUESENSOR_COF torsensor_stTorSensorCof;
+//extern TORQUESENSOR_OUT torsensor_stTorSensorOut;
+//extern TORQUESENSOR_COF torsensor_stTorSensorCof;
 
 /***************************************
  *
@@ -130,10 +138,13 @@ extern TORQUESENSOR_COF torsensor_stTorSensorCof;
 void torsensor_voTorSensorCof(void);
 void torsensor_voTorSensorInit(void);
 void torsensor_voTorADC(void);
-
+UWORD torsensor_uwTorqOffsetCal(SWORD Temp); 
+UWORD torsensor_uwTorqSencitiveCal(SWORD Temp, SWORD T0);
+ void torsensor_voCadenceCnt(void);
+ void torsensor_voDynamicOffset(void);
 /************************************************************************/
 #endif
 /************************************************************************
  End of this File (EOF):
  Do not put anything after this part!
-*************************************************************************/
+*************************************************************************/

+ 1072 - 137
User project/3.BasicFunction/Source/AssistCurve.c

@@ -288,9 +288,9 @@ void AssitCoefInit(void)
     ass_CalOut.swCadSpd2MotSpd = 0;
 
     ass_CurLimCoef.uwLimitGain[0] = 0; // Q10 percentage of max Current
-    ass_CurLimCoef.uwLimitGain[1] = 716;
-    ass_CurLimCoef.uwLimitGain[2] = 870;
-    ass_CurLimCoef.uwLimitGain[3] = 1024;
+    ass_CurLimCoef.uwLimitGain[1] = 400;
+    ass_CurLimCoef.uwLimitGain[2] = 682;
+    ass_CurLimCoef.uwLimitGain[3] = 910;
     ass_CurLimCoef.uwLimitGain[4] = 1024;
     ass_CurLimCoef.uwLimitGain[5] = 1024;
     ass_CurLimCoef.uwSpdThresHold = 21845;
@@ -319,6 +319,8 @@ void AssitCoefInit(void)
     
     mth_voLPFilterCoef(1000000 / 25, EVENT_1MS_HZ, &ass_pvt_stCurLpf.uwKx); //100Hz
     ass_pvt_stCurLpf.slY.sl = 0;
+    
+    
 }
 
 /**
@@ -342,10 +344,37 @@ ORIG_COEF Stop_Orig_Coef = {-100, 0, 0};
     SLONG TempSmooth;
     SWORD TorqCmd1, TorqCmd, CadCmd;
     SLONG temp_a1, temp_b1, temp_c1;
+    UWORD  TorqueAccStep=0;
+    UWORD  TorqueDecStep=80;
+    UWORD TorquAccCnt=0,TorquDecCnt=0;
 SWORD   AssitCuvApplPer(void)
 {
-    ///////////////////////////  Assist torque Cal using Assist Curve ////////////////////////////////
+  ///////////////////////////  Assist torque Cal using Assist Curve ////////////////////////////////
+    if (ass_CalIn.uwGearSt == 1)
+    {
+        TorqueAccStep = 50;
+    }
+    else if(ass_CalIn.uwGearSt == 2)
+    {
+        TorqueAccStep = 100;
+    }
+    else if(ass_CalIn.uwGearSt == 3)
+    {
+        TorqueAccStep = 120;
+    }
+    else if(ass_CalIn.uwGearSt == 4)
+    {
+        TorqueAccStep = 150;
+    }   
+    else if(ass_CalIn.uwGearSt == 5)
+    {
+        TorqueAccStep = 150;
+    }
+    else
+    {
 
+    }
+     
     TorqCmd1 = ((ULONG)ass_CalIn.uwtorque * ass_CalCoef.swTorqFilterGain >> 14) +
                ((ULONG)ass_CalIn.uwtorquelpf * (Q14_1 - ass_CalCoef.swTorqFilterGain) >> 14); //转矩指令滤波切换,由低通滤波到踏频相关的滑动平均滤波
     TorqCmd = ((ULONG)TorqCmd1 * ass_CalCoef.swSmoothGain) >> 12;                             //转矩指令斜坡
@@ -364,8 +393,8 @@ SWORD   AssitCuvApplPer(void)
     {
         //do nothing;
     }
-    //    CadCmd = (((SLONG)ass_CalIn.uwcadance * ass_CalCoef.swCadanceGain) >> 12)*10;                                          // 踏频指令斜坡
-    CadCmd = (((SLONG)ass_CalIn.uwcadance * ass_CalCoef.swSmoothGain) >> 12)*10;   
+                                           
+    CadCmd = (((SLONG)ass_CalIn.uwcadance * ass_CalCoef.swSmoothGain) >> 12)*10;   // 踏频指令斜坡
     Te_Cad_Assit_tempPu = ((SLONG)(Polynomial(&ass_CalCoef.uwCadencAsseGain[ass_CalIn.uwGearSt], &CadCmd, 20))) >> 6; // Q20 - Q6 = Q14 //踏频助力曲线
 
     if (Te_Tor_Assit_tempPu > ass_ParaCong.uwBikeAssTorMaxPu) // 最大转矩限幅
@@ -871,10 +900,11 @@ SWORD   AssitCuvApplPer(void)
         }
         else
         {
-          if (ass_CalIn.uwtorquelpf > ((ass_CalCoef.uwAssThreshold * 5)>>3) && ass_CalIn.uwtorquePer > ass_CalCoef.uwAssThreshold && ass_CalIn.uwcadance > 0)
+          if (ass_CalIn.uwtorquelpf > ((ass_CalCoef.uwAssThreshold * 3)>>3) && ass_CalIn.uwtorquePer > ass_CalCoef.uwAssThreshold && ass_CalIn.uwcadance > 0)
             {
 //               hw_voPWMOn();
                 ass_CalCoef.swTorqFilterGain = 0;
+                uwspeed2torqCnt = 0;
                 Ass_FSM = Spd2Torq;
                 ass_CalOut.swSpeedRef = ass_CalIn.uwSpdFbkAbsPu;
                 ass_CalCoef.sw2StopCNT = 0;
@@ -924,12 +954,15 @@ SWORD   AssitCuvApplPer(void)
     if (ass_CalIn.uwbikespeed <= ass_CurLimCoef.uwBikeSpdThresHold1)
     {
         ass_CalCoef.swBikeSpeedGain = Q12_1; // Q12
+        
     }
     else if (ass_CalIn.uwbikespeed > ass_CurLimCoef.uwBikeSpdThresHold1 && ass_CalIn.uwbikespeed <= ass_CurLimCoef.uwBikeSpdThresHold2)
     {
         ass_CalCoef.swBikeSpeedGain =
             Q12_1 -
             ((((SQWORD)ass_CalIn.uwbikespeed - (SQWORD)ass_CurLimCoef.uwBikeSpdThresHold1) * (SQWORD)ass_CurLimCoef.ulBikeSpdDeltInv) >> 28); // Q12
+        TorqueAccStep = 10;
+        TorqueDecStep = 10;
     }
     else
     {
@@ -939,8 +972,26 @@ SWORD   AssitCuvApplPer(void)
     switch (Ass_FSM)
     {
     case Startup:
+       Te_Tor_AssitPu2 = ((SLONG)Te_Tor_AssitPu1 * ass_CalCoef.swBikeSpeedGain) >> 12; // Q14+Q12-Q12+Q12-Q12=Q14
+        Te_Cad_AssitPu2 = ((SLONG)Te_Cad_AssitPu1 * ass_CalCoef.swBikeSpeedGain) >> 12; // Q14+Q12-Q12+Q12-Q12=Q14
+        ass_CalOut.swTorAss2CurrentTemp = swCurrentCal(Te_Tor_AssitPu2);                // Q14  电流指令计算
+        ass_CalOut.swCadAss2CurrentTemp = swCurrentCal(Te_Cad_AssitPu2);                // Q14  电流指令计算
+        if (ass_CalOut.swTorAss2CurrentTemp > ass_CalCoef.swCurrentmax_torAssPu)
+        {
+            ass_CalOut.swTorAss2CurrentTemp = ass_CalCoef.swCurrentmax_torAssPu;
+        }
+        if (ass_CalOut.swCadAss2CurrentTemp > ass_CalCoef.swCurrentmax_cadAssPu)
+        {
+            ass_CalOut.swCadAss2CurrentTemp = ass_CalCoef.swCurrentmax_cadAssPu;
+        }
+       ass_CalOut.swTorRefTarget = ass_CalOut.swTorAss2CurrentTemp + ass_CalOut.swCadAss2CurrentTemp;
+       ass_CalOut.swTorRefEnd = ass_CalOut.swTorRefTarget;
+       ass_CalOut.swTorAssistCurrentTemp = ass_CalIn.swDirection *ass_CalOut.swTorRefEnd;
+      
+    break;  
+      
     case TorqueAssit:
-    case  ReduceCurrent:
+   
         Te_Tor_AssitPu2 = ((SLONG)Te_Tor_AssitPu1 * ass_CalCoef.swBikeSpeedGain) >> 12; // Q14+Q12-Q12+Q12-Q12=Q14
         Te_Cad_AssitPu2 = ((SLONG)Te_Cad_AssitPu1 * ass_CalCoef.swBikeSpeedGain) >> 12; // Q14+Q12-Q12+Q12-Q12=Q14
         ass_CalOut.swTorAss2CurrentTemp = swCurrentCal(Te_Tor_AssitPu2);                // Q14  电流指令计算
@@ -953,7 +1004,38 @@ SWORD   AssitCuvApplPer(void)
         {
             ass_CalOut.swCadAss2CurrentTemp = ass_CalCoef.swCurrentmax_cadAssPu;
         }
+#if CURSWITCH
+        ass_CalOut.swTorRefTarget = ass_CalOut.swTorAss2CurrentTemp + ass_CalOut.swCadAss2CurrentTemp;
+        
+        if((ass_CalOut.swTorRefTarget - ass_CalOut.swTorRefEnd) > 2)
+        {
+            TorquAccCnt++;
+            if(TorquAccCnt >= 20)
+            {
+                ass_CalOut.swTorRefEnd += TorqueAccStep; 
+                TorquAccCnt = 0;
+            }          
+        }  
+        else if(((ass_CalOut.swTorRefTarget - ass_CalOut.swTorRefEnd) < (-1)))
+        {
+          if (ass_CalIn.uwcadance != ass_CalIn.uwcadancelast)
+          {
+
+                ass_CalOut.swTorRefEnd -= TorqueDecStep;
+               
+          }
+           
+        }
+        else
+        {
+           ass_CalOut.swTorRefEnd = ass_CalOut.swTorRefTarget;
+        }
+        ass_CalOut.swTorAssistCurrentTemp = ass_CalIn.swDirection * ass_CalOut.swTorRefEnd;
+       
+#else  
+        
         ass_CalOut.swTorAssistCurrentTemp = ass_CalIn.swDirection *(ass_CalOut.swTorAss2CurrentTemp + ass_CalOut.swCadAss2CurrentTemp);
+#endif
         break;
         
     case StartupCruise:
@@ -969,6 +1051,43 @@ SWORD   AssitCuvApplPer(void)
         {
             ass_CalOut.swCadAss2CurrentTemp = ass_CalCoef.swCurrentmax_cadAssPu;
         }
+       
+#if CURSWITCH
+         
+        ass_CalOut.swTorRefTarget = ass_CalOut.swTorAss2CurrentTemp + ass_CalOut.swCadAss2CurrentTemp;
+        if((ass_CalOut.swTorRefTarget - ass_CalOut.swTorRefEnd) > 2)
+        {
+            TorquAccCnt++;
+            if(TorquAccCnt >= 20)
+            {
+                ass_CalOut.swTorRefEnd += TorqueAccStep; 
+                TorquAccCnt = 0;
+            }    
+        }  
+        else if(((ass_CalOut.swTorRefTarget - ass_CalOut.swTorRefEnd) < (-1)))
+        {
+          if (ass_CalIn.uwcadance != ass_CalIn.uwcadancelast)
+          {
+               ass_CalOut.swTorRefEnd -= TorqueDecStep;
+          }
+        }
+        else
+        {
+           ass_CalOut.swTorRefEnd = ass_CalOut.swTorRefTarget;
+        }
+        
+        if(ass_CalOut.swTorRefEnd  < ass_CalOut.swTorSpdLoopCurrentTemp)
+        {
+            ass_CalOut.swTorRefEnd  = ass_CalOut.swTorSpdLoopCurrentTemp;
+            //ass_CalOut.swTorSpdLoopCurrentTemp = 0; // 启动前电流最小为速度环电流,启动后最小电流为0
+        }
+        else
+        {
+            ass_CalOut.swTorRefEnd = ass_CalOut.swTorRefEnd;
+        }
+        ass_CalOut.swTorAssistCurrentTemp = ass_CalIn.swDirection * ass_CalOut.swTorRefEnd;
+       
+#else
         ass_CalOut.swTorAssistCurrentTemp = ass_CalOut.swTorAss2CurrentTemp + ass_CalOut.swCadAss2CurrentTemp;
         if(ass_CalOut.swTorAssistCurrentTemp < ass_CalOut.swTorSpdLoopCurrentTemp)
         {
@@ -979,16 +1098,34 @@ SWORD   AssitCuvApplPer(void)
         {
             ass_CalOut.swTorAssistCurrentTemp = ass_CalIn.swDirection * ass_CalOut.swTorAssistCurrentTemp;
         }
-        
-        break;               
+#endif
+      
+        break; 
+    case  ReduceCurrent:
+        Te_Tor_AssitPu2 = ((SLONG)Te_Tor_AssitPu1 * ass_CalCoef.swBikeSpeedGain) >> 12; // Q14+Q12-Q12+Q12-Q12=Q14
+        Te_Cad_AssitPu2 = ((SLONG)Te_Cad_AssitPu1 * ass_CalCoef.swBikeSpeedGain) >> 12; // Q14+Q12-Q12+Q12-Q12=Q14
+        ass_CalOut.swTorAss2CurrentTemp = swCurrentCal(Te_Tor_AssitPu2);                // Q14  电流指令计算
+        ass_CalOut.swCadAss2CurrentTemp = swCurrentCal(Te_Cad_AssitPu2);                // Q14  电流指令计算
+        if (ass_CalOut.swTorAss2CurrentTemp > ass_CalCoef.swCurrentmax_torAssPu)
+        {
+            ass_CalOut.swTorAss2CurrentTemp = ass_CalCoef.swCurrentmax_torAssPu;
+        }
+        if (ass_CalOut.swCadAss2CurrentTemp > ass_CalCoef.swCurrentmax_cadAssPu)
+        {
+            ass_CalOut.swCadAss2CurrentTemp = ass_CalCoef.swCurrentmax_cadAssPu;
+        }
+        ass_CalOut.swTorAssistCurrentTemp = ass_CalIn.swDirection *(ass_CalOut.swTorAss2CurrentTemp + ass_CalOut.swCadAss2CurrentTemp);
+        break; 
     case SpeedAssit:
         ass_CalOut.swTorAssistCurrentTemp = asr_stTorqSpdPIOut.swIqRefPu; // ass_CalOut.swTorSpdLoopCurrentTemp;
         break;
     case Spd2Torq:
         ass_CalOut.swTorAssistCurrentTemp = asr_stTorqSpdPIOut.swIqRefPu; // ass_CalOut.swTorSpdLoopCurrentTemp;
+        ass_CalOut.swTorRefEnd = ass_CalOut.swTorAssistCurrentTemp;
         break;
     case StopAssit:
          ass_CalOut.swTorAssistCurrentTemp = 0;
+         ass_CalOut.swTorRefEnd = 0;
          break;
     default:
     	break;
@@ -1002,156 +1139,954 @@ SWORD   AssitCuvApplPer(void)
     return Assist_torqueper;
 }
 
-/**
- * @brief  Three order polynomial  Y = a*X^3 + b*X^2 + c*x +d
- *
- * @param coef polynomial coefficient a, b, c, d
- * @param Value polynomial input value X
- * @param Qnum  polynomial input Q type
- * @return UWORD  polynomial output Y
- */
-void AssitCuvLim(UWORD gear, UWORD uwBikeSpeedHzPu, UWORD uwCurMaxPu)
-{
-    UWORD uwIqLimitTemp1;
-
-    uwIqLimitTemp1 = ((ULONG)ass_CurLimCoef.uwLimitGain[gear] * uwCurMaxPu) >> 10;
 
-    ass_CurLimOut.uwIqlimit = uwIqLimitTemp1;
-}
+SWORD tmpVoltargetPu,VoltCnt;
+UWORD tempVoltage;
 
-/**
- * @brief  Assist function
- *
- * @param coef polynomial coefficient a, b, c, d
- * @param Value polynomial input value X
- * @param Qnum  polynomial input Q type
- * @return UWORD  polynomial output Y
- */
-void Assist(void)
+        SLONG slSpderror,sltmpvoltagelimit;
+        SWORD SpdKp = 500; //Q10;
+SWORD   AssitCuvApplPerVolt(void)
 {
-
-    if (((ass_CalIn.uwtorquePer > ass_CalCoef.uwAssThreshold && ass_CalIn.uwcadancePer > 0) || ass_CalIn.uwtorquePer > 3000) && ass_CalIn.uwGearSt > 0)
+  ///////////////////////////  Assist torque Cal using Assist Curve ////////////////////////////////
+    if (ass_CalIn.uwGearSt == 1)
     {
-        ass_CalCoef.blAssistflag = TRUE;
+        TorqueAccStep = 50;
     }
-    if (ass_CalCoef.blAssistflag == TRUE)
+    else if(ass_CalIn.uwGearSt == 2)
     {
-        ////////////  Calculate the Iq limit ///////////////////
-        UWORD IqLimitTemp;
-        AssitCuvLim(ass_CalIn.uwGearSt, ass_CalIn.uwbikespeed, ass_ParaCong.uwCofCurMaxPu);
-        AssistCurrentLimitAccordingBMS(ass_CalIn.SOCValue);
-
-        IqLimitTemp = (ass_CurLimOut.uwIqlimit < ass_CalIn.swFlxIqLimit)
-                          ? (ass_CurLimOut.uwIqlimit < ass_CalIn.swPwrIqLimit ? ass_CurLimOut.uwIqlimit : ass_CalIn.swPwrIqLimit)
-                          : (ass_CalIn.swFlxIqLimit < ass_CalIn.swPwrIqLimit ? ass_CalIn.swFlxIqLimit : ass_CalIn.swPwrIqLimit);
-
-        ass_CalCoef.uwCurrentMaxPu = (IqLimitTemp < ass_CurLimitCalBMSOut.uwIqLimitAbs) ? IqLimitTemp : ass_CurLimitCalBMSOut.uwIqLimitAbs;
-        ass_CalCoef.swCurrentmax_torAssPu = ((SLONG)ass_CalCoef.uwCurrentMaxPu * ass_ParaSet.uwTorWeight) >> 12; // Q14
-        ass_CalCoef.swCurrentmax_cadAssPu = ((SLONG)ass_CalCoef.uwCurrentMaxPu * ass_ParaSet.uwCadenceWeight) >> 12;
-        //////////////// Assist ////////////////////////
-
-        AssitCuvApplPer();
-
-        /////////////// Limit ///////////////////////////
-        if (Assist_torqueper > ass_CalCoef.uwCurrentMaxPu)
-        {
-            Assist_torqueper = ass_CalCoef.uwCurrentMaxPu;
-        }            
+        TorqueAccStep = 100;
     }
-    else
-    {
-        Assist_torqueper = 0;
-    }    
-}
-
-void MoveAverageFilter(MAF_IN *in)
-{
-    in->sum -= in->buffer[in->index];
-    in->buffer[in->index] = in->value;
-    in->sum += (SQWORD)in->value;
-//    if (in->buffer[in->length - 1] == 0)
-//    {
-//        in->AverValue = (SLONG)(in->sum / (in->index + 1));
-//    }
-//    else
-//    {
-        in->AverValue = (SLONG)(in->sum / in->length);
-//    }
-    in->index++;
-
-    if (in->index >= in->length)
+    else if(ass_CalIn.uwGearSt == 3)
     {
-        in->index = 0;
+        TorqueAccStep = 120;
     }
-}
-void MoveAverageFilterClear(MAF_IN *in)
-{
-    UWORD i;
-    in->index = 0;
-    in->sum = 0;
-    //    memset((UBYTE*)in->buffer, 0, sizeof(in->buffer));
-
-    //     in->buffer[(1 << in->length)-1]=0;
-    for (i = 0; i < 64; i++)
+    else if(ass_CalIn.uwGearSt == 4)
     {
-        in->buffer[i] = 0;
-    }
-}
-
-void AssistMode_Select(void) // 上电运行一次or助力参数更新后,AssistCoef需要重新计算
-{
-    UWORD TempAssit;
-    UWORD TempGear, gear;
-//    if (ass_ParaSet.uwAsssistSelectNum == 1) // OBC:更换成EE参数
-//    {
-//        TempAssit = ass_ParaCong.uwAssistSelect1;
-//    }
-//    else if (ass_ParaSet.uwAsssistSelectNum == 2)
-//    {
-//        TempAssit = ass_ParaCong.uwAssistSelect2;
-//    }
-//    else
-//    {
-//        TempAssit = ASSISTMOD_SELECT_DEFAULT;
-//    }
-    if (ass_ParaCong.uwStartMode == 1) // OBC:更换成EE参数
+        TorqueAccStep = 150;
+    }   
+    else if(ass_CalIn.uwGearSt == 5)
     {
-        TempAssit = ASSISTMOD_SELECT_DEFAULT;
+        TorqueAccStep = 150;
     }
-    else if (ass_ParaCong.uwStartMode  == 2)
+    else
     {
-        TempAssit = ass_ParaCong.uwAssistSelect1;
+
     }
-    else if (ass_ParaCong.uwStartMode  == 3)
+     TorqueDecStep = 80;
+    TorqCmd1 = ((ULONG)ass_CalIn.uwtorque * ass_CalCoef.swTorqFilterGain >> 14) +
+               ((ULONG)ass_CalIn.uwtorquelpf * (Q14_1 - ass_CalCoef.swTorqFilterGain) >> 14); //转矩指令滤波切换,由低通滤波到踏频相关的滑动平均滤波
+    TorqCmd = ((ULONG)TorqCmd1 * ass_CalCoef.swSmoothGain) >> 12;                             //转矩指令斜坡
+    if (TorqCmd > ass_ParaCong.uwBikeAssTorMaxPu) // 最大转矩限幅
     {
-        TempAssit = ass_ParaCong.uwAssistSelect2;
+        TorqCmd = ass_ParaCong.uwBikeAssTorMaxPu;
     }
-    else
+   
+    Te_Tor_Assit_tempPu = (SLONG)(Polynomial(&ass_CalCoef.uwTorqueAssGain[ass_CalIn.uwGearSt], &TorqCmd, 14)); // Q14  转矩助力曲线
+    Te_Tor_Assit_LinerPu = (SLONG)(((TorqCmd * LinerAssist[ass_CalIn.uwGearSt] )>> 12) + 136);
+    if (Te_Tor_Assit_tempPu < Te_Tor_Assit_LinerPu)
     {
-        TempAssit = ASSISTMOD_SELECT_DEFAULT;
+      Te_Tor_Assit_tempPu = Te_Tor_Assit_LinerPu;
     }
-    
-    for (gear = 0; gear < 5; gear++)
+    else
     {
-        TempGear = gear * 3 + ((TempAssit >> (gear << 1)) & 0x0003);
-        memcpy(&ass_CalCoef.uwTorqueAssGain[(gear + 1)], &flash_stPara.slTorqAssGain[TempGear], sizeof(POLY_COEF));
+        //do nothing;
     }
-    memcpy(&ass_CalCoef.uwCadencAsseGain[1], &flash_stPara.slCadAssGain[0], sizeof(flash_stPara.slCadAssGain));
-}
+                                        
+    CadCmd = (((SLONG)ass_CalIn.uwcadance * ass_CalCoef.swSmoothGain) >> 12)*10;  // 踏频指令斜坡 
+    Te_Cad_Assit_tempPu = ((SLONG)(Polynomial(&ass_CalCoef.uwCadencAsseGain[ass_CalIn.uwGearSt], &CadCmd, 20))) >> 6; // Q20 - Q6 = Q14 //踏频助力曲线
 
-void AssistCurrentLimitAccordingBMS(UWORD uwSOCvalue)
-{
-    if (uwSOCvalue < ass_CurLimCalBMSCoef.uwIqLimitStartSoc && uwSOCvalue > ass_CurLimCalBMSCoef.uwIqLimitEndSoc)
+    if (Te_Tor_Assit_tempPu > ass_ParaCong.uwBikeAssTorMaxPu) // 最大转矩限幅
     {
-        ass_CurLimitCalBMSOut.uwIqLimitAbs =
-            ass_CurLimCalBMSCoef.uwIqLimitInitAbs - (((SLONG)ass_CurLimCalBMSCoef.uwIqLimitStartSoc - uwSOCvalue) * ass_CurLimCalBMSCoef.swIqLImitK);
+        Te_Tor_Assit_tempPu = ass_ParaCong.uwBikeAssTorMaxPu;
     }
-    else if (uwSOCvalue <= ass_CurLimCalBMSCoef.uwIqLimitEndSoc)
+
+    if (Te_Cad_Assit_tempPu > ass_ParaCong.uwBikeAssTorMaxPu) // 最大转矩限幅
     {
-        ass_CurLimitCalBMSOut.uwIqLimitAbs = 0;
+        Te_Cad_Assit_tempPu = ass_ParaCong.uwBikeAssTorMaxPu;
     }
-    else
+
+    // paraset  gain of user
+    Te_Tor_AssitPu1 = (((SLONG)Te_Tor_Assit_tempPu) * ass_ParaSet.uwTorAssAjstGain) >> 12;     // Q14+Q12-Q12 = Q14; 用户设置转矩比例
+    Te_Cad_AssitPu1 = (((SLONG)Te_Cad_Assit_tempPu) * ass_ParaSet.uwCadenceAssAjstGain) >> 12; // Q14+Q12-Q12 = Q14; 用户设置踏频比例
+    ass_CalOut.swTorAssistSum1 = (Te_Tor_AssitPu1 + Te_Cad_AssitPu1);                          // Q14
+
+    //////////////////////////////  Dadence para cal   /////////////////////////////////////////////
+    ass_CalOut.swCadSpd2MotSpd =
+        ((SLONG)ass_CalIn.uwcadance * ass_ParaCong.uwMechRationMotor * ass_ParaCong.uwMotorPoles) >> 5; // Q20-Q5= Q15 出力时电机转速计算
+    ass_CalCoef.uwCadencePeriodCNT = TIME_MS2CNT(((ULONG)1000 << 20) / ((ULONG)ass_CalIn.uwcadance * FBASE));        //一圈踏频时间计数   
+   
+    
+    tmpVoltargetPu = (SLONG)ass_CalOut.swCadSpd2MotSpd *(SLONG)cof_uwFluxPu >> 13;//Q15+Q12-Q13=Q14;
+      
+    ass_CalCoef.uwStartupGain =  ass_ParaSet.uwStartupCoef ; //零速启动助力比计算
+    ass_CalCoef.uwStartupCruiseGain = ass_ParaSet.uwStartupCruiseCoef ; //带速启动助力比计算
+    //////////////////////////////   Assist FSM Control ///////////////////////////////////////////
+    switch (Ass_FSM)
     {
-        ass_CurLimitCalBMSOut.uwIqLimitAbs = ass_CurLimCalBMSCoef.uwIqLimitInitAbs;
-    }
-}
+    case Startup:
+        /*code*/
+        ass_CalCoef.swSmoothGain = Q12_1;
+        
+        SpdKp = 500;//ass_ParaSet.uwStartUpCadNm;
+        slSpderror = (SLONG)ass_CalOut.swCadSpd2MotSpd - (SLONG)ass_CalIn.uwSpdFbkAbsPu;
+       
+        if(ass_CalCoef.StartFlag == 0)
+        { 
+            sltmpvoltagelimit= ((slSpderror * SpdKp )>> 11) + tmpVoltargetPu; 
+            if(sltmpvoltagelimit > scm_swVsDcpLimPu)
+            {
+                sltmpvoltagelimit = scm_swVsDcpLimPu;
+            }
+            else if(sltmpvoltagelimit <= 0)
+            {
+                sltmpvoltagelimit =0;
+            }
+            ass_CalOut.swVoltLimitPu = sltmpvoltagelimit;
+            
+            if(slSpderror <= 1500 )
+            {
+                ass_CalCoef.StartFlag=1;
+            }     
+        }
+        else if(ass_CalCoef.StartFlag ==1 )
+        {
+            ass_CalOut.swVoltLimitPu += 3;//ass_CalCoef.uwStartUpGainAddStep; 
+            if(slSpderror <= 100)
+            {
+              VoltCnt++;
+            }
+            else
+            {
+                VoltCnt--;
+                if (VoltCnt<0)
+                {
+                  VoltCnt=0;
+                }
+             }
+             if(VoltCnt > 30)
+             {
+                Ass_FSM = TorqueAssit;
+                ass_CalCoef.StartFlag=0;
+            }
+        }
+        
+        
+//        if(ass_CalCoef.StartFlag ==0 )
+//        { 
+//          
+//           VoltCnt++;
+//           ass_CalOut.swVoltLimitPu = tmpVoltargetPu;
+//           if(VoltCnt>=30)
+//           {
+//             ass_CalCoef.StartFlag=1;
+//             VoltCnt=0;
+//           }
+////           if (ass_CalOut.swVoltLimitPu < (tmpVoltargetPu-200))
+////           {
+////              ass_CalOut.swVoltLimitPu +=200;
+////              
+////           }
+////           else
+////           {
+////               ass_CalOut.swVoltLimitPu = tmpVoltargetPu;
+////               ass_CalCoef.StartFlag=1;
+////           }
+//        }
+//        else if(ass_CalCoef.StartFlag ==1)
+//        {
+//           ass_CalOut.swVoltLimitPu += ass_CalCoef.uwStartUpGainAddStep;
+//           if(abs(ass_CalIn.swCurRefPu - ass_CalIn.swCurFdbPu)<200)
+//           {
+//              VoltCnt++;
+//           }
+//           else
+//           {
+//              VoltCnt--;
+//              if (VoltCnt<0)
+//              {
+//                VoltCnt=0;
+//              }
+//           }
+//           if(VoltCnt > 30)
+//           {
+//              Ass_FSM = TorqueAssit;
+//              ass_CalCoef.StartFlag=0;
+//              VoltCnt = (((SLONG)abs(ass_CalOut.swVoltLimitPu - tmpVoltargetPu))<<12)/scm_swVsDcpLimPu;
+//           }
+//            else
+//           {
+//           }
+//        }
+//        
+
+        /*启动停机判断,瞬时转矩小于停机值持续1/4圈*/
+        if(ass_CalIn.uwcadancePer == 0)
+        {
+            ass_CalOut.swSpeedRef = ass_CalIn.uwSpdFbkAbsPu; // Q15  Q10 (9.625)
+            asr_stTorqSpdPIOut.slIqRefPu = ((SLONG)ass_CalOut.swTorAssistCurrent) << 16;
+            asr_stTorqSpdPIOut.swIqRefPu = ass_CalOut.swTorAssistCurrent;
+            ass_CalCoef.swAss2SpdCNT = 0;
+            ass_CalCoef.sw2StopCNT = 0;
+            Ass_FSM = ReduceCurrent;
+        }
+        else if(ass_CalIn.uwtorquePer <= (ass_CalCoef.uwAssStopThreshold))
+        {
+            if (ass_CalIn.uwcadance != ass_CalIn.uwcadancelast)
+            {
+                ass_CalCoef.swAss2SpdCNT++;
+            }
+            if (ass_CalCoef.swAss2SpdCNT > (ass_ParaCong.uwCadPulsePerCirc >> 1))
+            {
+                ass_CalOut.swSpeedRef = ass_CalIn.uwSpdFbkAbsPu; // Q15  Q10 (9.625)
+                asr_stTorqSpdPIOut.slIqRefPu = ((SLONG)ass_CalOut.swTorAssistCurrent) << 16;
+                asr_stTorqSpdPIOut.swIqRefPu = ass_CalOut.swTorAssistCurrent;
+                ass_CalCoef.swAss2SpdCNT = 0;
+                ass_CalCoef.sw2StopCNT = 0;
+                Ass_FSM = ReduceCurrent;
+            }  
+        }
+         else
+        {           
+
+             ass_CalCoef.swAss2SpdCNT = 0;
+
+        }
+
+        break;
+
+    case TorqueAssit:
+        
+        VoltCnt += 3;
+        if(VoltCnt > Q12_1)
+        {
+           VoltCnt = Q12_1;
+        }
+        else
+        {
+        
+        }
+        
+//        if(ass_CalIn.uwtorquelpf >= ass_CalCoef.uwSwitch2TorqThreshold)
+//        {  
+//            ass_CalCoef.swCadanceGain = Q12_1; 
+//        }
+//        else if (ass_CalIn.uwtorquelpf > ass_CalCoef.uwSwitch1TorqThreshold && ass_CalIn.uwtorquelpf <= ass_CalCoef.uwSwitch2TorqThreshold)
+//        {
+//            ass_CalCoef.swCadanceGain = ((SLONG)ass_CalIn.uwtorquelpf - (SLONG)ass_CalCoef.uwSwitch1TorqThreshold) * ass_CalCoef.ulStartupDeltInv >> 16;//Q14+Q14-Q16=Q12;
+//        }
+//        else
+//        {
+//            ass_CalCoef.swCadanceGain = 0;
+//        }
+//        ass_CalCoef.swCadanceGain=Q12_1;
+//        tempVoltage =(SLONG)scm_swVsDcpLimPu * ass_CalCoef.swCadanceGain >> 12;
+//        ass_CalOut.swVoltLimitPu = (SLONG)tmpVoltargetPu + ((SLONG)tempVoltage * VoltCnt >> 12);
+        
+          ///////////test/////////
+          
+          if(ass_CalIn.uwtorquePer >= ass_CalCoef.uwSwitch1TorqThreshold)
+          {             
+              ass_CalOut.swVoltLimitPu +=  ass_CalCoef.uwStartUpGainAddStep;
+          }
+          else if (ass_CalIn.uwtorquePer <= ass_CalCoef.uwSwitch1TorqThreshold)
+          {
+              ass_CalOut.swVoltLimitPu -=  ass_CalCoef.uwSpeedConstantCommand;
+          }
+          else
+          {}
+          if (ass_CalOut.swVoltLimitPu > scm_swVsDcpLimPu)
+          {
+              ass_CalOut.swVoltLimitPu = scm_swVsDcpLimPu;
+          }
+          else if (ass_CalOut.swVoltLimitPu <= (tmpVoltargetPu + ass_ParaSet.uwStartUpCadNm))
+          {
+              ass_CalOut.swVoltLimitPu =  tmpVoltargetPu + ass_ParaSet.uwStartUpCadNm;
+          }
+
+        
+        /* Torque stop*/
+        ass_CalCoef.swTorqFilterGain += 4; // Q14 转矩滤波方式切换系数
+        if (ass_CalCoef.swTorqFilterGain > Q14_1)
+        {
+            ass_CalCoef.swTorqFilterGain = Q14_1;
+        }
+//ass_CalCoef.swTorqFilterGain = 0;
+                 
+        /*停机判断,瞬时转矩小于停机值持续1/4圈*/
+        
+        if(ass_CalIn.uwcadancePer == 0)
+        {
+            VoltCnt=0;
+            ass_CalOut.swSpeedRef = ass_CalIn.uwSpdFbkAbsPu; // Q15  Q10 (9.625)
+            asr_stTorqSpdPIOut.slIqRefPu = ((SLONG)ass_CalOut.swTorAssistCurrent) << 16;
+            asr_stTorqSpdPIOut.swIqRefPu = ass_CalOut.swTorAssistCurrent;
+            ass_CalCoef.swAss2SpdCNT = 0;
+            ass_CalCoef.sw2StopCNT = 0;
+            Stop_Orig_Coef.k = (SLONG)ass_CalCoef.swSmoothGain;
+            Stop_Coef = Polynomial_center(&Stop_Orig_Coef);
+            Ass_FSM = ReduceCurrent;
+            
+            ass_CalOut.blAssHoldFlag = 0;
+        }
+        else if(ass_CalIn.uwtorquePer <= (ass_CalCoef.uwAssStopThreshold))
+        {
+            if (ass_CalIn.uwcadance != ass_CalIn.uwcadancelast)
+            {
+                ass_CalCoef.swAss2SpdCNT++;
+            }
+            if (ass_CalCoef.swAss2SpdCNT > (ass_ParaCong.uwCadPulsePerCirc >> 1 ) || ass_CalIn.uwcadancePer == 0)
+            {
+               TorquAccCnt=0;
+                ass_CalOut.swSpeedRef = ass_CalIn.uwSpdFbkAbsPu; // Q15  Q10 (9.625)
+                asr_stTorqSpdPIOut.slIqRefPu = ((SLONG)ass_CalOut.swTorAssistCurrent) << 16;
+                asr_stTorqSpdPIOut.swIqRefPu = ass_CalOut.swTorAssistCurrent;
+                ass_CalCoef.swAss2SpdCNT = 0;
+                ass_CalCoef.sw2StopCNT = 0;
+                Ass_FSM = ReduceCurrent;
+                Stop_Orig_Coef.k = (SLONG)ass_CalCoef.swSmoothGain;
+                Stop_Coef = Polynomial_center(&Stop_Orig_Coef);
+                
+                ass_CalOut.blAssHoldFlag = 0;
+            }  
+        }
+         else
+        {
+          ass_CalCoef.swAss2SpdCNT = 0;
+
+        }
+
+        break;
+
+    case SpeedAssit:
+      
+       ass_CalOut.swVoltLimitPu = scm_swVsDcpLimPu;
+        /*电机速度指令斜坡,保证低速运行不停机*/
+        if (ass_CalOut.swSpeedRef >= 0)//ass_CalCoef.uwSpeedConstantCommand) // Q15
+        {
+            ass_CalOut.swSpeedRef -= 100;
+        }
+        else
+        {
+            ass_CalOut.swSpeedRef += 10;
+        }
+        if(ass_CalOut.swSpeedRef < 0)
+        {
+            ass_CalOut.swSpeedRef = 0;
+        }
+        
+        asr_stTorqSpdPIIn.swSpdRefPu = ass_CalIn.swDirection*ass_CalOut.swSpeedRef;
+        asr_stTorqSpdPIIn.swSpdFdbPu = ass_CalIn.swSpdFbkPu;           // Q15
+        asr_stTorqSpdPIIn.swIqMaxPu = ass_CalCoef.swSpdLoopAbsCurMax;  // ass_CalCoef.uwCurrentMaxPu;
+        asr_stTorqSpdPIIn.swIqMinPu = - ass_CalCoef.swSpdLoopAbsCurMax; // ass_CalCoef.uwCurrentMaxPu;
+        asr_voSpdPI(&asr_stTorqSpdPIIn, &asr_stTorqSpdPICoef, &asr_stTorqSpdPIOut);
+        ass_CalOut.swTorSpdLoopCurrentTemp = abs(asr_stTorqSpdPIOut.swIqRefPu);
+
+
+        if(abs(ass_CalIn.swSpdFbkPu)< 400)
+        {
+            ass_CalCoef.sw2StopCNT = 0;
+            ass_CalCoef.StartFlag = 0;
+            ass_CalCoef.uwStartUpTargetGain = 0;
+            Ass_FSM = StopAssit;
+            MoveAverageFilterClear(&maf_torque);
+            Stop_Orig_Coef.k = 0;
+            Stop_Coef = Polynomial_center(&Stop_Orig_Coef);
+            ass_CalCoef.swCoefStep = 0;
+        }
+        break;
+    case Spd2Torq:
+        /*加速啮合,速度指令斜坡快速追踪踏频*/
+        if (ass_CalIn.uwSpdFbkAbsPu < ((ass_CalOut.swCadSpd2MotSpd*3) >> 1))
+        {
+            ass_CalOut.swSpeedRef += 100;
+        }
+        else
+        {
+//            ass_CalOut.swSpeedRef -= 4;
+        }
+        if (ass_CalOut.swSpeedRef > ((ass_CalOut.swCadSpd2MotSpd*3) >> 1))
+        {
+            ass_CalOut.swSpeedRef = ((ass_CalOut.swCadSpd2MotSpd*3) >> 1);
+        }
+        asr_stTorqSpdPIIn.swSpdRefPu = ass_CalIn.swDirection*ass_CalOut.swSpeedRef;
+        asr_stTorqSpdPIIn.swSpdFdbPu = ass_CalIn.swSpdFbkPu;           // Q15
+        asr_stTorqSpdPIIn.swIqMaxPu = ass_CalCoef.swSpdLoopAbsCurMax;  // Q14
+        asr_stTorqSpdPIIn.swIqMinPu = -ass_CalCoef.swSpdLoopAbsCurMax; // Q14
+        asr_voSpdPI(&asr_stTorqSpdPIIn, &asr_stTorqSpdPICoef, &asr_stTorqSpdPIOut);
+        ass_CalOut.swTorSpdLoopCurrentTemp = abs(asr_stTorqSpdPIOut.swIqRefPu);
+        /*啮合后切换至带速启动*/
+        uwspeed2torqCnt++;
+        if (uwspeed2torqCnt > 150)//ass_CalIn.uwSpdFbkAbsPu > ass_CalOut.swCadSpd2MotSpd )// && ass_CalIn.uwtorquePer > ass_CalCoef.uwAssStopThreshold) // Q15
+        {
+            ass_CalCoef.StartFlag = 0;
+            ass_CalCoef.uwStartUpTargetGain = 0;
+            TempSpeedtoTorque = swCurrentCal(Te_Tor_AssitPu1);
+            TempSmooth = ((ULONG)abs(asr_stTorqSpdPIOut.swIqRefPu) << 12) /
+                         TempSpeedtoTorque; // abs(asr_stTorqSpdPIOut.swIqRefPu)/swCurrentCal(Te_Tor_AssitPu1)
+            if (TempSmooth > Q12_1)
+            {
+                TempSmooth = Q12_1;
+            }
+            else
+            {}
+            ass_CalCoef.swSmoothGain = 0;//Q12_1 >> 1;
+            uwspeed2torqCnt = 0;
+
+            Ass_FSM = StartupCruise;
+        }
+
+        /* 停机判断*/
+        if( ass_CalIn.uwcadance == 0)
+        {
+            ass_CalOut.swSpeedRef = ass_CalIn.uwSpdFbkAbsPu; // Q15  Q10 (9.625)
+            asr_stTorqSpdPIOut.slIqRefPu = ((SLONG)ass_CalOut.swTorAssistCurrent) << 16;
+            asr_stTorqSpdPIOut.swIqRefPu = ass_CalOut.swTorAssistCurrent;
+            ass_CalCoef.swAss2SpdCNT = 0;
+            Ass_FSM = ReduceCurrent;
+            Stop_Orig_Coef.k = (SLONG)ass_CalCoef.swSmoothGain;
+            Stop_Coef = Polynomial_center(&Stop_Orig_Coef);
+        }
+        else if ((ass_CalIn.uwtorquePer <= ass_CalCoef.uwAssStopThreshold)) // Q14
+        {
+            if (ass_CalIn.uwcadance != ass_CalIn.uwcadancelast)
+            {
+                ass_CalCoef.swAss2SpdCNT++;
+            }
+            if (ass_CalCoef.swAss2SpdCNT > (ass_ParaCong.uwCadPulsePerCirc >> 1)|| ass_CalIn.uwcadance == 0)
+            {
+                ass_CalOut.swSpeedRef = ass_CalIn.uwSpdFbkAbsPu; // Q15  Q10 (9.625)
+                asr_stTorqSpdPIOut.slIqRefPu = ((SLONG)ass_CalOut.swTorAssistCurrent) << 16;
+                asr_stTorqSpdPIOut.swIqRefPu = ass_CalOut.swTorAssistCurrent;
+                ass_CalCoef.swAss2SpdCNT = 0;
+                Ass_FSM = ReduceCurrent;
+                Stop_Orig_Coef.k = (SLONG)ass_CalCoef.swSmoothGain;
+                Stop_Coef = Polynomial_center(&Stop_Orig_Coef);
+            }
+        }
+        else
+        {
+            ass_CalCoef.swAss2SpdCNT = 0;
+        }
+        break;
+
+    case StartupCruise:
+
+        if (ass_CalCoef.StartFlag == 0)
+        {
+            ass_CalCoef.swSmoothGain += ass_CalCoef.uwStartUpGainAddStep;// / ass_CalIn.uwGearSt; //助力比斜坡,与用户设置以及档位相关
+            if (ass_CalCoef.swSmoothGain >= ass_CalCoef.uwStartupCruiseGain)
+            {
+                ass_CalCoef.StartFlag = 1;
+            }
+        }
+        else if (ass_CalCoef.StartFlag == 1)
+        {
+            ass_CalCoef.swSmoothGain -= ass_CalCoef.uwStartUpGainAddStep;// / ass_CalIn.uwGearSt; //助力比斜坡,与用户设置以及档位相关
+            if (ass_CalIn.uwcadance != ass_CalIn.uwcadancelast)
+            {
+                ass_CalCoef.swCadanceCNT++;
+            }
+            if (ass_CalCoef.swSmoothGain < Q12_1)
+            {
+                ass_CalCoef.swSmoothGain = Q12_1;
+                if (ass_CalCoef.swCadanceCNT > ass_CalCoef.uwStartUpTimeCadenceCnt)
+                {
+                    Ass_FSM = TorqueAssit;
+                    ass_CalCoef.swAss2SpdCNT = 0;
+                    ass_CalCoef.swCadanceCNT = 0;
+                    ass_CalCoef.sw2StopCNT = 0;
+                }
+            }
+        }
+
+         if(ass_CalIn.uwcadancePer == 0)
+        {
+            ass_CalOut.swSpeedRef = ass_CalIn.uwSpdFbkAbsPu; // Q15  Q10 (9.625)
+            asr_stTorqSpdPIOut.slIqRefPu = ((SLONG)ass_CalOut.swTorAssistCurrent) << 16;
+            asr_stTorqSpdPIOut.swIqRefPu = ass_CalOut.swTorAssistCurrent;
+            ass_CalCoef.swAss2SpdCNT = 0;
+            ass_CalCoef.sw2StopCNT = 0;
+            Ass_FSM = ReduceCurrent;
+            Stop_Orig_Coef.k = (SLONG)ass_CalCoef.swSmoothGain;
+            Stop_Coef = Polynomial_center(&Stop_Orig_Coef);
+        }
+        else if(ass_CalIn.uwtorquePer <= (ass_CalCoef.uwAssStopThreshold))
+        {
+            if (ass_CalIn.uwcadance != ass_CalIn.uwcadancelast)
+            {
+                ass_CalCoef.swAss2SpdCNT++;
+            }
+            if (ass_CalCoef.swAss2SpdCNT > (ass_ParaCong.uwCadPulsePerCirc >> 1) || ass_CalIn.uwcadancePer == 0)
+            {
+                ass_CalOut.swSpeedRef = ass_CalIn.uwSpdFbkAbsPu; // Q15  Q10 (9.625)
+                asr_stTorqSpdPIOut.slIqRefPu = ((SLONG)ass_CalOut.swTorAssistCurrent) << 16;
+                asr_stTorqSpdPIOut.swIqRefPu = ass_CalOut.swTorAssistCurrent;
+                ass_CalCoef.swAss2SpdCNT = 0;
+                ass_CalCoef.sw2StopCNT = 0;
+                Ass_FSM = ReduceCurrent;
+                Stop_Orig_Coef.k = (SLONG)ass_CalCoef.swSmoothGain;
+                Stop_Coef = Polynomial_center(&Stop_Orig_Coef);
+            }  
+        }
+         else
+        {
+
+            ass_CalCoef.swAss2SpdCNT = 0;
+        }
+
+
+        break;
+
+    case  ReduceCurrent:
+        if ((ass_CalCoef.swSmoothGain <= 0) && (abs(ass_CalIn.swSpdFbkPu)< 400))
+        {
+            ass_CalCoef.swSmoothGain = 0;
+            ass_CalCoef.swTorqFilterGain = 0;
+            MoveAverageFilterClear(&maf_torque);
+            ass_CalCoef.swCadanceGain = 0;
+            ass_CalOut.swSpeedRef = ass_CalIn.uwSpdFbkAbsPu; // Q15  Q10 (9.625)
+            asr_stTorqSpdPIOut.slIqRefPu = ((SLONG)ass_CalOut.swTorAssistCurrent) << 16;
+            asr_stTorqSpdPIOut.swIqRefPu = ass_CalOut.swTorAssistCurrent;
+            Ass_FSM = StopAssit;
+            
+        }  
+        else
+        {
+            ass_CalCoef.swSmoothGain -= 40;
+            ass_CalOut.swVoltLimitPu -= 20;
+            if(ass_CalOut.swVoltLimitPu <= 0)
+            {
+                ass_CalOut.swVoltLimitPu = 0;
+            }
+            
+        }
+        break;
+    case StopAssit:
+ 
+        ass_CalOut.swTorSpdLoopCurrentTemp = 0;
+        /* 启动判断*/
+       if (ass_CalIn.uwbikespeed < 449) // 0.3Hz,  (2.19m轮径下  2.36km/h )
+        {
+            if (ass_CalIn.uwtorquePer > ass_CalCoef.uwAssThreshold && ass_CalIn.uwcadance > 0)
+            {
+//               hw_voPWMOn();
+                Ass_FSM = Startup;
+                ass_CalCoef.swTorqFilterGain = 0;
+                ass_CalCoef.sw2StopCNT = 0;
+                VoltCnt=0;
+                ass_CalOut.swVoltLimitPu=0;
+            }
+        }
+        else
+        {
+          if (ass_CalIn.uwtorquelpf > ((ass_CalCoef.uwAssThreshold * 3)>>3) && ass_CalIn.uwtorquePer > ass_CalCoef.uwAssThreshold && ass_CalIn.uwcadance > 0)
+            {
+//               hw_voPWMOn();
+                ass_CalCoef.swTorqFilterGain = 0;
+                uwspeed2torqCnt = 0;
+                Ass_FSM = Startup;
+                ass_CalOut.swSpeedRef = ass_CalIn.uwSpdFbkAbsPu;
+                ass_CalCoef.sw2StopCNT = 0;
+                VoltCnt=0;
+                ass_CalOut.swVoltLimitPu=0;
+            }
+        }
+       
+//        if (ass_CalIn.uwtorquelpf > ass_CalCoef.uwAssThreshold && ass_CalIn.uwcadance > 0)
+//        {
+////            hw_voPWMOn();
+//            if (ass_CalIn.uwbikespeed == 0)
+//            {
+//                Ass_FSM = Startup;
+//                ass_CalCoef.swTorqFilterGain = 0;
+//            }
+//            else
+//            {
+//                ass_CalCoef.swTorqFilterGain = 0;
+//                Ass_FSM = Spd2Torq;
+//                ass_CalOut.swSpeedRef = ass_CalIn.uwSpdFbkAbsPu;
+//            }
+//            ass_CalCoef.sw2StopCNT = 0;
+//        }
+        /* 退出助力判断*/
+        if (ass_CalIn.uwcadance == 0 || ass_CalIn.uwtorquelpf < ass_CalCoef.uwAssStopThreshold)
+        {
+            ass_CalCoef.sw2StopCNT++;
+        }
+        else
+        {
+            if (ass_CalCoef.sw2StopCNT >= 1)
+            {
+                ass_CalCoef.sw2StopCNT--;
+            }
+        }
+        if (ass_CalCoef.sw2StopCNT > TIME_MS2CNT(3000)) // 3s
+        {
+            ass_CalCoef.sw2StopCNT = 0;
+            ass_CalCoef.blAssistflag = FALSE;
+            
+        }
+        break;
+
+    default:
+        break;
+    }
+
+    //////////////////////////////   Bikespeed limt of Assist //////////////////////////////////
+    if (ass_CalIn.uwbikespeed <= ass_CurLimCoef.uwBikeSpdThresHold1)
+    {
+        ass_CalCoef.swBikeSpeedGain = Q12_1; // Q12
+        
+    }
+    else if (ass_CalIn.uwbikespeed > ass_CurLimCoef.uwBikeSpdThresHold1 && ass_CalIn.uwbikespeed <= ass_CurLimCoef.uwBikeSpdThresHold2)
+    {
+        ass_CalCoef.swBikeSpeedGain =
+            Q12_1 -
+            ((((SQWORD)ass_CalIn.uwbikespeed - (SQWORD)ass_CurLimCoef.uwBikeSpdThresHold1) * (SQWORD)ass_CurLimCoef.ulBikeSpdDeltInv) >> 28); // Q12
+        TorqueAccStep = 10;
+        TorqueDecStep = 10;
+    }
+    else
+    {
+        ass_CalCoef.swBikeSpeedGain = 0;
+    }
+
+    switch (Ass_FSM)
+    {
+    case Startup:
+       Te_Tor_AssitPu2 = ((SLONG)Te_Tor_AssitPu1 * ass_CalCoef.swBikeSpeedGain) >> 12; // Q14+Q12-Q12+Q12-Q12=Q14
+        Te_Cad_AssitPu2 = ((SLONG)Te_Cad_AssitPu1 * ass_CalCoef.swBikeSpeedGain) >> 12; // Q14+Q12-Q12+Q12-Q12=Q14
+        ass_CalOut.swTorAss2CurrentTemp = swCurrentCal(Te_Tor_AssitPu2);                // Q14  电流指令计算
+        ass_CalOut.swCadAss2CurrentTemp = swCurrentCal(Te_Cad_AssitPu2);                // Q14  电流指令计算
+        if (ass_CalOut.swTorAss2CurrentTemp > ass_CalCoef.swCurrentmax_torAssPu)
+        {
+            ass_CalOut.swTorAss2CurrentTemp = ass_CalCoef.swCurrentmax_torAssPu;
+        }
+        if (ass_CalOut.swCadAss2CurrentTemp > ass_CalCoef.swCurrentmax_cadAssPu)
+        {
+            ass_CalOut.swCadAss2CurrentTemp = ass_CalCoef.swCurrentmax_cadAssPu;
+        }
+       ass_CalOut.swTorRefTarget = ass_CalOut.swTorAss2CurrentTemp + ass_CalOut.swCadAss2CurrentTemp;
+       ass_CalOut.swTorRefEnd = ass_CalOut.swTorRefTarget;
+       if (ass_CalCoef.StartFlag==0)
+       {
+            ass_CalOut.swTorAssistCurrentTemp = ass_CalIn.swDirection * 13000;
+       }
+       else
+       {
+            ass_CalOut.swTorAssistCurrentTemp = ass_CalIn.swDirection *ass_CalOut.swTorRefEnd;
+       }
+       
+       
+    break;  
+      
+    case TorqueAssit:
+   
+        Te_Tor_AssitPu2 = ((SLONG)Te_Tor_AssitPu1 * ass_CalCoef.swBikeSpeedGain) >> 12; // Q14+Q12-Q12+Q12-Q12=Q14
+        Te_Cad_AssitPu2 = ((SLONG)Te_Cad_AssitPu1 * ass_CalCoef.swBikeSpeedGain) >> 12; // Q14+Q12-Q12+Q12-Q12=Q14
+        ass_CalOut.swTorAss2CurrentTemp = swCurrentCal(Te_Tor_AssitPu2);                // Q14  电流指令计算
+        ass_CalOut.swCadAss2CurrentTemp = swCurrentCal(Te_Cad_AssitPu2);                // Q14  电流指令计算
+        if (ass_CalOut.swTorAss2CurrentTemp > ass_CalCoef.swCurrentmax_torAssPu)
+        {
+            ass_CalOut.swTorAss2CurrentTemp = ass_CalCoef.swCurrentmax_torAssPu;
+        }
+        if (ass_CalOut.swCadAss2CurrentTemp > ass_CalCoef.swCurrentmax_cadAssPu)
+        {
+            ass_CalOut.swCadAss2CurrentTemp = ass_CalCoef.swCurrentmax_cadAssPu;
+        }
+#if CURSWITCH
+        ass_CalOut.swTorRefTarget = ass_CalOut.swTorAss2CurrentTemp + ass_CalOut.swCadAss2CurrentTemp;
+        
+        if((ass_CalOut.swTorRefTarget - ass_CalOut.swTorRefEnd) > 2)
+        {
+            TorquAccCnt++;
+            if(TorquAccCnt >= 2)
+            {
+                ass_CalOut.swTorRefEnd += TorqueAccStep; 
+                TorquAccCnt = 0;
+            }          
+        }  
+        else if(((ass_CalOut.swTorRefTarget - ass_CalOut.swTorRefEnd) < (-1)))
+        {
+          if (ass_CalIn.uwcadance != ass_CalIn.uwcadancelast)
+          {
+
+                ass_CalOut.swTorRefEnd -= TorqueDecStep;
+               
+          }
+//            TorquDecCnt++;
+//            if(TorquDecCnt >= 10)
+//            {
+//                ass_CalOut.swTorRefEnd += TorqueAccStep; 
+//                TorquDecCnt = 0;
+//            }    
+        }
+        else
+        {
+           ass_CalOut.swTorRefEnd = ass_CalOut.swTorRefTarget;
+        }
+        ass_CalOut.swTorAssistCurrentTemp = ass_CalIn.swDirection * ass_CalOut.swTorRefEnd;
+       
+#else  
+        
+        ass_CalOut.swTorAssistCurrentTemp = ass_CalIn.swDirection *(ass_CalOut.swTorAss2CurrentTemp + ass_CalOut.swCadAss2CurrentTemp);
+#endif
+        break;
+        
+    case StartupCruise:
+        Te_Tor_AssitPu2 = ((SLONG)Te_Tor_AssitPu1 * ass_CalCoef.swBikeSpeedGain) >> 12; // Q14+Q12-Q12+Q12-Q12=Q14
+        Te_Cad_AssitPu2 = ((SLONG)Te_Cad_AssitPu1 * ass_CalCoef.swBikeSpeedGain) >> 12; // Q14+Q12-Q12+Q12-Q12=Q14
+        ass_CalOut.swTorAss2CurrentTemp = swCurrentCal(Te_Tor_AssitPu2);                // Q14  电流指令计算
+        ass_CalOut.swCadAss2CurrentTemp = swCurrentCal(Te_Cad_AssitPu2);                // Q14  电流指令计算
+        if (ass_CalOut.swTorAss2CurrentTemp > ass_CalCoef.swCurrentmax_torAssPu)
+        {
+            ass_CalOut.swTorAss2CurrentTemp = ass_CalCoef.swCurrentmax_torAssPu;
+        }
+        if (ass_CalOut.swCadAss2CurrentTemp > ass_CalCoef.swCurrentmax_cadAssPu)
+        {
+            ass_CalOut.swCadAss2CurrentTemp = ass_CalCoef.swCurrentmax_cadAssPu;
+        }
+       
+#if CURSWITCH
+         
+        ass_CalOut.swTorRefTarget = ass_CalOut.swTorAss2CurrentTemp + ass_CalOut.swCadAss2CurrentTemp;
+        if((ass_CalOut.swTorRefTarget - ass_CalOut.swTorRefEnd) > 2)
+        {
+            TorquAccCnt++;
+            if(TorquAccCnt >= 1)
+            {
+                ass_CalOut.swTorRefEnd += TorqueAccStep; 
+                TorquAccCnt = 0;
+            }    
+        }  
+        else if(((ass_CalOut.swTorRefTarget - ass_CalOut.swTorRefEnd) < (-1)))
+        {
+          if (ass_CalIn.uwcadance != ass_CalIn.uwcadancelast)
+          {
+               ass_CalOut.swTorRefEnd -= TorqueDecStep;
+          }
+        }
+        else
+        {
+           ass_CalOut.swTorRefEnd = ass_CalOut.swTorRefTarget;
+        }
+        
+        if(ass_CalOut.swTorRefEnd  < ass_CalOut.swTorSpdLoopCurrentTemp)
+        {
+            ass_CalOut.swTorRefEnd  = ass_CalOut.swTorSpdLoopCurrentTemp;
+            //ass_CalOut.swTorSpdLoopCurrentTemp = 0; // 启动前电流最小为速度环电流,启动后最小电流为0
+        }
+        else
+        {
+            ass_CalOut.swTorRefEnd = ass_CalOut.swTorRefEnd;
+        }
+        ass_CalOut.swTorAssistCurrentTemp = ass_CalIn.swDirection * ass_CalOut.swTorRefEnd;
+       
+#else
+        ass_CalOut.swTorAssistCurrentTemp = ass_CalOut.swTorAss2CurrentTemp + ass_CalOut.swCadAss2CurrentTemp;
+        if(ass_CalOut.swTorAssistCurrentTemp < ass_CalOut.swTorSpdLoopCurrentTemp)
+        {
+            ass_CalOut.swTorAssistCurrentTemp  = ass_CalIn.swDirection*ass_CalOut.swTorSpdLoopCurrentTemp;
+            //ass_CalOut.swTorSpdLoopCurrentTemp = 0; // 启动前电流最小为速度环电流,启动后最小电流为0
+        }
+        else
+        {
+            ass_CalOut.swTorAssistCurrentTemp = ass_CalIn.swDirection * ass_CalOut.swTorAssistCurrentTemp;
+        }
+#endif
+      
+        break; 
+    case  ReduceCurrent:
+        Te_Tor_AssitPu2 = ((SLONG)Te_Tor_AssitPu1 * ass_CalCoef.swBikeSpeedGain) >> 12; // Q14+Q12-Q12+Q12-Q12=Q14
+        Te_Cad_AssitPu2 = ((SLONG)Te_Cad_AssitPu1 * ass_CalCoef.swBikeSpeedGain) >> 12; // Q14+Q12-Q12+Q12-Q12=Q14
+        ass_CalOut.swTorAss2CurrentTemp = swCurrentCal(Te_Tor_AssitPu2);                // Q14  电流指令计算
+        ass_CalOut.swCadAss2CurrentTemp = swCurrentCal(Te_Cad_AssitPu2);                // Q14  电流指令计算
+        if (ass_CalOut.swTorAss2CurrentTemp > ass_CalCoef.swCurrentmax_torAssPu)
+        {
+            ass_CalOut.swTorAss2CurrentTemp = ass_CalCoef.swCurrentmax_torAssPu;
+        }
+        if (ass_CalOut.swCadAss2CurrentTemp > ass_CalCoef.swCurrentmax_cadAssPu)
+        {
+            ass_CalOut.swCadAss2CurrentTemp = ass_CalCoef.swCurrentmax_cadAssPu;
+        }
+        ass_CalOut.swTorAssistCurrentTemp = ass_CalIn.swDirection *(ass_CalOut.swTorAss2CurrentTemp + ass_CalOut.swCadAss2CurrentTemp);
+        break; 
+    case SpeedAssit:
+        ass_CalOut.swTorAssistCurrentTemp = asr_stTorqSpdPIOut.swIqRefPu; // ass_CalOut.swTorSpdLoopCurrentTemp;
+        break;
+    case Spd2Torq:
+        ass_CalOut.swTorAssistCurrentTemp = asr_stTorqSpdPIOut.swIqRefPu; // ass_CalOut.swTorSpdLoopCurrentTemp;
+        ass_CalOut.swTorRefEnd = ass_CalOut.swTorAssistCurrentTemp;
+        break;
+    case StopAssit:
+         ass_CalOut.swTorAssistCurrentTemp = 0;
+         ass_CalOut.swTorRefEnd = 0;
+         break;
+    default:
+    	break;
+    }
+
+    ////////////////////////////    output Iqref ///////////////////////////////////////
+    ass_CalOut.swTorAssistCurrent = ass_CalOut.swTorAssistCurrentTemp;
+    mth_voLPFilter(ass_CalOut.swTorAssistCurrent, &ass_pvt_stCurLpf);   
+    Assist_torqueper = ass_pvt_stCurLpf.slY.sw.hi;
+//      Assist_torqueper =ass_CalOut.swTorAssistCurrent;
+    return Assist_torqueper;
+}
+
+/**
+ * @brief  Three order polynomial  Y = a*X^3 + b*X^2 + c*x +d
+ *
+ * @param coef polynomial coefficient a, b, c, d
+ * @param Value polynomial input value X
+ * @param Qnum  polynomial input Q type
+ * @return UWORD  polynomial output Y
+ */
+void AssitCuvLim(UWORD gear, UWORD uwBikeSpeedHzPu, UWORD uwCurMaxPu)
+{
+    UWORD uwIqLimitTemp1;
+
+    uwIqLimitTemp1 = ((ULONG)ass_CurLimCoef.uwLimitGain[gear] * uwCurMaxPu) >> 10;
+
+    ass_CurLimOut.uwIqlimit = uwIqLimitTemp1;
+}
+
+/**
+ * @brief  Assist function
+ *
+ * @param coef polynomial coefficient a, b, c, d
+ * @param Value polynomial input value X
+ * @param Qnum  polynomial input Q type
+ * @return UWORD  polynomial output Y
+ */
+
+void Assist(void)
+{
+
+    if ((ass_CalIn.uwtorquePer > ass_CalCoef.uwAssThreshold && ass_CalIn.uwcadancePer > 0) && ass_CalIn.uwGearSt > 0)
+    {
+        ass_CalCoef.blAssistflag = TRUE;
+    }
+    if (ass_CalCoef.blAssistflag == TRUE)
+    {
+        ////////////  Calculate the Iq limit ///////////////////
+        UWORD IqLimitTemp;
+        AssitCuvLim(ass_CalIn.uwGearSt, ass_CalIn.uwbikespeed, ass_ParaCong.uwCofCurMaxPu);
+        AssistCurrentLimitAccordingBMS(ass_CalIn.SOCValue);
+
+        IqLimitTemp = (ass_CurLimOut.uwIqlimit < ass_CalIn.swFlxIqLimit)
+                          ? (ass_CurLimOut.uwIqlimit < ass_CalIn.swPwrIqLimit ? ass_CurLimOut.uwIqlimit : ass_CalIn.swPwrIqLimit)
+                          : (ass_CalIn.swFlxIqLimit < ass_CalIn.swPwrIqLimit ? ass_CalIn.swFlxIqLimit : ass_CalIn.swPwrIqLimit);
+
+        ass_CalCoef.uwCurrentMaxPu = (IqLimitTemp < ass_CurLimitCalBMSOut.uwIqLimitAbs) ? IqLimitTemp : ass_CurLimitCalBMSOut.uwIqLimitAbs;
+        ass_CalCoef.swCurrentmax_torAssPu = ((SLONG)ass_CalCoef.uwCurrentMaxPu * ass_ParaSet.uwTorWeight) >> 12; // Q14
+        ass_CalCoef.swCurrentmax_cadAssPu = ((SLONG)ass_CalCoef.uwCurrentMaxPu * ass_ParaSet.uwCadenceWeight) >> 12;
+        //////////////// Assist ////////////////////////
+
+//        AssitCuvApplPer();
+        AssitCuvApplPerVolt();
+        /////////////// Limit ///////////////////////////
+        if (Assist_torqueper > ass_CalCoef.uwCurrentMaxPu)
+        {
+            Assist_torqueper = ass_CalCoef.uwCurrentMaxPu;
+        }            
+    }
+    else
+    {
+        Assist_torqueper = 0;
+    }    
+}
+
+void MoveAverageFilter(MAF_IN *in)
+{
+    in->sum -= in->buffer[in->index];
+    in->buffer[in->index] = in->value;
+    in->sum += (SQWORD)in->value;
+//    if (in->buffer[in->length - 1] == 0)
+//    {
+//        in->AverValue = (SLONG)(in->sum / (in->index + 1));
+//    }
+//    else
+//    {
+        in->AverValue = (SLONG)(in->sum / in->length);
+//    }
+    in->index++;
+
+    if (in->index >= in->length)
+    {
+        in->index = 0;
+    }
+}
+void MoveAverageFilterClear(MAF_IN *in)
+{
+    UWORD i;
+    in->index = 0;
+    in->sum = 0;
+    //    memset((UBYTE*)in->buffer, 0, sizeof(in->buffer));
+
+    //     in->buffer[(1 << in->length)-1]=0;
+    for (i = 0; i < 64; i++)
+    {
+        in->buffer[i] = 0;
+    }
+}
+
+void AssistMode_Select(void) // 上电运行一次or助力参数更新后,AssistCoef需要重新计算
+{
+    UWORD TempAssit;
+    UWORD TempGear, gear;
+//    if (ass_ParaSet.uwAsssistSelectNum == 1) // OBC:更换成EE参数
+//    {
+//        TempAssit = ass_ParaCong.uwAssistSelect1;
+//    }
+//    else if (ass_ParaSet.uwAsssistSelectNum == 2)
+//    {
+//        TempAssit = ass_ParaCong.uwAssistSelect2;
+//    }
+//    else
+//    {
+//        TempAssit = ASSISTMOD_SELECT_DEFAULT;
+//    }
+    if (ass_ParaCong.uwStartMode == 1) // OBC:更换成EE参数
+    {
+        TempAssit = ASSISTMOD_SELECT_DEFAULT;
+    }
+    else if (ass_ParaCong.uwStartMode  == 2)
+    {
+        TempAssit = ass_ParaCong.uwAssistSelect1;
+    }
+    else if (ass_ParaCong.uwStartMode  == 3)
+    {
+        TempAssit = ass_ParaCong.uwAssistSelect2;
+    }
+    else
+    {
+        TempAssit = ASSISTMOD_SELECT_DEFAULT;
+    }
+    
+    for (gear = 0; gear < 5; gear++)
+    {
+        TempGear = gear * 3 + ((TempAssit >> (gear << 1)) & 0x0003);
+        memcpy(&ass_CalCoef.uwTorqueAssGain[(gear + 1)], &flash_stPara.slTorqAssGain[TempGear], sizeof(POLY_COEF));
+    }
+    memcpy(&ass_CalCoef.uwCadencAsseGain[1], &flash_stPara.slCadAssGain[0], sizeof(flash_stPara.slCadAssGain));
+}
+
+void AssistCurrentLimitAccordingBMS(UWORD uwSOCvalue)
+{
+    if (uwSOCvalue < ass_CurLimCalBMSCoef.uwIqLimitStartSoc && uwSOCvalue > ass_CurLimCalBMSCoef.uwIqLimitEndSoc)
+    {
+        ass_CurLimitCalBMSOut.uwIqLimitAbs =
+            ass_CurLimCalBMSCoef.uwIqLimitInitAbs - (((SLONG)ass_CurLimCalBMSCoef.uwIqLimitStartSoc - uwSOCvalue) * ass_CurLimCalBMSCoef.swIqLImitK);
+    }
+    else if (uwSOCvalue <= ass_CurLimCalBMSCoef.uwIqLimitEndSoc)
+    {
+        ass_CurLimitCalBMSOut.uwIqLimitAbs = 0;
+    }
+    else
+    {
+        ass_CurLimitCalBMSOut.uwIqLimitAbs = ass_CurLimCalBMSCoef.uwIqLimitInitAbs;
+    }
+}
+
+

+ 72 - 14
User project/3.BasicFunction/Source/Temp.c

@@ -36,7 +36,7 @@ SWORD tmp_CurCalibCoef[CURCALIBNUM] = {
     940,  // 80-90
 };
 
-static SWORD PCB_swRTempTab[TEMPNUM] = {
+static SWORD PCB_swRTempTab[PCB_TEMP_NUM] = {
 0, // 0.01kOnm IPM voltage at 0 C      initial
 0, // 0.01kOnm IPM voltage at 10 C
 0, // 0.01kOnm IPM voltage at 20 C
@@ -51,7 +51,7 @@ static SWORD PCB_swRTempTab[TEMPNUM] = {
 0, // 0.01kOnm IPM voltage at 110 C
 0// 40 // 0.01kOnm IPM voltage at 120 C
 };
-static SWORD PCB_swRTempTab_CITY[TEMPNUM] = {
+static SWORD PCB_swRTempTab_CITY[PCB_TEMP_NUM] = {
  2700, // 0.01kOnm IPM voltage at 0 C        CITY
  1700, // 0.01kOnm IPM voltage at 10 C
  1100, // 0.01kOnm IPM voltage at 20 C
@@ -66,7 +66,7 @@ static SWORD PCB_swRTempTab_CITY[TEMPNUM] = {
  30, // 0.01kOnm IPM voltage at 110 C
  20// 40 // 0.01kOnm IPM voltage at 120 C
 };
-static SWORD PCB_swRTempTab_MTB[TEMPNUM] = {
+static SWORD PCB_swRTempTab_MTB[PCB_TEMP_NUM] = {
  3000, // 0.01kOnm IPM voltage at 0 C       MTB
  2000, // 0.01kOnm IPM voltage at 10 C
  1200, // 0.01kOnm IPM voltage at 20 C
@@ -82,11 +82,31 @@ static SWORD PCB_swRTempTab_MTB[TEMPNUM] = {
  37// 40 // 0.01kOnm IPM voltage at 120 C
 };
 
-static SWORD PCB_swRTempCofTab[TEMPNUM-1] = {
+static SWORD PCB_swRTempCofTab[PCB_TEMP_NUM-1] = {
   0,0,0,0,0,0,0,0,0,0,0,0
 };
 
-SWORD tmp_PcbTemp = 0;
+volatile SWORD TorqTempReg[TORQ_TEMP_NUM]= {
+3301,    //-11 C
+2690,    //8 C
+1802,    //28 C
+1368,    //40 C
+899,     //55 C
+580,     //69 C
+376      //85 C
+};
+volatile SWORD TorqTemp[TORQ_TEMP_NUM]= {
+-1083,    //unit: 0.01C
+843,    
+2830,    
+3997,    
+5460,     
+6930,     
+8453      
+};
+volatile SWORD TorqTempCof[TORQ_TEMP_NUM-1]= {
+  0,0,0,0,0,0
+};
 /***************************************************************
  Function: TempInit;
  Description: cadence frequency get initialization
@@ -98,10 +118,11 @@ SWORD tmp_PcbTemp = 0;
 ****************************************************************/
 void TempInit(void)
 {
+    UWORD i = 0;
+
     if(MOTOR_ID_SEL == MOTOR_WELLING_MTB)
     {
-      UWORD i = 0;
-      for(i = 0 ; i < TEMPNUM ;i ++)
+      for(i = 0 ; i < PCB_TEMP_NUM ;i ++)
       {
         PCB_swRTempTab[i] =   PCB_swRTempTab_MTB[i] ;
       }
@@ -109,19 +130,23 @@ void TempInit(void)
 
     if(MOTOR_ID_SEL == MOTOR_WELLING_CITY)
     {
-      UWORD i = 0;
-      for(i = 0 ; i < TEMPNUM ;i ++)
+      for(i = 0 ; i < PCB_TEMP_NUM ;i ++)
       {
         PCB_swRTempTab[i] =   PCB_swRTempTab_CITY[i] ;
       }
-
     }
     
-    UWORD CNT = 0;
-    for (CNT = 0; CNT < (TEMPNUM - 1); CNT++)
+    for (i = 0; i < (PCB_TEMP_NUM - 1); i++)
     {
-        PCB_swRTempCofTab[CNT] = ((SLONG)10 << 10) / (PCB_swRTempTab[CNT ] - PCB_swRTempTab[CNT+ 1]);
+        PCB_swRTempCofTab[i] = ((SLONG)10 << 10) / (PCB_swRTempTab[i] - PCB_swRTempTab[i+ 1]); //Q10
+    }  
+    
+           
+    for (i = 0; i < (TORQ_TEMP_NUM - 1); i++)
+    {
+        TorqTempCof[i] = (((SLONG)TorqTemp[i+1] - (SLONG)TorqTemp[i]) << 10) / (TorqTempReg[i] - TorqTempReg[i+1]) ; //Q10
     }
+
 }
 
 /***************************************************************
@@ -133,6 +158,7 @@ void TempInit(void)
  Subroutine Call: N/A;
  Reference: N/A
 ****************************************************************/
+SWORD tmp_PcbTemp = 0;
 //void PcbTempCal(SWORD PcbR)
 //{
 //    if (PcbR >= PCB_swRTempTab[temp_0])
@@ -241,10 +267,42 @@ void PcbTempCal(SWORD PcbR)
         coeftest = 1;
     }
 }
+/***************************************************************
+ Function: 
+ Description:
+ Call by: 
+ Input Variables: N/A
+ Output/Return Variables: N/A
+ Subroutine Call: N/A
+ Reference: N/A
+****************************************************************/    
+SWORD temp_swTorqTempCal(UWORD Reg)  
+{
+    SWORD Temp = 0,i = 0;
     
+    if(Reg >= TorqTempReg[0])
+    {
+       Temp = TorqTemp[0];
+    }
+    else if(Reg < TorqTempReg[TORQ_TEMP_NUM - 1])
+    {
+       Temp = TorqTemp[TORQ_TEMP_NUM - 1];
+    }
+    else
+    {
+        for (i = 0; i < (TORQ_TEMP_NUM - 1); i++)
+        {
+            if(Reg >= TorqTempReg[i+1] && Reg < TorqTempReg[i])
+            {
+               Temp = TorqTemp[i] + ((SLONG)TorqTempCof[i] * (TorqTempReg[i] - Reg) >> 10);  //Q10
+               break;
+            }        
+        }    
+    }
     
+    return  Temp;
+}
     
-
 /*************************************************************************
  End of this File (EOF)!
  Do not put anything after this part!

+ 2 - 0
User project/3.BasicFunction/Source/canAppl.c

@@ -20,6 +20,8 @@
 #include "string.h"
 #include "syspar.h"
 #include "AssistCurve.h"
+#include "hwsetup.h"
+#include "spi_master.h"
 /******************************
  *
  *  Parameter

+ 253 - 6
User project/3.BasicFunction/Source/torquesensor.c

@@ -20,7 +20,7 @@
 #include "hwsetup.h"
 #include "CodePara.h"
 #include "canAppl.h"
-
+#include "FuncLayerAPI.h"
 /******************************
  *
  * static  Parameter
@@ -30,12 +30,59 @@ TORQUESENSOR_COF torsensor_stTorSensorCof = TORQUESENSOR_COF_DEFAULT;
 static LPF_OUT   scm_stTorSensorLpf;
 TORQUESENSOR_OUT torsensor_stTorSensorOut = TORQUESENSOR_OUT_DEFAULT;
 
+volatile SWORD TorqOffsetReg[TORQ_OFFSET_NUM]= {
+640,    //-11 C
+718,    //8 C
+919,    //28 C
+957,    //40 C
+1051,     //55 C
+1196,     //69 C
+1352      //85 C
+};
+
+volatile SWORD TorqOffsetTemp[TORQ_OFFSET_NUM]= {
+-1083,    //unit: 0.01C
+843,    
+2830,    
+3997,    
+5460,     
+6930,     
+8453      
+};
+volatile SWORD TorqOffsetCof[TORQ_OFFSET_NUM-1]= {
+  0,0,0,0,0,0
+};
+
+volatile SWORD TorqSencitiveReg[TORQ_OFFSET_NUM]= {
+4423,    //-20 C
+6021,    //0 C
+7048,    //20 C
+7663,    //40 C
+8008,     //60 C
+8226,     //80 C
+8459      //100 C
+};
+volatile SWORD TorqSencitiveTemp[TORQ_OFFSET_NUM]= {
+-200,    //unit: 0.1C
+0,    
+200,    
+400,    
+600,     
+800,     
+1000      
+};
+volatile SLONG TorqSencitiveCof[TORQ_OFFSET_NUM-1]= {
+  0,0,0,0,0,0
+};
 /******************************
  *
  * Extern  Parameter
  *
  ******************************/
 UWORD TorSensor_uwDMAReg = 0;
+
+POLY_COEF TorqSencitiveCoef = TORQUESENSITIVE_COF_DEFAULT;
+
 /***************************************************************
  Function: cadence_voFreGet;
  Description: cadence frequency get
@@ -45,12 +92,12 @@ UWORD TorSensor_uwDMAReg = 0;
  Subroutine Call: N/A;
  Reference: N/A
 ****************************************************************/
-//UWORD PowerUpOffset = 573;
 void torsensor_voTorSensorCof(void)
 {
 
     ULONG ulLpfTm = 0;
-
+    UWORD i = 0;
+      
     // torsensor_stTorSensorCof.uwMaxSensorTorquePu = ((ULONG)TORQUE_MAX_RANGE << 14) / TORQUEBASE; // Q14
     torsensor_stTorSensorCof.uwMinSensorTorquePu = ((ULONG)TORQUE_MIN_RANGE << 14) / TORQUEBASE; // Q14
     torsensor_stTorSensorCof.uwMaxSensorVolOutputPu = ((ULONG)TORQUE_VOLTAGE_MAX_RANGE << 14 / VBASE);
@@ -63,7 +110,7 @@ void torsensor_voTorSensorCof(void)
         #if (TORSENSOR_USEMOL == TORSENSOR_USEDEFAULT)
         torsensor_stTorSensorCof.uwTorqueOffset = TORQUE_VOLTAGE_MIN_RANGE * 4096 / 3300;
         #elif (TORSENSOR_USEMOL == TORSENSOR_USEEE)
-        torsensor_stTorSensorCof.uwTorqueOffsetPowerUp = hw_uwADC0[7]; //hw_uwADC1[0];
+         torsensor_stTorSensorCof.uwTorqueOffsetPowerUp = hw_uwADC0[7]; 
         //torsensor_stTorSensorCof.uwTorqueOffsetPowerUp = PowerUpOffset;
 
         if(torsensor_stTorSensorCof.uwTorqueOffsetNow1 != 0 && torsensor_stTorSensorCof.uwTorqueOffsetNow2 != 0
@@ -166,6 +213,16 @@ void torsensor_voTorSensorCof(void)
     /* Torque Sensor limit coef */
     ulLpfTm = 1000000 / torsensor_stTorSensorCof.uwTorSensorLPFFrq;
     mth_voLPFilterCoef(ulLpfTm, torsensor_stTorSensorCof.uwTorVolLPFDisFrq, &scm_stTorSensorLpf.uwKx);
+    
+    for (i = 0; i < (TORQ_OFFSET_NUM - 1); i++)
+    {
+        TorqOffsetCof[i] =  (((SLONG)TorqOffsetReg[i+1] - (SLONG)TorqOffsetReg[i]) << 12) /(TorqOffsetTemp[i+1] - TorqOffsetTemp[i]); //Q12
+    }
+    
+        for (i = 0; i < (TORQ_OFFSET_NUM - 1); i++)
+    {
+        TorqSencitiveCof[i] =  (((SLONG)TorqSencitiveReg[i+1] - (SLONG)TorqSencitiveReg[i]) << 10) /(TorqSencitiveTemp[i+1] - TorqSencitiveTemp[i]); //Q10
+    }
 }
 
 /***************************************************************
@@ -177,6 +234,7 @@ void torsensor_voTorSensorCof(void)
  Subroutine Call: N/A;
  Reference: N/A
 ****************************************************************/
+LPF_OUT tst_dynOffsetLpf;
 void torsensor_voTorSensorInit(void)
 {
     torsensor_stTorSensorOut.uwTorqueReg = 0;
@@ -185,18 +243,130 @@ void torsensor_voTorSensorInit(void)
     torsensor_stTorSensorOut.uwTorqueErrorCnt = 0;
     torsensor_stTorSensorOut.blTorqueCaliFlg = FALSE;
     torsensor_stTorSensorOut.blTorqueErrorFlg = FALSE;
+    mth_voLPFilterCoef(1000000 / 1, EVENT_1MS_HZ, &tst_dynOffsetLpf.uwKx); //25Hz  
+    tst_dynOffsetLpf.slY.sw.hi =  hw_uwADC0[7];
+        /* Torque Sensor limit coef */
+   
 }
 
 /*************************************************************************
  Local Functions (N/A)
 *************************************************************************/
+UWORD tsttorqCadCnt,tsttorqMin=4096,tstdynOffset;
+BOOL tstDynCalibflg= TRUE;
+UWORD tstTorqOffset,tstSensitiveset,TorqValue,TorqValuePu, TorqReg;
+SWORD tstTorqTemp,tstTorqTemp111,tstSencitiveOrig;
+void torsensor_voCadenceCnt(void)
+{
+  if (((cadence_stFreGetCof.uwNumbersPulses>>1)-1) != tsttorqCadCnt)
+  {
+      tsttorqCadCnt++;
+  }
+  else
+  {
+      tsttorqCadCnt = 0;
+      tsttorqMin = 4096;
+  }
+}
+
+void torsensor_voDynamicOffset(void)
+{
+   if(cadence_stFreGetOut.uwLPFFrequencyPu != 0)
+   {
+     tstDynCalibflg = TRUE;
+     if(tsttorqMin > hw_uwADC0[7])
+     {
+        tsttorqMin = hw_uwADC0[7];
+     }
+     if(tsttorqCadCnt == ((cadence_stFreGetCof.uwNumbersPulses>>1) -1))
+     {       
+        tstdynOffset = tsttorqMin;
+     }
+   }
+   else
+   {
+     if( tstDynCalibflg == TRUE && TorqValuePu <= 500)
+     {
+        tstdynOffset = hw_uwADC0[7];
+        tstDynCalibflg = FALSE;
+     }
+   }
+   mth_voLPFilter(tstdynOffset, &tst_dynOffsetLpf);
+}
+
+
+void torsensor_voTorADCwithTemp(void)
+{
+    tstTorqTemp = temp_swTorqTempCal(hw_uwADC0[4]); // 0.1 C
+//    tstTorqOffset = torsensor_uwTorqOffsetCal(tstTorqTemp); // Torque AD 
+    tstTorqOffset= 1478; //tst_dynOffsetLpf.slY.sw.hi;    //tstdynOffset;
+    tstSensitiveset = torsensor_uwTorqSencitiveCal(tstTorqTemp/10, 250); //Q12
+
+    torsensor_stTorSensorOut.uwTorqueReg = hw_uwADC0[7];
+    
+    if(((SLONG)torsensor_stTorSensorOut.uwTorqueReg - tstTorqOffset) < 0)
+    {
+      TorqReg = torsensor_stTorSensorCof.uwTorqueOffset;
+    }
+    else
+    {
+      TorqReg = (((SLONG)torsensor_stTorSensorOut.uwTorqueReg - tstTorqOffset) *10000) / tstSensitiveset + torsensor_stTorSensorCof.uwTorqueOffset;
+    }
+    
+      
+        if (TorqReg <= torsensor_stTorSensorCof.uwTorqueOffset)
+        {
+            TorqValuePu = 0;
+        }
+        else if (TorqReg <= torsensor_stTorSensorCof.uwBikeTorStep1ADC)
+        {
+            TorqValuePu = 0 +
+                ((((SQWORD)abs((SWORD)(TorqReg) - torsensor_stTorSensorCof.uwTorqueOffset)) *
+                 torsensor_stTorSensorCof.uwTorqueReg2Pu1) >>
+                10); // Q14
+        }
+        else if (TorqReg <= torsensor_stTorSensorCof.uwBikeTorStep2ADC)
+        {
+            TorqValuePu = torsensor_stTorSensorCof.uwBikeTorStep1NmPu + 
+                ((((SQWORD)abs((SWORD)(TorqReg) - torsensor_stTorSensorCof.uwBikeTorStep1ADC)) *
+                 torsensor_stTorSensorCof.uwTorqueReg2Pu2) >>
+                10); // Q14
+        }
+        else if (TorqReg <= torsensor_stTorSensorCof.uwBikeTorStep3ADC)
+        {
+            TorqValuePu = torsensor_stTorSensorCof.uwBikeTorStep2NmPu +
+                ((((SQWORD)abs((SWORD)(TorqReg) - torsensor_stTorSensorCof.uwBikeTorStep2ADC)) *
+                 torsensor_stTorSensorCof.uwTorqueReg2Pu3) >>
+                10); // Q14
+        }
+        else if (TorqReg<= torsensor_stTorSensorCof.uwBikeTorStep4ADC)
+        {
+            TorqValuePu = torsensor_stTorSensorCof.uwBikeTorStep3NmPu + 
+                ((((SQWORD)abs((SWORD)(TorqReg) - torsensor_stTorSensorCof.uwBikeTorStep3ADC)) *
+                 torsensor_stTorSensorCof.uwTorqueReg2Pu4) >>
+                10); // Q14
+        }
+        else
+        {
+            TorqValuePu = torsensor_stTorSensorCof.uwBikeTorStep4NmPu;
+        }
+        torsensor_stTorSensorOut.uwTorquePu=TorqValuePu;
+        mth_voLPFilter(torsensor_stTorSensorOut.uwTorquePu, &scm_stTorSensorLpf);
+        torsensor_stTorSensorOut.uwTorqueLPFPu = scm_stTorSensorLpf.slY.sw.hi;
+        TorqValue = (ULONG)TorqValuePu * TORQUEBASE  >> 14;
+        
+    //TorqValue = ((torsensor_stTorSensorOut.uwTorqueReg - tstTorqOffset) << 12 )/tstSencitiveset;
+}
+
+
 void torsensor_voTorADC(void) // need to match ADC_StartConversion(ADC1);
 {
 
+
     if (torsensor_stTorSensorOut.blTorqueErrorFlg == TRUE)
     {
         torsensor_stTorSensorOut.uwTorquePu = 0;
-        torsensor_stTorSensorOut.uwTorqueReg = hw_uwADC0[7]; //hw_uwADC1[0];
+        torsensor_stTorSensorOut.uwTorqueReg = hw_uwADC0[7];
         if (torsensor_stTorSensorOut.uwTorqueReg < 4000 && torsensor_stTorSensorOut.uwTorqueReg > 10) // output 0mv - 3000mv
         {
             torsensor_stTorSensorOut.uwTorqueErrorCnt++;
@@ -213,7 +383,7 @@ void torsensor_voTorADC(void) // need to match ADC_StartConversion(ADC1);
     }
     else
     {
-        torsensor_stTorSensorOut.uwTorqueReg = hw_uwADC0[7]; //hw_uwADC1[0]; // TorSensor_uwDMAReg;
+        torsensor_stTorSensorOut.uwTorqueReg = hw_uwADC0[7]; // TorSensor_uwDMAReg;
 #if (TORSENSOR_USEMOL == TORSENSOR_USEDEFAULT)
         torsensor_stTorSensorOut.uwTorquePu =
             (((SQWORD)abs((SWORD)(torsensor_stTorSensorOut.uwTorqueReg) - torsensor_stTorSensorCof.uwTorqueOffset)) *
@@ -284,6 +454,83 @@ void torsensor_voTorADC(void) // need to match ADC_StartConversion(ADC1);
     }
 }
 
+/***************************************************************
+ Function:
+ Description:
+ Call by:
+ Input Variables: N/A
+ Output/Return Variables: N/A
+ Subroutine Call: N/A
+ Reference: N/A
+****************************************************************/
+UWORD torsensor_uwTorqOffsetCal(SWORD Temp)  
+{
+    UWORD Offset = 0, i = 0;
+    
+    if(Temp < TorqOffsetTemp[0])
+    {
+       Offset = TorqOffsetReg[0];
+    }
+    else if(Temp >= TorqOffsetTemp[TORQ_OFFSET_NUM - 1])
+    {
+       Offset = TorqOffsetReg[TORQ_OFFSET_NUM - 1];
+    }
+    else
+    {
+        for (i = 0; i < (TORQ_OFFSET_NUM - 1); i++)
+        {    
+            if(Temp >= TorqOffsetTemp[i] && Temp < TorqOffsetTemp[i+1])
+            {
+               Offset = TorqOffsetReg[i] + (TorqOffsetCof[i] * (Temp - TorqOffsetTemp[i]) >> 12);
+               break;
+            }        
+        } 
+    }
+   
+    return  Offset;
+}
+
+UWORD torsensor_uwTorqSencitiveCal(SWORD Temp, SWORD T0)  
+{
+//    UWORD Sencitive = 0, i = 0;
+//    
+//    if(Temp < TorqSencitiveTemp[0])
+//    {
+//       Sencitive = TorqSencitiveReg[0];
+//    }
+//    else if(Temp >= TorqSencitiveTemp[TORQ_OFFSET_NUM - 1])
+//    {
+//       Sencitive = TorqSencitiveReg[TORQ_OFFSET_NUM - 1];
+//    }
+//    else
+//    {
+//        for (i = 0; i < (TORQ_OFFSET_NUM - 1); i++)
+//        {    
+//            if(Temp >= TorqSencitiveTemp[i] && Temp < TorqSencitiveTemp[i+1])
+//            {
+//               Sencitive = TorqSencitiveReg[i] + (TorqSencitiveCof[i] * (Temp - TorqSencitiveTemp[i]) >> 10); // Q10
+//               break;
+//            }        
+//        } 
+//    }
+//    
+//    return  Sencitive;
+  
+     UWORD a = 108, b = 939, sensitive = 0; //a=0.00010846, b= 0.93899723
+     SWORD DeltaTemp = 0;  
+     SLONG g = 0;  
+
+     DeltaTemp = Temp - T0; //unit: 0.1 C
+     
+     g =(SLONG)b * DeltaTemp +  (SLONG)a * DeltaTemp * DeltaTemp / 1000;
+     
+     sensitive = 10000 + g / 100;  
+     
+     return sensitive;
+     
+}
+
+
 /*************************************************************************
  Local Functions (N/A)
 *************************************************************************/

+ 8 - 3
User project/4.BasicHardwSoftwLayer/1.BasicHardwLayer/Source/hwsetup.c

@@ -272,6 +272,7 @@ void hw_voInitGPIO(void)
 
     //gpio_init(GPIOC,GPIO_MODE_IN_FLOATING,GPIO_OSPEED_50MHZ, GPIO_PIN_6|GPIO_PIN_7|GPIO_PIN_8);  /* TIM2_CH0,1,2: HallA, HallB, HallC */
 
+    gpio_pin_remap_config(GPIO_TIMER2_FULL_REMAP,ENABLE);
     gpio_init(GPIOC,GPIO_MODE_AF_PP,GPIO_OSPEED_50MHZ, GPIO_PIN_9);  /* TIM2_CH3: 70KHz For Torque Sensor*/   
 
     gpio_init(GPIOC,GPIO_MODE_AF_PP,GPIO_OSPEED_50MHZ,GPIO_PIN_10); /* UART3_TX*/    
@@ -528,7 +529,8 @@ void hw_voInitADC(void)
     adc_regular_channel_config(ADC0, 4, ADC_CHANNEL_15, ADC_SAMPLETIME_7POINT5); //PC5 Motor_Temp
     adc_regular_channel_config(ADC0, 5, ADC_CHANNEL_12, ADC_SAMPLETIME_7POINT5); //PC2 U_12V
     adc_regular_channel_config(ADC0, 6, ADC_CHANNEL_13, ADC_SAMPLETIME_7POINT5); //PC3 Throtttle
-    adc_regular_channel_config(ADC0, 7, ADC_CHANNEL_3, ADC_SAMPLETIME_7POINT5); //PA3 Torque
+    adc_regular_channel_config(ADC0, 7, ADC_CHANNEL_3, ADC_SAMPLETIME_7POINT5); //PA3 Torque    
+
     /* 8· = 0.55*8 = 4.44us */
     
     /* ADC inserted channel config */
@@ -760,8 +762,8 @@ void hw_voInitTim2(void)
     timer_channel_output_config(TIMER2, TIMER_CH_3, &timer_ocintpara);
 
     timer_channel_output_pulse_value_config(TIMER2, TIMER_CH_3, (1028>>1));
-    timer_channel_output_mode_config(TIMER2, TIMER_CH_0, TIMER_OC_MODE_PWM1);
-    timer_channel_output_shadow_config(TIMER2, TIMER_CH_0, TIMER_OC_SHADOW_DISABLE);
+    timer_channel_output_mode_config(TIMER2, TIMER_CH_3, TIMER_OC_MODE_PWM1);
+    timer_channel_output_shadow_config(TIMER2, TIMER_CH_3, TIMER_OC_SHADOW_DISABLE);
     
      /* TIMER2 primary output enable */
     timer_primary_output_config(TIMER2,ENABLE);
@@ -1137,6 +1139,9 @@ void hw_voEnInt(void)
     {
         adc_interrupt_enable(ADC0 , ADC_INT_EOIC);
         adc_interrupt_enable(ADC1 , ADC_INT_EOIC);
+        
+        
+         //adc_interrupt_enable(ADC1 , ADC_INT_EOC);
     }
     else
     {

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

@@ -40,7 +40,7 @@ Update Time
 *=======================================================================*/
 #define MOTOR_WELLING_CITY 0x20
 #define MOTOR_WELLING_MTB 0x21
-#define MOTOR_ID_SEL           MOTOR_WELLING_MTB //
+#define MOTOR_ID_SEL           MOTOR_WELLING_CITY //
 
 
 /*======================================================================*
@@ -263,7 +263,7 @@ Update Time
 /*=====================================================================*
    PWM generation
 *=======================================================================*/
-#define PWM_MAX_DUTY_CYLE_IPM     900                        // 938      // unit: 0.1%,Max duty cyle for compare value
+#define PWM_MAX_DUTY_CYLE_IPM     880                        // 938      // unit: 0.1%,Max duty cyle for compare value
 #define PWM_7SVM_TO_5SVM_DUTY_IPM 700                        // unit: 0.1%, Switch ratio from 7 to 5 svpwm
 #define PWM_MIN_SAMPLE_DUTY1_IPM  5 * 10000 / PWM_PERIOD_US  // unit: 0.1%, 5us TWO MIN ZERO VECTOR = two sample current steady time
 #define PWM_MIN_SAMPLE_DUTY2_IPM  10 * 10000 / PWM_PERIOD_US // unit: 0.1%, 10us TWO (one sample current steady time + one sample time)
@@ -441,10 +441,6 @@ Update Time
 #include "pwrlim.h"
 #include "bootloader.h"
 #include "brake.h"
-//#include "stm32f3xx_STLparam.h"
-//#include "stm32f3xx_STLcrc32Run.h"
-//#include "stm32f3xx_STLclassBvar.h"
-//#include "stm32f3xx_STLcpu.h"
 #include "uart_monitor_appl.h"
 #include "macroequ.h"
 #include "alignstartup.h"

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

@@ -41,7 +41,7 @@ void CodeParaInit(void)
     UWORD i;
 #if (MOTOR_ID_SEL ==MOTOR_WELLING_CITY )
 {
-    cp_stFlg.RunModelSelect = ClZLOOP; //CityBIKE;//ClZLOOP; 
+    cp_stFlg.RunModelSelect = CityBIKE; //CityBIKE;//ClZLOOP; 
     cp_stFlg.RotateDirectionSelect = BackwardRotate;
 }
 #elif (MOTOR_ID_SEL == MOTOR_WELLING_MTB)