Przeglądaj źródła

V3.2.6_20211028
1、针对里程统计,累计圈数时增加滤波,减少干扰信号;
2、增加和TE的通信,获取硬件版本号,并根据MCU的ID计算CRC作为硬件版本的尾缀,用于唯一性识别;
3、修改读取指定地址寄存器数据的代码,实现不定长度数据的读取。
4、解决开机后电压母线电压采集上升慢导致SOC不准的问题。

white.xu 3 lat temu
rodzic
commit
072bc593a4

+ 5 - 2
Core/Src/gpio.c

@@ -174,8 +174,11 @@ void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
 		}
 		DiffTime_ms_Old = MC_SpeedSensorData.DiffTime_ms;
 		//车轮圈数更新
-		SignalTrigCount++;
-		MC_SpeedSensorData.WheelTurnCount = SignalTrigCount / ((MC_ConfigParam1.SpeedSensorPoles == 0) ? 1: MC_ConfigParam1.SpeedSensorPoles);
+		if(MC_SpeedSensorData.DiffTime_ms >= 75) //滤掉干扰信号,电机转速按照2000rpm时,前齿按照20T,后齿按照11T时,车轮转速为2000 / 4.55 * 20 / 11 = 800rpm,即每圈周期75ms
+		{
+		  SignalTrigCount++;
+		  MC_SpeedSensorData.WheelTurnCount = SignalTrigCount / ((MC_ConfigParam1.SpeedSensorPoles == 0) ? 1: MC_ConfigParam1.SpeedSensorPoles);
+		}
 	}
 	else if(GPIO_Pin == BREAK_IN_Pin)
 	{

+ 14 - 8
Core/Src/main.c

@@ -262,18 +262,24 @@ int main(void)
 			Break_Check(&IsBreakTrig_Flag);
 						
 			//续航里程计算
-			if(HAL_GetTick() > 2000)
+			do
 			{
-			  static uint8_t RD_RemainDis_InitFinished = 0x00;
+				static uint8_t RD_RemainDis_InitFinished = 0x00;
 				if(RD_RemainDis_InitFinished == 0x00)
 				{
-					RD_RemainDis_InitFinished = 0x01;
-					//续航里程计算变量初始化
-					RD_RemainDis_Init(MC_ConfigParam1.WheelSize + MC_ConfigParam1.WheelSizeAdj, IsComOK_BMS.IsOK_Flag, MC_RunInfo.BusVoltage / 10, MC_MotorParam.Rate_Voltage, BMS_RunInfo.RC);	
+					if((IsComOK_BMS.IsOK_Flag == TRUE) || (HAL_GetTick() > 10000))//初始化续航计算相关变量
+					{
+						//续航里程计算变量初始化
+						RD_RemainDis_Init(MC_ConfigParam1.WheelSize + MC_ConfigParam1.WheelSizeAdj, IsComOK_BMS.IsOK_Flag, MC_RunInfo.BusVoltage / 10, MC_MotorParam.Rate_Voltage, BMS_RunInfo.RC);	
+						RD_RemainDis_InitFinished = 0x01;
+					}
 				}
-				RD_CalculateRemainDis(MC_SpeedSensorData.WheelTurnCount, BMS_RunInfo.RC, BMS_RunInfo.SOC, MC_RunInfo.BusCurrent);
-				RD_SaveAndUpdateInfo(MC_ControlCode.GearSt, MC_CalParam.AssistRunMode);
-			}
+				else
+				{
+				  RD_CalculateRemainDis(MC_SpeedSensorData.WheelTurnCount, BMS_RunInfo.RC, BMS_RunInfo.SOC, MC_RunInfo.BusCurrent);
+				  RD_SaveAndUpdateInfo(MC_ControlCode.GearSt, MC_CalParam.AssistRunMode);
+				}			
+			}while(0);
 			
 			//更新电机运行信息
 			MC_RunInfo_Update();

Plik diff jest za duży
+ 2144 - 2144
MDK-ARM/QD007A_CTL_APP/QD007A_CTL_APP_CRC.hex


BIN
MDK-ARM/bin/QD007A_CTL_APP.bin


+ 6 - 6
MDK-ARM/startup_stm32f103xb.lst

