Browse Source

V3.2.3_20210107 TC013003-MW2002-V0r2
1、增加根据电机转速和车速的传动比来限制母线电流,测试发现体验不是很好,屏蔽该代码;
2、增加ODO里程清除逻辑,100km内清除TRIP同时归零,只能操作一次;
3、修改低电压和温度过热衰减方式,改为通过电压和温度调整限流值;
4、修改过热保护的判断条件;
5、V3.2.3_20210107 TC013003-MW2002-V0r2。

dail.zhou 4 years ago
parent
commit
ddef2efc4f

+ 3 - 0
Core/Src/main.c

@@ -287,6 +287,9 @@ int main(void)
 			//根据踏频计算限流系数
 			MC_CadenceLimit_K = MC_CadenceLimit_Cal(MC_RunInfo.Cadence, MC_RunInfo.BusCurrent, MC_RunInfo.T_Coil);
 			
+			//根据电机转速和车速的传动比计算限流系数
+			//MC_MotorSpeedLimit_K = MC_MotorSpeedLimit_Cal(MC_RunInfo.MotorSpeed, MC_RunInfo.BikeSpeed);
+			
 			//Flash数据存储更新处理
 			if(MC_CalParam.Foc_Flag == RESET)
 			{

BIN
MDK-ARM/bin/MC_PSX000-TC013003-MW2002-V3.2.3.0.2_20210107.bin


BIN
MDK-ARM/bin/QD007A_CTL_APP.bin


+ 1 - 0
User/Inc/motor_control.h

@@ -76,6 +76,7 @@ extern MC_ControlCode_Struct_t MC_ControlCode_Back;
 extern MC_CalParam_Struct_t MC_CalParam;
 extern MC_CalParam_Struct_t MC_CalParam_Back;
 extern uint8_t MC_CadenceLimit_K;
+extern uint8_t MC_MotorSpeedLimit_K;
 extern FlagStatus MC_StarFlag;
 
 #define Update_MC_ControlCode_Back()    { MC_ControlCode_Back.GearSt = (MC_GearSt_Struct_t)~MC_ControlCode.GearSt;\

+ 1 - 0
User/Inc/tasks.h

@@ -15,6 +15,7 @@ extern void MC_SendErrorCode_Process(MC_ErrorCode_Struct_t ErrorCode);
 extern void MC_SendRunInfo_Process(MC_WorkMode_Struct_t WorkMode);
 extern void MC_TE_SensorData_Process(MC_TE_SensorData_Struct_t* p_MC_TE_SensorData);
 extern uint8_t MC_CadenceLimit_Cal(uint8_t Cadence, uint16_t Current, uint8_t T_Coil);
+extern uint8_t MC_MotorSpeedLimit_Cal(uint16_t MotorSpeed, uint16_t BikeSpeed);
 extern void PowerOff_Process(void);
 extern void MC_CanRxCheck_Process(MC_SupportFlag_Struct_t NoPBU_Flag, MC_SupportFlag_Struct_t NoHMI_Flag, MC_WorkMode_Struct_t WorkMode, MC_GearSt_Struct_t* GearSt);
 extern void MC_UartRxCheck_Process(void);

+ 20 - 0
User/Src/can_process.c

@@ -205,6 +205,16 @@ void DataProcess(uint16_t ID, uint8_t Mode, uint16_t Cmd, uint8_t* Data)
 					{
 					  MC_RideLog.TRIP_Km = 0;
 						MC_RideLog.TRIP_Time = 0;
+						if(strncmp("CLEAR_ODO", (char*)UserString1, 9) != 0)//利用UserString1作为是否允许清除ODO的标志
+						{
+						  if(MC_RideLog.ODO_Km < 1000) //前100km允许清除
+							{
+						  	MC_RideLog.ODO_Km = 0;
+					  		MC_RideLog.ODO_Time = 0;
+							}
+							strncpy((char*)UserString1, (char*)"CLEAR_ODO", 9);
+							IsFlashSaveDataUpdate = TRUE;
+						}	
 						SaveParamToEEprom_24C02(&I2C_Handle_EEPROM, EEPROM_24C02_ADDR_RIDE_LOG, sizeof(MC_RideLog_Struct_t), (uint8_t*)&MC_RideLog.ODO_Km);
 						SendData(ID_MC_TO_PBU, MODE_REPORT, 0x5303, (uint8_t*)"ACK");
 						MC_RunInfo.Ride_Km = 0;
@@ -332,6 +342,16 @@ void DataProcess(uint16_t ID, uint8_t Mode, uint16_t Cmd, uint8_t* Data)
 					{
 					  MC_RideLog.TRIP_Km = 0;
 						MC_RideLog.TRIP_Time = 0;
+						if(strncmp("CLEAR_ODO", (char*)UserString1, 9) != 0)//利用UserString1作为是否允许清除ODO的标志
+						{
+						  if(MC_RideLog.ODO_Km < 1000) //前100km允许清除
+							{
+						  	MC_RideLog.ODO_Km = 0;
+					  		MC_RideLog.ODO_Time = 0;
+							}
+							strncpy((char*)UserString1, (char*)"CLEAR_ODO", 9);
+							IsFlashSaveDataUpdate = TRUE;
+						}	
 						SaveParamToEEprom_24C02(&I2C_Handle_EEPROM, EEPROM_24C02_ADDR_RIDE_LOG, sizeof(MC_RideLog_Struct_t), (uint8_t*)&MC_RideLog.ODO_Km);
 						SendData(ID_MC_TO_HMI, MODE_REPORT, 0x7403, (uint8_t*)"ACK");
 						MC_RunInfo.Ride_Km = 0;

+ 8 - 7
User/Src/motor_control.c

@@ -26,6 +26,8 @@ MC_CalParam_Struct_t MC_CalParam = {MC_AssistRunMode_INVALID, 0,	0, RESET};
 MC_CalParam_Struct_t MC_CalParam_Back = {(MC_AssistRunMode_Struct_t)~MC_AssistRunMode_INVALID, ~0, ~0, (FlagStatus)~RESET}; 
 //踏频限流系数
 uint8_t MC_CadenceLimit_K = 100;
+//电机转速和车速传动比限流系数
+uint8_t MC_MotorSpeedLimit_K = 100;
 //力矩助力控制参数
 MC_TorqueProcess_Param_Struct_t MC_TorqueProcess_Param = {SET, 0, 0, 0};
 //推行助力控制参数
@@ -600,7 +602,7 @@ MC_CalParam_Struct_t MC_AssistRunMode_Torque_Process(MC_CadenceResult_Struct_t C
 					//给定上限
 					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) * 100;
+					CurrentLimitSet = (uint32_t)(MC_AssisParam.Gear_SPORT.CurrentMax_K * MC_ConfigParam1.CurrentLimit * 1000 >> 17) * MC_MotorSpeedLimit_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
@@ -613,7 +615,7 @@ MC_CalParam_Struct_t MC_AssistRunMode_Torque_Process(MC_CadenceResult_Struct_t C
 					//给定上限
 					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) * 100;
+					CurrentLimitSet = (uint32_t)(MC_AssisParam.Gear_TURBO.CurrentMax_K * MC_ConfigParam1.CurrentLimit * 1000 >> 17) * MC_MotorSpeedLimit_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
@@ -626,7 +628,7 @@ MC_CalParam_Struct_t MC_AssistRunMode_Torque_Process(MC_CadenceResult_Struct_t C
 					//给定上限
 					Torque_Temp = (Torque_Temp > MC_AssisParam.Gear_SMART.Upper_Iq) ? MC_AssisParam.Gear_SMART.Upper_Iq : Torque_Temp;
 					//限流参数设置
-					CurrentLimitSet = (uint32_t)(MC_AssisParam.Gear_SMART.CurrentMax_K * MC_ConfigParam1.CurrentLimit * 1000 >> 17) * 100;
+					CurrentLimitSet = (uint32_t)(MC_AssisParam.Gear_SMART.CurrentMax_K * MC_ConfigParam1.CurrentLimit * 1000 >> 17) * MC_MotorSpeedLimit_K;
 					CurrentLimitPresent = MC_DataSet_Linear_Process(CurrentLimitSet, CurrentLimitPresent, 5 ,1);
 					PID_IMax.hLower_Limit_Output = -(MC_AssisParam.Gear_SMART.Upper_Iq);   //Lower Limit for Output limitation
 					PID_IMax.hUpper_Limit_Output = 0; //Upper Limit for Output limitation
@@ -964,7 +966,7 @@ MC_CalParam_Struct_t MC_AssistRunMode_Torque_Process(MC_CadenceResult_Struct_t C
   K_ByVoltage_Result = MC_DataSet_Linear_Process(K_ByVoltage_Set, K_ByVoltage_Result, 1, 1); //设定值与给定值线性处理
 	
 	//根据温度调节输出
-	K_ByTemperature_Set = MC_Cal_K_ByTemperature(MC_RunInfo.T_Coil, MC_ConfigParam1.TempTH_Alarm); //根据温度计算衰减比例
+	K_ByTemperature_Set = MC_Cal_K_ByTemperature(MC_RunInfo.T_PCB, MC_ConfigParam1.TempTH_Alarm); //根据温度计算衰减比例
 	K_ByTemperature_Result = MC_DataSet_Linear_Process(K_ByTemperature_Set, K_ByTemperature_Result, 1, 1); //设定值与给定值线性处理
 	
 	#else
@@ -974,10 +976,9 @@ MC_CalParam_Struct_t MC_AssistRunMode_Torque_Process(MC_CadenceResult_Struct_t C
 	#endif
 	
   //限流计算
-  IqRefByInPower =  PID_Regulator(CurrentLimitPresent / 100, (MC_RunInfo.BusCurrent >> 7), &PID_IMax);
+  IqRefByInPower =  PID_Regulator((uint32_t)(CurrentLimitPresent / 100 * K_ByVoltage_Result * K_ByTemperature_Result) >> 20, (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 = MC_TorqueProcess_Param.TorqueRefEnd;
 	Torque_Ref_Temp = (Torque_Ref_Temp + IqRefByInPower) >> 1;
 	
 	p_MC_CalParam.Ref_Torque = (int16_t)Torque_Ref_Temp;

+ 4 - 15
User/Src/protect_check.c

@@ -211,21 +211,10 @@ void MC_Protect_OverHeat_Process(uint8_t T_MCU, uint8_t T_PCB, uint8_t T_Coil, u
 	
 	if(p_MC_ErrorCode->ERROR_Bit.Protect_OverTemp == 0)
 	{
-		//温度传感器相互比较,差值在允许范围内进行处理
-		if(((T_MCU < (50 + T_PCB))  || (T_PCB < (50 + T_MCU))) &&    //PCB温度和MCU温度差值小于50度
-			 ((T_MCU < (100 + T_Coil)) || (T_Coil < (100 + T_MCU))))   //绕组温度和MCU温度差值小于100度
+		//根据MCU和PCB温度进行判断
+		if((T_MCU < (TH - 20)) && (T_PCB < (TH - 20)) && (T_Coil < (TH + 55)))
 		{
-			if((T_PCB < (TH - 20)) && (T_Coil < (TH + 15)))
-			{
-				OT_Set_TimeCnt = HAL_GetTick();
-			}
-		}
-		else
-		{
-			if(T_MCU < (TH - 20))
-			{
-			  OT_Set_TimeCnt = HAL_GetTick();
-			}
+			OT_Set_TimeCnt = HAL_GetTick();
 		}
 		//过热保护判断
 		if((HAL_GetTick() - OT_Set_TimeCnt) > 5000)
@@ -243,7 +232,7 @@ void MC_Protect_OverHeat_Process(uint8_t T_MCU, uint8_t T_PCB, uint8_t T_Coil, u
 	else
 	{
 		//过热保护恢复
-		if((((T_PCB < (TH - 20)) && (T_Coil < (TH  - 20))) || (T_MCU < (TH - 40))) && ((HAL_GetTick() - OT_Reset_TimeCnt) > 300000))
+		if(((T_PCB < (TH - 30)) && (T_MCU < (TH - 30)) && (T_Coil < (TH + 15))) && ((HAL_GetTick() - OT_Reset_TimeCnt) > 300000))
 		{
 			p_MC_ErrorCode->ERROR_Bit.Protect_OverTemp = 0;
 			OT_Set_TimeCnt = HAL_GetTick();

+ 52 - 0
User/Src/tasks.c

@@ -521,6 +521,58 @@ uint8_t MC_CadenceLimit_Cal(uint8_t Cadence, uint16_t Current, uint8_t T_Coil)
 	return Result;
 }
 
+//根据电机转速和车速的传动比限制母线电流
+uint8_t MC_MotorSpeedLimit_Cal(uint16_t MotorSpeed, uint16_t BikeSpeed)
+{
+  static uint32_t PeriodTimeCnt = 0;
+	static uint16_t DataCnt = 0;
+	static uint32_t MotorSpeedSum = 0;
+	static uint32_t BikeSpeedSum = 0;
+	uint32_t K_Temp;
+	static uint8_t Result = 100;
+	
+	if((HAL_GetTick() - PeriodTimeCnt) > 100)
+	{
+  	PeriodTimeCnt = HAL_GetTick();
+		
+		if((MotorSpeed > 20) && (BikeSpeed > 10))
+		{
+  		MotorSpeedSum += MotorSpeed;
+			BikeSpeedSum += BikeSpeed;
+			DataCnt++;
+			if(DataCnt >= 50)
+			{
+			  DataCnt = 0;
+				K_Temp = MotorSpeedSum * 10 / BikeSpeedSum;
+				MotorSpeedSum = 0;
+				BikeSpeedSum = 0;
+				//判断传动比:电机转速 / 车速 = T后 / T前 * 4.55 * 1000 / 2.32 / 60 = T后 / T前 * 32.6868,按照T前 = 24T,T后 = 26T * 0.8 = 20.8T作为临界点,则判断标准为24 / 20.8 * 32.6868 = 37.7
+				if(K_Temp > 32) //三档以上
+				{
+				  Result = 100;
+				}
+				else if(K_Temp > 26)//四档
+				{
+			  	Result = 95; //K_Temp * 100 / 37;
+				}
+				else//五档
+				{
+				  Result = 90;
+				}
+			}
+		}
+		else
+		{
+		  DataCnt = 0;
+			MotorSpeedSum = 0;
+			BikeSpeedSum = 0;
+			Result = 100;
+		}
+	}
+	
+	return Result;
+}
+
 //接收到关机指令处理
 void PowerOff_Process(void)
 {

+ 2 - 2
User/Src/var.c

@@ -490,8 +490,8 @@ void Var_Init(void)
 		
 	//MC版本信息初始化,Mode和SN从EEPROM读取
   strncpy(MC_VerInfo.HW_Version, (char*)"TT_KZ_010D.     ", 16);
-	strncpy(MC_VerInfo.FW_Version, (char*)"V3r2r3_20210105.", 16);
-	strncpy(Firmware_Special, (char*)"TC013003-MW2002-V0r1.           ", 32);
+	strncpy(MC_VerInfo.FW_Version, (char*)"V3r2r3_20210107.", 16);
+	strncpy(Firmware_Special, (char*)"TC013003-MW2002-V0r2.           ", 32);
 	
 	//电机型号
 	strncpy(MC_VerInfo.Mode, (char*)"PG8000 & PSX000.", 16);

+ 24 - 0
修改说明.txt

@@ -343,4 +343,28 @@ V3.2.3_20210105 TC013003-MW2002-V0r1
 1、修改转把模式的控制方式,按照力矩控制;
 2、V3.2.3_20210105 TC013003-MW2002-V0r1。
 
+V3.2.3_20210107 TC013003-MW2002-V0r2
+1、增加根据电机转速和车速的传动比来限制母线电流,测试发现体验不是很好,屏蔽该代码;
+2、增加ODO里程清除逻辑,100km内清除TRIP同时归零,只能操作一次;
+3、修改低电压和温度过热衰减方式,改为通过电压和温度调整限流值;
+4、修改过热保护的判断条件;
+5、V3.2.3_20210107 TC013003-MW2002-V0r2。
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+