|
@@ -129,6 +129,40 @@ uint16_t MC_Cal_K_ByVoltage(uint16_t Voltage, uint16_t DesignVol, uint16_t K_Vol
|
|
|
return(Result);
|
|
|
}
|
|
|
|
|
|
+//随SOC计算限流衰减系数
|
|
|
+uint16_t MC_LimitCurrent_Cal_K_BySOC(uint16_t SOC)
|
|
|
+{
|
|
|
+ uint16_t Limit_K_BySOC = 1024;
|
|
|
+ if(SOC <= 2)
|
|
|
+ Limit_K_BySOC = 256;
|
|
|
+ else if(SOC <= 6)
|
|
|
+ Limit_K_BySOC = 256 + (SOC - 2) * 64;
|
|
|
+ else if(SOC <= 22)
|
|
|
+ Limit_K_BySOC = 512 + (SOC - 6) * 24;
|
|
|
+ else if(SOC <= 30)
|
|
|
+ Limit_K_BySOC = 896 + (SOC - 22) * 16;
|
|
|
+ else
|
|
|
+ Limit_K_BySOC = 1024;
|
|
|
+ return Limit_K_BySOC;
|
|
|
+}
|
|
|
+
|
|
|
+//随SOC计算限速衰减系数
|
|
|
+uint16_t MC_LimitSpeed_Cal_K_BySOC(uint16_t SOC)
|
|
|
+{
|
|
|
+ uint16_t Limit_K_BySOC = 1024;
|
|
|
+ if(SOC <= 2)
|
|
|
+ Limit_K_BySOC = 512;
|
|
|
+ else if(SOC <= 6)
|
|
|
+ Limit_K_BySOC = 512 + (SOC - 2) * 32;
|
|
|
+ else if(SOC <= 22)
|
|
|
+ Limit_K_BySOC = 640 + (SOC - 6) * 20;
|
|
|
+ else if(SOC <= 30)
|
|
|
+ Limit_K_BySOC = 960 + (SOC - 22) * 8;
|
|
|
+ else
|
|
|
+ Limit_K_BySOC = 1024;
|
|
|
+ return Limit_K_BySOC;
|
|
|
+}
|
|
|
+
|
|
|
//随温度计算助力衰减系数
|
|
|
uint16_t MC_Cal_K_ByTemperature(uint16_t CoilTemp, uint16_t AlarmTempTH)
|
|
|
{
|
|
@@ -155,15 +189,15 @@ MC_AssistRunMode_Struct_t MC_JudgeAsistRunMode_Process(MC_GasMode_Struct_t GasMo
|
|
|
|
|
|
if(MC_ErrorCode.Code == 0) // 无故障
|
|
|
{
|
|
|
- if((GearSt != MC_GearSt_OFF) && (StopFlag == FALSE) && (HAL_GetTick()>3000))
|
|
|
+ if((GearSt != MC_GearSt_OFF) && (StopFlag == FALSE) && (HAL_GetTick() > 3000))
|
|
|
{
|
|
|
//进入指拨模式
|
|
|
- if((GasSensorData > 100) && (GasMode_Param.Mode != (uint8_t)MC_SUPPORT_DISABLE))
|
|
|
+ if((GasSensorData > 200) && (GasMode_Param.Mode != (uint8_t)MC_SUPPORT_DISABLE)) //转把启动电压 = 零点电压 + (TH / 4096 * 3.3) / 10 * 15.6,5V转把0.3V启动
|
|
|
{
|
|
|
MC_AssistRunMode_Result = MC_AssistRunMode_GAS;
|
|
|
}
|
|
|
//退出指拨模式
|
|
|
- else if(GasSensorData < 50)
|
|
|
+ else if(GasSensorData < 100)
|
|
|
{
|
|
|
//进入推行模式
|
|
|
if(GearSt == MC_GearSt_WALK)
|
|
@@ -295,18 +329,20 @@ MC_CalParam_Struct_t MC_AssistRunMode_GasSpeed_Process(MC_GasMode_Struct_t GasMo
|
|
|
|
|
|
/*电机最高速度,上位机配置参数*/
|
|
|
SpeedMax = MC_MotorParam.Rate_Speed;
|
|
|
- Tmp = SensorData-50; //指拨100启动,减去50能控低速
|
|
|
+ Tmp = SensorData - 100; //指拨200启动,减去100能控低速
|
|
|
Tmp = Tmp > 2048 ? 2048 : Tmp;
|
|
|
- Tmp = (Tmp*Tmp)/2048; //指拨值改为抛物线,低速控制行程变大
|
|
|
+ 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);
|
|
|
+ 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;
|
|
|
else
|
|
|
- SpeedLimit = MC_ConfigParam1.SpeedLimit + (int8_t)MC_ConfigParam2.SpeedLimitAdj + MC_GasMode_Param.Mode_bit.SpeedLimit - (0xAA >> 3);
|
|
|
- SpeedSet = Tmp * (SpeedLimit * SpdProportion) / 10 >> 11; //(Tmp >> 11) * cd_Speedlimit * ( SpdProportion / 10)
|
|
|
+ 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;
|
|
|
+ //根据SOC限制最大车速
|
|
|
+ SpeedSet = Tmp * (SpeedLimit * SpdProportion) / 10 >> 11; //(Tmp >> 11) * cd_Speedlimit * ( SpdProportion / 10)
|
|
|
+
|
|
|
//超过限速值,设定电机转速为0
|
|
|
- if(wheelSpeed > ((MC_ConfigParam1.SpeedLimit + (int8_t)MC_ConfigParam2.SpeedLimitAdj + MC_GasMode_Param.Mode_bit.SpeedLimit - (0xAA >> 3)) * 10 + 20))
|
|
|
+ if(wheelSpeed > (SpeedLimit * 10 + 20))
|
|
|
{
|
|
|
SpeedSet = 0;
|
|
|
}
|
|
@@ -396,7 +432,7 @@ MC_CalParam_Struct_t MC_AssistRunMode_GasSpeed_Process(MC_GasMode_Struct_t GasMo
|
|
|
PID_MotorSpd.hLower_Limit_Output = -100;
|
|
|
PID_MotorSpd.hUpper_Limit_Output = 1050;
|
|
|
/*限制母线电流*/
|
|
|
- SpdMotorByIdc = PID_Regulator((MC_ConfigParam1.CurrentLimit * 1000) >> 7, MC_RunInfo.BusCurrent >> 7, &PID_ConstantPower);
|
|
|
+ SpdMotorByIdc = PID_Regulator((MC_ConfigParam1.CurrentLimit * 1000 * MC_LimitCurrent_Cal_K_BySOC(MC_RunInfo.SOC)) >> 17, MC_RunInfo.BusCurrent >> 7, &PID_ConstantPower);
|
|
|
|
|
|
#if 1
|
|
|
static uint16_t K_ByVoltage_Set_Old = 1024;
|
|
@@ -596,14 +632,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)) * 10 + MC_ConfigParam2.SpeedLimitStartAdj;
|
|
|
- speedLimitEnd = (MC_ConfigParam1.SpeedLimit + (int8_t)MC_ConfigParam2.SpeedLimitAdj + GasMode_Param.Mode_bit.SpeedLimit + 0x1F - (0xAA >> 3)) * 10 + MC_ConfigParam2.SpeedLimitEndAdj + 22;
|
|
|
+ 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;
|
|
|
slewRate = 1024 / (speedLimitEnd - speedLimitStart - 3);
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
- speedLimitStart = (MC_ConfigParam1.SpeedLimit + (int8_t)MC_ConfigParam2.SpeedLimitAdj + GasMode_Param.Mode_bit.SpeedLimit - (0xAA >> 3)) * 10 + MC_ConfigParam2.SpeedLimitStartAdj;
|
|
|
- speedLimitEnd = (MC_ConfigParam1.SpeedLimit + (int8_t)MC_ConfigParam2.SpeedLimitAdj + GasMode_Param.Mode_bit.SpeedLimit - (0xAA >> 3)) * 10 + MC_ConfigParam2.SpeedLimitEndAdj + 22;
|
|
|
+ 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;
|
|
|
slewRate = 1024 / (speedLimitEnd - speedLimitStart - 3);
|
|
|
}
|
|
|
|
|
@@ -699,13 +735,14 @@ MC_CalParam_Struct_t MC_AssistRunMode_GasTorque_Process(MC_GasMode_Struct_t GasM
|
|
|
uint16_t K_ByTemperature_Result = 1024;
|
|
|
#endif
|
|
|
|
|
|
- //限流计算
|
|
|
- IqRefByInPower = PID_Regulator(CurrentLimitPresent * (MC_RunInfo.SOC <= 5 ? 5 : (MC_RunInfo.SOC >= 10 ? 10 : MC_RunInfo.SOC)) / 1000, (MC_RunInfo.BusCurrent >> 7), &PID_IMax);
|
|
|
-
|
|
|
+ //根据SOC计算限流
|
|
|
+ IqRefByInPower = PID_Regulator((CurrentLimitPresent * MC_LimitCurrent_Cal_K_BySOC(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;
|
|
|
Torque_Ref_Temp = (Torque_Ref_Temp + IqRefByInPower) >> 1;
|
|
|
|
|
|
+ //Iq输出
|
|
|
p_MC_CalParam.Ref_Torque = (int16_t)Torque_Ref_Temp;
|
|
|
p_MC_CalParam.Foc_Flag = SET;
|
|
|
p_MC_CalParam.AssistRunMode = MC_AssistRunMode_GAS;
|
|
@@ -770,7 +807,8 @@ MC_CalParam_Struct_t MC_AssistRunMode_Walk_Process(MC_WorkMode_Struct_t p_MC_Wor
|
|
|
{
|
|
|
MC_WalkProcess_Param.MotorSpeedSetBigin = WalkMode_MotorSpeedSet << 5;
|
|
|
}
|
|
|
- SpdMotorByIdc = PID_Regulator((MC_ConfigParam1.CurrentLimit * 500) >> 7, MC_RunInfo.BusCurrent >> 7, &PID_ConstantPower); // 母线电流闭环
|
|
|
+ //根据SOC计算限流
|
|
|
+ SpdMotorByIdc = PID_Regulator((MC_ConfigParam1.CurrentLimit * 500 * MC_LimitCurrent_Cal_K_BySOC(MC_RunInfo.SOC)) >> 17, MC_RunInfo.BusCurrent >> 7, &PID_ConstantPower); // 母线电流闭环
|
|
|
}
|
|
|
|
|
|
//速度环
|
|
@@ -1176,8 +1214,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;
|
|
|
- speedLimitEnd = (MC_ConfigParam1.SpeedLimit + (int8_t)MC_ConfigParam2.SpeedLimitAdj) * 10 + MC_ConfigParam2.SpeedLimitEndAdj + 22;
|
|
|
+ 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;
|
|
|
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);
|
|
@@ -1313,13 +1351,14 @@ MC_CalParam_Struct_t MC_AssistRunMode_Torque_Process(uint16_t SenorData, MC_Gear
|
|
|
uint16_t K_ByTemperature_Result = 1024;
|
|
|
#endif
|
|
|
|
|
|
- //限流计算
|
|
|
- IqRefByInPower = PID_Regulator(CurrentLimitPresent * (MC_RunInfo.SOC <= 5 ? 5 : (MC_RunInfo.SOC >= 10 ? 10 : MC_RunInfo.SOC)) / 1000, (MC_RunInfo.BusCurrent >> 7), &PID_IMax);
|
|
|
+ //根据SOC计算限流
|
|
|
+ IqRefByInPower = PID_Regulator((CurrentLimitPresent * MC_LimitCurrent_Cal_K_BySOC(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;
|
|
|
Torque_Ref_Temp = (Torque_Ref_Temp + IqRefByInPower) >> 1;
|
|
|
|
|
|
+ //Iq输出
|
|
|
p_MC_CalParam.Ref_Torque = (int16_t)Torque_Ref_Temp;
|
|
|
p_MC_CalParam.Foc_Flag = SET;
|
|
|
p_MC_CalParam.AssistRunMode = MC_AssistRunMode_TORQUE;
|