Ver Fonte

1 清除ODO里程时可清除平均功耗;
2 故障检测时间延长;
3 续航里程计算优化,电池有通信时才计算续航里程;

white.xu há 3 anos atrás
pai
commit
ac843dd37a

+ 1 - 1
Core/Src/adc.c

@@ -455,7 +455,7 @@ 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) * 9; //根据母线电流和估算的线阻进行补偿, 补偿电阻 0.07 * 128 = 9
+	MC_RunInfo.BusVoltage += (MC_RunInfo.BusCurrent >> 7) * 8; //根据母线电流和估算的线阻进行补偿, 补偿电阻 0.2 * 128 = 25.6
     if( MCUManufacturer == HK32F103RBT6 )
 	{
 	   MC_RunInfo.BusVoltage = ((MC_RunInfo.BusVoltage - 8100) * 1402) >> 10;

Diff do ficheiro suprimidas por serem muito extensas
+ 2455 - 2455
MDK-ARM/QD007A_CTL_APP/QD007A_CTL_APP_CRC.hex


BIN
MDK-ARM/bin/QD007A_CTL_APP.bin


+ 4 - 0
User/Src/can_process.c

@@ -325,6 +325,8 @@ void DataProcess(uint16_t ID, uint8_t Mode, uint16_t Cmd, uint8_t* Data)
 								SaveParamToEEprom_24C02(&I2C_Handle_EEPROM, EEPROM_24C02_ADDR_RIDE_LOG, sizeof(MC_RideLog_Struct_t), (uint8_t*)&MC_RideLog.ODO_Km);
 						    MC_RunInfo.Ride_Km = 0;
 						    MC_RunInfo.Ride_Time = 0;
+								Var_SetToDefaultLog();						
+								EEPROM_24C02_LogReset(&I2C_Handle_EEPROM);
 							}
 							else//Çå³ý¹ý£¬ÅжϴÎÊý
 							{
@@ -339,6 +341,8 @@ void DataProcess(uint16_t ID, uint8_t Mode, uint16_t Cmd, uint8_t* Data)
 									SaveParamToEEprom_24C02(&I2C_Handle_EEPROM, EEPROM_24C02_ADDR_RIDE_LOG, sizeof(MC_RideLog_Struct_t), (uint8_t*)&MC_RideLog.ODO_Km);
 									MC_RunInfo.Ride_Km = 0;
 									MC_RunInfo.Ride_Time = 0;
+									Var_SetToDefaultLog();						
+									EEPROM_24C02_LogReset(&I2C_Handle_EEPROM);									
 								}
 							}
 						}

+ 65 - 51
User/Src/fault_check.c