@@ -524,12 +524,12 @@ ork --depend=.\qd007a_ctl_app\startup_stm32f103xb.d -o.\qd007a_ctl_app\startup_
 ARM Macro Assembler    Page 9 
 
 
-stm32f103xb.o -ID:\MOTINOVAϵͳ\Motor\TT_KZ_010A\³öÎÊÌâµÄ³ÌÐò\TT-KZ-010A_CTRL_A
-PP\MDK-ARM\RTE\_QD007A_CTL_APP -IC:\Keil_v5\ARM\PACK\ARM\CMSIS\5.0.0\CMSIS\Incl
-ude -IC:\Keil_v5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include --predefine="
-__MICROLIB SETA 1" --predefine="__UVISION_VERSION SETA 522" --predefine="_RTE_ 
-SETA 1" --predefine="STM32F10X_MD SETA 1" --list=startup_stm32f103xb.lst startu
-p_stm32f103xb.s
+stm32f103xb.o -ID:\MOTINOVAϵͳ\Motor\TT_KZ_010A\TT-KZ-010A_CTRL_APP_GD32\TT-KZ
+-010A_CTRL_APP\MDK-ARM\RTE\_QD007A_CTL_APP -IC:\Keil_v5\ARM\PACK\ARM\CMSIS\5.0.
+0\CMSIS\Include -IC:\Keil_v5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include -
+-predefine="__MICROLIB SETA 1" --predefine="__UVISION_VERSION SETA 522" --prede
+fine="_RTE_ SETA 1" --predefine="STM32F10X_MD SETA 1" --list=startup_stm32f103x
+b.lst startup_stm32f103xb.s
 
 
 

+ 7 - 7
MDK-ARM/stm32f1xx_stucpuregsaddressing.lst

@@ -123,19 +123,19 @@ ARM Macro Assembler    Page 2
    99 00000096                 END
 Command Line: --debug --xref --diag_suppress=9931 --cpu=Cortex-M3 --apcs=interw
 ork --depend=.\qd007a_ctl_app\stm32f1xx_stucpuregsaddressing.d -o.\qd007a_ctl_a
-pp\stm32f1xx_stucpuregsaddressing.o -ID:\MOTINOVAϵͳ\Motor\TT_KZ_010A\³öÎÊÌâµÄ
-³ÌÐò\TT-KZ-010A_CTRL_APP\MDK-ARM\RTE\_QD007A_CTL_APP -IC:\Keil_v5\ARM\PACK\ARM\
-CMSIS\5.0.0\CMSIS\Include -IC:\Keil_v5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device
-\Include --predefine="__MICROLIB SETA 1" --predefine="__UVISION_VERSION SETA 52
-2" --predefine="_RTE_ SETA 1" --predefine="STM32F10X_MD SETA 1" --list=stm32f1x
+pp\stm32f1xx_stucpuregsaddressing.o -ID:\MOTINOVAϵͳ\Motor\TT_KZ_010A\TT-KZ-01
+0A_CTRL_APP_GD32\TT-KZ-010A_CTRL_APP\MDK-ARM\RTE\_QD007A_CTL_APP -IC:\Keil_v5\A
+RM\PACK\ARM\CMSIS\5.0.0\CMSIS\Include -IC:\Keil_v5\ARM\PACK\Keil\STM32F1xx_DFP\
+1.1.0\Device\Include --predefine="__MICROLIB SETA 1" --predefine="__UVISION_VER
+SION SETA 522" --predefine="_RTE_ SETA 1" --predefine="STM32F10X_MD SETA 1" --l
 
 
 
 ARM Macro Assembler    Page 3 
 
 
-x_stucpuregsaddressing.lst ..\SelfTestUser\src_specific\stm32f1xx_STUCpuRegsAdd
-ressing.s
+ist=stm32f1xx_stucpuregsaddressing.lst ..\SelfTestUser\src_specific\stm32f1xx_S
+TUCpuRegsAddressing.s
 
 
 

+ 7 - 6
MDK-ARM/stm32f1xx_stucpuwalkpatkeil.lst

@@ -1593,12 +1593,13 @@ ARM Macro Assembler    Page 25
  1172 000006D0                 END
 Command Line: --debug --xref --diag_suppress=9931 --cpu=Cortex-M3 --apcs=interw
 ork --depend=.\qd007a_ctl_app\stm32f1xx_stucpuwalkpatkeil.d -o.\qd007a_ctl_app\
