瀏覽代碼

1、针对圣达客户在样车测试过程中遇到的问题,暂时按照定制程序处理;
2、低压保护值初始化完成后设置为2950;
3、微故障调整,兼容GD单片机;
4、增加低电量限流处理;
5、修改低压保护的处理方式,分别按照电池有通讯和无通讯处理;
6、接收关机指令后延时调整为1s,解决接收关机指令后,电门信号没有关闭时,TE误报MCU故障。

dail 3 年之前
父節點
當前提交
756e2c1804

+ 3 - 0
Core/Src/main.c

@@ -205,6 +205,9 @@ int main(void)
 	
 	//初始化完成标志
 	IsInitFinish_Flag = TRUE;
+	
+	//定制特殊化处理
+	MC_ConfigParam1.UV_Protect_TH = 2950;
 
   /* USER CODE END 2 */
 

文件差異過大導致無法顯示
+ 2338 - 2338
MDK-ARM/QD007A_CTL_APP/QD007A_CTL_APP_CRC.hex


二進制
MDK-ARM/bin/MC_PG8010-TC011057-MD2102&3&4-V3.2.6.0.1_20211118.bin


二進制
MDK-ARM/bin/QD007A_CTL_APP.bin


+ 16 - 16
SelfTestUser/src_middlewares/stm32f1xx_STUperipheralRegisters.c

@@ -425,23 +425,23 @@ uint8_t ADC_register_selftest(ADC_TypeDef* ADCx)
 //		if(val!=0x008AA80A)
 //				return  (0);
 	//////////SMPR1//////////////	
-	ADCx->SMPR1=0x00555555;
-	val=ADCx->SMPR1;
-	if(val!=0x00555555)
-				return  (0);
-	ADCx->SMPR1=0x00AAAAAA;
-	val=ADCx->SMPR1;
-		if(val!=0x00AAAAAA)
-				return  (0);
+//	ADCx->SMPR1=0x00555555;
+//	val=ADCx->SMPR1;
+//	if(val!=0x00555555)
+//				return  (0);
+//	ADCx->SMPR1=0x00AAAAAA;
+//	val=ADCx->SMPR1;
+//		if(val!=0x00AAAAAA)
+//				return  (0);
 	//////////SMPR2//////////////	
-	ADCx->SMPR2=0x15555555;
-	val=ADCx->SMPR2;
-	if(val!=0x15555555)
-				return  (0);
-	ADCx->SMPR2=0x2AAAAAAA;
-	val=ADCx->SMPR2;
-		if(val!=0x2AAAAAAA)
-				return  (0);				
+//	ADCx->SMPR2=0x15555555;
+//	val=ADCx->SMPR2;
+//	if(val!=0x15555555)
+//				return  (0);
+//	ADCx->SMPR2=0x2AAAAAAA;
+//	val=ADCx->SMPR2;
+//		if(val!=0x2AAAAAAA)
+//				return  (0);				
 	//////////JOFR1 //////////////	
 	ADCx->JOFR1=0x00000555;
 	val=ADCx->JOFR1;

+ 6 - 6
User/Src/fault_check.c

@@ -368,11 +368,11 @@ void MC_Fault_NTCSensor_Process(uint8_t T_PCB_Result, uint8_t T_Coil_Result, MC_
 		  TrigTimeCnt_Coil = HAL_GetTick();
 		}
 		