@@ -30,8 +30,8 @@ void MC_Fault_SpeedSensor_Process(TrueOrFalse_Flag_Struct_t IsStopFlag, MC_Caden
 		{
 		  if((MotorSpeed > 50) && (IsStopFlag == TRUE))
 			{
-			  DelayTime = 1650000 / MotorSpeed;//考虑前后齿比为0.8的情况下,轮子转一圈的时间为:60 / (电机转速 / (4.55 * 2.4) * 0.8) s, 延长2圈时间
-				DelayTime = DelayTime < 2000 ? 2000 : DelayTime;
+			  DelayTime = 4125000 / MotorSpeed;//考虑前后齿比为0.8的情况下,轮子转一圈的时间为:60 / (电机转速 / (4.55 * 2.4) * 0.8) s, 延长2圈时间
+				DelayTime = DelayTime < 10000 ? 10000 : DelayTime;
 				if((HAL_GetTick() - TrigTimeCnt_1) > DelayTime)
 				{
 				  p_MC_ErrorCode->ERROR_Bit.Fault_SpeedSensor = 1;
@@ -56,8 +56,8 @@ void MC_Fault_SpeedSensor_Process(TrueOrFalse_Flag_Struct_t IsStopFlag, MC_Caden
 		{
 			if((CadenceSensor.Cadence_Data >= 5) && (CadenceSensor.Cadence_Dir == MC_Cadence_Forward) && (IsStopFlag == TRUE))
 			{
-				DelayTime = 150000 / CadenceSensor.Cadence_Data;//考虑前后齿比为0.8的情况下,轮子转一圈的时间为:60 / (踏频 * 0.8) s, 延长2圈时间
-				DelayTime = DelayTime < 2000 ? 2000 : DelayTime;
+				DelayTime = 375000 / CadenceSensor.Cadence_Data;//考虑前后齿比为0.8的情况下,轮子转一圈的时间为:60 / (踏频 * 0.8) s, 延长2圈时间
+				DelayTime = DelayTime < 10000 ? 10000 : DelayTime;
 				if((HAL_GetTick() - TrigTimeCnt_2) > DelayTime)
 				{
 					p_MC_ErrorCode->ERROR_Bit.Fault_SpeedSensor = 1;
@@ -113,9 +113,9 @@ void MC_Fault_TorqueSensor_Process(uint16_t ADC_Data,  uint16_t GasSensor, MC_Ge
 			//传感器感应失效检测,进入力矩助力模式、踏频正转大于10rpm、标准差较小
 			if(((GearSt != 0x22) && ((GearSt & 0x0F) != 0)) && (GasSensor < 500) && (CadenceData.Cadence_Data > 30) && (CadenceData.Cadence_Dir == MC_Cadence_Forward) && (AstMode == MC_AssistRunMode_TORQUE) && (DiffSqrtResult < 10))
 			{
-				DelayTime = 60000 / CadenceData.Cadence_Data;  //根据踏频计算踩踏1/4圈的时间,要考虑空踩情况
-				DelayTime = (DelayTime < 250) ? 250 : DelayTime;
-				if((HAL_GetTick() - TrigTimeCnt_1) > (DelayTime * 2))
+//				DelayTime = 60000 / CadenceData.Cadence_Data;  //根据踏频计算踩踏1/4圈的时间,要考虑空踩情况
+//				DelayTime = (DelayTime < 250) ? 250 : DelayTime;
+				if((HAL_GetTick() - TrigTimeCnt_1) > 15000)
 				{
 					p_MC_ErrorCode->ERROR_Bit.Fault_TorqueSensor = 1;
 					//记录故障日志
@@ -137,7 +137,7 @@ void MC_Fault_TorqueSensor_Process(uint16_t ADC_Data,  uint16_t GasSensor, MC_Ge
 			//传感器短路或开路检测
 			if((ADC_Data < 50) || (ADC_Data > 4050))
 			{
-				if((HAL_GetTick() - TrigTimeCnt_2) > 200)
+				if((HAL_GetTick() - TrigTimeCnt_2) > 1000)
 				{
 					p_MC_ErrorCode->ERROR_Bit.Fault_TorqueSensor = 1;
 					//记录故障日志
@@ -174,7 +174,7 @@ void MC_Fault_PhaseLine_Process(FlagStatus Foc_Flag, uint16_t BusCurrent, uint16
 		  //A相电流
 			if(abs(Phase_Current.uw_phase_a) < 300)
 			{
-			  if((HAL_GetTick() - TrigTimeCnt_PhaseA) > 3000)
+			  if((HAL_GetTick() - TrigTimeCnt_PhaseA) > 5000)
 				{
 		  		p_MC_ErrorCode->ERROR_Bit.Fault_PhaseLine = 1;
 					//记录故障日志
@@ -196,7 +196,7 @@ void MC_Fault_PhaseLine_Process(FlagStatus Foc_Flag, uint16_t BusCurrent, uint16
 			//B相电流
 			if(abs(Phase_Current.uw_phase_b) < 300)
 			{
-			  if((HAL_GetTick() - TrigTimeCnt_PhaseB) > 3000)
+			  if((HAL_GetTick() - TrigTimeCnt_PhaseB) > 5000)
 				{
 		  		p_MC_ErrorCode->ERROR_Bit.Fault_PhaseLine = 1;
 					//记录故障日志
@@ -218,7 +218,7 @@ void MC_Fault_PhaseLine_Process(FlagStatus Foc_Flag, uint16_t BusCurrent, uint16
 			//C相电流
 			if(abs(Phase_Current.uw_phase_c) < 300)
 			{
-			  if((HAL_GetTick() - TrigTimeCnt_PhaseC) > 3000)
+			  if((HAL_GetTick() - TrigTimeCnt_PhaseC) > 5000)
 				{
 		  		p_MC_ErrorCode->ERROR_Bit.Fault_PhaseLine = 1;
 					//记录故障日志
@@ -255,12 +255,12 @@ void MC_Fault_NTCSensor_Process(uint8_t T_PCB_Result, uint8_t T_Coil_Result, MC_
 	static uint32_t NTC_Check_PeriodTimeCnt = 0; //NTC检测,母线电流采集周期
 	static uint16_t NTC_Check_Count = 0;
 	static uint32_t BusCurrentSum = 0;
-	uint8_t BusCurrentAvg = 0;
+	static uint16_t BusCurrentAvg1 = 0, BusCurrentAvg2 = 0;
 	static uint8_t T_PCB_Old = 0;
 	static uint8_t T_Coil_Old = 0;
 		
 	//初始化5s,且50度以上,不检测NTC故障
-	if((HAL_GetTick() < 5000) || (MC_RunInfo.T_MCU > 90))
+	if((HAL_GetTick() < 5000) || (T_PCB_Result > 90))
 	{
 	  TrigTimeCnt_PCB = HAL_GetTick();
 		TrigTimeCnt_PCB = HAL_GetTick();
@@ -276,13 +276,15 @@ void MC_Fault_NTCSensor_Process(uint8_t T_PCB_Result, uint8_t T_Coil_Result, MC_
 	if(p_MC_ErrorCode->ERROR_Bit.Fault_NtcSensor == 0)
 	{
 	  //PCB上NTC短路或开路检测,判断AD值是否为异常值
-	  if((T_PCB_Result < 5) || (T_PCB_Result > 180))           //5(-35度):AD为4000,180(140度):AD为80
+	  if((T_PCB_Result < 5) || (T_PCB_Result > 190))           //5(-35度):AD为4000,180(140度):AD为80
 		{
-			if((HAL_GetTick() - TrigTimeCnt_PCB) > 500)
+			if((HAL_GetTick() - TrigTimeCnt_PCB) > 5000)
 			{
 				p_MC_ErrorCode->ERROR_Bit.Fault_NtcSensor = 1;
 				//记录故障日志
 				MC_ErrorLogSaveInfo.NotesInfo1 = 1;
+				MC_ErrorLogSaveInfo.NotesInfo2 = T_PCB_Result;
+				MC_ErrorLogSaveInfo.NotesInfo3 = T_Coil_Result;				
 				ErrorLogSave_Update(&MC_ErrorLogSaveInfo);
 				IsErrorLogSaveInfoUpdateFlag = TRUE;
 				//存储故障次数
@@ -298,13 +300,15 @@ void MC_Fault_NTCSensor_Process(uint8_t T_PCB_Result, uint8_t T_Coil_Result, MC_
 		}
 		
 	  //NTC短路或开路检测,判断AD值是否为异常值
-		if((T_Coil_Result < 5) || (T_Coil_Result > 180))    //5(-35度):AD为4000,180(140度):AD为80
+		if((T_Coil_Result < 5) || (T_Coil_Result > 190))    //5(-35度):AD为4000,180(140度):AD为80
 		{
-			if((HAL_GetTick() - TrigTimeCnt_Coil) > 500)
+			if((HAL_GetTick() - TrigTimeCnt_Coil) > 5000)
 			{
 				p_MC_ErrorCode->ERROR_Bit.Fault_NtcSensor = 1;
 				//记录故障日志
 				MC_ErrorLogSaveInfo.NotesInfo1 = 2;
+				MC_ErrorLogSaveInfo.NotesInfo2 = T_PCB_Result;
+				MC_ErrorLogSaveInfo.NotesInfo3 = T_Coil_Result;					
 				ErrorLogSave_Update(&MC_ErrorLogSaveInfo);
 				IsErrorLogSaveInfoUpdateFlag = TRUE;
 				//存储故障次数
@@ -319,42 +323,51 @@ void MC_Fault_NTCSensor_Process(uint8_t T_PCB_Result, uint8_t T_Coil_Result, MC_
 		  TrigTimeCnt_Coil = HAL_GetTick();
 		}
 		
-		//NTC为固定值的检测,检测3min内母线电流平均值 > 10A 时的前后温差
+		//NTC???????,????2?6.8min????????,????????????????NTC??????
 		if((HAL_GetTick() - NTC_Check_PeriodTimeCnt) >= 100)
 		{
-		  NTC_Check_PeriodTimeCnt = HAL_GetTick();
-			BusCurrentSum += (uint16_t)(MC_RunInfo.BusCurrent >> 7);//按照mA / 128 判断,约0.1A
+			NTC_Check_PeriodTimeCnt = HAL_GetTick();
+			BusCurrentSum += (uint16_t)((MC_RunInfo.BusCurrent > 20000) ? 156 
+																 : MC_RunInfo.BusCurrent >> 7);//??mA / 128 ??,?0.1A,??20A
 			NTC_Check_Count++;
-			//采集100 * 8192 = 819.2s内母线电流平均值
-			if(NTC_Check_Count >= 8192)
+			if(NTC_Check_Count == 4096) //?????6.8min???
 			{
-			  NTC_Check_Count = 0;
-				BusCurrentAvg = BusCurrentSum >> 13;//8192个值取均值
-				BusCurrentSum = 0;
-				//平均电流超过10A,判断是否有温升
-				if(BusCurrentAvg > 79) // 79  * 1.28 = 101
-				{
-				  if((abs(T_PCB_Result - T_PCB_Old) < 1) ||  //PCB 温升低于2度
-						 (abs(T_Coil_Result - T_Coil_Old) < 1))  //绕组温升低于2度
+					//avg1 = (x1 + x2 + ... + x4096) / 4096
+					BusCurrentAvg1 = BusCurrentSum >> 12; 
+			}
+			else if(NTC_Check_Count >= 8192) //???6.8min
+			{
+					NTC_Check_Count = 0;
+					//avg2 = (x4097 + x4098 + ... +x8192) / 4096 = 2 * (x1 + x2 + ... + x8192) / 8192 - avg1
+					BusCurrentAvg2 = (BusCurrentSum >> 12) - BusCurrentAvg1; 
+					BusCurrentSum = 0;
+					//???????10A?,???????????3A,??????????
+					if(((BusCurrentAvg1 + BusCurrentAvg2) >> 1) > 79) //79 * 128 = 10.1A
 					{
-					  p_MC_ErrorCode->ERROR_Bit.Fault_NtcSensor = 1;
-						//记录故障日志
-				  	MC_ErrorLogSaveInfo.NotesInfo1 = 3;
-						MC_ErrorLogSaveInfo.NotesInfo2 = BusCurrentAvg;
-						MC_ErrorLogSaveInfo.NotesInfo3 = (uint16_t)((abs(T_PCB_Result - T_PCB_Old) << 8) + (abs(T_Coil_Result - T_Coil_Old) < 2));
-						ErrorLogSave_Update(&MC_ErrorLogSaveInfo);
-				  	IsErrorLogSaveInfoUpdateFlag = TRUE;
-						//存储故障次数
-						MC_RunLog1.NTC_FaultCnt++;
-			      RunLogSaveIndex = 1;    
-						
-						return;
+							if(abs(BusCurrentAvg1 - BusCurrentAvg2) >= 25)  //25 * 128 = 3.2A
+							{
+									if((abs(T_PCB_Result - T_PCB_Old) < 1) ||  //PCB ????1?
+										 (abs(T_Coil_Result - T_Coil_Old) < 1))  //??????1?
+									{
+											p_MC_ErrorCode->ERROR_Bit.Fault_NtcSensor = 1;
+											//??????
+											MC_ErrorLogSaveInfo.NotesInfo1 = 3;
+											MC_ErrorLogSaveInfo.NotesInfo2 = (BusCurrentAvg1 << 8) + (BusCurrentAvg2);
+											MC_ErrorLogSaveInfo.NotesInfo3 = (uint16_t)((abs(T_PCB_Result - T_PCB_Old) << 8) 
+																																+ (abs(T_Coil_Result - T_Coil_Old) < 2));
+											ErrorLogSave_Update(&MC_ErrorLogSaveInfo);
+											IsErrorLogSaveInfoUpdateFlag = TRUE;
+											//??????
+											MC_RunLog1.NTC_FaultCnt++;
+											RunLogSaveIndex = 1;    
+											return;
+								 }
+							}
 					}
-				}
-				T_PCB_Old = T_PCB_Result;
-				T_Coil_Old = T_Coil_Result;
+					T_PCB_Old = T_PCB_Result;
+					T_Coil_Old = T_Coil_Result;
 			}
-		}		
+		}	
 	}
 }
 
@@ -810,7 +823,7 @@ void MC_Fault_Machine_Process(uint16_t MotorSpeed, uint16_t CadenceSpeed, ADC_Se
 				if( speedratio > 1500 ) 
 				{
 					ClutchFaultCount++;
-					if( ClutchFaultCount>= 50)                  //速比连续出错50次判断为故障,时间将近1s
+					if( ClutchFaultCount>= 250)                  //速比连续出错250次判断为故障,时间将近5s
 					{
 						ClutchFaultCount=0;
 						p_MC_ErrorCode->ERROR_Bit.Fault_Machine = 1;
@@ -843,7 +856,7 @@ void MC_Fault_Machine_Process(uint16_t MotorSpeed, uint16_t CadenceSpeed, ADC_Se
 void MC_Fault_HallSensor_Process(MC_HallSensorStatus_Struct_t HallSensorStatus, MC_ErrorCode_Struct_t* p_MC_ErrorCode)
 {
 	static TrueOrFalse_Flag_Struct_t IsFirstEnterFlag = TRUE;
-	static uint32_t TrigTimeCnt_1 = 0;//用于检测霍尔全部短路或开路检测 延时判断
+	static uint32_t TrigTimeCnt_1 = 0, TrigTimeCnt_2 = 0;;//用于检测霍尔全部短路或开路检测 延时判断
 	static uint8_t HallGroupOldBak[6];//用于单个霍尔故障判断霍尔状态缓存
 	static uint8_t Count = 0;
 	static uint32_t TrigCnt_2 = 0;//用于单个霍尔故障次数计数
@@ -860,7 +873,7 @@ void MC_Fault_HallSensor_Process(MC_HallSensorStatus_Struct_t HallSensorStatus,
 	  //霍尔传感器全部短路或开路检测
 		if((HallSensorStatus.HallGropuStatus == 0x00) || (HallSensorStatus.HallGropuStatus == 0x07))
 		{
-		  if((HAL_GetTick() - TrigTimeCnt_1) > 250)
+		  if((HAL_GetTick() - TrigTimeCnt_1) > 1000)
 			{
 			  p_MC_ErrorCode->ERROR_Bit.Fault_HallSensor = 1;
 				//记录故障日志
@@ -895,8 +908,9 @@ void MC_Fault_HallSensor_Process(MC_HallSensorStatus_Struct_t HallSensorStatus,
 				else
 				{
 				  TrigCnt_2 = 0;
+					TrigTimeCnt_2 = HAL_GetTick();
 				}
-				if(TrigCnt_2 > 50)
+				if( (TrigCnt_2 > 50) && (HAL_GetTick()>(TrigTimeCnt_2+500)) )
 				{
 					p_MC_ErrorCode->ERROR_Bit.Fault_HallSensor = 1;
 					//记录故障日志
@@ -958,7 +972,7 @@ void MC_Fault_CadenceSensor_Process(uint16_t Torque, uint16_t BikeSpeed, MC_Erro
 		  //判断霍尔1
 			if(Hall_1_Trg == 0)
 			{
-			  if((HAL_GetTick() - Hall_1_Fault_TrigTimeCnt) > 5000)
+			  if((HAL_GetTick() - Hall_1_Fault_TrigTimeCnt) > 10000)
 				{
 				  p_MC_ErrorCode->ERROR_Bit.Fault_CadenceSensor = 1;
 					//记录故障日志

+ 67 - 94
User/Src/remain_distance.c

@@ -100,7 +100,7 @@ void RD_RemainDis_Init(uint16_t uwWheelLength, TrueOrFalse_Flag_Struct_t BMS_COM
 	}
 	else //电池不含通讯时,根据母线电压估算剩余容量
 	{
-	  RD_getQRemainRecord(BusVoltage * 36 / DesignVol); //放电曲线是按照36V,针对48V或24V做等效转换
+//	  RD_getQRemainRecord(BusVoltage * 36 / DesignVol); //放电曲线是按照36V,针对48V或24V做等效转换
 	}
 	
 	RemainDis.start = 0;
@@ -157,7 +157,6 @@ void RD_CalculateRemainDis(uint32_t WheelTurnCnt, uint16_t RemainCap, uint8_t SO
 	static int32_t PowerPerKmFltSum=0;
 	
 	uint8_t i;
-	uint8_t flagBatteryFull=0;
 	int32_t ptmp;
 	
 	static uint32_t RunTimeCnt = 0;
@@ -183,11 +182,10 @@ void RD_CalculateRemainDis(uint32_t WheelTurnCnt, uint16_t RemainCap, uint8_t SO
 		  RemainDis.BMS_Com_DelayTimeCnt = HAL_GetTick();
 			RemainDis.IsBMS_ComOK_Flag = FALSE;
 		}
-		
-		/*电流大于最小阈值,累加一次电量*/
-		if((RemainDis.I_motor > CURRENT_MIN) && (RemainDis.IsBMS_ComOK_Flag == FALSE) )
+		else
 		{
-			RemainDis.Q_add += RemainDis.I_motor * RemainDis.acc_period;//mA * ms
+				//更新电池剩余容量
+				Battery_Info.Q_remain_real = RemainCap;			
 		}
 		
 		/*助力档位切换后*/
@@ -229,104 +227,79 @@ void RD_CalculateRemainDis(uint32_t WheelTurnCnt, uint16_t RemainCap, uint8_t SO
 				
 					/*充电状态,或由母线电流切换到电量信息计算时,此值会出现负数*/
 					Q_add_tmp = (Q_add_tmp > 0) ? Q_add_tmp : 0;
-					
+					Q_add_tmp = (Q_add_tmp < 30) ? Q_add_tmp : 30;
 					/*判断电池是否满充*/
 	        if( ( Q_add_tmp == 0 ) && ( Battery_Info.SOC == 100 ) )
 					{
 						/*当电池满充时,发出的电量信息会是标称值,
 						在Battery.SOC==100时不会随电量消耗尔减小*/
 						/*置标志位,不计算更新*/
-						flagBatteryFull = 1;
 					}
-				
-					/*切换到母线电流积分计算后,使用最新的剩余电量数据*/
-					Battery_Info.Q_remain_record = Battery_Info.Q_remain_real;
-					Battery_Info.Q_discharged = 0;
-					RemainDis.Q_add = 0;
-				}
-			}
-			else/*消耗的电量信息来自母线电流,进行积分累计计算*/
-			{
-				/*单位mA*h*/
-				Q_add_tmp = RemainDis.Q_add / ( 3600 * 1000 );
-				if(Q_add_tmp > 0)
-				{
-					RemainDis.Q_add = RemainDis.Q_add % ( 3600 * 1000 );//保留余数,下次累加
+					else
+					{
+						/*将一定轮圈数消耗的电量,写入FIFO,FIFO中的数据滑动求平均值*/
+						Q_sum -= Q_FIFO[Q_Index];
+						Q_sum += Q_add_tmp;
+						Q_FIFO[Q_Index++] = Q_add_tmp;
+						
+						if(Q_Index>=Q_FIFO_LENGTH)
+						{
+							Q_Index = 0;
+							Q_fifo_full_falg = 1;
+							
+							/*250圈,动态功耗刷新一次,置一次eeprom保存标志*/
+							RemainDis.flag_saveInfo = 1;
+						}
+						/*
+						wheelCount x WHEEL_LENGTH(cm) 
+						------------------------------- (km)  wheelCount=(Q_FIFO_LENGTH * WHEEL_COUNT_REFRESH_VALUE)
+											 1000 x 100
+						
+							Q_sum(mA*h) x 1000 x 100
+						------------------------------- (mA*h/km)
+						 wheelCount x WHEEL_LENGTH  
+						*/						
+						if( Q_sum > 0 )
+						{
+							/*缓存满后,求平均值*/
+							if(Q_fifo_full_falg==1)
+							{
+								RemainDis.Power_per_km = (Q_sum * 1000 * 100 ) / ( Q_FIFO_LENGTH * WHEEL_COUNT_REFRESH_VALUE * RemainDis.wheelLength );
+							}
+							else
+							{
+								/*缓存数据未满,以当前有效数据个数求平均值*/
+								RemainDis.Power_per_km = (Q_sum * 1000 * 100 ) / ( Q_Index * WHEEL_COUNT_REFRESH_VALUE * RemainDis.wheelLength );
+							}
+						}
+						else
+						{
+							RemainDis.Power_per_km = 0;
+						}
+						
+						/*电量缓存Q_FIFO计满一次,滑动滤波求平均值*/
+						if(Q_Index==0)
+						{		
+							ptmp = RemainDis.Power_per_km;
+							PowerPerKmFltSum += ((ptmp << 8) - PowerPerKmFltSum) / P_FIFO_LENGTH;
+							RemainDis.Power_per_km_average = (uint16_t)(PowerPerKmFltSum >> 8);
+						}
+
+						/*计算剩余续航里程*/
+						if(RemainDis.Power_per_km_average > 0)
+						{
+							RemainDis.remainDistance = Battery_Info.Q_remain_real / RemainDis.Power_per_km_result;//单位km
+						}
+						else
+						{
+							RemainDis.remainDistance = 0xFFFF;//码表显示---km
+						}
+					}
 				}
-			
-				/*累计总的消耗电量*/
-				Battery_Info.Q_discharged  += Q_add_tmp ;  //mA*h
-				
-				/*更新电池剩余电量*/
-				Battery_Info.Q_remain_real = Battery_Info.Q_remain_record - Battery_Info.Q_discharged ;
 			}
-			
+
 			/*电量信息来自电池的计算,需要用到此数据*/
 			Battery_Info.Q_remain_real_last = Battery_Info.Q_remain_real;
-			
-			/*电池非满充状态*/
-			if( flagBatteryFull == 0 )
-			{
-				/*将一定轮圈数消耗的电量,写入FIFO,FIFO中的数据滑动求平均值*/
-				Q_sum -= Q_FIFO[Q_Index];
-				Q_sum += Q_add_tmp;
-				Q_FIFO[Q_Index++] = Q_add_tmp;
-			}
-			
-			if(Q_Index>=Q_FIFO_LENGTH)
-			{
-				Q_Index = 0;
-				Q_fifo_full_falg = 1;
-				
-				/*250圈,动态功耗刷新一次,置一次eeprom保存标志*/
-				RemainDis.flag_saveInfo = 1;
-			}
-			
-			/*
-			wheelCount x WHEEL_LENGTH(cm) 
-			------------------------------- (km)  wheelCount=(Q_FIFO_LENGTH * WHEEL_COUNT_REFRESH_VALUE)
-								 1000 x 100
-			
-				Q_sum(mA*h) x 1000 x 100
-			------------------------------- (mA*h/km)
-			 wheelCount x WHEEL_LENGTH  
-			*/
-			
-			if( Q_sum > 0 )
-			{
-				/*缓存满后,求平均值*/
-				if(Q_fifo_full_falg==1)
-				{
-					RemainDis.Power_per_km = (Q_sum * 1000 * 100 ) / ( Q_FIFO_LENGTH * WHEEL_COUNT_REFRESH_VALUE * RemainDis.wheelLength );
-				}
-				else
-				{
-					/*缓存数据未满,以当前有效数据个数求平均值*/
-					RemainDis.Power_per_km = (Q_sum * 1000 * 100 ) / ( Q_Index * WHEEL_COUNT_REFRESH_VALUE * RemainDis.wheelLength );
-				}
-			}
-			else
-			{
-				RemainDis.Power_per_km = 0;
-			}
-			
-			/*电量缓存Q_FIFO计满一次,滑动滤波求平均值*/
-			if(Q_Index==0)
-			{		
-				ptmp = RemainDis.Power_per_km;
-				PowerPerKmFltSum += ((ptmp << 8) - PowerPerKmFltSum) / P_FIFO_LENGTH;
-				RemainDis.Power_per_km_average = (uint16_t)(PowerPerKmFltSum >> 8);
-			}
-
-			/*计算剩余续航里程*/
-			if(RemainDis.Power_per_km_average > 0)
-			{
-				RemainDis.remainDistance = Battery_Info.Q_remain_real / RemainDis.Power_per_km_result;//单位km
-			}
-			else
-			{
-				RemainDis.remainDistance = 0xFFFF;//码表显示---km
-			}
 		}
 	}
 }
@@ -372,7 +345,7 @@ void RD_SaveAndUpdateInfo(MC_GearSt_Struct_t GearSt, MC_AssistRunMode_Struct_t M
 					
            /*各档位关联*/
 					/*不低于默认值30%*/
-					if( sPercent >= -30 )
+					if( (sPercent >= -30)&&(sPercent <= 455) )
 					{
 						/*更新平均功耗*/
 						RemainDis.Power_per_km_result = powerDefaultCurrentMode * ( 100 +  sPercent ) / 100;

Alguns ficheiros não foram mostrados porque muitos ficheiros mudaram neste diff