-stm32f1xx_stucpuwalkpatkeil.o -ID:\MOTINOVAϵͳ\Motor\TT_KZ_010A\³öÎÊÌâµÄ³ÌÐò\T
-T-KZ-010A_CTRL_APP\MDK-ARM\RTE\_QD007A_CTL_APP -IC:\Keil_v5\ARM\PACK\ARM\CMSIS\
-5.0.0\CMSIS\Include -IC:\Keil_v5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Inclu
-de --predefine="__MICROLIB SETA 1" --predefine="__UVISION_VERSION SETA 522" --p
-redefine="_RTE_ SETA 1" --predefine="STM32F10X_MD SETA 1" --list=stm32f1xx_stuc
-puwalkpatkeil.lst ..\SelfTestUser\src_specific\stm32f1xx_STUCpuWalkpatKEIL.s
+stm32f1xx_stucpuwalkpatkeil.o -ID:\MOTINOVAϵͳ\Motor\TT_KZ_010A\TT-KZ-010A_CTR
+L_APP_GD32\TT-KZ-010A_CTRL_APP\MDK-ARM\RTE\_QD007A_CTL_APP -IC:\Keil_v5\ARM\PAC
+K\ARM\CMSIS\5.0.0\CMSIS\Include -IC:\Keil_v5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\
+Device\Include --predefine="__MICROLIB SETA 1" --predefine="__UVISION_VERSION S
+ETA 522" --predefine="_RTE_ SETA 1" --predefine="STM32F10X_MD SETA 1" --list=st
+m32f1xx_stucpuwalkpatkeil.lst ..\SelfTestUser\src_specific\stm32f1xx_STUCpuWalk
+patKEIL.s
 
 
 

+ 7 - 6
MDK-ARM/stm32f1xx_sturamwalkpatkeil.lst

@@ -430,12 +430,13 @@ ARM Macro Assembler    Page 7
   331 000001F2                 END
 Command Line: --debug --xref --diag_suppress=9931 --cpu=Cortex-M3 --apcs=interw
 ork --depend=.\qd007a_ctl_app\stm32f1xx_sturamwalkpatkeil.d -o.\qd007a_ctl_app\
-stm32f1xx_sturamwalkpatkeil.o -ID:\MOTINOVAϵͳ\Motor\TT_KZ_010A\³öÎÊÌâµÄ³ÌÐò\T
-T-KZ-010A_CTRL_APP\MDK-ARM\RTE\_QD007A_CTL_APP -IC:\Keil_v5\ARM\PACK\ARM\CMSIS\
-5.0.0\CMSIS\Include -IC:\Keil_v5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Inclu
-de --predefine="__MICROLIB SETA 1" --predefine="__UVISION_VERSION SETA 522" --p
-redefine="_RTE_ SETA 1" --predefine="STM32F10X_MD SETA 1" --list=stm32f1xx_stur
-amwalkpatkeil.lst ..\SelfTestUser\src_specific\stm32f1xx_STURamWalkpatKEIL.s
+stm32f1xx_sturamwalkpatkeil.o -ID:\MOTINOVAϵͳ\Motor\TT_KZ_010A\TT-KZ-010A_CTR
+L_APP_GD32\TT-KZ-010A_CTRL_APP\MDK-ARM\RTE\_QD007A_CTL_APP -IC:\Keil_v5\ARM\PAC
+K\ARM\CMSIS\5.0.0\CMSIS\Include -IC:\Keil_v5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\
+Device\Include --predefine="__MICROLIB SETA 1" --predefine="__UVISION_VERSION S
+ETA 522" --predefine="_RTE_ SETA 1" --predefine="STM32F10X_MD SETA 1" --list=st
+m32f1xx_sturamwalkpatkeil.lst ..\SelfTestUser\src_specific\stm32f1xx_STURamWalk
+patKEIL.s
 
 
 

+ 1 - 1
User/Inc/remain_distance.h

@@ -50,7 +50,7 @@ typedef struct
 extern Remain_Dis_t RemainDis;
 
 extern void RD_RemainDis_Init(uint16_t uwWheelLength, TrueOrFalse_Flag_Struct_t BMS_COM_OK, uint16_t BusVoltage, uint8_t DesignVol, uint16_t BMS_RC);
