Эх сурвалжийг харах

V3.2.5_20210727 HK
1、针对HK单片机串口通讯不稳定问题,屏蔽与TE通讯相关的检测;
2、硬件版本号和客户标识符增加“HK”;
3、清除TRIP里程时,前100km内可清除总里程一次;
4、调整过流保护的判断条件,增加软件过流保护检测;
5、Break信号被触发后,仅关闭PWM一个周期处理,不做警告提示;
6、删除TIM1 Break的中断配置。

dail 4 жил өмнө
parent
commit
4e2d44d851

+ 1 - 1
Core/Src/usart.c

@@ -58,7 +58,7 @@ void MX_USART3_UART_Init(void)
 {
 {
 
 
   huart3.Instance = USART3;
   huart3.Instance = USART3;
-  huart3.Init.BaudRate = 9600;
+  huart3.Init.BaudRate = 9696;
   huart3.Init.WordLength = UART_WORDLENGTH_8B;
   huart3.Init.WordLength = UART_WORDLENGTH_8B;
   huart3.Init.StopBits = UART_STOPBITS_1;
   huart3.Init.StopBits = UART_STOPBITS_1;
   huart3.Init.Parity = UART_PARITY_NONE;
   huart3.Init.Parity = UART_PARITY_NONE;

Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 2508 - 2508
MDK-ARM/QD007A_CTL_APP/QD007A_CTL_APP_CRC.hex


BIN
MDK-ARM/bin/MC_PG80XX&PSX0XX(125K)-TC011000-MS0000HK_V3.2.5_20210727.bin


BIN
MDK-ARM/bin/QD007A_CTL_APP.bin


+ 20 - 0
User/Src/can_process.c

@@ -214,6 +214,16 @@ void DataProcess(uint16_t ID, uint8_t Mode, uint16_t Cmd, uint8_t* Data)
 					{
 					{
 					  MC_RideLog.TRIP_Km = 0;
 					  MC_RideLog.TRIP_Km = 0;
 						MC_RideLog.TRIP_Time = 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);
 						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");
 						SendData(ID_MC_TO_PBU, MODE_REPORT, 0x5303, (uint8_t*)"ACK");
 						MC_RunInfo.Ride_Km = 0;
 						MC_RunInfo.Ride_Km = 0;
@@ -365,6 +375,16 @@ void DataProcess(uint16_t ID, uint8_t Mode, uint16_t Cmd, uint8_t* Data)
 					{
 					{
 					  MC_RideLog.TRIP_Km = 0;
 					  MC_RideLog.TRIP_Km = 0;
 						MC_RideLog.TRIP_Time = 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);
 						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");
 						SendData(ID_MC_TO_HMI, MODE_REPORT, 0x7403, (uint8_t*)"ACK");
 						MC_RunInfo.Ride_Km = 0;
 						MC_RunInfo.Ride_Km = 0;

+ 1 - 1
User/Src/fault_check.c

@@ -1057,7 +1057,7 @@ void MC_Fault_Check_Process(void)
 	MC_Fault_MOS_Process(ADC_3ShuntCurrent_RMSValue, &MC_ErrorCode);
 	MC_Fault_MOS_Process(ADC_3ShuntCurrent_RMSValue, &MC_ErrorCode);
 
 
   //TE故障检测
   //TE故障检测
-	#if 0
+	#if 1
 	if(TE_CheckFlag == SET)//针对样机的TE软件版本,不检测故障
 	if(TE_CheckFlag == SET)//针对样机的TE软件版本,不检测故障
 	{
 	{
   	MC_Fault_TE_Process(&MC_TE_SensorStatus, IsComOK_TE.IsOK_Flag, &MC_ErrorCode);
   	MC_Fault_TE_Process(&MC_TE_SensorStatus, IsComOK_TE.IsOK_Flag, &MC_ErrorCode);

+ 60 - 59
User/Src/protect_check.c

@@ -304,9 +304,48 @@ void MC_Protect_VoltageChange_Process(uint16_t Voltage, uint16_t Current, MC_Err
 	}
 	}
 }
 }
 
 
+//软件过流保护检测
+void MC_OverCurrent_SoftProtect_Process(uint16_t BusCurrent, uint16_t MaxCurrent, MC_ErrorCode_Struct_t* p_MC_ErrorCode)
+{
+  static uint32_t Protect_TimeCnt = 0;
+	static uint32_t Fault_TimeCnt = 0;
+	uint16_t Current_Th;
+	
+	Current_Th = (MaxCurrent * 3) >> 1;//1.5倍
+	
+	if(p_MC_ErrorCode->ERROR_Bit.Protect_OverCurrent == 0)
+	{
+		if(BusCurrent < Current_Th)
+		{
+			Protect_TimeCnt = HAL_GetTick();
+		}
+		if((HAL_GetTick() - Protect_TimeCnt) > 5000)
+		{
+			p_MC_ErrorCode->ERROR_Bit.Protect_OverCurrent = 1;
+			//记录故障日志
+			MC_ErrorLogSaveInfo.NotesInfo1 = 2;
+			MC_ErrorLogSaveInfo.NotesInfo2 = Current_Th;
+			ErrorLogSave_Update(&MC_ErrorLogSaveInfo);
+		  IsErrorLogSaveInfoUpdateFlag = TRUE;
+			//存储故障次数
+			MC_RunLog1.OC_ProtectCnt++;
+			RunLogSaveIndex = 1;	
+			Fault_TimeCnt = HAL_GetTick();
+		}
+	}
+	else
+	{
+		//过流保护恢复
+		if((HAL_GetTick() - Fault_TimeCnt) > 5000)
+		{
+			MC_ErrorCode.ERROR_Bit.Protect_OverCurrent = 0;
+		}
+	}
+}
+
 /******************************全局函数定义******************************/
 /******************************全局函数定义******************************/
 #define OC_CLEARFLAG_DELAYTIME 15 //过流标志间隔清零延时,单位ms
 #define OC_CLEARFLAG_DELAYTIME 15 //过流标志间隔清零延时,单位ms
-#define OC_COUNTER_TH 100          //过流保护计数判断阈值
+#define OC_COUNTER_TH 1000          //过流保护计数判断阈值
 //过流保护检测
 //过流保护检测
 /*
 /*
 检测原理:
 检测原理:
@@ -314,79 +353,39 @@ void MC_Protect_VoltageChange_Process(uint16_t Voltage, uint16_t Current, MC_Err
 2、在过流触发计数达到OC_COUNTER_TH 次之前,如果存在两次过流触发间隔时间超过OC_CLEARFLAG_DELAYTIME ms,清除过流触发计数;
 2、在过流触发计数达到OC_COUNTER_TH 次之前,如果存在两次过流触发间隔时间超过OC_CLEARFLAG_DELAYTIME ms,清除过流触发计数;
 3、如果每两次过流触发间隔时间都不超过OC_CLEARFLAG_DELAYTIME ms,当过流触发计数达到OC_COUNTER_TH 次,则进入过流保护;
 3、如果每两次过流触发间隔时间都不超过OC_CLEARFLAG_DELAYTIME ms,当过流触发计数达到OC_COUNTER_TH 次,则进入过流保护;
 4、进入过流保护后,超时5s解除。
 4、进入过流保护后,超时5s解除。
+
+更改处理方式20210630
+1、关闭过流告警;
+2、出现过流信号时,封闭PWM2个周期
 */
 */
 void MC_Protect_OverCurrent_Process(FlagStatus* OverCurrentTrigFlag, MC_ErrorCode_Struct_t* p_MC_ErrorCode)
 void MC_Protect_OverCurrent_Process(FlagStatus* OverCurrentTrigFlag, MC_ErrorCode_Struct_t* p_MC_ErrorCode)
 {
 {
   static uint8_t OffPwmCnt = 0;        //过流信号触发后,关闭PWM延时计数
   static uint8_t OffPwmCnt = 0;        //过流信号触发后,关闭PWM延时计数
 	static uint8_t StarPwmCnt = 0;       //关闭PWM后启动PWM延时计数
 	static uint8_t StarPwmCnt = 0;       //关闭PWM后启动PWM延时计数
-  static uint16_t ocCnt = 0;           //过流信号触发计数
-  static uint32_t ocTimeCnt = 0;       //过流信号触发计时
-	static uint32_t ocFaultTimeCnt = 0;  //过流保护后计时
 	
 	
-	if(p_MC_ErrorCode->ERROR_Bit.Protect_OverCurrent == 0)
+	if(*OverCurrentTrigFlag == RESET)
 	{
 	{
-		if(*OverCurrentTrigFlag == RESET)
-		{
-			//关闭PWM计数清零
-			OffPwmCnt = 0;
-			//两次过流触发间隔超时OC_CLEARFLAG_DELAYTIME ms,过流次数未达到OC_COUNTER_TH 次,过流计数清零
-			if(ocCnt < OC_COUNTER_TH)
-			{
-				if((HAL_GetTick() - ocTimeCnt) >= OC_CLEARFLAG_DELAYTIME)
-				{
-					ocTimeCnt = HAL_GetTick();
-					ocCnt = 0;
-				}
-			}
-			//开启PWM
-			if(StarPwmCnt == 0)
-			{
-				StarPwmCnt++;
-				Enable_PwmGpio_Out();
-			}
-		}
-		else
+		//关闭PWM计数清零
+		OffPwmCnt = 0;
+		//开启PWM
+		if(StarPwmCnt == 0)
 		{
 		{
-			//开启PWM计数清零
-			StarPwmCnt = 0;
-			//关闭PWM
-			Disable_PwmGpio_Out();
-			//2个PWM周期后,过流触发标志复位
-			if(OffPwmCnt >= 1)
-			{
-				*OverCurrentTrigFlag = RESET;
-			}
-			//过流次数计数
-			if(ocCnt < OC_COUNTER_TH)
-			{
-				ocCnt++;
-			}
-			//过流标志计数次数达到OC_COUNTER_TH 次,启动过流保护
-			else
-			{
-				ocCnt = 0;
-				p_MC_ErrorCode->ERROR_Bit.Protect_OverCurrent = 1;
-				ocFaultTimeCnt = HAL_GetTick();
-				//记录故障日志
-			  ErrorLogSave_Update(&MC_ErrorLogSaveInfo);
-		  	IsErrorLogSaveInfoUpdateFlag = TRUE;
-				//存储故障次数
-				MC_RunLog1.OC_ProtectCnt++;
-				RunLogSaveIndex = 1;	
-			}
-			OffPwmCnt++;
-			ocTimeCnt = HAL_GetTick();
+			StarPwmCnt++;
+			Enable_PwmGpio_Out();
 		}
 		}
 	}
 	}
 	else
 	else
 	{
 	{
-		//过流恢复
-		if((HAL_GetTick() - ocFaultTimeCnt) > 5000)
+		//开启PWM计数清零
+		StarPwmCnt = 0;
+		//关闭PWM
+		Disable_PwmGpio_Out();
+		//2个PWM周期后,过流触发标志复位
+		if(OffPwmCnt >= 1)
 		{
 		{
-			MC_ErrorCode.ERROR_Bit.Protect_OverCurrent = 0;
-			ocFaultTimeCnt = HAL_GetTick();
 			*OverCurrentTrigFlag = RESET;
 			*OverCurrentTrigFlag = RESET;
 		}
 		}
+		OffPwmCnt++;
 	}
 	}
 }
 }
 
 
@@ -411,4 +410,6 @@ void MC_Protect_Check_Process(void)
 	//电压波动异常保护检测
 	//电压波动异常保护检测
 	MC_Protect_VoltageChange_Process(MC_RunInfo.BusVoltage, MC_RunInfo.BusCurrent, &MC_ErrorCode);
 	MC_Protect_VoltageChange_Process(MC_RunInfo.BusVoltage, MC_RunInfo.BusCurrent, &MC_ErrorCode);
 	
 	
+  //软件过流保护检测
+	MC_OverCurrent_SoftProtect_Process(MC_RunInfo.BusCurrent, MC_ConfigParam1.CurrentLimit * 1000, &MC_ErrorCode);
 }
 }

+ 0 - 2
User/Src/pwm_driver.c

@@ -44,8 +44,6 @@ void	Enable_Pwm_Output(void)
 	HAL_TIMEx_PWMN_Start(&PWM_TIMER,TIM_CHANNEL_4);
 	HAL_TIMEx_PWMN_Start(&PWM_TIMER,TIM_CHANNEL_4);
 	
 	
 	Pwm_Timer_Start();
 	Pwm_Timer_Start();
-	HAL_NVIC_SetPriority(TIM1_BRK_IRQn, 0, 0);
-  HAL_NVIC_EnableIRQ(TIM1_BRK_IRQn);
 }
 }
 
 
 /**
 /**

+ 4 - 2
User/Src/tasks.c

@@ -17,6 +17,7 @@
 #include "key_driver.h"
 #include "key_driver.h"
 #include "encrypt.h"
 #include "encrypt.h"
 #include "ICM20600.h"
 #include "ICM20600.h"
+#include "light_driver.h"
 
 
 /************************全局变量************************/
 /************************全局变量************************/
 TrueOrFalse_Flag_Struct_t IsInitFinish_Flag = FALSE;
 TrueOrFalse_Flag_Struct_t IsInitFinish_Flag = FALSE;
