|
@@ -206,234 +206,248 @@ MC_AssistRunMode_Struct_t MC_JudgeAsistRunMode_Process(MC_SupportFlag_Struct_t G
|
|
|
return MC_AssistRunMode_Result;
|
|
|
}
|
|
|
|
|
|
-/*指拨模式相关变量*/
|
|
|
-
|
|
|
-static int32_t SpdMotorDivWheelFlt=0;
|
|
|
-int16_t SpdProportion=490; //车轮电机速度比
|
|
|
-static uint16_t SpdProportion_buff_CNT=0;
|
|
|
-uint8_t SpdProportion_CAL_flag=0;
|
|
|
-static uint16_t SpdProportion_Save_CNT=0;
|
|
|
-uint16_t SpdProportion_buff[100]={0};
|
|
|
-float SpdProportion_StandardDeviation=0;
|
|
|
-int32_t test_StandardDeviation=0;
|
|
|
-uint16_t test_SpdProportionAver=0;
|
|
|
-int32_t SpeedSetMiddle=0;
|
|
|
-int16_t dbSpdWheelSet=0; //调试用
|
|
|
-
|
|
|
-int16_t wheelSpeed=0;
|
|
|
-static int16_t DbSpdMotorPre=0;
|
|
|
-static int16_t wheelSpeedPre=0;
|
|
|
-int16_t SpdMotorDivWheel=0;
|
|
|
-int16_t SpdMotorDivWheelFlted=0;
|
|
|
-int16_t SpeedMax = 0; // 最高时速
|
|
|
-int16_t SpeedSet = 0; // 速度设定值
|
|
|
-uint32_t accStep = 0; // 加速时间步进
|
|
|
-uint32_t decStep = 0; // 减速时间步进
|
|
|
-int16_t SpeedSetReal = 0; // 速度设定真实值
|
|
|
-
|
|
|
-/*指拨模式相关变量*/
|
|
|
-
|
|
|
//指拨模式处理
|
|
|
MC_CalParam_Struct_t MC_AssistRunMode_Gas_Process(uint16_t GasSensorData, uint16_t TorqueSensorData, MC_GearSt_Struct_t GearSt)
|
|
|
{
|
|
|
- int32_t Tmp;
|
|
|
- int16_t TorQueBySpd = 0;
|
|
|
- int32_t Ref_Speed_Temp;
|
|
|
- int16_t SpdMotorByIdc = 0;
|
|
|
-
|
|
|
- MC_CalParam_Struct_t p_MC_CalParam = {MC_AssistRunMode_INVALID, 0, 0, RESET};
|
|
|
-
|
|
|
- //...插入指拨处理
|
|
|
-
|
|
|
- /*车轮速度使用原始数据,滤波后的数据有滞后,影响控制回路*/
|
|
|
- wheelSpeed = (int16_t)MC_SpeedSensorData.Speed_Data;
|
|
|
+ MC_CalParam_Struct_t p_MC_CalParam = {MC_AssistRunMode_INVALID, 0, 0, RESET};
|
|
|
+ uint8_t TorqueAccStep = 0;//力矩上升斜率
|
|
|
+ uint8_t TorqueDecStep = 0;//力矩下降斜率
|
|
|
+ int16_t Torque_Temp;
|
|
|
+ int32_t Torque_Ref_Temp;
|
|
|
+ static int16_t IqRefByInPower; //限流计算结果
|
|
|
+ static uint16_t CurrentLimitPresent; //限流实际值,做升降速处理
|
|
|
+ uint16_t CurrentLimitSet; //限流设置值,不同助力档位更新
|
|
|
|
|
|
- /*实时计算电机转速与车轮速的比值*/
|
|
|
- SpdMotorDivWheel = (uint32_t)(MC_RunInfo.MotorSpeed * 100) / wheelSpeed ;
|
|
|
- Tmp = SpdMotorDivWheel;
|
|
|
- SpdMotorDivWheelFlt += ((Tmp << 8) - SpdMotorDivWheelFlt) >> 6;
|
|
|
- SpdMotorDivWheelFlted = SpdMotorDivWheelFlt >> 8;
|
|
|
+ static uint8_t TorqueRefEndUpdateCount = 0;
|
|
|
|
|
|
- /*在电机转速与车轮速比值,与实际速比一致时,更新速比*/
|
|
|
- if(( MC_RunInfo.MotorSpeed > 100 ) && ( wheelSpeed > 0 ))
|
|
|
+ //踩踏力矩输入
|
|
|
+ MC_TorqueProcess_Param.TorqueApp = (GasSensorData < TorqueSensorData) ? TorqueSensorData : GasSensorData;
|
|
|
+
|
|
|
+ //按照助力档位调节力矩输入值
|
|
|
+ switch(GearSt)
|
|
|
{
|
|
|
- /*加速时,更新速比,比较法*/
|
|
|
- if((wheelSpeed - wheelSpeedPre ) > 5)
|
|
|
+ case MC_GearSt_Torque_ECO:
|
|
|
{
|
|
|
- if(( MC_RunInfo.MotorSpeed - DbSpdMotorPre ) > 0)
|
|
|
+ //控制输入给定加速斜率
|
|
|
+ if(MC_ConfigParam1.UserAdjParam_ECO.StarModel_GAIN <= 80)
|
|
|
+ {
|
|
|
+ TorqueAccStep = 2;
|
|
|
+ }
|
|
|
+ else if(MC_ConfigParam1.UserAdjParam_ECO.StarModel_GAIN >= 120)
|
|
|
+ {
|
|
|
+ TorqueAccStep = 4;
|
|
|
+ }
|
|
|
+ else
|
|
|
{
|
|
|
- SpdProportion = SpdMotorDivWheel ;
|
|
|
+ TorqueAccStep = 3;
|
|
|
}
|
|
|
- DbSpdMotorPre = MC_RunInfo.MotorSpeed;
|
|
|
+ TorqueAccStep = (TorqueAccStep <= 0) ? 1 : TorqueAccStep;
|
|
|
+ //控制输入给定减速斜率
|
|
|
+ TorqueDecStep = 7;
|
|
|
+ //随力矩输入调节助力比
|
|
|
+ Torque_Temp = (uint16_t)((uint32_t)(MC_TorqueProcess_Param.TorqueApp * Coefficient_GainCal(MC_AssisParam.Gear_ECO.Gain_K >> 1, MC_AssisParam.Gear_ECO.Gain_K, MC_AssisParam.Gear_ECO.TorqueApp_TH, MC_TorqueProcess_Param.TorqueApp)) >> 10);
|
|
|
+ //根据助力增益调节助力比
|
|
|
+ Torque_Temp = Torque_Temp * MC_ConfigParam1.UserAdjParam_ECO.Assist_K_GAIN / 100;
|
|
|
+ //给定下限
|
|
|
+ Torque_Temp = (Torque_Temp < MC_AssisParam.Gear_ECO.Lower_Iq) ? MC_AssisParam.Gear_ECO.Lower_Iq : Torque_Temp;
|
|
|
+ //给定上限
|
|
|
+ Torque_Temp = (Torque_Temp > MC_AssisParam.Gear_ECO.Upper_Iq) ? MC_AssisParam.Gear_ECO.Upper_Iq : Torque_Temp;
|
|
|
+ //限流参数设置
|
|
|
+ CurrentLimitSet = (uint32_t)(MC_AssisParam.Gear_ECO.CurrentMax_K * MC_ConfigParam1.CurrentLimit * 1000 >> 17) * 100;
|
|
|
+ CurrentLimitPresent = MC_DataSet_Linear_Process(CurrentLimitSet, CurrentLimitPresent, 5 ,1);
|
|
|
+ PID_IMax.hLower_Limit_Output = -(MC_AssisParam.Gear_ECO.Upper_Iq); //Lower Limit for Output limitation
|
|
|
+ PID_IMax.hUpper_Limit_Output = 0; //Upper Limit for Output limitation
|
|
|
+ PID_IMax.wLower_Limit_Integral = -(MC_AssisParam.Gear_ECO.Upper_Iq << 10); // 放大1024
|
|
|
+ PID_IMax.wUpper_Limit_Integral = 0; // 放大1024
|
|
|
+ break;
|
|
|
}
|
|
|
- wheelSpeedPre = wheelSpeed;
|
|
|
-
|
|
|
- /*求标准差,速比稳定后,更新速比*/
|
|
|
- /*此处将数据保存到数组中,标准差计算,时间较长,放在主循环进行*/
|
|
|
- if((SpdProportion_CAL_flag==0) && (MC_CalParam.Ref_Speed > 25)) //电机力矩控制量低于25时,认为是空载,此时不更新速比
|
|
|
+ case MC_GearSt_Torque_NORM:
|
|
|
{
|
|
|
- SpdProportion_Save_CNT++;
|
|
|
- /*40ms保存一次数据到数组*/
|
|
|
- if(SpdProportion_Save_CNT >= 40 )
|
|
|
+ //控制输入给定加速斜率
|
|
|
+ if(MC_ConfigParam1.UserAdjParam_NORM.StarModel_GAIN <= 80)
|
|
|
{
|
|
|
- SpdProportion_Save_CNT = 0;
|
|
|
-
|
|
|
- SpdProportion_buff[SpdProportion_buff_CNT] = SpdMotorDivWheelFlted;
|
|
|
- SpdProportion_buff_CNT++;
|
|
|
- if( SpdProportion_buff_CNT >=50 )
|
|
|
- {
|
|
|
- SpdProportion_buff_CNT = 0;
|
|
|
-
|
|
|
- /*标志位置1,主循环里求标准差*/
|
|
|
- SpdProportion_CAL_flag = 1;
|
|
|
- }
|
|
|
+ TorqueAccStep = 2;
|
|
|
}
|
|
|
- }
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- wheelSpeedPre = wheelSpeed;
|
|
|
- DbSpdMotorPre = MC_RunInfo.MotorSpeed;
|
|
|
- }
|
|
|
-
|
|
|
- /*电机最高速度,上位机配置参数*/
|
|
|
- SpeedMax = MC_MotorParam.Rate_Speed;
|
|
|
- Tmp = ((GasSensorData < TorqueSensorData) ? TorqueSensorData : GasSensorData) + 50 ; //加50偏移量,确保能达到最大值2048
|
|
|
- Tmp = Tmp > 2048 ? 2048 : Tmp;
|
|
|
-
|
|
|
- /*调试用,根据车速限速值,换算指拨对应的设定车速*/
|
|
|
- dbSpdWheelSet = (Tmp * MC_ConfigParam1.SpeedLimit * 10 )>> 11;
|
|
|
-
|
|
|
- /*电机转速设定,根据指拨大小、车轮限速值和速比,换算*/
|
|
|
- SpeedSet = ((Tmp * MC_ConfigParam1.SpeedLimit * SpdProportion) / 10 >> 11); //(Tmp >> 11) * cd_Speedlimit * ( SpdProportion / 10)
|
|
|
-
|
|
|
- //超过限速值,设定电机转速为0
|
|
|
- if(wheelSpeed > (MC_ConfigParam1.SpeedLimit * 10 + 20))
|
|
|
- {
|
|
|
- SpeedSet = 0;
|
|
|
- }
|
|
|
-
|
|
|
- SpeedSet = (SpeedSet > 0) ? SpeedSet : 0;
|
|
|
- SpeedSet = (SpeedSet < SpeedMax) ? SpeedSet : SpeedMax;
|
|
|
-
|
|
|
- //根据档位调整加速度
|
|
|
- switch (GearSt & 0x0F)
|
|
|
- {
|
|
|
- case 0x01:
|
|
|
- accStep = StepCalc(SpeedMax, 1, 2100);
|
|
|
- break;
|
|
|
- case 0x02:
|
|
|
- accStep = StepCalc(SpeedMax, 1, 1500);
|
|
|
- break;
|
|
|
- case 0x03:
|
|
|
- accStep = StepCalc(SpeedMax, 1, 1071);
|
|
|
+ else if(MC_ConfigParam1.UserAdjParam_NORM.StarModel_GAIN >= 120)
|
|
|
+ {
|
|
|
+ TorqueAccStep = 4;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ TorqueAccStep = 3;
|
|
|
+ }
|
|
|
+ TorqueAccStep = (TorqueAccStep <= 0) ? 1 : TorqueAccStep;
|
|
|
+ //控制输入给定减速斜率
|
|
|
+ TorqueDecStep = 7;
|
|
|
+ //随力矩输入调节助力比
|
|
|
+ Torque_Temp = (uint16_t)((uint32_t)(MC_TorqueProcess_Param.TorqueApp * Coefficient_GainCal(MC_AssisParam.Gear_NORM.Gain_K >> 1, MC_AssisParam.Gear_NORM.Gain_K, MC_AssisParam.Gear_NORM.TorqueApp_TH, MC_TorqueProcess_Param.TorqueApp)) >> 10);
|
|
|
+ //根据助力增益调节助力比
|
|
|
+ Torque_Temp = Torque_Temp * MC_ConfigParam1.UserAdjParam_NORM.Assist_K_GAIN / 100;
|
|
|
+ //给定下限
|
|
|
+ Torque_Temp = (Torque_Temp < MC_AssisParam.Gear_NORM.Lower_Iq) ? MC_AssisParam.Gear_NORM.Lower_Iq : Torque_Temp;
|
|
|
+ //给定上限
|
|
|
+ Torque_Temp = (Torque_Temp > MC_AssisParam.Gear_NORM.Upper_Iq) ? MC_AssisParam.Gear_NORM.Upper_Iq : Torque_Temp;
|
|
|
+
|
|
|
+ //限流参数设置
|
|
|
+ CurrentLimitSet = (uint32_t)(MC_AssisParam.Gear_NORM.CurrentMax_K * MC_ConfigParam1.CurrentLimit * 1000 >> 17) * 100;
|
|
|
+ CurrentLimitPresent = MC_DataSet_Linear_Process(CurrentLimitSet, CurrentLimitPresent, 5 ,1);
|
|
|
+ PID_IMax.hLower_Limit_Output = -(MC_AssisParam.Gear_NORM.Upper_Iq); //Lower Limit for Output limitation
|
|
|
+ PID_IMax.hUpper_Limit_Output = 0; //Upper Limit for Output limitation
|
|
|
+ PID_IMax.wLower_Limit_Integral = -(MC_AssisParam.Gear_NORM.Upper_Iq << 10); // 放大1024
|
|
|
+ PID_IMax.wUpper_Limit_Integral = 0; // 放大1024
|
|
|
break;
|
|
|
- case 0x04:
|
|
|
- accStep = StepCalc(SpeedMax, 1, 765);
|
|
|
+ }
|
|
|
+ case MC_GearSt_Torque_SPORT:
|
|
|
+ {
|
|
|
+ //控制输入给定加速斜率
|
|
|
+ if(MC_ConfigParam1.UserAdjParam_SPORT.StarModel_GAIN <= 80)
|
|
|
+ {
|
|
|
+ TorqueAccStep = 2;
|
|
|
+ }
|
|
|
+ else if(MC_ConfigParam1.UserAdjParam_SPORT.StarModel_GAIN >= 120)
|
|
|
+ {
|
|
|
+ TorqueAccStep = 4;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ TorqueAccStep = 3;
|
|
|
+ }
|
|
|
+ TorqueAccStep = (TorqueAccStep <= 0) ? 1 : TorqueAccStep;
|
|
|
+ //控制输入给定减速斜率
|
|
|
+ TorqueDecStep = 7;
|
|
|
+ //随力矩输入调节助力比
|
|
|
+ Torque_Temp = (uint16_t)((uint32_t)(MC_TorqueProcess_Param.TorqueApp * Coefficient_GainCal(MC_AssisParam.Gear_SPORT.Gain_K >> 1, MC_AssisParam.Gear_SPORT.Gain_K, MC_AssisParam.Gear_SPORT.TorqueApp_TH, MC_TorqueProcess_Param.TorqueApp)) >> 10);
|
|
|
+ //根据助力增益调节助力比
|
|
|
+ Torque_Temp = Torque_Temp * MC_ConfigParam1.UserAdjParam_SPORT.Assist_K_GAIN / 100;
|
|
|
+ //给定下限
|
|
|
+ Torque_Temp = (Torque_Temp < MC_AssisParam.Gear_SPORT.Lower_Iq) ? MC_AssisParam.Gear_SPORT.Lower_Iq : Torque_Temp;
|
|
|
+ //给定上限
|
|
|
+ Torque_Temp = (Torque_Temp > MC_AssisParam.Gear_SPORT.Upper_Iq) ? MC_AssisParam.Gear_SPORT.Upper_Iq : Torque_Temp;
|
|
|
+ //限流参数设置
|
|
|
+ CurrentLimitSet = (uint32_t)(MC_AssisParam.Gear_SPORT.CurrentMax_K * MC_ConfigParam1.CurrentLimit * 1000 >> 17) * MC_CadenceLimit_K;
|
|
|
+ CurrentLimitPresent = MC_DataSet_Linear_Process(CurrentLimitSet, CurrentLimitPresent, 5 ,1);
|
|
|
+ PID_IMax.hLower_Limit_Output = -(MC_AssisParam.Gear_SPORT.Upper_Iq); //Lower Limit for Output limitation
|
|
|
+ PID_IMax.hUpper_Limit_Output = 0; //Upper Limit for Output limitation
|
|
|
+ PID_IMax.wLower_Limit_Integral = -(MC_AssisParam.Gear_SPORT.Upper_Iq << 10); // 放大1024
|
|
|
+ PID_IMax.wUpper_Limit_Integral = 0; // 放大1024
|
|
|
break;
|
|
|
- default:
|
|
|
- /*计算周期1ms, 加减速时间为 2.00s 加减速步进计算*/
|
|
|
- accStep = StepCalc(SpeedMax, 1, 1500);
|
|
|
+ }
|
|
|
+ case MC_GearSt_Torque_TURBO:
|
|
|
+ {
|
|
|
+ //控制输入给定加速斜率
|
|
|
+ if(MC_ConfigParam1.UserAdjParam_TURBO.StarModel_GAIN <= 80)
|
|
|
+ {
|
|
|
+ TorqueAccStep = 2;
|
|
|
+ }
|
|
|
+ else if(MC_ConfigParam1.UserAdjParam_TURBO.StarModel_GAIN >= 120)
|
|
|
+ {
|
|
|
+ TorqueAccStep = 4;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ TorqueAccStep = 3;
|
|
|
+ }
|
|
|
+ TorqueAccStep = (TorqueAccStep <= 0) ? 1 : TorqueAccStep;
|
|
|
+ //控制输入给定减速斜率
|
|
|
+ TorqueDecStep = 7;
|
|
|
+ //随力矩输入调节助力比
|
|
|
+ Torque_Temp = (uint16_t)((uint32_t)(MC_TorqueProcess_Param.TorqueApp * Coefficient_GainCal(MC_AssisParam.Gear_TURBO.Gain_K >> 1, MC_AssisParam.Gear_TURBO.Gain_K, MC_AssisParam.Gear_TURBO.TorqueApp_TH, MC_TorqueProcess_Param.TorqueApp)) >> 10);
|
|
|
+ //根据助力增益调节助力比
|
|
|
+ Torque_Temp = Torque_Temp * MC_ConfigParam1.UserAdjParam_TURBO.Assist_K_GAIN / 100;
|
|
|
+ //给定下限
|
|
|
+ Torque_Temp = (Torque_Temp < MC_AssisParam.Gear_TURBO.Lower_Iq) ? MC_AssisParam.Gear_TURBO.Lower_Iq : Torque_Temp;
|
|
|
+ //给定上限
|
|
|
+ Torque_Temp = (Torque_Temp > MC_AssisParam.Gear_TURBO.Upper_Iq) ? MC_AssisParam.Gear_TURBO.Upper_Iq : Torque_Temp;
|
|
|
+ //限流参数设置
|
|
|
+ CurrentLimitSet = (uint32_t)(MC_AssisParam.Gear_TURBO.CurrentMax_K * MC_ConfigParam1.CurrentLimit * 1000 >> 17) * MC_CadenceLimit_K;
|
|
|
+ CurrentLimitPresent = MC_DataSet_Linear_Process(CurrentLimitSet, CurrentLimitPresent, 5 ,1);
|
|
|
+ PID_IMax.hLower_Limit_Output = -(MC_AssisParam.Gear_TURBO.Upper_Iq); //Lower Limit for Output limitation
|
|
|
+ PID_IMax.hUpper_Limit_Output = 0; //Upper Limit for Output limitation
|
|
|
+ PID_IMax.wLower_Limit_Integral = -(MC_AssisParam.Gear_TURBO.Upper_Iq << 10); // 放大1024
|
|
|
+ PID_IMax.wUpper_Limit_Integral = 0; // 放大1024
|
|
|
break;
|
|
|
- }
|
|
|
-
|
|
|
- /*减速步进*/
|
|
|
- decStep = StepCalc(SpeedMax, 1, 2000);
|
|
|
-
|
|
|
- /* 跟踪启动 */
|
|
|
- if(MC_CalParam.Foc_Flag == RESET)
|
|
|
- {
|
|
|
- //MotorStartFlg = 1;
|
|
|
- if(MC_RunInfo.MotorSpeed > 100)
|
|
|
+ }
|
|
|
+ default:
|
|
|
{
|
|
|
- SpeedSetReal = MC_RunInfo.MotorSpeed;
|
|
|
- SpeedSetMiddle = SpeedSetReal << 16;
|
|
|
+ TorqueAccStep = 0;
|
|
|
+ TorqueDecStep = 0;
|
|
|
+ Torque_Temp = 0;
|
|
|
+ break;
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
- /*速度指令的加减速处理*/
|
|
|
- #if 1 //根据档位设定最高速度
|
|
|
|
|
|
- switch(GearSt & 0x0F)
|
|
|
+ //随车速调节助力比
|
|
|
+ Torque_Temp = (uint16_t)((uint32_t)(Torque_Temp * Function_Linear_3Stage(MC_ConfigParam1.SpeedLimit * 10, 0, MC_ConfigParam1.SpeedLimit * 10, 52, MC_SpeedSensorData.Speed_Data)) >> 10);
|
|
|
+
|
|
|
+ //助力输出
|
|
|
+ MC_TorqueProcess_Param.TorqueRef = Torque_Temp;
|
|
|
+ if(MC_TorqueProcess_Param.TorqueRef <= 0)
|
|
|
{
|
|
|
- case 0x01:
|
|
|
- SpeedSetReal = accDecProcess((SpeedSet * 9) >> 4, accStep, decStep, &SpeedSetMiddle);
|
|
|
- break;
|
|
|
- case 0x02:
|
|
|
- SpeedSetReal = accDecProcess((SpeedSet * 11) >> 4, accStep, decStep, &SpeedSetMiddle);
|
|
|
- break;
|
|
|
- case 0x03:
|
|
|
- SpeedSetReal = accDecProcess((SpeedSet * 13) >> 4, accStep, decStep, &SpeedSetMiddle);
|
|
|
- break;
|
|
|
- case 0x04:
|
|
|
- SpeedSetReal = accDecProcess(SpeedSet, accStep, decStep, &SpeedSetMiddle);
|
|
|
- break;
|
|
|
- default:
|
|
|
- SpeedSetReal = accDecProcess(SpeedSet, accStep, decStep, &SpeedSetMiddle);
|
|
|
- break;
|
|
|
+ MC_TorqueProcess_Param.TorqueRef = 0;
|
|
|
}
|
|
|
-
|
|
|
- #else
|
|
|
-
|
|
|
- SpeedSetReal = accDecProcess(SpeedSet, accStep, decStep, &SpeedSetMiddle);
|
|
|
-
|
|
|
- #endif
|
|
|
-
|
|
|
- /*限制母线电流*/
|
|
|
- #if 0 //根据档位设定最大电流,电流环在内环,不稳定
|
|
|
-
|
|
|
- static uint16_t CurrentLimitPresent; //限流实际值,做升降速处理
|
|
|
- uint16_t CurrentLimitSet; //限流设置值,不同助力档位更新
|
|
|
-
|
|
|
- switch(GearSt & 0x0F)
|
|
|
+
|
|
|
+ //升降速曲线计算
|
|
|
+ if( MC_SpeedSensorData.Speed_Data > (MC_ConfigParam1.SpeedLimit * 10) ) //限速处理
|
|
|
{
|
|
|
- case 0x01://ECO
|
|
|
+ if((MC_TorqueProcess_Param.TorqueRef - MC_TorqueProcess_Param.TorqueRefEnd) > 2)
|
|
|
{
|
|
|
- CurrentLimitSet = (uint32_t)(MC_AssisParam.Gear_ECO.CurrentMax_K * MC_ConfigParam1.CurrentLimit * 1000 >> 17);
|
|
|
- CurrentLimitPresent = MC_DataSet_Linear_Process(CurrentLimitSet, CurrentLimitPresent, 5 ,1);
|
|
|
- break;
|
|
|
+ MC_TorqueProcess_Param.TorqueRefEnd += 1;
|
|
|
}
|
|
|
- case 0x02://NORM
|
|
|
+ else if((MC_TorqueProcess_Param.TorqueRef - MC_TorqueProcess_Param.TorqueRefEnd) < (- 1))
|
|
|
{
|
|
|
- CurrentLimitSet = (uint32_t)(MC_AssisParam.Gear_NORM.CurrentMax_K * MC_ConfigParam1.CurrentLimit * 1000 >> 17);
|
|
|
- CurrentLimitPresent = MC_DataSet_Linear_Process(CurrentLimitSet, CurrentLimitPresent, 5 ,1);
|
|
|
- break;
|
|
|
+ MC_TorqueProcess_Param.TorqueRefEnd -= 10;
|
|
|
}
|
|
|
- case 0x03://SPORT
|
|
|
+ }
|
|
|
+ else if( (Bike_Attitude.UpWardSlope_flag == TRUE)&&(MC_SpeedSensorData.Speed_Data < 100)) //上坡处理
|
|
|
+ {
|
|
|
+ if((MC_TorqueProcess_Param.TorqueRef - MC_TorqueProcess_Param.TorqueRefEnd) > 2)
|
|
|
{
|
|
|
- CurrentLimitSet = (uint32_t)(MC_AssisParam.Gear_SPORT.CurrentMax_K * MC_ConfigParam1.CurrentLimit * 1000 >> 17);
|
|
|
- CurrentLimitPresent = MC_DataSet_Linear_Process(CurrentLimitSet, CurrentLimitPresent, 5 ,1);
|
|
|
- break;
|
|
|
+ MC_TorqueProcess_Param.TorqueRefEnd += TorqueAccStep;
|
|
|
}
|
|
|
- case 0x04://TURBO
|
|
|
+ else if((MC_TorqueProcess_Param.TorqueRef - MC_TorqueProcess_Param.TorqueRefEnd) < (- 1))
|
|
|
{
|
|
|
- CurrentLimitSet = (uint32_t)(MC_AssisParam.Gear_TURBO.CurrentMax_K * MC_ConfigParam1.CurrentLimit * 1000 >> 17);
|
|
|
- CurrentLimitPresent = MC_DataSet_Linear_Process(CurrentLimitSet, CurrentLimitPresent, 5 ,1);
|
|
|
- break;
|
|
|
+ TorqueRefEndUpdateCount++;
|
|
|
+ if(TorqueRefEndUpdateCount >= 3)
|
|
|
+ {
|
|
|
+ TorqueRefEndUpdateCount = 0;
|
|
|
+ MC_TorqueProcess_Param.TorqueRefEnd -= TorqueDecStep;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ else //正常骑行
|
|
|
+ {
|
|
|
+ if((MC_TorqueProcess_Param.TorqueRef - MC_TorqueProcess_Param.TorqueRefEnd) > 2)
|
|
|
+ {
|
|
|
+ MC_TorqueProcess_Param.TorqueRefEnd += TorqueAccStep;
|
|
|
}
|
|
|
- default://SMART
|
|
|
+ else if((MC_TorqueProcess_Param.TorqueRef - MC_TorqueProcess_Param.TorqueRefEnd) < (- 1))
|
|
|
{
|
|
|
- CurrentLimitSet = (uint32_t)(MC_AssisParam.Gear_SMART.CurrentMax_K * MC_ConfigParam1.CurrentLimit * 1000 >> 17);
|
|
|
- CurrentLimitPresent = MC_DataSet_Linear_Process(CurrentLimitSet, CurrentLimitPresent, 5 ,1);
|
|
|
- break;
|
|
|
+ MC_TorqueProcess_Param.TorqueRefEnd -= TorqueDecStep;
|
|
|
}
|
|
|
}
|
|
|
- SpdMotorByIdc = PID_Regulator(CurrentLimitPresent, MC_RunInfo.BusCurrent >> 7, &PID_ConstantPower);
|
|
|
-
|
|
|
- #else
|
|
|
-
|
|
|
- SpdMotorByIdc = PID_Regulator((MC_ConfigParam1.CurrentLimit * 1000) >> 7, MC_RunInfo.BusCurrent >> 7, &PID_ConstantPower);
|
|
|
+ MC_TorqueProcess_Param.TorqueRefEnd = (MC_TorqueProcess_Param.TorqueRefEnd < 6) ? 6 : MC_TorqueProcess_Param.TorqueRefEnd;
|
|
|
|
|
|
+ //限速点处理
|
|
|
+ if( MC_SpeedSensorData.Speed_Data > (MC_ConfigParam1.SpeedLimit * 10 + 22) ) //限速值+2.2
|
|
|
+ {
|
|
|
+ MC_TorqueProcess_Param.MotorStopLock_Flag = SET;
|
|
|
+ MC_TorqueProcess_Param.TorqueRefEnd = 0;
|
|
|
+ //停机处理
|
|
|
+ MC_MotorStop(&MC_StarFlag);
|
|
|
+ }
|
|
|
+ #if 0 //低于限速点启动电机
|
|
|
+ else if(MC_RunInfo.BikeSpeed < ((MC_ConfigParam1.SpeedLimit) * 10))
|
|
|
+ {
|
|
|
+ MC_MotorStar(&MC_StarFlag);
|
|
|
+ }
|
|
|
+ #elif 1 //低于断电点即启动电机
|
|
|
+ else
|
|
|
+ {
|
|
|
+ MC_MotorStar(&MC_StarFlag);
|
|
|
+ }
|
|
|
#endif
|
|
|
|
|
|
- /* 电机速度闭环 */
|
|
|
- //最大力矩为4档的力矩参数
|
|
|
- PID_MotorSpd.hLower_Limit_Output= -(MC_AssisParam.Gear_TURBO.Upper_Iq / 2);
|
|
|
- PID_MotorSpd.hUpper_Limit_Output= (MC_AssisParam.Gear_TURBO.Upper_Iq / 2);
|
|
|
- TorQueBySpd = PID_Regulator(SpeedSetReal, MC_RunInfo.MotorSpeed, &PID_MotorSpd);
|
|
|
-
|
|
|
- TorQueBySpd += SpdMotorByIdc;
|
|
|
-
|
|
|
#if 1
|
|
|
static uint16_t K_ByVoltage_Set_Old = 1024;
|
|
|
uint16_t K_ByVoltage_Set;
|
|
@@ -454,24 +468,16 @@ MC_CalParam_Struct_t MC_AssistRunMode_Gas_Process(uint16_t GasSensorData, uint16
|
|
|
|
|
|
uint16_t K_ByVoltage_Result = 1024;
|
|
|
uint16_t K_ByTemperature_Result = 1024;
|
|
|
-
|
|
|
#endif
|
|
|
|
|
|
- //速度环控制量为0时停机,防止电机出现异响
|
|
|
- if(SpeedSetReal == 0)
|
|
|
- {
|
|
|
- MC_MotorStop(&MC_StarFlag);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- //电机启动
|
|
|
- MC_MotorStar(&MC_StarFlag);
|
|
|
- }
|
|
|
+ //限流计算
|
|
|
+ IqRefByInPower = PID_Regulator(CurrentLimitPresent / 100, (MC_RunInfo.BusCurrent >> 7), &PID_IMax);
|
|
|
|
|
|
- Ref_Speed_Temp = ((int32_t)TorQueBySpd * K_ByVoltage_Result) >> 10;
|
|
|
- Ref_Speed_Temp = ((int32_t)Ref_Speed_Temp * K_ByTemperature_Result) >> 10;
|
|
|
-
|
|
|
- p_MC_CalParam.Ref_Speed = (int16_t)(Ref_Speed_Temp);
|
|
|
+ Torque_Ref_Temp = ((int32_t)MC_TorqueProcess_Param.TorqueRefEnd * K_ByVoltage_Result) >> 10;
|
|
|
+ Torque_Ref_Temp = (Torque_Ref_Temp * K_ByTemperature_Result) >> 10;
|
|
|
+ Torque_Ref_Temp = (Torque_Ref_Temp + IqRefByInPower) >> 1;
|
|
|
+
|
|
|
+ p_MC_CalParam.Ref_Torque = (int16_t)Torque_Ref_Temp;
|
|
|
p_MC_CalParam.Foc_Flag = SET;
|
|
|
p_MC_CalParam.AssistRunMode = MC_AssistRunMode_GAS;
|
|
|
|
|
@@ -1780,9 +1786,6 @@ void MC_CalParam_Cal(MC_WorkMode_Struct_t p_MC_WorkMode, \
|
|
|
{
|
|
|
MC_AssistRunMode_Temp = MC_AssistRunMode_INVALID;
|
|
|
MC_AssistRunMode_ShiftFlag = SET;
|
|
|
-
|
|
|
- SpeedSetMiddle = 0; //指拨模式,清零速度中间量
|
|
|
- SpdMotorDivWheelFlt = 0;
|
|
|
}
|
|
|
}
|
|
|
//助力模式处理
|
|
@@ -1879,22 +1882,3 @@ void MC_MotorStar(FlagStatus* StarFlag)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-/*
|
|
|
-指拨模式计算速比,计算费时,在主循环调用
|
|
|
-*/
|
|
|
-void SpdProportion_calculate(void)
|
|
|
-{
|
|
|
- if(SpdProportion_CAL_flag==1)
|
|
|
- {
|
|
|
- SpdProportion_StandardDeviation = Standard_deviation_aver(SpdProportion_buff, 50, &test_SpdProportionAver);
|
|
|
- test_StandardDeviation = (int32_t)(SpdProportion_StandardDeviation );
|
|
|
- SpdProportion_CAL_flag = 0;
|
|
|
- /*更新速比*/
|
|
|
- if(test_StandardDeviation < 30)
|
|
|
- {
|
|
|
- SpdProportion = test_SpdProportionAver;
|
|
|
- }
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
-
|