فهرست منبع

增加传动比计算,用于转把限速控制。

dd 4 ماه پیش
والد
کامیت
4979cdaab6

+ 2 - 0
1.FrameLayer/Source/FSM_1st.c

@@ -157,6 +157,8 @@ void SysInit_hook(void)
         torsensor_voTorSensorInit();
 
         bikebrake_voBikeBrakeInit();
+
+        BikeRatioCal_Init(ass_ParaCong.uwNmFrontChainring, ass_ParaCong.uwNmBackChainring);
         switch_flg.SysRdy_Flag = TRUE;
         
         AssitCoefInit();

+ 7 - 0
1.FrameLayer/Source/TimeTask_Event.c

@@ -278,6 +278,13 @@ void Event_10ms(void)
 
        #endif
    CadSmartDisting();
+   //整车传动比计算
+   BikeRatioCal_Process((abs(switchhall_stOut.swLowSpdLpfPu) * cof_uwVbRpm) >> 15, \
+                          ((ULONG)cadence_stFreGetOut.uwLPFFrequencyPu * cof_uwFbHz * 60) >> 20, \
+                          ((ULONG)bikespeed_stFreGetOut.uwFrequencyPu * cof_uwFbHz * 60) >> 20, \
+                          ((ULONG)torsensor_stTorSensorOut.uwTorquePu * cof_uwTorqNm) >> 14, \
+                          ((ULONG)adc_stUpOut.uwIbusAvgLpfPu * cof_uwIbAp * 10) >> 14, \
+                          &Bike_RatioCalParam);
 }
 
 void  Event_20ms(void)

+ 28 - 0
3.BasicFunction/Include/bikeRatioCal.h

@@ -0,0 +1,28 @@
+/*
+ * BikeRatioCal.h
+ *
+ *  Created on: 2025年3月27日
+ *      Author: zhouxiong9
+ */
+
+#ifndef BIKERATIOCAL_H_
+#define BIKERATIOCAL_H_
+
+#include "typedefine.h"
+
+//传动比计算参数
+typedef struct
+{
+    UWORD RatioPer;                           //实时传动比,车轮转速 / 牙盘转速 * 1024
+    UWORD RatioFlt;                           //传动比滤波值
+    SLONG RatioFltSum;
+    UWORD RatioDefault;                       //传动比默認值
+    UWORD RatioResult;                        //传动比输出
+}Bike_RatioCal_Struct_t;
+
+extern Bike_RatioCal_Struct_t Bike_RatioCalParam;
+
+extern void BikeRatioCal_Init(UWORD Teeth_F, UWORD Teeth_B);
+extern void BikeRatioCal_Process(UWORD MotorSpeed, UWORD Cadence, UWORD BikeSpeedRpm, UWORD PedalTorqueNm, UWORD Current, Bike_RatioCal_Struct_t* p_Bike_RatioCal);
+
+#endif /* 3_BASICFUNCTION_INCLUDE_BIKERATIOCAL_H_ */

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

@@ -16,6 +16,7 @@
 
 #include "AssistCurve.h"
 #include "bikeinformation.h"