-extern void RD_CalculateRemainDis(uint32_t WheelTurnCnt, uint16_t RemainCap, uint8_t SOC, uint16_t BusCurrent);
+extern void RD_CalculateRemainDis(uint32_t WheelTurnCnt, uint16_t RemainCap, uint8_t SOC, uint16_t BusCurrent) ;
 extern void RD_SaveAndUpdateInfo(MC_GearSt_Struct_t GearSt, MC_AssistRunMode_Struct_t MC_AssistRunMode);
 extern uint8_t Battery_SocCal(uint16_t Voltage);
 

+ 3 - 1
User/Inc/var.h

@@ -433,6 +433,9 @@ typedef struct
 	uint16_t Rs[3];
 }MC_AvgPower_Struct_t;
 
+//硬件版本定义表
+extern const uint16_t Ver_Table[11];
+
 /******************************类型定义End***************************/
 
 /**************************全局变量声明Begin*************************/
@@ -464,7 +467,6 @@ extern MC_TE_SensorStatus_Struct_t MC_TE_SensorStatus;
 extern MC_TE_SensorData_Struct_t MC_TE_SensorData;
 extern uint16_t MC_TE_SyncClockFreqScan;
 extern TrueOrFalse_Flag_Struct_t TE_MCU_DataRefreshFlag;
-extern FlagStatus TE_CheckFlag;
 extern MC_AssistParam_Struct_t MC_AssisParam;
 extern uint8_t MC_WalkMode_Persent;
 extern ComOK_Check_Struct_t IsComOK_TE;

+ 1 - 1
User/Src/battery_info.c

