Quellcode durchsuchen

V2.1.6_20210616_1 TC011052-MCK201001-V1r1
1、里程统计增加过滤,避免干扰信号导致里程统计不准;
2、针对开机后母线电压采集上升缓慢,优化SOC初始值的计算方法。

dail vor 3 Jahren
Ursprung
Commit
5f4cde3cfd

+ 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

@@ -267,18 +267,24 @@ int main(void)
 			LightDriver_Process(MC_ControlCode.LightSwitch);
 			
 			//续航里程计算
-			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();

Datei-Diff unterdrückt, da er zu groß ist
+ 2511 - 2511
MDK-ARM/QD007A_CTL_APP/QD007A_CTL_APP_CRC.hex


BIN
MDK-ARM/bin/MC_VS7500-TC011052-MCK201001-V2.1.6.1.1_20210616_1.bin


BIN
MDK-ARM/bin/QD007A_CTL_APP.bin


+ 7 - 2
User/Src/can_process.c

@@ -637,8 +637,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://查询骑行历史信息

+ 66 - 29
User/Src/remain_distance.c

@@ -462,49 +462,86 @@ 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 < 100)//避免电量小范围波动,只做减小处理
+		else//第一次计算后,采用25组电压平均值
 		{
-			if((Result >= Result_Pre) && ((Result - Result_Pre) < 10))
+		  Result_Pre = MC_RunInfo.SOC;
+			Result = Result_Pre;
+			
+			//取25组数据的平均值计算SOC
+			FiltSum += Voltage_mV;
+			FiltCnt++;
+			if(FiltCnt >= 25)
 			{
-				Result = Result_Pre;
+				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;
 }

+ 3 - 0
修改说明.txt

@@ -391,6 +391,9 @@ V2.1.6_20210616 TC011052-MCK201001-V1r1
 5、收到关机指令是关闭车灯,解决开灯状态关机后下次开机时会闪烁一下的问题;
 6、版本号:V2.1.6_20210616 客户特性说明:TC011052-MCK201001-V1r1
 
+V2.1.6_20210616_1 TC011052-MCK201001-V1r1
+1、里程统计增加过滤,避免干扰信号导致里程统计不准;
+2、针对开机后母线电压采集上升缓慢,优化SOC初始值的计算方法。
 
 
 

Einige Dateien werden nicht angezeigt, da zu viele Dateien in diesem Diff geändert wurden.