浏览代码

V2.1.6_20210301 TC011052-MCK201001-V1r0
1、上电时增加转把是否接入的检测,解决上电时未接入转把,上电后接入转把会启动电机的问题;
2、低压保护检测增加根据BMS通信状态采用BMS的电压或电机的电压;
3、修改临时掉电数据存储的地址,单独开一页(1024B)空间,避免初始化时MC_Init()前执行EEPROM_Flash_DataUpdate时,擦除完1KFlash后系统

断电,导致Flash中数据丢失的问题;
4、修改PowerOff_Process函数,在接收到关机指令时,延迟5s退出,按键和BMS发送关机指令后延迟1s关闭ACC和电源;
5、调整SMART档位助力;
6、修改力矩传感器故障检测的条件为踩踏1圈;
7、版本号:V2.1.6_20210301 客户特性说明:TC011052-MCK201001-V1r0

dail.zhou 4 年之前
父节点
当前提交
a575c30046

+ 11 - 4
Core/Src/adc.c

@@ -494,10 +494,17 @@ void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
 	#endif
 			
 	//更新指拨
-	Temp_32 = ADC1_Result[ADC1_RANK_GAS] - GasSensor_OffSet;
-	Temp_32 = (Temp_32 <= 0) ? 0 : Temp_32;
-	GasSensorFltSum += ((Temp_32 << 10) - GasSensorFltSum) >> 8;  //滤波延时0.33*256=85.3ms
-	ADC_SensorData.GasSensor = GasSensorFltSum >> 10;
+	if(IsGasSensorConnectedFlag == TRUE)
+	{
+		Temp_32 = ADC1_Result[ADC1_RANK_GAS] - GasSensor_OffSet;
+		Temp_32 = (Temp_32 <= 0) ? 0 : Temp_32;
+		GasSensorFltSum += ((Temp_32 << 10) - GasSensorFltSum) >> 8;  //滤波延时0.33*256=85.3ms
+		ADC_SensorData.GasSensor = GasSensorFltSum >> 10;
+	}
+  else
+	{
+	  ADC_SensorData.GasSensor = 0;
+	}	
 }
 
 //ADC1和ADC2数据滑动滤波

+ 3 - 11
Core/Src/main.c

@@ -174,11 +174,11 @@ int main(void)
 	}
 	
 	//掉电临时数据搬移到24C02
+	IsPowerOffDataBkp_SaveFlag = EEPROM_Flash_TempCheck();
 	SavePowerOffBakData(&I2C_Handle_EEPROM, IsPowerOffDataBkp_SaveFlag);//75ms
 		
-	//擦除临时掉电数据存储区域为0xFF
-	IsFlashSaveDataUpdate = TRUE;
-	EEPROM_Flash_DataUpdate(&IsFlashSaveDataUpdate);//100ms
+	//擦除临时掉电数据存储区域为0xFF,关机前写入时无需擦除
+	EEPROM_Flash_Erase(EEPROM_FLASH_ADDR_TEMP_BEGIN_ADDRESS, EEPROM_FLASH_ADDR_TEMP_END_ADDRESS);//100ms
 	
 	//MC控制初始化
 	MC_Init();//145ms
@@ -205,14 +205,6 @@ int main(void)
 	
 	//初始化完成标志
 	IsInitFinish_Flag = TRUE;
-	
-	//根据客户定制需求修改配置参数
-	MC_ConfigParam1.GasCtrlMode_Flag = MC_SUPPORT_ENABLE;//打开转把模式
-	MC_ConfigParam1.CadenceStarNum = 10;      	      	 //曲柄60度启动
-	MC_ConfigParam1.UV_Protect_TH = 3000;     		       //30V欠压
-	MC_ConfigParam1.SpeedLimit = 24;      		           //限速24km/h,要求超过24km/h断电
-	MC_ConfigParam1.WalkMode_SpeedLimit = 40; 		       //推行限速4.0km/h
-	MC_ConfigParam1.WalkMode_MotorSpeedSet = 135;	       //推行电机转速
 
   /* USER CODE END 2 */
 

二进制
MDK-ARM/bin/MC_VS7500-TC011052-MCK201001-V2.1.6.1.0_20210301.bin


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


