|
@@ -89,7 +89,8 @@ void HAL_SYSTICK_Callback(void)
|
|
|
if(TimeCnt_10ms >= 10)
|
|
|
{
|
|
|
TimeCnt_10ms = 0;
|
|
|
-
|
|
|
+ //计算整车传动比
|
|
|
+ BikeRatioCal_Process(MC_RunInfo.MotorSpeed, MC_RunInfo.Cadence, MC_RunInfo.BikeSpeed, &Bike_RatioCalParam);
|
|
|
}
|
|
|
|
|
|
//50ms任务
|
|
@@ -108,8 +109,7 @@ void HAL_SYSTICK_Callback(void)
|
|
|
TimeCnt_100ms = 0;
|
|
|
//踏频计算滑动均值滤波
|
|
|
MC_RunInfo.Cadence = MovingAverageFilter(MC_CadenceResult.Cadence_Data, MC_Cadence_Array, sizeof(MC_Cadence_Array) / 2);
|
|
|
- //计算整车传动比
|
|
|
- BikeRatioCal_Process(MC_RunInfo.MotorSpeed, MC_RunInfo.Cadence, MC_RunInfo.BikeSpeed, &Bike_RatioCalParam);
|
|
|
+
|
|
|
}
|
|
|
|
|
|
//200ms任务
|
|
@@ -977,36 +977,39 @@ void NoPBUMode_Ini( void )
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-//车辆传动比计算,运行周期100ms
|
|
|
+//车辆传动比计算,运行周期10ms
|
|
|
void BikeRatioCal_Process(uint16_t MotorSpeed, uint16_t Cadence, uint16_t BikeSpeed, Bike_RatioCal_Struct_t* p_Bike_RatioCal)
|
|
|
{
|
|
|
- static uint8_t Cnt = 0;
|
|
|
uint8_t Cal_K = 0;
|
|
|
+ uint16_t AccCnt, DecCnt;
|
|
|
//车辆静止或滑行时不计算
|
|
|
if((BikeSpeed < 30) || ((BikeSpeed >= 30) && (MotorSpeed < 100) && (Cadence < 10)))
|
|
|
{
|
|
|
- return;
|
|
|
+ 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;
|
|
|
+ return;
|
|
|
}
|
|
|
- //根据车速、电机转速、踏频计算传动系数
|
|
|
- p_Bike_RatioCal->Ratio_Per = (((uint32_t)BikeSpeed << 18) * 10) / ((((uint32_t)MotorSpeed << 8) > ((uint32_t)Cadence * 2795)) ? ((uint32_t)MotorSpeed << 8) : ((uint32_t)Cadence * 2795));
|
|
|
+ //根据车速、电机转速、踏频计算传动系数,系数 = 车速 / 电机转速 * 1024,其中车速单位为km/h,并放大了10倍
|
|
|
+ p_Bike_RatioCal->RatioPer = (((uint32_t)BikeSpeed << 18) * 10) / ((((uint32_t)MotorSpeed << 8) > ((uint32_t)Cadence * 2795)) ? ((uint32_t)MotorSpeed << 8) : ((uint32_t)Cadence * 2795));
|
|
|
//限制计算结果
|
|
|
- p_Bike_RatioCal->Ratio_Per = (p_Bike_RatioCal->Ratio_Per < 100) ? 100 : ((p_Bike_RatioCal->Ratio_Per > 10000) ? 10000 : p_Bike_RatioCal->Ratio_Per);
|
|
|
- //判断换挡是否完成
|
|
|
- p_Bike_RatioCal->Ratio_Array[Cnt++] = p_Bike_RatioCal->Ratio_Per;
|
|
|
- if(Cnt >= 50)
|
|
|
- {
|
|
|
- GetMaxMinAvgData(p_Bike_RatioCal->Ratio_Array, 50, &p_Bike_RatioCal->Ratio_Max, &p_Bike_RatioCal->Ratio_Min, &p_Bike_RatioCal->Ratio_Avg);
|
|
|
- Cal_K = ((p_Bike_RatioCal->Ratio_Max + p_Bike_RatioCal->Ratio_Min) >> 1) * 100 / p_Bike_RatioCal->Ratio_Avg;
|
|
|
- if((Cal_K < 120) && (Cal_K > 80))
|
|
|
- {
|
|
|
- p_Bike_RatioCal->Ratio_Result = p_Bike_RatioCal->Ratio_Avg;
|
|
|
- p_Bike_RatioCal->Ratio_ShiftFlag = TRUE;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- p_Bike_RatioCal->Ratio_ShiftFlag = FALSE;
|
|
|
- }
|
|
|
- Cnt = 0;
|
|
|
- }
|
|
|
+ p_Bike_RatioCal->RatioPer = (p_Bike_RatioCal->RatioPer < 500) ? 500 : ((p_Bike_RatioCal->RatioPer > 8000) ? 8000 : p_Bike_RatioCal->RatioPer);
|
|
|
+ //计算结果滤波
|
|
|
+ p_Bike_RatioCal->RatioFltSum += ((p_Bike_RatioCal->RatioPer << 10) - p_Bike_RatioCal->RatioFltSum) >> 5;
|
|
|
+ p_Bike_RatioCal->RatioFlt = p_Bike_RatioCal->RatioFltSum >> 10;
|
|
|
+ //目标值计算
|
|
|
+ #if 0
|
|
|
+ AccCnt = p_Bike_RatioCal->TargetAcc;
|
|
|
+ DecCnt = p_Bike_RatioCal->TargetDec;
|
|
|
+ if(p_Bike_RatioCal->RatioFlt - p_Bike_RatioCal->RatioResult >= AccCnt)
|
|
|
+ p_Bike_RatioCal->RatioResult += AccCnt;
|
|
|
+ else if(p_Bike_RatioCal->RatioResult - p_Bike_RatioCal->RatioFlt >= DecCnt)
|
|
|
+ p_Bike_RatioCal->RatioResult -= DecCnt;
|
|
|
+ else
|
|
|
+ p_Bike_RatioCal->RatioResult = p_Bike_RatioCal->RatioFlt;
|
|
|
+ #else
|
|
|
+ p_Bike_RatioCal->RatioResult = p_Bike_RatioCal->RatioFlt;
|
|
|
+ #endif
|
|
|
}
|
|
|
/**************************全局函数定义结束*****************/
|