소스 검색

MC_VL65X3&VS75X3-TC013039-MB2002&3HK-V2.1.6.1.1_20210701_1
1、里程统计增加过滤,避免干扰信号导致里程统计不准;
2、针对开机后母线电压采集上升缓慢,优化SOC初始值的计算方法。

dail 3 년 전
부모
커밋
4f5d7f250d

+ 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)
 	{

+ 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();

파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 2509 - 2509
MDK-ARM/QD007A_CTL_APP/QD007A_CTL_APP_CRC.hex


BIN
MDK-ARM/bin/MC_VL65X3&VS75X3(125K)-TC013039-MB2002&3HK-V2.1.6.1.1_20210701_1.bin


BIN
MDK-ARM/bin/QD007A_CTL_APP.bin


+ 1 - 1
User/Inc/remain_distance.h

@@ -52,7 +52,7 @@ 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_SaveAndUpdateInfo(MC_GearSt_Struct_t GearSt, MC_AssistRunMode_Struct_t MC_AssistRunMode);
-extern uint8_t Battery_SocCal(uint16_t Voltage, uint16_t Current);
+extern uint8_t Battery_SocCal(uint16_t Voltage);
 
 #endif
 

+ 7 - 2
User/Src/can_process.c

@@ -585,8 +585,13 @@ void DataProcess(uint16_t ID, uint8_t Mode, uint16_t Cmd, uint8_t* Data)
 				}
         case 0x2D08://读取存储器指定地址数据
 				{
-				  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://查询骑行历史信息

+ 64 - 25
User/Src/remain_distance.c

@@ -462,36 +462,41 @@ void RD_SaveAndUpdateInfo(MC_GearSt_Struct_t GearSt, MC_AssistRunMode_Struct_t M
 	MC_AssistRunMode_Old = MC_AssistRunMode;
 }
 
-uint8_t Battery_SocCal(uint16_t Voltage_mV, uint16_t Current_mA)
+//运行周期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();
-	  if(Current_mA < 2000)//电流小于2A
+	  if(InitFlag == FALSE)//等待约5s后,计算一次初始值
 		{
-			for(i=0;i<num;i++)
+		  InitFlag = TRUE;
+			for(i=0; i<TableNum; i++)
 			{
-				if(battery_VoltageQuantity[i][0] <=  Voltage)
+				if(battery_VoltageQuantity[i][0] <= (Voltage_mV / 10))
 				{
-					batteryRemainQ = batteryTotalQ - battery_VoltageQuantity[i][1] ;    //A*s
+					batteryRemainQ = batteryTotalQ - battery_VoltageQuantity[i][1];
 					break;
 				}
 				else//电池电压低于最小值
@@ -500,10 +505,44 @@ uint8_t Battery_SocCal(uint16_t Voltage_mV, uint16_t Current_mA)
 				}
 			}
 			Result = batteryRemainQ * 100 / batteryTotalQ;
-			if(Result>=Result_Pre) Result = Result_Pre;
-	  }	
+		}
+		else//第一次计算后,采用25组电压平均值
+		{
+		  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/tasks.c

@@ -157,7 +157,7 @@ void MC_RunInfo_Update(void)
 		MC_RunInfo.LightSwitch = MC_ControlCode.LightSwitch;
 		
 		//Ê£ÓàµçÁ¿
-		MC_RunInfo.SOC = (DeviceOnLine_Status.Status_Bit.BMS_OffLine == 1) ? Battery_SocCal(MC_RunInfo.BusVoltage * 36 / MC_MotorParam.Rate_Voltage, MC_RunInfo.BusCurrent)
+		MC_RunInfo.SOC = (DeviceOnLine_Status.Status_Bit.BMS_OffLine == 1) ? Battery_SocCal(MC_RunInfo.BusVoltage * 36 / MC_MotorParam.Rate_Voltage)
 	                                                                     : BMS_RunInfo.SOC;
 		//Ðøº½Àï³Ì
 		MC_RunInfo.RemainDistance = (DeviceOnLine_Status.Status_Bit.BMS_OffLine == 1) ? 0xEEEE : RemainDis.remainDistance;

+ 3 - 0
修改说明.txt

@@ -375,4 +375,7 @@ MC_VL65X3&VS75X3-TC013039-MB2002&3HK-V2.1.6.1.1_20210701
 1、针对HK单片机串口通讯不稳定问题,屏蔽与TE通讯相关的检测;
 2、硬件版本号和客户标识符增加“HK”。
 
+MC_VL65X3&VS75X3-TC013039-MB2002&3HK-V2.1.6.1.1_20210701_1
+1、里程统计增加过滤,避免干扰信号导致里程统计不准;
+2、针对开机后母线电压采集上升缓慢,优化SOC初始值的计算方法。
 

이 변경점에서 너무 많은 파일들이 변경되어 몇몇 파일들은 표시되지 않았습니다.