@@ -533,6 +534,7 @@ void PowerOff_Process(TrueOrFalse_Flag_Struct_t ReturnEnable)
 	//关闭助力档位
 	//关闭助力档位
 	MC_ControlCode.GearSt = MC_GearSt_OFF;
 	MC_ControlCode.GearSt = MC_GearSt_OFF;
 	MC_ControlCode.LightSwitch = MC_LightSwitch_OFF;
 	MC_ControlCode.LightSwitch = MC_LightSwitch_OFF;
+	LightDriver_Process(MC_ConfigParam2.MC_TailLight_Mode, IsBreakTrig_Flag, MC_ControlCode.LightSwitch);
 	Update_MC_ControlCode_Back();
 	Update_MC_ControlCode_Back();
 	
 	
 	#if 1 //存储到Flash,下次开机时从Flash取出转移到EEPROM
 	#if 1 //存储到Flash,下次开机时从Flash取出转移到EEPROM
@@ -859,8 +861,8 @@ void MC_TemperatureLogProcess(void)
 	static uint16_t SavePeriodCnt = 0;
 	static uint16_t SavePeriodCnt = 0;
 	static TrueOrFalse_Flag_Struct_t DataChangeFlag = FALSE;
 	static TrueOrFalse_Flag_Struct_t DataChangeFlag = FALSE;
 	
 	
