فهرست منبع

V2.1.10.0.0_20211202
1、增加识别MCU品牌的代码,加入硬件版本号的第11个字节,主控为HK时增加母线电压补偿;
2、解决转把模式无法检测速度传感器故障的问题;
3、增加根据SOC限流的处理;
4、修改低压保护的处理方式,根据BMS通信状态分别处理;
5、修改关机处理的等待时间,由5s调整到1s,解决仪表关机到下次开机时间很短导致误报MCU故障的问题;
6、低压保护默认值调整为30V。

dail 3 سال پیش
والد
کامیت
62d5bdd8e8

+ 4 - 1
Core/Src/adc.c

@@ -456,7 +456,10 @@ void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
 	BusVoltageFltSum += ((ADC1_Result[ADC1_RANK_VIN] << 10) - BusVoltageFltSum) >> 9;
 	MC_RunInfo.BusVoltage = (uint32_t)((BusVoltageFltSum >> 10) * 18382) >> 10; //3300 * 1047 / (4095 * 47)
 	MC_RunInfo.BusVoltage += (MC_RunInfo.BusCurrent >> 7) * 26; //根据母线电流和估算的线阻进行补偿, 补偿电阻 0.2 * 128 = 25.6
-	MC_RunInfo.BusVoltage = ((MC_RunInfo.BusVoltage - 8100) * 1402) >> 10;//针对航顺芯片输入阻抗低的问题,增加补偿算法。Dail 20211021
+	if( MCUManufacturer == HK32F103RBT6 )
+	{
+	   MC_RunInfo.BusVoltage = ((MC_RunInfo.BusVoltage - 8100) * 1402) >> 10;
+	}
 	
 	//更新母线电流
 	Temp_32 = (ADC1_Result[ADC1_RANK_CURRENT] - uw_current_offset) * 50000 >> 11;

+ 1 - 1
Core/Src/main.c

