|
@@ -30,6 +30,8 @@ MC_TorqueProcess_Param_Struct_t MC_TorqueProcess_Param = {SET, 0, 0, 0};
|
|
|
MC_WalkProcess_Param_Struct_t MC_WalkProcess_Param = {FALSE, 0};
|
|
|
//电机启动标志
|
|
|
FlagStatus MC_StarFlag = RESET;
|
|
|
+//下降速度参数表
|
|
|
+uint8_t MC_CurrentDecTable[5] = {5, 7, 10, 14, 21};
|
|
|
|
|
|
/*************************局部函数定义***********************/
|
|
|
//设定值线性变化处理
|
|
@@ -130,9 +132,11 @@ uint16_t MC_Cal_K_ByVoltage(uint16_t Voltage, uint16_t DesignVol, uint16_t K_Vol
|
|
|
}
|
|
|
|
|
|
//随SOC计算限流衰减系数
|
|
|
-uint16_t MC_LimitCurrent_Cal_K_BySOC(uint16_t SOC)
|
|
|
+uint16_t MC_LimitCurrent_Cal_K_BySOC(FunctionalState Flag, uint16_t SOC)
|
|
|
{
|
|
|
uint16_t Limit_K_BySOC = 1024;
|
|
|
+ if(Flag == DISABLE)
|
|
|
+ return 1024;
|
|
|
if(SOC <= 2)
|
|
|
Limit_K_BySOC = 256;
|
|
|
else if(SOC <= 6)
|
|
@@ -147,9 +151,11 @@ uint16_t MC_LimitCurrent_Cal_K_BySOC(uint16_t SOC)
|
|
|
}
|
|
|
|
|
|
//随SOC计算限速衰减系数
|
|
|
-uint16_t MC_LimitSpeed_Cal_K_BySOC(uint16_t SOC)
|
|
|
+uint16_t MC_LimitSpeed_Cal_K_BySOC(FunctionalState Flag, uint16_t SOC)
|
|
|
{
|
|
|
uint16_t Limit_K_BySOC = 1024;
|
|
|
+ if(Flag == DISABLE)
|
|
|
+ return 1024;
|
|
|
if(SOC <= 2)
|
|
|
Limit_K_BySOC = 512;
|
|
|
else if(SOC <= 6)
|
|
@@ -333,20 +339,22 @@ MC_CalParam_Struct_t MC_AssistRunMode_GasSpeed_Process(MC_GasMode_Struct_t GasMo
|
|
|
Tmp = Tmp > 2048 ? 2048 : Tmp;
|
|
|
Tmp = (Tmp * Tmp) / 2048; //指拨值改为抛物线,低速控制行程变大
|
|
|
|
|
|
- /*电机转速设定,根据指拨大小、车轮限速值和速比,换算,以0xAA >> 3*为中心根据整车限速对称偏移,调整上限±15km/h*/
|
|
|
- if(MC_GasMode_Param.Mode_bit.SpeedLimit <= 5)
|
|
|
- SpeedLimit = ((MC_ConfigParam1.SpeedLimit + (int8_t)MC_ConfigParam2.SpeedLimitAdj + MC_GasMode_Param.Mode_bit.SpeedLimit + 0x1F - (0xAA >> 3)) * MC_LimitSpeed_Cal_K_BySOC(MC_RunInfo.SOC)) >> 10;
|
|
|
+ /*电机转速设定,根据指拨大小、车轮限速值和速比,换算,以0xAA >> 3*为中心根据整车限速对称偏移,调整上限±15km/h*,转把限速偏移为0x31时进入转把推行,限速6km/h*/
|
|
|
+ if(MC_GasMode_Param.Mode_bit.SpeedLimit == 0x1F)
|
|
|
+ SpeedLimit = MC_ConfigParam1.WalkMode_SpeedLimit / 10;
|
|
|
+ else if(MC_GasMode_Param.Mode_bit.SpeedLimit <= 5)
|
|
|
+ SpeedLimit = ((MC_ConfigParam1.SpeedLimit + (int8_t)MC_ConfigParam2.SpeedLimitAdj + MC_GasMode_Param.Mode_bit.SpeedLimit + 0x1F - (0xAA >> 3)) * MC_LimitSpeed_Cal_K_BySOC((((MC_ConfigParam1.SpeedLimit >> 7) & 0x01) == 0 ? ENABLE : DISABLE), MC_RunInfo.SOC)) >> 10;
|
|
|
else
|
|
|
- SpeedLimit = ((MC_ConfigParam1.SpeedLimit + (int8_t)MC_ConfigParam2.SpeedLimitAdj + MC_GasMode_Param.Mode_bit.SpeedLimit - (0xAA >> 3)) * MC_LimitSpeed_Cal_K_BySOC(MC_RunInfo.SOC)) >> 10;
|
|
|
+ SpeedLimit = ((MC_ConfigParam1.SpeedLimit + (int8_t)MC_ConfigParam2.SpeedLimitAdj + MC_GasMode_Param.Mode_bit.SpeedLimit - (0xAA >> 3)) * MC_LimitSpeed_Cal_K_BySOC((((MC_ConfigParam1.SpeedLimit >> 7) & 0x01) == 0 ? ENABLE : DISABLE), MC_RunInfo.SOC)) >> 10;
|
|
|
//根据SOC限制最大车速
|
|
|
#if 0 //旧版传动比计算
|
|
|
- SpeedSet = Tmp * (SpeedLimit * SpdProportion) / 10 >> 11; //(Tmp >> 11) * cd_Speedlimit * ( SpdProportion / 10)
|
|
|
+ SpeedSet = Tmp * ((SpeedLimit + 1) * SpdProportion) / 10 >> 11; //(Tmp >> 11) * cd_Speedlimit * ( SpdProportion / 10)
|
|
|
#else //新版传动比计算
|
|
|
- SpeedSet = Tmp * SpeedLimit * 50 / Bike_RatioCalParam.RatioResult;
|
|
|
+ SpeedSet = Tmp * (SpeedLimit + 1) * 50 / Bike_RatioCalParam.RatioResult; //(Tmp >> 11) * 100 / (RatioResult >> 10),传动比 = 车速 * 100 / 电机转速 << 10
|
|
|
#endif
|
|
|
|
|
|
//超过限速值,设定电机转速为0
|
|
|
- if(wheelSpeed > (SpeedLimit * 10 + 20))
|
|
|
+ if(wheelSpeed > (SpeedLimit * 10 + 22))
|
|
|
{
|
|
|
SpeedSet = 0;
|
|
|
}
|
|
@@ -432,11 +440,13 @@ MC_CalParam_Struct_t MC_AssistRunMode_GasSpeed_Process(MC_GasMode_Struct_t GasMo
|
|
|
//最大力矩为4档的力矩参数
|
|
|
PID_MotorSpd.hLower_Limit_Output = -200;
|
|
|
PID_MotorSpd.hUpper_Limit_Output = 2100;
|
|
|
- TorQueBySpd = PID_Regulator(SpeedSetReal>>1, MC_HallSensorData.motorspeed_RCFlt>>1, &PID_MotorSpd);
|
|
|
+ TorQueBySpd = PID_Regulator(SpeedSetReal, MC_HallSensorData.motorspeed_RCFlt, &PID_MotorSpd);
|
|
|
PID_MotorSpd.hLower_Limit_Output = -100;
|
|
|
PID_MotorSpd.hUpper_Limit_Output = 1050;
|
|
|
/*限制母线电流*/
|
|
|
- SpdMotorByIdc = PID_Regulator((MC_ConfigParam1.CurrentLimit * 1000 * MC_LimitCurrent_Cal_K_BySOC(MC_RunInfo.SOC)) >> 17, MC_RunInfo.BusCurrent >> 7, &PID_ConstantPower);
|
|
|
+ SpdMotorByIdc = PID_Regulator((MC_ConfigParam1.CurrentLimit * 1000 * MC_LimitCurrent_Cal_K_BySOC((((MC_ConfigParam1.CurrentLimit >> 7) & 0x01) == 0 ? ENABLE : DISABLE), MC_RunInfo.SOC)) >> 17,
|
|
|
+ MC_RunInfo.BusCurrent >> 7,
|
|
|
+ &PID_ConstantPower);
|
|
|
|
|
|
#if 1
|
|
|
static uint16_t K_ByVoltage_Set_Old = 1024;
|
|
@@ -452,8 +462,8 @@ MC_CalParam_Struct_t MC_AssistRunMode_GasSpeed_Process(MC_GasMode_Struct_t GasMo
|
|
|
|
|
|
//根据温度调节输出
|
|
|
K_ByTemperature_Set1 = MC_Cal_K_ByTemperature(MC_RunInfo.T_Coil, MC_ConfigParam1.TempTH_Alarm); //根据温度计算衰减比例
|
|
|
- K_ByTemperature_Set2 = MC_Cal_K_ByTemperature(MC_RunInfo.T_PCB, (MC_ConfigParam1.TempTH_Alarm-15)); //根据温度计算衰减比例
|
|
|
- K_ByTemperature_Set = (K_ByTemperature_Set1 * K_ByTemperature_Set2)>>10;
|
|
|
+ K_ByTemperature_Set2 = MC_Cal_K_ByTemperature(MC_RunInfo.T_PCB, (MC_ConfigParam1.TempTH_Alarm - 15)); //根据温度计算衰减比例
|
|
|
+ K_ByTemperature_Set = (K_ByTemperature_Set1 * K_ByTemperature_Set2) >> 10;
|
|
|
K_ByTemperature_Result = MC_DataSet_Linear_Process(K_ByTemperature_Set, K_ByTemperature_Result, 1, 1); //设定值与给定值线性处理
|
|
|
|
|
|
#else
|
|
@@ -483,7 +493,7 @@ MC_CalParam_Struct_t MC_AssistRunMode_GasSpeed_Process(MC_GasMode_Struct_t GasMo
|
|
|
else ExitGasModeFlag = RESET;
|
|
|
}
|
|
|
|
|
|
- if(Ref_Speed_Temp_End < -200) Ref_Speed_Temp_End=-200;
|
|
|
+ if(Ref_Speed_Temp_End < -200) Ref_Speed_Temp_End = -200;
|
|
|
//速度环控制量为0时停机,防止电机出现异响
|
|
|
if(SpeedSetReal == 0)
|
|
|
{
|
|
@@ -495,7 +505,7 @@ MC_CalParam_Struct_t MC_AssistRunMode_GasSpeed_Process(MC_GasMode_Struct_t GasMo
|
|
|
MC_MotorStar(&MC_StarFlag);
|
|
|
}
|
|
|
|
|
|
- p_MC_CalParam.Ref_Speed = (int16_t)((Ref_Speed_Temp_End+SpdMotorByIdc)>>1);
|
|
|
+ p_MC_CalParam.Ref_Speed = (int16_t)((Ref_Speed_Temp_End + SpdMotorByIdc) >> 1);
|
|
|
p_MC_CalParam.Foc_Flag = SET;
|
|
|
p_MC_CalParam.AssistRunMode = MC_AssistRunMode_GAS;
|
|
|
|
|
@@ -636,14 +646,14 @@ MC_CalParam_Struct_t MC_AssistRunMode_GasTorque_Process(MC_GasMode_Struct_t GasM
|
|
|
|
|
|
if(MC_GasMode_Param.Mode_bit.SpeedLimit <= 5)
|
|
|
{
|
|
|
- speedLimitStart = (((MC_ConfigParam1.SpeedLimit + (int8_t)MC_ConfigParam2.SpeedLimitAdj + GasMode_Param.Mode_bit.SpeedLimit + 0x1F - (0xAA >> 3) - 2) * 10 + MC_ConfigParam2.SpeedLimitStartAdj) * MC_LimitSpeed_Cal_K_BySOC(MC_RunInfo.SOC)) >> 10;
|
|
|
- speedLimitEnd = (((MC_ConfigParam1.SpeedLimit + (int8_t)MC_ConfigParam2.SpeedLimitAdj + GasMode_Param.Mode_bit.SpeedLimit + 0x1F - (0xAA >> 3)) * 10 + MC_ConfigParam2.SpeedLimitEndAdj + 22) * MC_LimitSpeed_Cal_K_BySOC(MC_RunInfo.SOC)) >> 10;
|
|
|
+ speedLimitStart = (((MC_ConfigParam1.SpeedLimit + (int8_t)MC_ConfigParam2.SpeedLimitAdj + GasMode_Param.Mode_bit.SpeedLimit + 0x1F - (0xAA >> 3) - 2) * 10 + MC_ConfigParam2.SpeedLimitStartAdj) * MC_LimitSpeed_Cal_K_BySOC((((MC_ConfigParam1.SpeedLimit >> 7) & 0x01) == 0 ? ENABLE : DISABLE), MC_RunInfo.SOC)) >> 10;
|
|
|
+ speedLimitEnd = (((MC_ConfigParam1.SpeedLimit + (int8_t)MC_ConfigParam2.SpeedLimitAdj + GasMode_Param.Mode_bit.SpeedLimit + 0x1F - (0xAA >> 3)) * 10 + MC_ConfigParam2.SpeedLimitEndAdj + 22) * MC_LimitSpeed_Cal_K_BySOC((((MC_ConfigParam1.SpeedLimit >> 7) & 0x01) == 0 ? ENABLE : DISABLE), MC_RunInfo.SOC)) >> 10;
|
|
|
slewRate = 1024 / (speedLimitEnd - speedLimitStart - 3);
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
- speedLimitStart = (((MC_ConfigParam1.SpeedLimit + (int8_t)MC_ConfigParam2.SpeedLimitAdj + GasMode_Param.Mode_bit.SpeedLimit - (0xAA >> 3) - 2) * 10 + MC_ConfigParam2.SpeedLimitStartAdj) * MC_LimitSpeed_Cal_K_BySOC(MC_RunInfo.SOC)) >> 10;
|
|
|
- speedLimitEnd = (((MC_ConfigParam1.SpeedLimit + (int8_t)MC_ConfigParam2.SpeedLimitAdj + GasMode_Param.Mode_bit.SpeedLimit - (0xAA >> 3)) * 10 + MC_ConfigParam2.SpeedLimitEndAdj + 22) * MC_LimitSpeed_Cal_K_BySOC(MC_RunInfo.SOC)) >> 10;
|
|
|
+ speedLimitStart = (((MC_ConfigParam1.SpeedLimit + (int8_t)MC_ConfigParam2.SpeedLimitAdj + GasMode_Param.Mode_bit.SpeedLimit - (0xAA >> 3) - 2) * 10 + MC_ConfigParam2.SpeedLimitStartAdj) * MC_LimitSpeed_Cal_K_BySOC((((MC_ConfigParam1.SpeedLimit >> 7) & 0x01) == 0 ? ENABLE : DISABLE), MC_RunInfo.SOC)) >> 10;
|
|
|
+ speedLimitEnd = (((MC_ConfigParam1.SpeedLimit + (int8_t)MC_ConfigParam2.SpeedLimitAdj + GasMode_Param.Mode_bit.SpeedLimit - (0xAA >> 3)) * 10 + MC_ConfigParam2.SpeedLimitEndAdj + 22) * MC_LimitSpeed_Cal_K_BySOC((((MC_ConfigParam1.SpeedLimit >> 7) & 0x01) == 0 ? ENABLE : DISABLE), MC_RunInfo.SOC)) >> 10;
|
|
|
slewRate = 1024 / (speedLimitEnd - speedLimitStart - 3);
|
|
|
}
|
|
|
|
|
@@ -740,7 +750,7 @@ MC_CalParam_Struct_t MC_AssistRunMode_GasTorque_Process(MC_GasMode_Struct_t GasM
|
|
|
#endif
|
|
|
|
|
|
//根据SOC计算限流
|
|
|
- IqRefByInPower = PID_Regulator((CurrentLimitPresent * MC_LimitCurrent_Cal_K_BySOC(MC_RunInfo.SOC) / 100) >> 10, (MC_RunInfo.BusCurrent >> 7), &PID_IMax);
|
|
|
+ IqRefByInPower = PID_Regulator((CurrentLimitPresent * MC_LimitCurrent_Cal_K_BySOC((((MC_ConfigParam1.CurrentLimit >> 7) & 0x01) == 0 ? ENABLE : DISABLE), MC_RunInfo.SOC) / 100) >> 10, (MC_RunInfo.BusCurrent >> 7), &PID_IMax);
|
|
|
|
|
|
Torque_Ref_Temp = ((int32_t)MC_TorqueProcess_Param.TorqueRefEnd * K_ByVoltage_Result) >> 10;
|
|
|
Torque_Ref_Temp = (Torque_Ref_Temp * K_ByTemperature_Result) >> 10;
|
|
@@ -812,7 +822,7 @@ MC_CalParam_Struct_t MC_AssistRunMode_Walk_Process(MC_WorkMode_Struct_t p_MC_Wor
|
|
|
MC_WalkProcess_Param.MotorSpeedSetBigin = WalkMode_MotorSpeedSet << 5;
|
|
|
}
|
|
|
//根据SOC计算限流
|
|
|
- SpdMotorByIdc = PID_Regulator((MC_ConfigParam1.CurrentLimit * 500 * MC_LimitCurrent_Cal_K_BySOC(MC_RunInfo.SOC)) >> 17, MC_RunInfo.BusCurrent >> 7, &PID_ConstantPower); // 母线电流闭环
|
|
|
+ SpdMotorByIdc = PID_Regulator((MC_ConfigParam1.CurrentLimit * 500 * MC_LimitCurrent_Cal_K_BySOC((((MC_ConfigParam1.CurrentLimit >> 7) & 0x01) == 0 ? ENABLE : DISABLE), MC_RunInfo.SOC)) >> 17, MC_RunInfo.BusCurrent >> 7, &PID_ConstantPower); // 母线电流闭环
|
|
|
}
|
|
|
|
|
|
//速度环
|
|
@@ -1054,7 +1064,7 @@ MC_CalParam_Struct_t MC_AssistRunMode_Torque_Process(uint16_t SenorData, MC_Gear
|
|
|
//停机状态,延时处理
|
|
|
if(MC_TorqueProcess_Param.MotorStopLock_Flag == SET)
|
|
|
{
|
|
|
- if(MC_TorqueProcess_Param.TorqueRefEnd <= 7)
|
|
|
+ if(MC_TorqueProcess_Param.TorqueRefEnd <= MC_CurrentDecTable[(MC_ConfigParam1.Deceleration < 0 ? 3 : (MC_ConfigParam1.Deceleration > 5 ? 3 : MC_ConfigParam1.Deceleration)) - 1])
|
|
|
{
|
|
|
MC_TorqueProcess_Param.TorqueRefEnd = 0;
|
|
|
//停机处理
|
|
@@ -1068,7 +1078,7 @@ MC_CalParam_Struct_t MC_AssistRunMode_Torque_Process(uint16_t SenorData, MC_Gear
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
- MC_TorqueProcess_Param.TorqueRefEnd -= 7; //这里影响到停止踩踏后的断电时间
|
|
|
+ MC_TorqueProcess_Param.TorqueRefEnd -= MC_CurrentDecTable[(MC_ConfigParam1.Deceleration < 0 ? 3 : (MC_ConfigParam1.Deceleration > 5 ? 3 : MC_ConfigParam1.Deceleration)) - 1]; //这里影响到停止踩踏后的断电时间
|
|
|
MC_MotorStar(&MC_StarFlag);
|
|
|
}
|
|
|
}
|
|
@@ -1218,8 +1228,8 @@ MC_CalParam_Struct_t MC_AssistRunMode_Torque_Process(uint16_t SenorData, MC_Gear
|
|
|
if((MC_ConfigParam2.SpeedLimitStartAdj > 50) || (MC_ConfigParam2.SpeedLimitStartAdj < -50)) MC_ConfigParam2.SpeedLimitStartAdj = 0;
|
|
|
if((MC_ConfigParam2.SpeedLimitEndAdj > 50) || (MC_ConfigParam2.SpeedLimitEndAdj < -50)) MC_ConfigParam2.SpeedLimitEndAdj = 0;
|
|
|
|
|
|
- speedLimitStart = (((MC_ConfigParam1.SpeedLimit + (int8_t)MC_ConfigParam2.SpeedLimitAdj) * 10 + MC_ConfigParam2.SpeedLimitStartAdj) * MC_LimitSpeed_Cal_K_BySOC(MC_RunInfo.SOC)) >> 10;
|
|
|
- speedLimitEnd = (((MC_ConfigParam1.SpeedLimit + (int8_t)MC_ConfigParam2.SpeedLimitAdj) * 10 + MC_ConfigParam2.SpeedLimitEndAdj + 22) * MC_LimitSpeed_Cal_K_BySOC(MC_RunInfo.SOC)) >> 10;
|
|
|
+ speedLimitStart = (((MC_ConfigParam1.SpeedLimit + (int8_t)MC_ConfigParam2.SpeedLimitAdj) * 10 + MC_ConfigParam2.SpeedLimitStartAdj) * MC_LimitSpeed_Cal_K_BySOC((((MC_ConfigParam1.SpeedLimit >> 7) & 0x01) == 0 ? ENABLE : DISABLE), MC_RunInfo.SOC)) >> 10;
|
|
|
+ speedLimitEnd = (((MC_ConfigParam1.SpeedLimit + (int8_t)MC_ConfigParam2.SpeedLimitAdj) * 10 + MC_ConfigParam2.SpeedLimitEndAdj + 22) * MC_LimitSpeed_Cal_K_BySOC((((MC_ConfigParam1.SpeedLimit >> 7) & 0x01) == 0 ? ENABLE : DISABLE), MC_RunInfo.SOC)) >> 10;
|
|
|
slewRate = 1024 / (speedLimitEnd - speedLimitStart - 3);
|
|
|
//随车速调节助力比
|
|
|
Torque_Temp = (uint16_t)((uint32_t)(Torque_Temp * Function_Linear_3Stage(speedLimitStart, 0, speedLimitStart, slewRate, MC_SpeedSensorData.Speed_Data)) >> 10);
|
|
@@ -1356,7 +1366,7 @@ MC_CalParam_Struct_t MC_AssistRunMode_Torque_Process(uint16_t SenorData, MC_Gear
|
|
|
#endif
|
|
|
|
|
|
//根据SOC计算限流
|
|
|
- IqRefByInPower = PID_Regulator((CurrentLimitPresent * MC_LimitCurrent_Cal_K_BySOC(MC_RunInfo.SOC) / 100) >> 10, (MC_RunInfo.BusCurrent >> 7), &PID_IMax);
|
|
|
+ IqRefByInPower = PID_Regulator((CurrentLimitPresent * MC_LimitCurrent_Cal_K_BySOC((((MC_ConfigParam1.CurrentLimit >> 7) & 0x01) == 0 ? ENABLE : DISABLE), MC_RunInfo.SOC) / 100) >> 10, (MC_RunInfo.BusCurrent >> 7), &PID_IMax);
|
|
|
|
|
|
Torque_Ref_Temp = ((int32_t)MC_TorqueProcess_Param.TorqueRefEnd * K_ByVoltage_Result) >> 10;
|
|
|
Torque_Ref_Temp = (Torque_Ref_Temp * K_ByTemperature_Result) >> 10;
|