-	if((IsSendDataToTE_Step == SENDUPDATA) || (IsComOK_TE.IsOK_Flag == FALSE))  //TE升级状态,或TE通讯失败状态下,不存储历史温度,TE无APP时对主控采集AD有影响
-	{
+	if(HAL_GetTick() < 10000)  //开机前10s不处理
+  {
 	  PeriodTimeCnt = HAL_GetTick();
 	  PeriodTimeCnt = HAL_GetTick();
 		return;
 		return;
 	}
 	}

+ 1 - 5
User/Src/tim.c

@@ -184,11 +184,7 @@ void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* htim_base)
     /* Peripheral interrupt init*/
     /* Peripheral interrupt init*/
     HAL_NVIC_SetPriority(TIM1_UP_IRQn, 1, 1);
     HAL_NVIC_SetPriority(TIM1_UP_IRQn, 1, 1);
     HAL_NVIC_EnableIRQ(TIM1_UP_IRQn);
     HAL_NVIC_EnableIRQ(TIM1_UP_IRQn);
-		
-		HAL_NVIC_SetPriority(TIM1_BRK_IRQn, 0, 0);
-    HAL_NVIC_EnableIRQ(TIM1_BRK_IRQn);
-		
-		__HAL_TIM_ENABLE_IT(&htim1, TIM_IT_BREAK);
+
   /* USER CODE BEGIN TIM1_MspInit 1 */
   /* USER CODE BEGIN TIM1_MspInit 1 */
 
 
   /* USER CODE END TIM1_MspInit 1 */
   /* USER CODE END TIM1_MspInit 1 */