@@ -97,7 +97,7 @@ int main(void)
 {
   /* USER CODE BEGIN 1 */
   IAP_Init();  //Bootloader 200ms
-	
+	MCUManufacturer = IdentifyMCUManufacturer();
   //Flash¶Á±£»¤ÉèÖÃ
   #if 1
   Flash_ReadProtection();

تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 1983 - 1983
MDK-ARM/QD007A_CTL_APP/QD007A_CTL_APP_CRC.hex


BIN
MDK-ARM/bin/MC_VL65XX&VS75XX(125K)-TC011000-MS0000HK-V2.1.10.0.0_20211202.bin


BIN
MDK-ARM/bin/QD007A_CTL_APP.bin


+ 2 - 1
User/Inc/app_loader.h

@@ -5,7 +5,7 @@
 /* Includes ------------------------------------------------------------------*/
 #define STM32F103                1
 #define STM32F072                0
-
+#include "var.h"
 #if  STM32F103 
 	#include "stm32f1xx_hal.h"
 	#define NEW_VECTOR_OFFSET        (uint32_t)0x00003000
@@ -19,6 +19,7 @@
 
 
 extern void IAP_Init(void);
+extern MCU_Manufacturter_Struct_t IdentifyMCUManufacturer( void );
 
 
 

+ 10 - 0
User/Inc/var.h

@@ -7,6 +7,15 @@
 #include "string.h"
 
 /******************************ÀàÐͶ¨ÒåBegin*************************/
+typedef enum
+{
+	NoName = 0x00,
+  STM32F103RBT6,
+	APM32F103RBT6,
+	HK32F103RBT6,
+	GD32F103RBT6
+}MCU_Manufacturter_Struct_t;
+
 typedef enum
 {
   MC_LightSwitch_OFF = 0xF0,
@@ -470,6 +479,7 @@ extern ComOK_Check_Struct_t IsComOK_BMS;
 extern MC_AttitudeAngle_Struct_t MC_AttitudeAngle;
 extern MC_RideLog_Struct_t MC_RideLog;
 extern MC_AvgPower_Struct_t MC_AvgPower;
+extern MCU_Manufacturter_Struct_t MCUManufacturer;
 
 /**************************È«¾Ö±äÁ¿ÉùÃ÷End***************************/
 

+ 32 - 0
User/Src/app_loader.c

@@ -27,3 +27,35 @@ void IAP_Init(void)
 		__HAL_SYSCFG_REMAPMEMORY_SRAM();
   #endif		
 }
+
+MCU_Manufacturter_Struct_t IdentifyMCUManufacturer( void )
+{
+	MCU_Manufacturter_Struct_t manufacturer = STM32F103RBT6;
+  if( (*(uint8_t *)0xE00FFFD0 == 0x05)&&(*(uint8_t *)0xE00FFFE0 == 0x9B)&&(*(uint8_t *)0xE00FFFE4 == 0x52)&&(*(uint8_t *)0xE00FFFE8 == 0x05) )
+	{
+    manufacturer = HK32F103RBT6;
+		MC_VerInfo.HW_Version[10] = '3';
+	}
+	else if( (*(uint32_t *)0xE0042000) == 0x13030410 )
+	{
+		manufacturer = GD32F103RBT6;
+		MC_VerInfo.HW_Version[10] = '4';
+	}		
+	else if( (*(uint8_t *)0xE00FFFD0 == 0x04)&&(*(uint8_t *)0xE00FFFE0 == 0xC3)&&(*(uint8_t *)0xE00FFFE4 == 0xB4)&&(*(uint8_t *)0xE00FFFE8 == 0x0B) )
+	{
+		manufacturer = APM32F103RBT6;
+		MC_VerInfo.HW_Version[10] = '2';
+	}	
+	else if( (*(uint8_t *)0xE00FFFD0 == 0x00)&&(*(uint8_t *)0xE00FFFE0 == 0x10)&&(*(uint8_t *)0xE00FFFE4 == 0x04)&&(*(uint8_t *)0xE00FFFE8 == 0x0A) ) //4̨ÑéÖ¤ÕýÈ·
+	{
+    manufacturer = STM32F103RBT6;
+		MC_VerInfo.HW_Version[10] = '1';
+	}
+	else
+	{
+		manufacturer = NoName;
+		MC_VerInfo.HW_Version[10] = '0';
+	}
+	
+	return manufacturer;
+}	

+ 5 - 10
User/Src/fault_check.c

@@ -26,7 +26,7 @@ void MC_Fault_SpeedSensor_Process(TrueOrFalse_Flag_Struct_t IsStopFlag, MC_Caden
 			TrigTimeCnt_2 = HAL_GetTick();
 		}
 		//推行助力模式下,检测速度传感器是否产生信号变化
-		else if(AssistRunMode == MC_AssistRunMode_WALK)
+		else if( (AssistRunMode == MC_AssistRunMode_WALK) || (AssistRunMode == MC_AssistRunMode_GAS) )
 		{
 		  if((MotorSpeed > 50) && (IsStopFlag == TRUE))
 			{
@@ -323,7 +323,7 @@ void MC_Fault_NTCSensor_Process(uint8_t T_PCB_Result, uint8_t T_Coil_Result, MC_
 		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)
@@ -334,8 +334,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 温升低于2度
+						 (abs(T_Coil_Result - T_Coil_Old) < 1))  //绕组温升低于2度
 					{
 					  p_MC_ErrorCode->ERROR_Bit.Fault_NtcSensor = 1;
 						//记录故障日志
@@ -1008,12 +1008,7 @@ void MC_Fault_Check_Process(void)
 	MC_Fault_MOS_Process(ADC_3ShuntCurrent_RMSValue, &MC_ErrorCode);
 
   //TE故障检测
-	#if 1
-	if(TE_CheckFlag == SET)//针对样机的TE软件版本,不检测故障
-	{
-  	MC_Fault_TE_Process(&MC_TE_SensorStatus, IsComOK_TE.IsOK_Flag, &MC_ErrorCode);
-	}	
-	#elif 1
+	#if 0
 	MC_Fault_TE_Process(&MC_TE_SensorStatus, IsComOK_TE.IsOK_Flag, &MC_ErrorCode);
 	#endif
 	

+ 1 - 1
User/Src/motor_control.c

@@ -1132,7 +1132,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;

+ 70 - 33
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;
+			}
 		}
 	}
 }
