浏览代码

V2.2.1_20211008
1、解决开机后电压母线电压采集上升慢导致SOC不准的问题。

dail 3 年之前
父节点
当前提交
5973d6680e
共有 7 个文件被更改,包括 2422 次插入2376 次删除
  1. 13 7
      Core/Src/main.c
  2. 2338 2338
      MDK-ARM/QD007A_CTL_APP/QD007A_CTL_APP_CRC.hex
  3. 二进制
      MDK-ARM/bin/MC_VOLANS_V2r2r1_20211008.bin
  4. 二进制
      MDK-ARM/bin/QD007A_CTL_APP.bin
  5. 68 28
      User/Src/remain_distance.c
  6. 1 1
      User/Src/var.c
  7. 2 2
      修改说明.txt

+ 13 - 7
Core/Src/main.c

@@ -264,18 +264,24 @@ int main(void)
 			Break_Check(&IsBreakTrig_Flag);
 						
 			//续航里程计算
-			if(HAL_GetTick() > 2000)
+			do
 			{
 				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();

文件差异内容过多而无法显示
+ 2338 - 2338
MDK-ARM/QD007A_CTL_APP/QD007A_CTL_APP_CRC.hex


二进制
MDK-ARM/bin/MC_VOLANS_V2r2r1_20211008.bin


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


+ 68 - 28
User/Src/remain_distance.c

@@ -462,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;
+	uint16_t TableNum;
+	uint32_t batteryTotalQ, batteryRemainQ;
+	uint16_t Vol_Avg = 0;
 	
-	num = sizeof(battery_VoltageQuantity)/4;
-	
-	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;
 }
 

+ 1 - 1
User/Src/var.c

@@ -496,7 +496,7 @@ void Var_Init(void)
 		
 	//MC版本信息初始化,Mode和SN从EEPROM读取
   strncpy(MC_VerInfo.HW_Version, (char*)"QD007E/F/G/H.   ", 16);
-	strncpy(MC_VerInfo.FW_Version, (char*)"V2r2r0_20210902.", 16);
+	strncpy(MC_VerInfo.FW_Version, (char*)"V2r2r1_20211008.", 16);
 	strncpy(Firmware_Special, (char*)"TC011000-MS0000-V0r0.           ", 32);
 		
 	//电机型号

+ 2 - 2
修改说明.txt

@@ -424,8 +424,8 @@ V2.2.0_20210902
 2、增加和TE的通信,获取硬件版本号,并根据MCU的ID计算CRC作为硬件版本的尾缀,用于唯一性识别;
 3、修改读取指定地址寄存器数据的代码,实现不定长度数据的读取。
 
-
-
+V2.2.1_20211008
+1、解决开机后电压母线电压采集上升慢导致SOC不准的问题。
 
 
 

部分文件因为文件数量过多而无法显示