+ 6 - 6
User/Src/var.c

@@ -490,9 +490,9 @@ void Var_Init(void)
 	memcpy((uint8_t*)&PBU_ConfigParam.GearsNum, (uint8_t*)&PBU_ConfigParam_Default.GearsNum, sizeof(PBU_ConfigParam_Struct_t));
 	memcpy((uint8_t*)&PBU_ConfigParam.GearsNum, (uint8_t*)&PBU_ConfigParam_Default.GearsNum, sizeof(PBU_ConfigParam_Struct_t));
 		
 		
 	//MC版本信息初始化,Mode和SN从EEPROM读取
 	//MC版本信息初始化,Mode和SN从EEPROM读取
-  strncpy(MC_VerInfo.HW_Version, (char*)"TT_KZ_010C/D.   ", 16);
-	strncpy(MC_VerInfo.FW_Version, (char*)"V3r2r5_20210414.", 16);
-	strncpy(Firmware_Special, (char*)"TC011000-MS0000-V0r0.           ", 32);
+  strncpy(MC_VerInfo.HW_Version, (char*)"TT_KZ_010C/D_HK.", 16);
+	strncpy(MC_VerInfo.FW_Version, (char*)"V3r2r5_20210727.", 16);
+	strncpy(Firmware_Special, (char*)"TC011000-MS0000HK-V0r0.         ", 32);
 	
 	
 	//电机型号
 	//电机型号
 	strncpy(MC_VerInfo.Mode, (char*)"PG80XX & PSX0XX.", 16);
 	strncpy(MC_VerInfo.Mode, (char*)"PG80XX & PSX0XX.", 16);
