Jelajahi Sumber

feat(assist): 1. 助推模式更改为车速闭环,2修复负载观测器系数计算为零bug.3优化助力模块启动状态切换条件。

CN\zhangkai71 2 tahun lalu
induk
melakukan
8bc56aca67

+ 60 - 40
User project/1.FrameLayer/Source/TimeTask_Event.c

@@ -191,44 +191,44 @@ void  Event_1ms(void) /* parasoft-suppress METRICS-28 "本项目圈复杂度无
         /* Speed assist mode flag */
         if((cp_stFlg.RunModelSelect == CityBIKE) || (cp_stFlg.RunModelSelect == MountainBIKE))
         {
-            if(cp_stBikeRunInfoPara.uwBikeGear == 0x22)
-            {
-                Event_pvt_uwAssistCnt ++;
-                if(Event_pvt_uwAssistCnt > 200 && cp_stFlg.RunPermitFlg == TRUE)
-                {
-                    signal_state.Assist = TRUE;
-                    Event_pvt_uwAssistCnt = 200;
-                }
-            }
-            else
-            {
-                Event_pvt_uwAssistCnt = 0;
-                signal_state.Assist = FALSE;
-            }
-
-            if(signal_state.Assist == TRUE)
-            {
-                //6km/H = 100m/min = 1.67m/s
-                if(cp_stFlg.RunModelSelect == CityBIKE)
-                {
-                    uart_slSpdRefRpm = -(10000/(ass_stParaCong.uwWheelPerimeter))*ass_stParaCong.uwNmBackChainring*ass_stParaCong.uwMechRationMotor/ass_stParaCong.uwNmFrontChainring;
-    //                cp_stBikeRunInfoPara.BikeSpeedKmH = 60;      //constant display of 6km/h
-                }
-                else if(cp_stFlg.RunModelSelect == MountainBIKE)
-                {
-                    uart_slSpdRefRpm = (10000/(ass_stParaCong.uwWheelPerimeter))*ass_stParaCong.uwNmBackChainring*ass_stParaCong.uwMechRationMotor/ass_stParaCong.uwNmFrontChainring;
-    //                cp_stBikeRunInfoPara.BikeSpeedKmH = 60;      //constant display of 6km/h
-                }
-                else
-                {
-                	//do nothing
-                }
-
-            }
-            else
-            {
-                uart_slSpdRefRpm = 0;
-            }
+//            if(cp_stBikeRunInfoPara.uwBikeGear == 0x22)
+//            {
+//                Event_pvt_uwAssistCnt ++;
+//                if(Event_pvt_uwAssistCnt > 200 && cp_stFlg.RunPermitFlg == TRUE)
+//                {
+//                    signal_state.Assist = TRUE;
+//                    Event_pvt_uwAssistCnt = 200;
+//                }
+//            }
+//            else
+//            {
+//                Event_pvt_uwAssistCnt = 0;
+//                signal_state.Assist = FALSE;
+//            }
+//
+//            if(signal_state.Assist == TRUE)
+//            {
+//                //6km/H = 100m/min = 1.67m/s
+//                if(cp_stFlg.RunModelSelect == CityBIKE)
+//                {
+//                    uart_slSpdRefRpm = -(10000/(ass_stParaCong.uwWheelPerimeter))*ass_stParaCong.uwNmBackChainring*ass_stParaCong.uwMechRationMotor/ass_stParaCong.uwNmFrontChainring;
+//    //                cp_stBikeRunInfoPara.BikeSpeedKmH = 60;      //constant display of 6km/h
+//                }
+//                else if(cp_stFlg.RunModelSelect == MountainBIKE)
+//                {
+//                    uart_slSpdRefRpm = (10000/(ass_stParaCong.uwWheelPerimeter))*ass_stParaCong.uwNmBackChainring*ass_stParaCong.uwMechRationMotor/ass_stParaCong.uwNmFrontChainring;
+//    //                cp_stBikeRunInfoPara.BikeSpeedKmH = 60;      //constant display of 6km/h
+//                }
+//                else
+//                {
+//                	//do nothing
+//                }
+//
+//            }
+//            else
+//            {
+//                uart_slSpdRefRpm = 0;
+//            }
         }
         else
         {          
@@ -306,17 +306,37 @@ void Event_100ms(void)
     SWORD swIqLowerPu;
     if(switch_flg.SysCoef_Flag == TRUE)
     {
+      
+        if(cp_stBikeRunInfoPara.uwBikeGear == 0x22)
+        {
+            Event_pvt_uwAssistCnt ++;
+            if(Event_pvt_uwAssistCnt >= 2 && cp_stFlg.RunPermitFlg == TRUE)
+            {
+                Event_pvt_uwAssistCnt = 2;
+            }
+        }
+        else
+        {
+            Event_pvt_uwAssistCnt = 0;
+        }
         /* Bike Speed LPF */
         bikespeed_stFreGetOut.uwLPFFrequencyPu = (bikespeed_stFreGetOut.uwLPFFrequencyPu * bikespeed_stFreGetCof.uwBikeSpeedLPFGain +
                                                   bikespeed_stFreGetOut.uwFrequencyPu * (100 - bikespeed_stFreGetCof.uwBikeSpeedLPFGain)) /
                                                  100;
         /* Bike Throttle Assist */
-        if((bikethrottle_stBikeThrottleOut.uwThrottlePercent > 200)  && (cp_stBikeRunInfoPara.uwBikeGear > 0) && (cp_stFlg.RunPermitFlg == TRUE) && (BikeBrake_blGetstate() == FALSE))
+        if(((bikethrottle_stBikeThrottleOut.uwThrottlePercent > 200) || Event_pvt_uwAssistCnt == 2)&& (cp_stBikeRunInfoPara.uwBikeGear > 0) && (cp_stFlg.RunPermitFlg == TRUE) && (BikeBrake_blGetstate() == FALSE))
         {
             Event_pvt_blBikeThroFlg = TRUE;
 
             /* Bike Speed Ref, 200-890Percent: 4-25km/h */
-            Event_pvt_uwBikeSpdRefTarget = (UWORD)((((ULONG)25 - (ULONG)4) *(bikethrottle_stBikeThrottleOut.uwThrottlePercent - 200)/690 + 4) * BIKESPEED_KMPERH2FREQPU); // Q20
+            if(Event_pvt_uwAssistCnt == 2)
+            {
+                Event_pvt_uwBikeSpdRefTarget = (UWORD)BIKESPEED_KMPERH2FREQPU * 6; // Q20
+            }
+            else
+            {
+                Event_pvt_uwBikeSpdRefTarget = (UWORD)((((ULONG)25 - (ULONG)4) *(bikethrottle_stBikeThrottleOut.uwThrottlePercent - 200)/690 + 4) * BIKESPEED_KMPERH2FREQPU); // Q20   
+            }
             
             /* Bike Speed Ref Ramp */
             if(Event_pvt_uwBikeSpdRef < Event_pvt_uwBikeSpdRefTarget - 80)

+ 2 - 0
User project/1.FrameLayer/Source/gd32f30x_it.c

@@ -265,6 +265,7 @@ void TIMER0_UP_TIMER9_IRQHandler(void)
     \param[out] none
     \retval     none
 */
+UWORD tim1cnt;
 void TIMER1_IRQHandler(void)
 {
     UWORD uwIntSource = 0;
@@ -273,6 +274,7 @@ void TIMER1_IRQHandler(void)
 
     if (timer_interrupt_flag_get(TIMER1, TIMER_INT_FLAG_UP) != 0)
     {
+      tim1cnt++;
         if(switch_flg.SysCoef_Flag == TRUE)
         {
             uwIntSource = 1;

TEMPAT SAMPAH
User project/2.MotorDrive/Lib/WLMCP_LIB.lib


+ 1 - 1
User project/2.MotorDrive/Source/packed

@@ -1 +1 @@
-Subproject commit 9527cb426f3e6ffe5b282fbee405ded271ef5ece
+Subproject commit cbefbcaa0f012fe049a449241ab03895cd035aa2

+ 54 - 31
User project/3.BasicFunction/Source/AssistCurve.c

@@ -435,12 +435,13 @@ void ass_voAssitCoef(void)
 
 static SWORD ass_pvt_swVoltCnt=0;
 static UWORD ass_pvt_uwTorqAccCnt=0,ass_pvt_uwTorqDecCnt=0,ass_pvt_uwSpd2TorqCnt=0;
+UWORD AssCnt1ms; 
 static void AssitCuvApplPerVolt(void) /* parasoft-suppress METRICS-28 "本项目圈复杂度无法更改,后续避免" */
 {  
     SLONG slTeTorAssitTmpPu,slTeTorAssitLinerPu,slTeCadAssitTmpPu;
     SWORD swTeTorAssitPu1, swTeTorAssitPu2;
     SWORD swTeCadAssitPu1, swTeCadAssitPu2;
-    SWORD swTmpSpdtoTorqCur;
+    SWORD swTmpSpdtoTorqCur;   
     SLONG slTmpSmoothCur;
     SWORD swTorqCmd1, swTorqCmd, swCadCmd;
     UWORD uwTorqAccStep = 50,uwTorqDecStep = 80;
@@ -481,6 +482,13 @@ static void AssitCuvApplPerVolt(void) /* parasoft-suppress METRICS-28 "本项目
     }
     uwTorqDecStep = 80;
     
+    AssCnt1ms ++;
+    if(AssCnt1ms >= 10000)
+    {
+        AssCnt1ms = 0;
+    }
+    
+    
     /* Select TorqRef: LPFTorq or MAFTorq */
     swTorqCmd1 = (SWORD)(((SLONG)ass_stCalIn.uwtorque * ass_stCalCoef.swTorqFilterGain >> 14) +
                ((SLONG)ass_stCalIn.uwtorquelpf * (Q14_1 - ass_stCalCoef.swTorqFilterGain) >> 14)); //转矩指令滤波切换,由低通滤波到踏频相关的滑动平均滤波
@@ -494,7 +502,7 @@ static void AssitCuvApplPerVolt(void) /* parasoft-suppress METRICS-28 "本项目
     slTeTorAssitTmpPu = (SLONG)(ass_slPolynomial(&ass_stCalCoef.uwTorqueAssGain[ass_stCalIn.uwGearSt], &swTorqCmd, 14)); // Q14  转矩助力曲线
     if(ass_stCalIn.uwGearSt == 5)
     {
-        slTeTorAssitLinerPu = (((SLONG)swTorqCmd * LinerAssist[ass_stCalIn.uwGearSt-1] )>> 12) + 273;
+        slTeTorAssitLinerPu = (((SLONG)swTorqCmd * LinerAssist[ass_stCalIn.uwGearSt-1] )>> 12) + 273; // Q14  转矩助力曲线线性段
     }
     else
     {
@@ -577,24 +585,36 @@ static void AssitCuvApplPerVolt(void) /* parasoft-suppress METRICS-28 "本项目
             else
             {
             	//do nothing
-            }
-            
+            }          
             ass_stCalOut.swVoltLimitPu = (SWORD)slTmpVoltLim;
             
-            if(slSpdErr <= 1000)
+//            if(slSpdErr <= 1000)
+//            {
+//                ass_stCalCoef.StartFlag = 1;
+//            }  
+            if(abs(scm_swIqRefPu- scm_swIqFdbLpfPu) > 200)
+            {
+                ass_pvt_swVoltCnt++;  
+            }    
+            else
             {
+                ass_pvt_swVoltCnt=0;
+            }
+            if(ass_pvt_swVoltCnt > 10)
+            {
+                ass_pvt_swVoltCnt=0;
                 ass_stCalCoef.StartFlag = 1;
-            }     
+            }      
         }
         else if(ass_stCalCoef.StartFlag ==1 )
         {
-            if(ass_stCalOut.swVoltLimitPu < (scm_swVsDcpLimPu - uwVoltAccStep))
+            if(0 == (AssCnt1ms%5))
             {
-                ass_stCalOut.swVoltLimitPu += (SWORD)uwVoltAccStep;//ass_stCalCoef.uwStartUpGainAddStep;
-            }
-            else
-            {
-                ass_stCalOut.swVoltLimitPu = scm_swVsDcpLimPu;
+                ass_stCalOut.swVoltLimitPu += ass_stCalCoef.uwStartUpGainAddStep; 
+                if (ass_stCalOut.swVoltLimitPu > scm_swVsDcpLimPu)
+                {
+                    ass_stCalOut.swVoltLimitPu = scm_swVsDcpLimPu;
+                }
             }
  
             if(slSpdErr <= 100)
@@ -668,25 +688,28 @@ static void AssitCuvApplPerVolt(void) /* parasoft-suppress METRICS-28 "本项目
         }
         
         /* Reduce Voltage Limit When LPFTorq < Switch1TorqThreshold */     
-//         if(ass_stCalIn.uwtorquelpf >= ass_stCalCoef.uwSwitch1TorqThreshold)
-//         {             
-             ass_stCalOut.swVoltLimitPu +=  (SWORD)uwVoltAccStep; //ass_stCalCoef.uwStartUpGainAddStep;
-//         }
-//         else if (ass_stCalIn.uwtorquelpf <= ass_stCalCoef.uwSwitch1TorqThreshold)
-//         {
-//             ass_stCalOut.swVoltLimitPu -=  uwVoltDecStep; //ass_stCalCoef.uwSpeedConstantCommand;
-//         }
-//         else
-//         {
-//         }
-         if (ass_stCalOut.swVoltLimitPu > scm_swVsDcpLimPu)
-         {
-             ass_stCalOut.swVoltLimitPu = scm_swVsDcpLimPu;
-         }
-//         else if (ass_stCalOut.swVoltLimitPu <= (swTmpVoltPu + ass_stParaSet.uwStartUpCadNm))
-//         {
-//             ass_stCalOut.swVoltLimitPu =  swTmpVoltPu + ass_stParaSet.uwStartUpCadNm;
-//         }
+        if(0 == (AssCnt1ms%5))
+        {
+//            if(ass_stCalIn.uwtorque >= ass_stCalCoef.uwSwitch1TorqThreshold)
+//            {             
+                ass_stCalOut.swVoltLimitPu +=  ass_stCalCoef.uwStartUpGainAddStep;
+                if (ass_stCalOut.swVoltLimitPu > scm_swVsDcpLimPu)
+                {
+                    ass_stCalOut.swVoltLimitPu = scm_swVsDcpLimPu;
+                }
+//            }
+//            else if (ass_stCalIn.uwtorque <= ass_stCalCoef.uwSwitch1TorqThreshold)
+//            {
+////                ass_stCalOut.swVoltLimitPu -=  ass_stCalCoef.uwSpeedConstantCommand;
+////                if (ass_stCalOut.swVoltLimitPu <= (tmpVoltargetPu + ass_ParaSet.uwStartUpCadNm))
+////                {
+////                    ass_stCalOut.swVoltLimitPu =  tmpVoltargetPu + ass_ParaSet.uwStartUpCadNm;
+////                }
+//            }
+//            else
+//            {
+//            }
+        }
        
         /* TorqueRef Select Coef */
         ass_stCalCoef.swTorqFilterGain += 4; // Q14 转矩滤波方式切换系数

+ 2 - 2
User project/4.BasicHardwSoftwLayer/1.BasicHardwLayer/Include/hwsetup.h

@@ -45,9 +45,9 @@ extern "C" {
 #define APB1CLK_KHZ CLK_APB1_KHZ // APB1 Clock
 #define APB2CLK_KHZ CLK_APB2_KHZ // APB2 Clock
 #define TIM0CLK_KHZ CLK_TIM0_KHZ // TIM0 Clock
-#define TIM1CLK_KHZ CLK_TIM0_KHZ /100
+#define TIM1CLK_KHZ (CLK_TIM0_KHZ /100)
 #define TIM2CLK_KHZ CLK_TIM0_KHZ 
-#define TIM5CLK_KHZ CLK_TIM0_KHZ / 2 
+#define TIM5CLK_KHZ (CLK_TIM0_KHZ / 2 )
 /* Timer2 for switchhall */
 #define TIM2CNTCLK_KHZ 72    // not use
 /* Time task base use TIMER5 */