@@ -17,7 +17,7 @@
 /*µç³ØÉè¼ÆÈÝÁ¿*/
 const uint16_t battery_VoltageQuantity[1022][2] = 
 {
-	4152	,	0	,
+4152	,	0	,
 4122	,	2	,
 4121	,	6	,
 4120	,	10	,

+ 25 - 5
User/Src/can_process.c

@@ -249,6 +249,12 @@ void DataProcess(uint16_t ID, uint8_t Mode, uint16_t Cmd, uint8_t* Data)
 					{
 					  memcpy(&MC_ControlCode.GearSt, Data, 2);
 					  Update_MC_ControlCode_Back();
+						//更新轮速,仅配置为通过通信获取车轮周期时更新
+						if(MC_ConfigParam1.SpeedSignal == MC_SPEED_COMMUNICATION)
+						{
+							MC_SpeedSensorData.DiffTime_ms = (Data[3] << 8) + Data[2];
+							MC_SpeedSensorData.IsTrigFlag = TRUE;
+						}
 					}			
 		      MC_RunInfo.GearSt = MC_ControlCode.GearSt;//当前助力档位更新
 					MC_RunInfo.LightSwitch = MC_ControlCode.LightSwitch;
@@ -287,8 +293,11 @@ void DataProcess(uint16_t ID, uint8_t Mode, uint16_t Cmd, uint8_t* Data)
 				
 				case 0x3900://OBC/ECU查询版本信息
 				{
-				  ReadDataFromEEPROM_Flash(EEPROM_FLASH_ADDR_MODE, (uint8_t*)MC_VerInfo.Mode, 16);
+				  uint32_t MCU_ID_CRC32;
+					ReadDataFromEEPROM_Flash(EEPROM_FLASH_ADDR_MODE, (uint8_t*)MC_VerInfo.Mode, 16);
 					ReadDataFromEEPROM_Flash(EEPROM_FLASH_ADDR_SN, (uint8_t*)MC_VerInfo.SN_Num, 16);
+					MCU_ID_CRC32 = CRC32_Calculate(MC_CheckInfo.MAC_ID, 12);
+					memcpy((uint8_t*)(MC_VerInfo.HW_Version + 12), (uint8_t*)(&MCU_ID_CRC32), 4);
 					SendData(ID_MC_BC, MODE_REPORT, 0x1240, (uint8_t*)MC_VerInfo.Mode);
 					SendData(ID_MC_BC, MODE_REPORT, 0x1720, (uint8_t*)Firmware_Special);
 					break;
@@ -324,8 +333,11 @@ void DataProcess(uint16_t ID, uint8_t Mode, uint16_t Cmd, uint8_t* Data)
 				//HMI发送MC的指令
 				case 0x3000://查询电机版本信息
 				{
-				  ReadDataFromEEPROM_Flash(EEPROM_FLASH_ADDR_MODE, (uint8_t*)MC_VerInfo.Mode, 16);
+				  uint32_t MCU_ID_CRC32;
+					ReadDataFromEEPROM_Flash(EEPROM_FLASH_ADDR_MODE, (uint8_t*)MC_VerInfo.Mode, 16);
 					ReadDataFromEEPROM_Flash(EEPROM_FLASH_ADDR_SN, (uint8_t*)MC_VerInfo.SN_Num, 16);
+					MCU_ID_CRC32 = CRC32_Calculate(MC_CheckInfo.MAC_ID, 12);
+					memcpy((uint8_t*)(MC_VerInfo.HW_Version + 12), (uint8_t*)(&MCU_ID_CRC32), 4);
 					SendData(ID_MC_BC, MODE_REPORT, 0x1240, (uint8_t*)MC_VerInfo.Mode);
 					SendData(ID_MC_BC, MODE_REPORT, 0x1720, (uint8_t*)Firmware_Special);
 					break;
@@ -418,8 +430,11 @@ void DataProcess(uint16_t ID, uint8_t Mode, uint16_t Cmd, uint8_t* Data)
 				}
 				case 0x1200://查询电机版本信息
 				{
-				  ReadDataFromEEPROM_Flash(EEPROM_FLASH_ADDR_MODE, (uint8_t*)MC_VerInfo.Mode, 16);
+				  uint32_t MCU_ID_CRC32;
+					ReadDataFromEEPROM_Flash(EEPROM_FLASH_ADDR_MODE, (uint8_t*)MC_VerInfo.Mode, 16);
 					ReadDataFromEEPROM_Flash(EEPROM_FLASH_ADDR_SN, (uint8_t*)MC_VerInfo.SN_Num, 16);
+					MCU_ID_CRC32 = CRC32_Calculate(MC_CheckInfo.MAC_ID, 12);
+					memcpy((uint8_t*)(MC_VerInfo.HW_Version + 12), (uint8_t*)(&MCU_ID_CRC32), 4);
 					SendData(ID_MC_BC, MODE_REPORT, 0x1240, (uint8_t*)MC_VerInfo.Mode);
 					SendData(ID_MC_BC, MODE_REPORT, 0x1720, (uint8_t*)Firmware_Special);
 					break;
@@ -630,8 +645,13 @@ void DataProcess(uint16_t ID, uint8_t Mode, uint16_t Cmd, uint8_t* Data)
 				}
         case 0x2D08://读取Flash存储器指定地址数据
 				{
-				  memcpy((uint8_t*)(Data + 8), (uint8_t*)((Data[0] << 24) + (Data[1] << 16) + (Data[2] << 8) + (Data[3])), 128);
-					SendData(ID_MC_TO_CDL, MODE_REPORT, 0xAB88, (uint8_t*)Data);
+				  do
+					{
+						uint32_t DataLength;
+						DataLength = (uint32_t)((Data[4] << 24) + (Data[5] << 16) + (Data[6] << 8) + (Data[7])) - (uint32_t)((Data[0] << 24) + (Data[1] << 16) + (Data[2] << 8) + (Data[3])) + 1;
+						memcpy((uint8_t*)(Data + 8), (uint8_t*)((Data[0] << 24) + (Data[1] << 16) + (Data[2] << 8) + (Data[3])), DataLength);
+						SendData(ID_MC_TO_CDL, MODE_REPORT, (0xAB08 + DataLength), (uint8_t*)Data);	
+					}while(0);
 					break;
 				}
 				case 0x2E00://查询骑行历史信息

+ 1 - 6
User/Src/fault_check.c

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

+ 71 - 29
User/Src/remain_distance.c

@@ -25,6 +25,7 @@
 extern const MC_AvgPower_Struct_t MC_AvgPower_Default;
 
 //续航计算相关参数
+
 Remain_Dis_t RemainDis = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0xFFFF, 0, 0, FALSE, 0};
 //电池信息
 Battery_Info_t Battery_Info;
@@ -114,7 +115,8 @@ void RD_RemainDis_Init(uint16_t uwWheelLength, TrueOrFalse_Flag_Struct_t BMS_COM
 	RemainDis.flag_saveInfo = 0;
 	RemainDis.flag_helpModeChange = 0;
 	RemainDis.IsBMS_ComOK_Flag = FALSE;
-	RemainDis.BMS_Com_DelayTimeCnt = HAL_GetTick();		
+	RemainDis.BMS_Com_DelayTimeCnt = HAL_GetTick();	
+	
 }
 
 /******************************************************************************
@@ -460,47 +462,87 @@ void RD_SaveAndUpdateInfo(MC_GearSt_Struct_t GearSt, MC_AssistRunMode_Struct_t M
 	MC_AssistRunMode_Old = MC_AssistRunMode;
 }
 
+//运行周期200ms
 uint8_t Battery_SocCal(uint16_t Voltage_mV)
 {
-  static uint32_t PeriodTimeCnt = 0;
-	static uint8_t Result = 0,Result_Pre=0;
+  static uint16_t TimeDelayCnt = 0;
+	static uint32_t FiltSum = 0;
+	static uint8_t FiltCnt = 0;
+	static uint8_t Result = 0, Result_Pre=0;
+	static TrueOrFalse_Flag_Struct_t InitFlag = FALSE;
 	uint16_t i;
-	uint16_t num;
-	uint32_t batteryTotalQ,batteryRemainQ;
-	uint16_t Voltage;
-	
-	Voltage = Voltage_mV / 10;
-	
-	num = sizeof(battery_VoltageQuantity)/4;
+	uint16_t TableNum;
+	uint32_t batteryTotalQ, batteryRemainQ;
+	uint16_t Vol_Avg = 0;
 	
-	batteryTotalQ = battery_VoltageQuantity[num-1][1];
+	TableNum = sizeof(battery_VoltageQuantity) / 4;
+	batteryTotalQ = battery_VoltageQuantity[TableNum - 1][1];
 	batteryRemainQ = batteryTotalQ;
 	
-	Result_Pre = MC_RunInfo.SOC;
-	Result = Result_Pre;
-
-	if((HAL_GetTick() - PeriodTimeCnt) > 2000)//计算周期2s
+	TimeDelayCnt++;
+	//初始化电压上升较慢,开机时动态效果
+	if(TimeDelayCnt <= 10) return 0;
+	else if(TimeDelayCnt <= 15) return 10;
+	else if(TimeDelayCnt <= 20) return 25;
+	else if(TimeDelayCnt <= 25) return 45;
+	else if(TimeDelayCnt <= 30) return 65;
+	else if(TimeDelayCnt <= 35) return 85;
+	else	
 	{
-		PeriodTimeCnt = HAL_GetTick();
-		for(i=0;i<num;i++)
+	  if(InitFlag == FALSE)//等待约5s后,计算一次初始值
 		{
-			if(battery_VoltageQuantity[i][0] <=  Voltage)
-			{
-				batteryRemainQ = batteryTotalQ - battery_VoltageQuantity[i][1] ;    //A*s
-				break;
-			}
-			else//电池电压低于最小值
+		  InitFlag = TRUE;
+			for(i=0; i<TableNum; i++)
 			{
-				batteryRemainQ = 0;
+				if(battery_VoltageQuantity[i][0] <= (Voltage_mV / 10))
+				{
+					batteryRemainQ = batteryTotalQ - battery_VoltageQuantity[i][1];
+					break;
+				}
+				else//电池电压低于最小值
+				{
+					batteryRemainQ = 0;
+				}
 			}
+			Result = batteryRemainQ * 100 / batteryTotalQ;
 		}
-		Result = batteryRemainQ * 100 / batteryTotalQ;
-		if(Result >= Result_Pre)
+		else//第一次计算后,采用25组电压平均值
 		{
-		  Result = Result_Pre;
+		  Result_Pre = MC_RunInfo.SOC;
+			Result = Result_Pre;
+			
+			//取25组数据的平均值计算SOC
+			FiltSum += Voltage_mV;
+			FiltCnt++;
+			if(FiltCnt >= 25)
+			{
+				Vol_Avg = FiltSum / 25;
+				FiltSum = 0;
+				FiltCnt = 0;
+				//查表计算SOC
+				for(i=0; i<TableNum; i++)
+				{
+					if(battery_VoltageQuantity[i][0] <= (Vol_Avg / 10))
+					{
+						batteryRemainQ = batteryTotalQ - battery_VoltageQuantity[i][1] ;    //A*s
+						break;
+					}
+					else//电池电压低于最小值
+					{
+						batteryRemainQ = 0;
+					}
+				}
+				Result = batteryRemainQ * 100 / batteryTotalQ;
+				if(Result > Result_Pre)//电量上升时,突变较小,取上次计算值
+				{
+					if((Result < (Result_Pre + 30)) && (Result < 90))
+					{
+						Result = Result_Pre;
+					}
+				}
+			}
 		}
+		return Result;
 	}
-	return Result;
 }
 
-

+ 11 - 2
User/Src/uart_process.c

@@ -6,10 +6,12 @@
 #include "string.h"
 #include "can_process.h"
 #include "tasks.h"
+
 //命令处理
 void UART_DataProcess(uint8_t Mode, uint16_t Command, uint8_t* Data)
 {
   uint8_t DataLength;
+	uint16_t Data16_Temp;
 	
 	//通信正常标志
 	IsComOK_TE.IsOK_Flag = TRUE;
@@ -32,9 +34,16 @@ void UART_DataProcess(uint8_t Mode, uint16_t Command, uint8_t* Data)
       IsSendDataToTE_Step = SENDSENSOR;  
       break;
     }
-		case 0x9000://TE软件版本标志
+		case 0x9002://TE检测的硬件版本
 		{
-		  TE_CheckFlag = SET;
+		  Data16_Temp = Data[0] + (Data[1] << 8);
+			uint8_t i;
+			for(i = 0; i < sizeof(Ver_Table) / 2 ; i++)
+			{
+			  if(Data16_Temp < Ver_Table[i]) break;
+			}
+			strncpy(MC_VerInfo.HW_Version, (char*)"QD007 .         ", 16);
+			MC_VerInfo.HW_Version[5] = 'I' + i;
 			break;
 		}
     default:

+ 6 - 2
User/Src/var.c

@@ -29,7 +29,6 @@ MC_TE_SensorStatus_Struct_t MC_TE_SensorStatus;           //TE
 MC_TE_SensorData_Struct_t MC_TE_SensorData;               //发给TE传感器结果
 uint16_t MC_TE_SyncClockFreqScan;                         //TE同步时钟频率
 TrueOrFalse_Flag_Struct_t TE_MCU_DataRefreshFlag = FALSE; //TE MCU数据更新标志
-FlagStatus TE_CheckFlag = RESET;                          //检测TE标志
 MC_AssistParam_Struct_t MC_AssisParam;		                //助力输出计算参数
 uint8_t MC_WalkMode_Persent = 100;                        //推行模式最高转速百分比设置
 ComOK_Check_Struct_t IsComOK_TE =  {FALSE, 0};            //TE通信状态标志
@@ -173,6 +172,11 @@ const MC_RideLog_Struct_t MC_RideLog_Default =
 //默认密钥,占用8bytes
 const uint8_t Secret_Key_Default[8] = "AVONITOM";
 
+const uint16_t Ver_Table[11] = 
+{
+  372, 744, 1116, 1489, 1861, 2233, 2605, 2978, 3350, 3722, 4095
+};
+
 /************Volans助力参数************/
 //ECO档位助力参数
 const nGearParam_Struct_t GearParam_Default_ECO_Volans =
@@ -493,7 +497,7 @@ void Var_Init(void)
 		
 	//MC版本信息初始化,Mode和SN从EEPROM读取
     strncpy(MC_VerInfo.HW_Version, (char*)"TT_KZ_010C/D/F. ", 16);
-	strncpy(MC_VerInfo.FW_Version, (char*)"V3r2r6_20211025.", 16);
+	strncpy(MC_VerInfo.FW_Version, (char*)"V3r2r6_20211028.", 16);
 	strncpy(Firmware_Special, (char*)"TC011000-MS0000-V0r0.           ", 32);
 	
 	//电机型号

Niektóre pliki nie zostały wyświetlone z powodu dużej ilości zmienionych plików