-		//NTC为固定值的检测,检测3min内母线电流平均值 > 10A 时的前后温差
+		//NTC为固定值的检测,检测设定时间内内母线电流平均值 > 10A 时的前后温差
 		if((HAL_GetTick() - NTC_Check_PeriodTimeCnt) >= 100)
 		{
 		  NTC_Check_PeriodTimeCnt = HAL_GetTick();
-			BusCurrentSum += MC_RunInfo.BusCurrent >> 7;//按照mA / 128 判断,约0.1A
+			BusCurrentSum += (uint16_t)(MC_RunInfo.BusCurrent >> 7);//按照mA / 128 判断,约0.1A
 			NTC_Check_Count++;
 			//采集100 * 8192 = 819.2s内母线电流平均值
 			if(NTC_Check_Count >= 8192)
@@ -383,8 +383,8 @@ void MC_Fault_NTCSensor_Process(uint8_t T_PCB_Result, uint8_t T_Coil_Result, MC_
 				//平均电流超过10A,判断是否有温升
 				if(BusCurrentAvg > 79) // 79  * 1.28 = 101
 				{
-				  if((abs(T_PCB_Result - T_PCB_Old) < 2) ||  //PCB 温升低于2
-						 (abs(T_Coil_Result - T_Coil_Old) < 2))  //绕组温升低于2
+				  if((abs(T_PCB_Result - T_PCB_Old) < 1) ||  //PCB 温升低于1
+						 (abs(T_Coil_Result - T_Coil_Old) < 1))  //绕组温升低于1
 					{
 					  p_MC_ErrorCode->ERROR_Bit.Fault_NtcSensor = 1;
 						//记录故障日志
@@ -761,7 +761,7 @@ void MC_Fault_Circuit_Process(MC_ErrorCode_Struct_t* p_MC_ErrorCode)
 				
 				if((IqFdbFlt >> 10) > 200) //250时,相电流为9.6A;330时,相电流为12.4A;350时,相电流为13.6A。得到,相电流 = 0.038 * IqFdb
 				{
-					if(((BusCurrent_Flt >> 5) - uw_current_offset) < 50) //50对应的母线电流约1.2A, DATA / 2048 * 50A
+					if(((BusCurrent_Flt >> 5) - uw_current_offset) < 25) //25对应的母线电流约0.6A, DATA / 2048 * 50A
 					{
 						CurrentFaultCount++;
 						if(CurrentFaultCount > 10)
@@ -1057,7 +1057,7 @@ void MC_Fault_Check_Process(void)
 	MC_Fault_MOS_Process(ADC_3ShuntCurrent_RMSValue, &MC_ErrorCode);
 
   //TE故障检测
-	#if 0
+	#if 1
 	if(TE_CheckFlag == SET)//针对样机的TE软件版本,不检测故障
 	{
   	MC_Fault_TE_Process(&MC_TE_SensorStatus, IsComOK_TE.IsOK_Flag, &MC_ErrorCode);

+ 1 - 1
User/Src/motor_control.c

@@ -1128,7 +1128,7 @@ MC_CalParam_Struct_t MC_AssistRunMode_Torque_Process(uint16_t SenorData, MC_Gear
 	#endif
 	
   //ÏÞÁ÷¼ÆËã
-  IqRefByInPower =  PID_Regulator(CurrentLimitPresent / 100, (MC_RunInfo.BusCurrent >> 7), &PID_IMax);
+	IqRefByInPower = PID_Regulator(CurrentLimitPresent * (MC_RunInfo.SOC <= 5 ? 5 : (MC_RunInfo.SOC >= 10 ? 10 : MC_RunInfo.SOC)) / 1000, (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;

+ 67 - 27
User/Src/protect_check.c

@@ -11,7 +11,7 @@ FlagStatus MC_Protect_OverCurrentTrig_Flag = RESET;
 
 /******************************局部函数定义******************************/
 //低压保护检测
-void MC_Protect_UnderVoltage_Process(uint16_t BusVoltage, uint8_t DesignVoltage, uint16_t UV_TH, MC_ErrorCode_Struct_t* p_MC_ErrorCode)
+void MC_Protect_UnderVoltage_Process(TrueOrFalse_Flag_Struct_t IsBMS_ComOK, uint8_t SOC, uint16_t BusVoltage, uint8_t DesignVoltage, uint16_t UV_TH, MC_ErrorCode_Struct_t* p_MC_ErrorCode)
 {
   static uint32_t uvTimeCnt = 0;
 	static uint32_t uvFaultTimeCnt = 0;
@@ -23,54 +23,95 @@ void MC_Protect_UnderVoltage_Process(uint16_t BusVoltage, uint8_t DesignVoltage,
 		case 24:
 		{
 			UV_Voltage = UV_TH * 7;//低压保护时,电芯电压为3100mV
-		  break;
+			break;
 		}
 		case 36:
 		{
 			UV_Voltage = UV_TH * 10;//低压保护时,电芯电压为3100mV
-		  break;
+			break;
 		}
 		case 48:
 		{
 			UV_Voltage = UV_TH * 13;//低压保护时,电芯电压为3100mV
-		  break;
+			break;
 		}
 		default:
 		{
-  		UV_Voltage = BusVoltage;
+			UV_Voltage = BusVoltage;
 			break;
 		}
 	}
-	if(p_MC_ErrorCode->ERROR_Bit.Protect_UnderVoltage == 0)
+	
+	if(IsBMS_ComOK == TRUE)//电池通讯正常,根据BMS的SOC作为低压保护
 	{
-		//低压保护判断
-		if(BusVoltage >= UV_Voltage)
+	  if(p_MC_ErrorCode->ERROR_Bit.Protect_UnderVoltage == 0)
 		{
-			uvTimeCnt = HAL_GetTick();
+			//低压保护判断
+			if((SOC >= 1) && (BusVoltage >= UV_Voltage))
+			{
+				uvTimeCnt = HAL_GetTick();
+			}
+			if((HAL_GetTick() - uvTimeCnt) > 5000)
+			{
+				p_MC_ErrorCode->ERROR_Bit.Protect_UnderVoltage = 1;
+				//记录故障日志
+				MC_ErrorLogSaveInfo.NotesInfo1 = BusVoltage;
+				MC_ErrorLogSaveInfo.NotesInfo2 = (uint16_t)IsBMS_ComOK;
+				ErrorLogSave_Update(&MC_ErrorLogSaveInfo);
+				IsErrorLogSaveInfoUpdateFlag = TRUE;
+				//存储故障次数
+				MC_RunLog1.UV_ProtectCnt++;
+				RunLogSaveIndex = 1;
+			}
+			uvFaultTimeCnt = HAL_GetTick();
 		}
-		if((HAL_GetTick() - uvTimeCnt) > 5000)
+		else
 		{
-			p_MC_ErrorCode->ERROR_Bit.Protect_UnderVoltage = 1;
-			//记录故障日志
-			MC_ErrorLogSaveInfo.NotesInfo1 = BusVoltage;
-			ErrorLogSave_Update(&MC_ErrorLogSaveInfo);
-			IsErrorLogSaveInfoUpdateFlag = TRUE;
-			//存储故障次数
-			MC_RunLog1.UV_ProtectCnt++;
-			RunLogSaveIndex = 1;
+			//低压保护恢复
+			if((SOC < 1) && (BusVoltage < (UV_Voltage + 1000)))
+			{
+				uvFaultTimeCnt = HAL_GetTick();
+			}	
+			if((HAL_GetTick() - uvFaultTimeCnt) > 5000)
+			{
+				p_MC_ErrorCode->ERROR_Bit.Protect_UnderVoltage = 0;
+			}
 		}
-		uvFaultTimeCnt = HAL_GetTick();
 	}
 	else
 	{
-		//低压保护恢复
-		if(BusVoltage < (UV_Voltage + 500))
+		if(p_MC_ErrorCode->ERROR_Bit.Protect_UnderVoltage == 0)
 		{
+			//低压保护判断
+			if(BusVoltage >= UV_Voltage)
+			{
+				uvTimeCnt = HAL_GetTick();
+			}
+			if((HAL_GetTick() - uvTimeCnt) > 5000)
+			{
+				p_MC_ErrorCode->ERROR_Bit.Protect_UnderVoltage = 1;
+				//记录故障日志
+				MC_ErrorLogSaveInfo.NotesInfo1 = BusVoltage;
+				MC_ErrorLogSaveInfo.NotesInfo2 = (uint16_t)IsBMS_ComOK;
+				ErrorLogSave_Update(&MC_ErrorLogSaveInfo);
+				IsErrorLogSaveInfoUpdateFlag = TRUE;
+				//存储故障次数
+				MC_RunLog1.UV_ProtectCnt++;
+				RunLogSaveIndex = 1;
+			}
 			uvFaultTimeCnt = HAL_GetTick();
-		}	
-		if((HAL_GetTick() - uvFaultTimeCnt) > 5000)
+		}
+		else
 		{
-			p_MC_ErrorCode->ERROR_Bit.Protect_UnderVoltage = 0;
+			//低压保护恢复
+			if(BusVoltage < (UV_Voltage + 1000))
+			{
+				uvFaultTimeCnt = HAL_GetTick();
+			}	
+			if((HAL_GetTick() - uvFaultTimeCnt) > 5000)
+			{
+				p_MC_ErrorCode->ERROR_Bit.Protect_UnderVoltage = 0;
+			}
 		}
 	}
 }
@@ -396,9 +437,8 @@ void MC_Protect_OverCurrent_Process(FlagStatus* OverCurrentTrigFlag, MC_ErrorCod
 void MC_Protect_Check_Process(void)
 {
 	//低压保护检测
-	MC_Protect_UnderVoltage_Process(((IsComOK_BMS.IsOK_Flag == TRUE) ? BMS_RunInfo.Voltage : MC_RunInfo.BusVoltage), 
-	                                MC_MotorParam.Rate_Voltage, 
-	                                ((MC_ConfigParam1.UV_Protect_TH == 0) ? 3100 : MC_ConfigParam1.UV_Protect_TH), 
+	MC_Protect_UnderVoltage_Process(IsComOK_BMS.IsOK_Flag, MC_RunInfo.SOC, ((IsComOK_BMS.IsOK_Flag == TRUE) ? BMS_RunInfo.Voltage : MC_RunInfo.BusVoltage), 
+	                                MC_MotorParam.Rate_Voltage, ((MC_ConfigParam1.UV_Protect_TH == 0) ? 3100 : MC_ConfigParam1.UV_Protect_TH), 
 	                                &MC_ErrorCode);
 	
 	//过压保护检测

+ 9 - 1
User/Src/tasks.c

@@ -436,6 +436,14 @@ void MC_TE_SensorData_Process(MC_TE_SensorData_Struct_t* p_MC_TE_SensorData)
     }
     else if(IsSendDataToTE_Step == SENDSENSOR)//正常发送数据到TE
     {
+      //发送指令,TE不控制12V电源
+      static uint8_t Count = 0;
+      uint8_t Data[1] = {0};
+      if(Count++ <= 5)
+      {
+        SendUartDataToTE(&UART_TxBuff_Struct3, 0x07FF, MODE_WRITE, 0x1301, (uint8_t*)Data);
+        HAL_Delay(10);
+      }
       SendUartDataToTE(&UART_TxBuff_Struct3, 0x07FF, MODE_REPORT, 0x1014, (uint8_t*)&p_MC_TE_SensorData->AD_Torque);
     }
 		PeriodTimeCnt = HAL_GetTick();
@@ -563,7 +571,7 @@ void PowerOff_Process(TrueOrFalse_Flag_Struct_t ReturnEnable)
 	{
 		PeriodTimeCnt = HAL_GetTick();
 		Count = 0;
-	  while(Count < 50)
+	  while(Count < 10)//等待1s退出,避免关机时抖动
 		{
 		  if((HAL_GetTick() - PeriodTimeCnt) > 100)
 			{

+ 2 - 2
User/Src/var.c

@@ -491,8 +491,8 @@ void Var_Init(void)
 		
 	//MC版本信息初始化,Mode和SN从EEPROM读取
   strncpy(MC_VerInfo.HW_Version, (char*)"TT_KZ_010C/D.   ", 16);
-	strncpy(MC_VerInfo.FW_Version, (char*)"V3r2r6_20211012.", 16);
-	strncpy(Firmware_Special, (char*)"TC011000-MS0000-V0r0.           ", 32);
+	strncpy(MC_VerInfo.FW_Version, (char*)"V3r2r6_20211118.", 16);
+	strncpy(Firmware_Special, (char*)"TC011057-MD2102&3&4-V0r1.       ", 32);
 	
 	//电机型号
 	strncpy(MC_VerInfo.Mode, (char*)"PG80XX & PSX0XX.", 16);

+ 7 - 1
修改说明.txt

@@ -390,7 +390,13 @@ V3.2.6_20211012
 1、修改I2C的驱动,解决频繁封波导致电机出线异常;
 2、增加清除历史记录的指令。
 
-
+MC_PG8010-TC011057-MD2102&3&4-V3.2.6.0.1_20211118
+1、针对圣达客户在样车测试过程中遇到的问题,暂时按照定制程序处理;
+2、低压保护值初始化完成后设置为2950;
+3、微故障调整,兼容GD单片机;
+4、增加低电量限流处理;
+5、修改低压保护的处理方式,分别按照电池有通讯和无通讯处理;
+6、接收关机指令后延时调整为1s,解决接收关机指令后,电门信号没有关闭时,TE误报MCU故障。
 
 
 

部分文件因文件數量過多而無法顯示