+#include "bikeRatioCal.h"
  
 /****************************************
  *

+ 62 - 0
3.BasicFunction/Source/BikeRatioCal.c

@@ -0,0 +1,62 @@
+/*
+ * BikeRatioCal.c
+ *
+ *  Created on: 2025年3月27日
+ *      Author: zhouxiong9
+ */
+#include "BikeRatioCal.h"
+
+Bike_RatioCal_Struct_t Bike_RatioCalParam = {0,0,0,0,0};
+
+//参数初始化
+void BikeRatioCal_Init(UWORD Teeth_F, UWORD Teeth_B)
+{
+    Bike_RatioCalParam.RatioDefault = (Teeth_F << 10) / Teeth_B;
+    Bike_RatioCalParam.RatioResult = Bike_RatioCalParam.RatioDefault;
+}
+
+//传动比计算
+void BikeRatioCal_Process(UWORD MotorSpeed, UWORD Cadence, UWORD BikeSpeedRpm, UWORD PedalTorqueNm, UWORD Current, Bike_RatioCal_Struct_t* p_Bike_RatioCal)
+{
+    ULONG Speed_F, Speed_B; //前后牙盘转速 rpm Q8
+    UBYTE Coasted_Flag = 1; //滑行或静止标志,1-滑行或静止
+
+    //有效判断
+    if(BikeSpeedRpm > 20) //20rpm*60*2.19m/1000≈2.6km/h
+    {
+        if((PedalTorqueNm > 50) && (Cadence > 10)) //5Nm 10rpm
+            Coasted_Flag = 0;
+        else
+        {
+            if((MotorSpeed > 100) && (Current > 10)) //100rpm 0.1A
+            {
+                Coasted_Flag = 0;
+            }
+        }
+    }
+
+    //计算传动比
+    if(Coasted_Flag == 0)
+    {
+        //转速计算
+        Speed_F = ((((ULONG)MotorSpeed * 56) > ((ULONG)Cadence * 614)) ? ((ULONG)MotorSpeed * 56) : ((ULONG)Cadence * 614)) >> 8; //max(电机转速/4.55*256,踏频*2.4*256)
+        Speed_B = BikeSpeedRpm;
+        //计算传动比 Q10
+        p_Bike_RatioCal->RatioPer = (Speed_B << 10) / Speed_F;
+        //限制计算结果
+        p_Bike_RatioCal->RatioPer = (p_Bike_RatioCal->RatioPer < 200) ? 200 : ((p_Bike_RatioCal->RatioPer > 5000) ? 5000 : p_Bike_RatioCal->RatioPer);
+        //计算结果滤波
+        p_Bike_RatioCal->RatioFltSum += ((p_Bike_RatioCal->RatioPer << 10) - p_Bike_RatioCal->RatioFltSum) >> 4;
+        p_Bike_RatioCal->RatioFlt = p_Bike_RatioCal->RatioFltSum >> 10;
+        //目标值计算
+        p_Bike_RatioCal->RatioResult = p_Bike_RatioCal->RatioFlt;
+    }
+    else
+    {
+        p_Bike_RatioCal->RatioPer = p_Bike_RatioCal->RatioDefault;
+        p_Bike_RatioCal->RatioResult = p_Bike_RatioCal->RatioDefault;
+        p_Bike_RatioCal->RatioFlt = p_Bike_RatioCal->RatioDefault;
+        p_Bike_RatioCal->RatioFltSum = 0;
+    }
+
+}

+ 32 - 30
3.BasicFunction/Source/CadAssist.c