@@ -378,16 +419,13 @@ void MC_Protect_OverCurrent_Process(FlagStatus* OverCurrentTrigFlag, MC_ErrorCod
 	{
 		//开启PWM计数清零
 		StarPwmCnt = 0;
+		//关闭PWM
+		Disable_PwmGpio_Out();
 		//2个PWM周期后,过流触发标志复位
 		if(OffPwmCnt >= 1)
 		{
 			*OverCurrentTrigFlag = RESET;
 		}
-		else
-		{
-			//关闭PWM
-			Disable_PwmGpio_Out();
-		}
 		OffPwmCnt++;
 	}
 }
@@ -396,9 +434,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) ? 3000 : MC_ConfigParam1.UV_Protect_TH), 
 	                                &MC_ErrorCode);
 	
 	//过压保护检测
@@ -415,5 +452,5 @@ void MC_Protect_Check_Process(void)
 	
 	//软件过流保护检测
 	MC_OverCurrent_SoftProtect_Process(MC_RunInfo.BusCurrent, MC_ConfigParam1.CurrentLimit * 1000, &MC_ErrorCode);
-	
+
 }

+ 1 - 1
User/Src/tasks.c

@@ -570,7 +570,7 @@ void PowerOff_Process(TrueOrFalse_Flag_Struct_t ReturnEnable)
 	{
 		PeriodTimeCnt = HAL_GetTick();
 		Count = 0;
-	  while(Count < 50)
+	  while(Count < 10)
 		{
 		  if((HAL_GetTick() - PeriodTimeCnt) > 100)
 			{

+ 4 - 3
User/Src/var.c

@@ -37,8 +37,9 @@ ComOK_Check_Struct_t IsComOK_PBU = {FALSE, 0};            //PBU通
 ComOK_Check_Struct_t IsComOK_HMI = {FALSE, 0};            //HMI通信状态标志
 ComOK_Check_Struct_t IsComOK_BMS = {FALSE, 0};            //BMS通信状态标志
 MC_AttitudeAngle_Struct_t MC_AttitudeAngle;               //姿态传感器数值
-MC_RideLog_Struct_t MC_RideLog;                    //骑行历史
+MC_RideLog_Struct_t MC_RideLog;                           //骑行历史
 MC_AvgPower_Struct_t MC_AvgPower;                         //助力平均功耗
+MCU_Manufacturter_Struct_t MCUManufacturer;               //MCU生厂商
 
 //BMS默认设计信息
 const BMS_DesignInfo_Struct_t BMS_DesignInfo_Default =
@@ -80,7 +81,7 @@ const MC_ConfigParam1_Struct_t MC_ConfigParam1_Default =
 	(uint8_t)2,                                      //踏频启动信号个数
 	(MC_SpeedSignal_Struct_t)MC_SPEED_WHEEL_TRIG,    //速度信号来源,0x55-车轮触发,0x-AA踏频估算,0x-EE通信获取车轮旋转周期	
 	(int8_t)0,                                       //轮胎周长微调值 
-	(uint16_t)3100,                                  //低压保护阈值,单位mV,针对单节电芯的设置值	
+	(uint16_t)3000,                                  //低压保护阈值,单位mV,针对单节电芯的设置值	
   (uint8_t)60,                                     //推行限速值,单位0.1km/h
 	(uint8_t)135                                     //推行模式电机转速设置值
 };
@@ -490,7 +491,7 @@ void Var_Init(void)
 		
 	//MC版本信息初始化,Mode和SN从EEPROM读取
   strncpy(MC_VerInfo.HW_Version, (char*)"QD007H_HK.      ", 16);
-	strncpy(MC_VerInfo.FW_Version, (char*)"V2r1r9_20211012.", 16);
+	strncpy(MC_VerInfo.FW_Version, (char*)"V2r1r10_20211202", 16);
 	strncpy(Firmware_Special, (char*)"TC011000-MS0000HK-V0r0.         ", 32);
 		
 	//电机型号

برخی فایل ها در این مقایسه diff نمایش داده نمی شوند زیرا تعداد فایل ها بسیار زیاد است