+ 7 - 2
User/Inc/eeprom_flash.h

@@ -15,8 +15,12 @@
 #define    EEPROM_FLASH_ADDR_USER_INFO1          EEPROM_FLASH_BEGIN_ADDRESS + (uint32_t)84          //自定义字符串1 16bytes + 4bytes
 #define    EEPROM_FLASH_ADDR_USER_INFO2          EEPROM_FLASH_BEGIN_ADDRESS + (uint32_t)104         //自定义字符串2 16bytes + 4bytes
 #define    EEPROM_FLASH_ADDR_USER_INFO3          EEPROM_FLASH_BEGIN_ADDRESS + (uint32_t)124         //自定义字符串3 16bytes + 4bytes
-#define    EEPROM_FLASH_ADDR_POWEROFF_BKP        EEPROM_FLASH_BEGIN_ADDRESS + (uint32_t)144         //掉电保存的关键数据 40bytes + 4bytes
-#define    EEPROM_FLASH_ADDR_POWEROFF_BKP_FLAG   EEPROM_FLASH_BEGIN_ADDRESS + (uint32_t)188         //掉电保存的关键数据标志 4bytes + 4bytes
+
+#define    EEPROM_FLASH_ADDR_TEMP_BEGIN_ADDRESS    0x0801F400
+#define    EEPROM_FLASH_ADDR_TEMP_END_ADDRESS      0x0801F7FF
+
+#define    EEPROM_FLASH_ADDR_POWEROFF_BKP_FLAG   EEPROM_FLASH_ADDR_TEMP_BEGIN_ADDRESS               //掉电保存的关键数据标志 4bytes + 4bytes
+#define    EEPROM_FLASH_ADDR_POWEROFF_BKP        EEPROM_FLASH_ADDR_TEMP_BEGIN_ADDRESS + (uint32_t)8 //掉电保存的关键数据 40bytes + 4bytes
 
 extern TrueOrFalse_Flag_Struct_t IsPowerOffDataBkp_SaveFlag;
 extern TrueOrFalse_Flag_Struct_t IsFlashSaveDataUpdate;
@@ -27,5 +31,6 @@ extern int8_t ReadDataFromEEPROM_Flash(uint32_t FlashAddress, uint8_t* Data, uin
 extern void SaveDataToEEPROM_Flash(uint32_t FlashAddress, uint8_t* Data, uint8_t Length); // Length必须为4的倍数
 extern void EEPROM_Flash_Check(void);
 extern void EEPROM_Flash_DataUpdate(TrueOrFalse_Flag_Struct_t* IsUpdateFlag);
+extern TrueOrFalse_Flag_Struct_t EEPROM_Flash_TempCheck(void);
 
 #endif

+ 2 - 0
User/Inc/gas_sensor.h

@@ -15,7 +15,9 @@ typedef struct
 }GasSensorCruiceCheckParam_Struct_t;
 
 extern uint16_t GasSensor_OffSet;
+extern TrueOrFalse_Flag_Struct_t IsGasSensorConnectedFlag;
 extern GasSensorCruiceCheckParam_Struct_t GasSensorCruiceCheckParam;
+
 extern void GasSensorOffSet_Init(uint16_t* OffSet, uint16_t AdcData);
 extern void GasSensorOffSetData_Update(uint16_t* PresentData, uint16_t AdcData, MC_ErrorCode_Struct_t* p_MC_ErrorCode);
 extern void GasSensorCruiceCheck(uint16_t GasSensorData, uint16_t BikeSpeed, TrueOrFalse_Flag_Struct_t IsBreakFlag, MC_GearSt_Struct_t GearSt, GasSensorCruiceCheckParam_Struct_t* p_GasSensorCruiceCheckParam);

+ 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
 

+ 1 - 1
User/Inc/tasks.h

@@ -15,7 +15,7 @@ extern void MC_SendErrorCode_Process(MC_ErrorCode_Struct_t ErrorCode);
 extern void MC_SendRunInfo_Process(MC_WorkMode_Struct_t WorkMode);
 extern void MC_TE_SensorData_Process(MC_TE_SensorData_Struct_t* p_MC_TE_SensorData);
 extern uint8_t MC_CadenceLimit_Cal(uint8_t Cadence, uint16_t Current, uint8_t T_Coil);