@@ -501,9 +501,9 @@ void Var_Init(void)
 	strncpy(MC_VerInfo.SN_Num, (char*)"0000000000000000", 16);
 	strncpy(MC_VerInfo.SN_Num, (char*)"0000000000000000", 16);
 	
 	
 	//生产信息
 	//生产信息
-	strncpy(MC_MacInfo.Manufacturer, (char*)"MOTINOVA", 8);  //生产信息
-	strncpy(MC_MacInfo.MacAddr, (char*)"WUHAN.  ", 8);
-	strncpy(MC_MacInfo.MacDate, (char*)"20200901", 8);
+	strncpy((char*)MC_MacInfo.Manufacturer, (char*)"MOTINOVA", 8);  //生产信息
+	strncpy((char*)MC_MacInfo.MacAddr, (char*)"WUHAN.  ", 8);
+	strncpy((char*)MC_MacInfo.MacDate, (char*)"20200901", 8);
 
 
 	//MCU ID读取
 	//MCU ID读取
 	memcpy((uint8_t*)MC_CheckInfo.MAC_ID, (uint8_t*)(0x1FFFF7E8), 12);
 	memcpy((uint8_t*)MC_CheckInfo.MAC_ID, (uint8_t*)(0x1FFFF7E8), 12);

+ 7 - 1
修改说明.txt

@@ -381,7 +381,13 @@ V3.2.5_20210414
 V3.2.5_20210414_1
 V3.2.5_20210414_1
 1、收到关机指令后,增加关灯操作。
 1、收到关机指令后,增加关灯操作。
 
 
-
+V3.2.5_20210727 HK
+1、针对HK单片机串口通讯不稳定问题,屏蔽与TE通讯相关的检测;
+2、硬件版本号和客户标识符增加“HK”;
+3、清除TRIP里程时,前100km内可清除总里程一次;
+4、调整过流保护的判断条件,增加软件过流保护检测;
+5、Break信号被触发后,仅关闭PWM一个周期处理,不做警告提示;
+6、删除TIM1 Break的中断配置。
 
 
 
 
 
 

Энэ ялгаанд хэт олон файл өөрчлөгдсөн тул зарим файлыг харуулаагүй болно