@@ -881,7 +881,7 @@ void ass_voAssistCmdDeal(void)
         /** Q15 * Q4 / Q4 = Q15 */
          if(MC_WorkMode == 1)
          {
-           tmp_slAssistSpdCmd = (SLONG)ass_stCadAssCoef.swKmhToMSpdPu*(SLONG)ass_stCadAssCoef.uwThrottleMaxBikeSpeed >> 4;
+           tmp_slAssistSpdCmd = ((SLONG)ass_stCadAssCoef.swKmhToMSpdPu * (SLONG)ass_stCadAssCoef.uwThrottleMaxBikeSpeed) >> 4;
            tmp_slAssistSpdCmd= ((SLONG)MC_MotorSPD_rpm_Percent * tmp_slAssistSpdCmd) / 100;
 
            if(MC_MotorSPD_rpm_Percent<=2)
@@ -902,35 +902,36 @@ void ass_voAssistCmdDeal(void)
         {
             ass_stCadAssParaPro.uwAssitMode = 7;
         #if(THROTTLEGEAR != 0)
-                if(ass_stCadAssParaIn.uwGearSt == 1)
-                    {
-                        ass_MaxSpeed.MaxBikeSpeed =   ass_MaxSpeed.uwGearOne;
-                    }
-                    else if(ass_stCadAssParaIn.uwGearSt == 2)
-                    {
-                        ass_MaxSpeed.MaxBikeSpeed =   ass_MaxSpeed.uwGearTwo;
-                    }
-                    else if(ass_stCadAssParaIn.uwGearSt == 3)
-                   {
-                        ass_MaxSpeed.MaxBikeSpeed =   ass_MaxSpeed.uwGearThree;
-                   }
-                    else if(ass_stCadAssParaIn.uwGearSt == 4)
-                   {
-                        ass_MaxSpeed.MaxBikeSpeed = ass_MaxSpeed.uwGearFour;
-                   }
-                    else if(ass_stCadAssParaIn.uwGearSt == 5)
-                    {
-                        ass_MaxSpeed.MaxBikeSpeed =  ass_stCadAssCoef.uwThrottleMaxBikeSpeed ;
-                    }
-                if(ass_stCadAssParaIn.uwThrottlePercent < 650)
-                    {
-                        /** Q15 * Q4 / Q4 = Q15 */
-                        tmp_slAssistSpdCmd = ((SLONG)ass_stCadAssCoef.swKmhToMSpdPu*((((SLONG)(ass_stCadAssParaIn.uwThrottlePercent - 250)*(SLONG)(ass_MaxSpeed.MaxBikeSpeed - ASS_THROT_SPEED_MIN))/400)+ASS_THROT_SPEED_MIN)) >> 4;
-                    }
-                    else
-                    {
-                        tmp_slAssistSpdCmd = (SLONG)ass_stCadAssCoef.swKmhToMSpdPu*(SLONG)ass_MaxSpeed.MaxBikeSpeed>> 4;
-                    }
+        if(ass_stCadAssParaIn.uwGearSt == 1)
+            {
+                ass_MaxSpeed.MaxBikeSpeed =   ass_MaxSpeed.uwGearOne;
+            }
+            else if(ass_stCadAssParaIn.uwGearSt == 2)
+            {
+                ass_MaxSpeed.MaxBikeSpeed =   ass_MaxSpeed.uwGearTwo;
+            }
+            else if(ass_stCadAssParaIn.uwGearSt == 3)
+            {
+                ass_MaxSpeed.MaxBikeSpeed =   ass_MaxSpeed.uwGearThree;
+            }
+            else if(ass_stCadAssParaIn.uwGearSt == 4)
+            {
+                ass_MaxSpeed.MaxBikeSpeed = ass_MaxSpeed.uwGearFour;
+            }
+            else if(ass_stCadAssParaIn.uwGearSt == 5)
+            {
+                ass_MaxSpeed.MaxBikeSpeed =  ass_stCadAssCoef.uwThrottleMaxBikeSpeed ;
+            }
+            if(ass_stCadAssParaIn.uwThrottlePercent < 650)
+            {
+                /** Q15 * Q4 / Q4 = Q15 */
+                tmp_slAssistSpdCmd = ((SLONG)ass_stCadAssCoef.swKmhToMSpdPu*((((SLONG)(ass_stCadAssParaIn.uwThrottlePercent - 250)*(SLONG)(ass_MaxSpeed.MaxBikeSpeed - ASS_THROT_SPEED_MIN))/400)+ASS_THROT_SPEED_MIN)) >> 4;
+            }
+            else
+            {
+                tmp_slAssistSpdCmd = (SLONG)ass_stCadAssCoef.swKmhToMSpdPu*(SLONG)ass_MaxSpeed.MaxBikeSpeed>> 4;
+            }
+            tmp_slAssistSpdCmd = (tmp_slAssistSpdCmd << 10) / Bike_RatioCalParam.RatioResult; //前后飞轮传动比
         #else
             if(ass_stCadAssParaIn.uwThrottlePercent < 650) //850
             {
@@ -941,6 +942,7 @@ void ass_voAssistCmdDeal(void)
             {
                 tmp_slAssistSpdCmd = (SLONG)ass_stCadAssCoef.swKmhToMSpdPu*(SLONG)ass_stCadAssCoef.uwThrottleMaxBikeSpeed >> 4;
             }
+            tmp_slAssistSpdCmd = (tmp_slAssistSpdCmd << 10) / Bike_RatioCalParam.RatioResult; //前后飞轮传动比
          #endif
         }
         else

+ 3 - 4
3.BasicFunction/Source/canAppl.c

@@ -731,11 +731,10 @@ void Can_voMC_Run_1ms(void)
 
 void Can_voMC_Run_5ms(void)
 {
+    //cp_stBikeRunInfoPara.BikeSpeedKmH =
+    //    (((SQWORD)bikespeed_stFreGetOut.uwLPFFrequencyPu * FBASE * (ass_ParaCong.uwWheelPerimeter + ass_ParaCong.swDeltPerimeter) * 36 >> 20) * 1048 * 10) >>20; //    1048 = Q20(1/1000)    0.1 km/h
     cp_stBikeRunInfoPara.BikeSpeedKmH =
-        (((SQWORD)bikespeed_stFreGetOut.uwLPFFrequencyPu * FBASE * (ass_ParaCong.uwWheelPerimeter + ass_ParaCong.swDeltPerimeter) * 36 >> 20) * 1048 * 10) >>20; //    1048 = Q20(1/1000)    0.1 km/h
-    MC_RunInfo.BusVoltage = ((SLONG)adc_stUpOut.uwVdcPu * cof_uwUbVt >> 14) * 100;
-    MC_RunInfo.MotorSpeed = (SLONG)scm_uwSpdFbkLpfAbsPu * cof_uwVbRpm >> 15;
-    MC_RunInfo.BikeSpeed = cp_stBikeRunInfoPara.BikeSpeedKmH;//cp_stBikeRunInfoPara.BikeSpeedKmH; // MC_RunInfo.MotorSpeed / 10 ;
+          (((SQWORD)bikespeed_stFreGetOut.uwFrequencyPu * FBASE * (ass_ParaCong.uwWheelPerimeter + ass_ParaCong.swDeltPerimeter) * 36 >> 20) * 1048 * 10) >>20; //    1048 = Q20(1/1000)    0.1 km/h
 }
 
 void Can_voMC_Run_200ms(void)