-extern void PowerOff_Process(void);
+extern void PowerOff_Process(TrueOrFalse_Flag_Struct_t ReturnEnable);
 extern void MC_CanRxCheck_Process(MC_SupportFlag_Struct_t NoPBU_Flag, MC_SupportFlag_Struct_t NoHMI_Flag, MC_WorkMode_Struct_t WorkMode, MC_GearSt_Struct_t* GearSt);
 extern void MC_UartRxCheck_Process(void);
 extern void MC_RunTime_Cal(uint32_t* p_Runtime);

+ 37 - 4
User/Src/can_process.c

@@ -82,6 +82,7 @@ void DataProcess(uint16_t ID, uint8_t Mode, uint16_t Cmd, uint8_t* Data)
 				{
 					//更新电池运行信息
 					memcpy(&BMS_RunInfo.Voltage, Data, DataLength); 
+					MC_RunInfo.SOC = BMS_RunInfo.SOC;
 					//电池通信正常标志置位,用于续航计算
 					RemainDis.IsBMS_ComOK_Flag = TRUE;              
 					RemainDis.BMS_Com_DelayTimeCnt = HAL_GetTick();
@@ -92,7 +93,7 @@ void DataProcess(uint16_t ID, uint8_t Mode, uint16_t Cmd, uint8_t* Data)
 				}
 				case 0x1308://关机指令
 				{					
-					PowerOff_Process();
+					PowerOff_Process(FALSE);
 					break;
 				}
 				case 0x1410://电池设计信息
@@ -132,7 +133,7 @@ void DataProcess(uint16_t ID, uint8_t Mode, uint16_t Cmd, uint8_t* Data)
 				//PBU广播的指令
         case 0x1008://PBU关机指令
 				{
-					PowerOff_Process();
+					PowerOff_Process(FALSE);
 					break;
 				}
 				case 0x120C://PBU物理ID
