|
@@ -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)
|
|
|
{
|
|
@@ -158,12 +192,12 @@ MC_AssistRunMode_Struct_t MC_JudgeAsistRunMode_Process(MC_GasMode_Struct_t GasMo
|
|
|
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)
|
|
@@ -297,16 +331,21 @@ 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; //指拨值改为抛物线,低速控制行程变大
|
|
|
/*电机转速设定,根据指拨大小、车轮限速值和速比,换算*/
|
|
|
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限制最大车速
|
|
|
+ #if 0 //旧版传动比计算
|
|
|
+ SpeedSet = Tmp * (SpeedLimit * SpdProportion) / 10 >> 11; //(Tmp >> 11) * cd_Speedlimit * ( SpdProportion / 10)
|
|
|
+ #else //新版传动比计算
|
|
|
+ SpeedSet = Tmp * SpeedLimit * 50 / Bike_RatioCalParam.RatioResult;
|
|
|
+ #endif
|
|
|
+
|
|
|
//超过限速值,设定电机转速为0
|
|
|
if(wheelSpeed > (SpeedLimit * 10 + 20))
|
|
|
{
|
|
@@ -398,7 +437,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;
|
|
@@ -425,8 +464,6 @@ MC_CalParam_Struct_t MC_AssistRunMode_GasSpeed_Process(MC_GasMode_Struct_t GasMo
|
|
|
|
|
|
#endif
|
|
|
|
|
|
-
|
|
|
-
|
|
|
Ref_Speed_Temp = ((int32_t)TorQueBySpd * K_ByVoltage_Result) >> 10;
|
|
|
Ref_Speed_Temp = ((int32_t)Ref_Speed_Temp * K_ByTemperature_Result) >> 10;
|
|
|
|
|
@@ -447,7 +484,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)
|
|
|
{
|
|
@@ -459,7 +496,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;
|
|
|
|
|
@@ -595,19 +632,19 @@ MC_CalParam_Struct_t MC_AssistRunMode_GasTorque_Process(MC_GasMode_Struct_t GasM
|
|
|
|
|
|
//限速值设定
|
|
|
static uint16_t speedLimitStart = 250, speedLimitEnd = 272, slewRate = 52;
|
|
|
- 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;
|
|
|
+ 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;
|
|
|
|
|
|
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);
|
|
|
}
|
|
|
|
|
@@ -703,13 +740,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;
|
|
@@ -774,7 +812,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); // 母线电流闭环
|
|
|
}
|
|
|
|
|
|
//速度环
|
|
@@ -1183,8 +1222,8 @@ MC_CalParam_Struct_t MC_AssistRunMode_Torque_Process(uint16_t SenorData, MC_Gear
|
|
|
static uint16_t speedLimitStart = 250, speedLimitEnd = 272, slewRate = 52;
|
|
|
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);
|
|
@@ -1327,13 +1366,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;
|