@@ -189,7 +190,15 @@ void DataProcess(uint16_t ID, uint8_t Mode, uint16_t Cmd, uint8_t* Data)
 				}
 				case 0x3408://OBC设置用户参数
 				{
-				  MC_ConfigParam1.WheelSizeAdj = (int8_t)Data[0];
+				  if(MC_ConfigParam1.WheelSizeAdj > 10)
+					{
+						MC_ConfigParam1.WheelSizeAdj = 10;
+					}
+					if(MC_ConfigParam1.WheelSizeAdj < -10)
+					{
+						MC_ConfigParam1.WheelSizeAdj = -10;
+					}
+					MC_ConfigParam1.WheelSizeAdj = (int8_t)Data[0];
 					MC_ConfigParam1.StarModel = (MC_StarMode_Struct_t)Data[1];
 					SaveParamToEEprom_24C02(&I2C_Handle_EEPROM, EEPROM_24C02_ADDR_CONFIG_PARAM1, sizeof(MC_ConfigParam1), (uint8_t*)&MC_ConfigParam1.GasCtrlMode_Flag);
 					SendData(ID_MC_TO_PBU, MODE_REPORT, 0x5303, (uint8_t*)"ACK");
@@ -259,7 +268,23 @@ void DataProcess(uint16_t ID, uint8_t Mode, uint16_t Cmd, uint8_t* Data)
 				case 0x3810://ECU设置用户参数
 				{
 			  	MC_ConfigParam1.WheelSize = Data[0];
+					if(MC_ConfigParam1.WheelSize > 250)
+					{
+					  MC_ConfigParam1.WheelSize = 250;
+					}
+					if(MC_ConfigParam1.WheelSize < 120)
+					{
+					  MC_ConfigParam1.WheelSize = 120;
+					}
 					MC_ConfigParam1.SpeedLimit = Data[1];
+					if(MC_ConfigParam1.SpeedLimit > 99)
+					{
+					  MC_ConfigParam1.SpeedLimit = 99;
+					}
+					if(MC_ConfigParam1.SpeedLimit < 5)
+					{
+					  MC_ConfigParam1.SpeedLimit = 5;
+					}
 					//Data[2]和Data[3]低压保护值暂不处理
 					SaveParamToEEprom_24C02(&I2C_Handle_EEPROM, EEPROM_24C02_ADDR_CONFIG_PARAM1, sizeof(MC_ConfigParam1), (uint8_t*)&MC_ConfigParam1.GasCtrlMode_Flag);
 					SendData(ID_MC_TO_PBU, MODE_REPORT, 0x5303, (uint8_t*)"ACK");
@@ -325,6 +350,14 @@ void DataProcess(uint16_t ID, uint8_t Mode, uint16_t Cmd, uint8_t* Data)
 				case 0x3208://设置电机配置参数
 				{
 					MC_ConfigParam1.WheelSizeAdj = (int8_t)Data[0];
+					if(MC_ConfigParam1.WheelSizeAdj > 10)
+					{
+						MC_ConfigParam1.WheelSizeAdj = 10;
+					}
+					if(MC_ConfigParam1.WheelSizeAdj < -10)
+					{
+						MC_ConfigParam1.WheelSizeAdj = -10;
+					}
 					MC_ConfigParam1.StarModel = (MC_StarMode_Struct_t)Data[1];
 					SaveParamToEEprom_24C02(&I2C_Handle_EEPROM, EEPROM_24C02_ADDR_CONFIG_PARAM1, sizeof(MC_ConfigParam1), (uint8_t*)&MC_ConfigParam1.GasCtrlMode_Flag);
 					SendData(ID_MC_TO_HMI, MODE_REPORT, 0x7403, (uint8_t*)"ACK");
@@ -531,7 +564,7 @@ void DataProcess(uint16_t ID, uint8_t Mode, uint16_t Cmd, uint8_t* Data)
 				  if(strncmp("RESET", (char*)Data, DataLength) == 0)
 					{
 						SendData(ID_MC_TO_CDL, MODE_REPORT, 0xA903, (uint8_t*)"ACK");
-						PowerOff_Process();
+						PowerOff_Process(TRUE);
 		    	  HAL_Delay(100);
 			      __set_FAULTMASK(1);//关闭所有中断
 			      HAL_NVIC_SystemReset();

+ 23 - 16
User/Src/eeprom_flash.c

@@ -75,21 +75,6 @@ static void CopyDataFromEEPROM_Flash(void)
 	  memcpy(&UserString3, Data_Buf, 16);
 	}	
 	
-	//读取掉电临时保存的数据
-	Error_OK = ReadDataFromEEPROM_Flash(EEPROM_FLASH_ADDR_POWEROFF_BKP_FLAG, Data_Buf, 4);
-	if(Error_OK == 0)
-	{
-	  if(strncmp("FLAG", (char*)Data_Buf, 4) == 0) //关机前进行过存储
-		{
-			Error_OK = ReadDataFromEEPROM_Flash(EEPROM_FLASH_ADDR_POWEROFF_BKP, Data_Buf, 40);
-			if(Error_OK == 0)
-			{
-				memcpy((uint8_t*)&MC_PowerOffBkp.ODO_Km, Data_Buf, 40);
-				IsPowerOffDataBkp_SaveFlag = TRUE;
-			}	
-		}
-	}
-	
 }
 
 /****************************全局函数定义******************************/
@@ -139,7 +124,7 @@ void EEPROM_Flash_Erase(uint32_t BeginAddress, uint32_t EndAddress)
 int8_t ReadDataFromEEPROM_Flash(uint32_t FlashAddress, uint8_t* Data, uint8_t Length) // Length必须为4的倍数
 {
   uint32_t DataTemp32[8], CRC_Data, CRC_Result;
-	uint8_t CRC_Buf[40], i;
+	uint8_t CRC_Buf[64], i;
 	
 	Length = Length >> 2;//按照32bit读取
   for(i=0; i<Length; i++)
@@ -219,3 +204,25 @@ void EEPROM_Flash_DataUpdate(TrueOrFalse_Flag_Struct_t* IsUpdateFlag)
 		*IsUpdateFlag = FALSE;
 	}
 }
+
+TrueOrFalse_Flag_Struct_t EEPROM_Flash_TempCheck(void)
+{
+  uint8_t Data_Buf[64];
+	int8_t Error_OK;
+	
+	//读取掉电临时保存的数据
+	Error_OK = ReadDataFromEEPROM_Flash(EEPROM_FLASH_ADDR_POWEROFF_BKP_FLAG, Data_Buf, 4);
+	if(Error_OK == 0)
+	{
+	  if(strncmp("FLAG", (char*)Data_Buf, 4) == 0) //关机前进行过存储
+		{
+			Error_OK = ReadDataFromEEPROM_Flash(EEPROM_FLASH_ADDR_POWEROFF_BKP, Data_Buf, 40);
+			if(Error_OK == 0)
+			{
+				memcpy((uint8_t*)&MC_PowerOffBkp.ODO_Km, Data_Buf, 40);
+				return TRUE;
+			}	
+		}
+	}
+	return FALSE;
+}

+ 1 - 1
User/Src/fault_check.c

@@ -113,7 +113,7 @@ void MC_Fault_TorqueSensor_Process(uint16_t ADC_Data, MC_GearSt_Struct_t GearSt,
 			//传感器感应失效检测,进入力矩助力模式、踏频正转大于10rpm、标准差较小
 			if(((GearSt != 0x22) && ((GearSt & 0x0F) != 0)) && (CadenceData.Cadence_Data > 30) && (CadenceData.Cadence_Dir == MC_Cadence_Forward) && (AstMode == MC_AssistRunMode_TORQUE) && (DiffSqrtResult < 10))
 			{
-				DelayTime = 15000 / CadenceData.Cadence_Data;  //根据踏频计算踩踏1/4圈的时间,要考虑空踩情况
+				DelayTime = 60000 / CadenceData.Cadence_Data;  //根据踏频计算踩踏1圈的时间,要考虑空踩情况
 				DelayTime = (DelayTime < 250) ? 250 : DelayTime;
 				if((HAL_GetTick() - TrigTimeCnt_1) > (DelayTime * 2))
 				{

+ 34 - 17
User/Src/gas_sensor.c

@@ -4,13 +4,24 @@
 
 uint16_t GasSensor_OffSet = 0;
 GasSensorCruiceCheckParam_Struct_t GasSensorCruiceCheckParam = {0, 0, RESET, 0, FALSE};
+TrueOrFalse_Flag_Struct_t IsGasSensorConnectedFlag = FALSE;
 
 #define ZeroOffSetData 100
 
 //指拨零点值初始化
 void GasSensorOffSet_Init(uint16_t* OffSet, uint16_t AdcData)
 {
-  *OffSet = AdcData + ZeroOffSetData;
+  //根据开始时刻采集值判断是否连接转把
+	if(AdcData < 300)
+	{
+	  IsGasSensorConnectedFlag = FALSE;
+	}
+	else
+	{
+	  IsGasSensorConnectedFlag = TRUE;
+	}
+	
+	*OffSet = AdcData + ZeroOffSetData;
 }
 
 //指拨零点值更新
@@ -18,7 +29,7 @@ void GasSensorOffSetData_Update(uint16_t* PresentData, uint16_t AdcData, MC_Erro
 {
   static uint16_t Array[50];
 	static TrueOrFalse_Flag_Struct_t IsArrayFullFalg = FALSE;
-	uint8_t i = 0;
+	static uint8_t i = 0;
 	uint16_t TempData;
 	static uint32_t ErrorDelayTimeCnt = 0;
 	
@@ -39,25 +50,31 @@ void GasSensorOffSetData_Update(uint16_t* PresentData, uint16_t AdcData, MC_Erro
 		if(TempData < *PresentData)
 		{
 		  //更新零点值
-			*PresentData = TempData;
+			if(TempData > 300)//避免线缆松脱导致零点变为异常值
+			{
+		  	*PresentData = TempData;
+			}
 		}
 	}
 	//判断零点是否超出范围
-	if(*PresentData <= 1500)
-	{
-	  ErrorDelayTimeCnt = HAL_GetTick();
-		p_MC_ErrorCode->ERROR_Bit.Fault_GasSensor = 0;
-	}
-	if((HAL_GetTick() - ErrorDelayTimeCnt) > 10000)
+	if(p_MC_ErrorCode->ERROR_Bit.Fault_GasSensor == 0)
 	{
-	  p_MC_ErrorCode->ERROR_Bit.Fault_GasSensor = 1;
-		//记录故障日志
-		MC_ErrorLogSaveInfo.NotesInfo1 = *PresentData;
-		ErrorLogSave_Update(&MC_ErrorLogSaveInfo);
-		IsErrorLogSaveInfoUpdateFlag = TRUE;
-		//存储故障次数
-		MC_RunLog2.GasSensor_FaultCnt++;
-		RunLogSaveIndex = 2;
+	  if(*PresentData <= 1500)
+		{
+		  ErrorDelayTimeCnt = HAL_GetTick();
+		}
+		if((HAL_GetTick() - ErrorDelayTimeCnt) > 10000)
+		{
+			p_MC_ErrorCode->ERROR_Bit.Fault_GasSensor = 1;
+			//记录故障日志
+			MC_ErrorLogSaveInfo.NotesInfo1 = 1;
+			MC_ErrorLogSaveInfo.NotesInfo2 = *PresentData;
+			ErrorLogSave_Update(&MC_ErrorLogSaveInfo);
+			IsErrorLogSaveInfoUpdateFlag = TRUE;
+			//存储故障次数
+			MC_RunLog2.GasSensor_FaultCnt++;
+			RunLogSaveIndex = 2;
+		}	 
 	}
 }
 

+ 1 - 1
User/Src/key_driver.c

@@ -1,6 +1,6 @@
 #include "key_driver.h"
 
-TrueOrFalse_Flag_Struct_t IsBreakTrig_Flag;
+TrueOrFalse_Flag_Struct_t IsBreakTrig_Flag = FALSE;
 TrueOrFalse_Flag_Struct_t IsGearSensorTrig_Flag = FALSE;//ąäËŮ´Ť¸ĐĆ÷ąęÖž
 
 Key_TypeDef Key_Break_Left;

+ 5 - 1
User/Src/protect_check.c

@@ -52,6 +52,7 @@ void MC_Protect_UnderVoltage_Process(uint16_t BusVoltage, uint8_t DesignVoltage,
 		{
 			p_MC_ErrorCode->ERROR_Bit.Protect_UnderVoltage = 1;
 			//记录故障日志
+			MC_ErrorLogSaveInfo.NotesInfo1 = BusVoltage;
 			ErrorLogSave_Update(&MC_ErrorLogSaveInfo);
 			IsErrorLogSaveInfoUpdateFlag = TRUE;
 			//存储故障次数
@@ -393,7 +394,10 @@ void MC_Protect_OverCurrent_Process(FlagStatus* OverCurrentTrigFlag, MC_ErrorCod
 void MC_Protect_Check_Process(void)
 {
 	//低压保护检测
-	MC_Protect_UnderVoltage_Process(MC_RunInfo.BusVoltage, MC_MotorParam.Rate_Voltage, ((MC_ConfigParam1.UV_Protect_TH == 0) ? 3100 : MC_ConfigParam1.UV_Protect_TH), &MC_ErrorCode);
+	  MC_Protect_UnderVoltage_Process(((IsComOK_BMS.IsOK_Flag == TRUE) ? BMS_RunInfo.Voltage : MC_RunInfo.BusVoltage), 
+	                                MC_MotorParam.Rate_Voltage, 
+	                                ((MC_ConfigParam1.UV_Protect_TH == 0) ? 3100 : MC_ConfigParam1.UV_Protect_TH), 
+	                                &MC_ErrorCode);
 
 	//过压保护检测
 	MC_Protect_OverVoltage_Process(MC_RunInfo.BusVoltage, MC_MotorParam.Rate_Voltage, &MC_ErrorCode);

+ 18 - 17
User/Src/remain_distance.c

@@ -462,7 +462,7 @@ 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)
+uint8_t Battery_SocCal(uint16_t Voltage_mV)
 {
 	
   static uint32_t PeriodTimeCnt = 0;
@@ -485,25 +485,26 @@ uint8_t Battery_SocCal(uint16_t Voltage_mV, uint16_t Current_mA)
 	if((HAL_GetTick() - PeriodTimeCnt) > 2000)//计算周期2s
 	{
 		PeriodTimeCnt = HAL_GetTick();
-	  if(Current_mA < 2000)//电流小于2A
+		for(i=0;i<num;i++)
 		{
-			for(i=0;i<num;i++)
+			if(battery_VoltageQuantity[i][0] <=  Voltage)
 			{
-				if(battery_VoltageQuantity[i][0] <=  Voltage)
-				{
-					batteryRemainQ = batteryTotalQ - battery_VoltageQuantity[i][1] ;    //A*s
-					break;
-				}
-				else//电池电压低于最小值
-				{
-					batteryRemainQ = 0;
-				}
+				batteryRemainQ = batteryTotalQ - battery_VoltageQuantity[i][1] ;    //A*s
+				break;
+			}
+			else//电池电压低于最小值
+			{
+				batteryRemainQ = 0;
 			}
-			Result = batteryRemainQ * 100 / batteryTotalQ;
-			if(Result>=Result_Pre) Result = Result_Pre;
-	  }	
+		}
+		Result = batteryRemainQ * 100 / batteryTotalQ;
+		if(Result < 100)//避免电量小范围波动,只做减小处理
+		{
+			if((Result >= Result_Pre) && ((Result - Result_Pre) < 10))
+			{
+				Result = Result_Pre;
+			}
+		}
 	}
 	return Result;
 }
-
-

+ 32 - 7
User/Src/tasks.c

@@ -80,8 +80,10 @@ void HAL_SYSTICK_Callback(void)
 	{
 	  TimeCnt_10ms = 0;
 		//更新指拨零点值
-	  GasSensorOffSetData_Update(&GasSensor_OffSet, ADC1_Result[ADC1_RANK_GAS], &MC_ErrorCode);
-
+		if(IsGasSensorConnectedFlag == TRUE)
+		{
+			GasSensorOffSetData_Update(&GasSensor_OffSet, ADC1_Result[ADC1_RANK_GAS], &MC_ErrorCode);
+		}
 	}
 	
 	//50ms任务
@@ -141,7 +143,6 @@ void MC_RunInfo_Update(void)
 	  PeriodTimeCnt = HAL_GetTick();
 		
 		//计算电功率
-//		MC_RunInfo.Power = (uint16_t)((uint32_t)(MC_RunInfo.BusCurrent / 100 * MC_RunInfo.BusVoltage / 100) / 100) / 2;
 		MC_RunInfo.Power = ((uint32_t)MC_RunInfo.BusCurrent) * 25 / (MC_ConfigParam1.CurrentLimit*100);
 		MC_RunInfo.Power = (MC_RunInfo.Power < 20) ? 0 : MC_RunInfo.Power;
 		
@@ -158,7 +159,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;
@@ -533,9 +534,11 @@ uint8_t MC_CadenceLimit_Cal(uint8_t Cadence, uint16_t Current, uint8_t T_Coil)
 }
 
 //接收到关机指令处理
-void PowerOff_Process(void)
+void PowerOff_Process(TrueOrFalse_Flag_Struct_t ReturnEnable)
 {
   static FlagStatus SaveFlag = RESET;
+	static uint32_t PeriodTimeCnt = 0;
+	static uint8_t Count = 0;
 	
 	//关闭助力档位
 	MC_ControlCode.GearSt = MC_GearSt_OFF;
@@ -557,6 +560,28 @@ void PowerOff_Process(void)
 	
 	//发送关机就绪信号
 	SendData(ID_MC_BC, MODE_REPORT, 0x1305, (uint8_t*)"READY");
+	
+	//等待关机
+	if(ReturnEnable == TRUE)
+	{
+	  return;
+	}
+	else
+	{
+		PeriodTimeCnt = HAL_GetTick();
+		Count = 0;
+	  while(Count < 50)
+		{
+		  if((HAL_GetTick() - PeriodTimeCnt) > 100)
+			{
+			  PeriodTimeCnt = HAL_GetTick();
+				Count++;
+				#if DEBUG
+			  HAL_IWDG_Refresh(&hiwdg);
+			  #endif
+			}
+		}
+	}
 }
 
 //CAN设备PBU、HMI、BMS通信状态检测处理
@@ -704,7 +729,7 @@ void MC_DeviceCheck(Device_CheckInfo_Struct_t* p_Device, MC_ErrorCode_Struct_t*
 		}
 		case 2://校验按键
 		{
-		   p_ErrorCode->ERROR_Bit.Fault_BMS_Check = 1;
+		   p_ErrorCode->ERROR_Bit.Fault_PBU_Check = 1;
 			Send_CanID = ID_MC_TO_BMS;
 			Send_MAC_ID_Cmd = 0x5100;
 			Send_Code_Cmd = 0x5200;
@@ -712,7 +737,7 @@ void MC_DeviceCheck(Device_CheckInfo_Struct_t* p_Device, MC_ErrorCode_Struct_t*
 		}
 		case 3://校验仪表
 		{
-		  p_ErrorCode->ERROR_Bit.Fault_BMS_Check = 1;
+		  p_ErrorCode->ERROR_Bit.Fault_HMI_Check = 1;
 			Send_CanID = ID_MC_TO_BMS;
 			Send_MAC_ID_Cmd = 0x7100;
 			Send_Code_Cmd = 0x7200;

+ 4 - 4
User/Src/var.c

@@ -229,7 +229,7 @@ const nGearParam_Struct_t GearParam_Default_TURBO_Volans =
 const nGearParam_Struct_t GearParam_Default_SMART_Volans =
 {
   (uint16_t)0,
-	(uint16_t)980,
+	(uint16_t)500,
 	(uint16_t)100,
 	(uint16_t)2100,
 	(uint8_t)4,
@@ -290,7 +290,7 @@ const nGearParam_Struct_t GearParam_Default_TURBO_Volans_Plus =
 const nGearParam_Struct_t GearParam_Default_SMART_Volans_Plus =
 {
   (uint16_t)0,
-	(uint16_t)960,
+	(uint16_t)500,
 	(uint16_t)100,
 	(uint16_t)2100,
 	(uint8_t)4,
@@ -489,8 +489,8 @@ void Var_Init(void)
 		
 	//MC版本信息初始化,Mode和SN从EEPROM读取
   strncpy(MC_VerInfo.HW_Version, (char*)"QD007H.         ", 16);
-	strncpy(MC_VerInfo.FW_Version, (char*)"V2r1r6_20201231.", 16);
-	strncpy(Firmware_Special, (char*)"TC011052-MCK201001-V0r2.        ", 32);
+	strncpy(MC_VerInfo.FW_Version, (char*)"V2r1r6_20210301.", 16);
+	strncpy(Firmware_Special, (char*)"TC011052-MCK201001-V1r0.        ", 32);
 		
 	//电机型号
 	strncpy(MC_VerInfo.Mode, (char*)"VS7500.         ", 16);

+ 14 - 0
修改说明.txt

@@ -370,3 +370,17 @@ V2.1.6_20201230 TC011052-MCK201001-V0r2
 2、ODO里程在100km以内,第一次清除Trip时,同时清除ODO里程,利用UserString1作为存储标志;
 3、版本号:V2.1.6_20201231 客户特性说明:TC011052-MCK201001-V0r2
 
+V2.1.6_20210301 TC011052-MCK201001-V1r0
+1、上电时增加转把是否接入的检测,解决上电时未接入转把,上电后接入转把会启动电机的问题;
+2、低压保护检测增加根据BMS通信状态采用BMS的电压或电机的电压;
+3、修改临时掉电数据存储的地址,单独开一页(1024B)空间,避免初始化时MC_Init()前执行EEPROM_Flash_DataUpdate时,擦除完1KFlash后系统断电,导致Flash中数据丢失的问题;
+4、修改PowerOff_Process函数,在接收到关机指令时,延迟5s退出,按键和BMS发送关机指令后延迟1s关闭ACC和电源;
+5、调整SMART档位助力;
+6、修改力矩传感器故障检测的条件为踩踏1圈;
+7、版本号:V2.1.6_20210301 客户特性说明:TC011052-MCK201001-V1r0
+
+
+
+
+
+