Forráskód Böngészése

2.1.5_20201207 TC013054-MB2001-V1r0
1、修改MCU温度采集方式,开始时根据NTC校准初始值,后面按照4.3mV/度进行计算;
2、优化刹车和GearSensor信号检测,避免信号抖动导致误停机;
3、系统清除指令,只清楚EEPROM前4个Flag字节,缩短擦除时间;
4、软件版本:2.1.5_20201207 特性说明:TC013054-MB2001-V1r0

dail.zhou 4 éve
szülő
commit
0253505ffc

+ 26 - 30
Core/Src/adc.c

@@ -416,22 +416,40 @@ void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
 	int32_t Temp_32;
 	static int32_t BusVoltageFltSum = 0;
 	static int32_t IdcFltSum = 0;
+	static uint16_t T_Filt_Cnt = 0;
 	static uint32_t T_Coil_Sum = 0;
-	static uint16_t T_Coil_FiltCnt = 0;
 	static uint32_t T_PCB_Sum = 0;
-	static uint16_t T_PCB_FiltCnt = 0;
 	static uint32_t T_MCU_Sum = 0;
-	static uint16_t T_MCU_FiltCnt = 0;
+	static TrueOrFalse_Flag_Struct_t T_MCU_Init_Flag = FALSE;
+	static uint8_t T_MCU_Init = 0;
+	static uint16_t T_MCU_Init_AD = 0;
 	static int32_t GasSensorFltSum = 0;
 	
-	//更新PCB温度
+	//更新PCB温度,绕组温度,MCU温度
 	T_PCB_Sum += ADC1_Result[ADC1_RANK_NTC_PCB];
-	T_PCB_FiltCnt++;
-	if(T_PCB_FiltCnt >= 2048)
+	T_Coil_Sum += ADC1_Result[ADC1_RANK_NTC_COIL];
+	T_MCU_Sum += ADC1_Result[ADC1_RANK_TP_MCU];
+	T_Filt_Cnt++;
+	if(T_Filt_Cnt >= 3000)
 	{
-	  MC_RunInfo.T_PCB = GetNTCTempera(T_PCB_Sum >> 11);
+	  //计算PCB温度
+		MC_RunInfo.T_PCB = GetNTCTempera(T_PCB_Sum / 3000);
 		T_PCB_Sum = 0;
-		T_PCB_FiltCnt = 0;
+		//计算绕组温度
+		MC_RunInfo.T_Coil = GetNTCTempera(T_Coil_Sum / 3000);
+		T_Coil_Sum = 0;
+		//MCU温度根据PCB初始温度进行校准
+		if(T_MCU_Init_Flag == FALSE)
+		{
+		  T_MCU_Init = MC_RunInfo.T_PCB;//校准时温度
+			T_MCU_Init_AD = T_MCU_Sum / 3000;//校准时AD值
+			T_MCU_Init_Flag = TRUE;
+		}
+		//计算MCU温度 
+    MC_RunInfo.T_MCU = T_MCU_Init + ((int16_t)(T_MCU_Init_AD - T_MCU_Sum / 3000) * 192 >> 10);//4.3mV/度, 3300 / 4095 / 4.3 * 1024 = 192
+		T_MCU_Sum = 0;
+		
+		T_Filt_Cnt = 0;
 	}
 	
 	//更新母线电压 
@@ -439,16 +457,6 @@ void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
 	MC_RunInfo.BusVoltage = (uint32_t)((BusVoltageFltSum >> 10) * 18382) >> 10; //3300 * 1047 / (4095 * 47)
 	MC_RunInfo.BusVoltage += (MC_RunInfo.BusCurrent >> 7) * 26; //根据母线电流和估算的线阻进行补偿, 补偿电阻 0.2 * 128 = 25.6
 	
-	//更新绕组温度
-	T_Coil_Sum += ADC1_Result[ADC1_RANK_NTC_COIL];
-	T_Coil_FiltCnt++;
-	if(T_Coil_FiltCnt >= 2048)
-	{
-		MC_RunInfo.T_Coil = GetNTCTempera(T_Coil_Sum >> 11);
-		T_Coil_Sum = 0;
-		T_Coil_FiltCnt = 0;
-	}
-	
 	//更新母线电流
 	Temp_32 = (ADC1_Result[ADC1_RANK_CURRENT] - uw_current_offset) * 50000 >> 11;
 	Temp_32 = (Temp_32 <= 0) ? 0 : Temp_32;
@@ -491,18 +499,6 @@ void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
 	GasSensorFltSum += ((Temp_32 << 10) - GasSensorFltSum) >> 8;  //滤波延时0.33*256=85.3ms
 	ADC_SensorData.GasSensor = GasSensorFltSum >> 10;
 	
-	//更新MCU温度
-	T_MCU_Sum += ADC1_Result[ADC1_RANK_TP_MCU];
-	T_MCU_FiltCnt++;
-	if(T_MCU_FiltCnt >= 2048)
-	{
-	  Temp_32 = 3300 * (T_MCU_Sum >> 11) >> 12;
-	  Temp_32 = (int32_t)1430 - Temp_32;
-	  MC_RunInfo.T_MCU = (uint8_t)((Temp_32 * 238 >> 10) + 25 + 40);
-		T_MCU_Sum = 0;
-		T_MCU_FiltCnt = 0;
-	}
-	
 }
 
 //ADC1和ADC2数据滑动滤波

BIN
MDK-ARM/bin/MC_VS7500-TC013054-MB2001-V2.1.5.1.0_20201207.bin


BIN
MDK-ARM/bin/QD007A_CTL_APP.bin


+ 7 - 6
User/Inc/key_driver.h

@@ -13,13 +13,14 @@ typedef enum SwitchType
 //GPIO输入检测函数
 typedef struct              //缓冲区各变量,用于相关函数的参数
 {	
-	  GPIO_TypeDef* GPIOx;    //GPIOx
-		uint16_t  GPIO_Pin;			//GPIO_PIN_x
+	  GPIO_TypeDef* GPIOx;        //GPIOx
+		uint16_t  GPIO_Pin;			    //GPIO_PIN_x
 	  SwitchType_Struct_t SwitchType;  //开关类型
-		uint8_t  Trg;						//按键触发标志
-		uint8_t  Cont;					//计数
-	  uint8_t PressFlasg;     //按键按下标识
-	  uint16_t TimeCnt;       //按键计时
+		uint8_t  Trg;						    //按键触发标志
+		uint8_t  Cont;					    //计数
+	  uint8_t PressFlasg;         //按键按下标识
+	  uint32_t TimeCnt;           //按键长按计时
+	  uint32_t AutoReleaseTimeCnt;//自动释放计时
 }Key_TypeDef;
 
 extern TrueOrFalse_Flag_Struct_t IsGearSensorTrig_Flag;//变速传感器标志

+ 1 - 1
User/Src/can_process.c

@@ -512,7 +512,7 @@ void DataProcess(uint16_t ID, uint8_t Mode, uint16_t Cmd, uint8_t* Data)
 				{
 				  if(strncmp("CLEAR", (char*)Data, DataLength) == 0)
 					{
-					  EEPROM_24C02_ClearData(&I2C_Handle_EEPROM, EEPROM_24C02_ADDR_FLAG, EEPROM_24C02_ADDR_END, 0xFF);
+					  EEPROM_24C02_ClearData(&I2C_Handle_EEPROM, EEPROM_24C02_ADDR_FLAG, EEPROM_24C02_ADDR_FLAG + 4, 0xFF);
 						EEPROM_Flash_Erase(EEPROM_FLASH_BEGIN_ADDRESS, EEPROM_FLASH_END_ADDRESS);
 						EEPROM_Flash_Erase(LOG_ADDRESS_BEGIN, LOG_ADDRESS_END);
 						SendData(ID_MC_TO_CDL, MODE_REPORT, 0xA903, (uint8_t*)"ACK");

+ 44 - 22
User/Src/key_driver.c

@@ -8,44 +8,60 @@ Key_TypeDef Key_Break_Right;
 Key_TypeDef Key_GearSensor;
 
 /**********************局部函数定义************************/
-void _GPIO_Read(Key_TypeDef* Key)
+void _GPIO_Read(Key_TypeDef* Key, uint8_t TrigNum)
 {
   uint8_t ReadData;
 	
+	//读按键状态
 	if(HAL_GPIO_ReadPin(Key->GPIOx, Key->GPIO_Pin) == GPIO_PIN_RESET)
 	{
-	  if(Key->SwitchType == NormallyOpen)
+	  if(Key->SwitchType == NormallyOpen)//常开型开关
 		{
 			ReadData = 0x01;
 		}
-		else
+		else//常闭型开关
 		{
 		  ReadData = 0x00;
 		}
 	}
 	else
 	{
-	  if(Key->SwitchType == NormallyOpen)
+	  if(Key->SwitchType == NormallyOpen)//常开型开关
 		{
 			ReadData = 0x00;
 		}
-		else
+		else//常闭型开关
 		{
 		  ReadData = 0x01;
 		}
 	}
-	Key->Trg = ReadData & (ReadData ^ (Key->Cont));
+	
+	//触发标志
+	if(TrigNum == 1) //单极触发
+	{
+	  Key->Trg = ReadData & (ReadData ^ (Key->Cont));
+	}
+	else //双极触发
+	{
+	  Key->Trg = ReadData ^ (Key->Cont); 
+	}
 	Key->Cont = ReadData;
 }
 
-
-void Key_Check(Key_TypeDef* Key, uint32_t DelayTime, TrueOrFalse_Flag_Struct_t* Flag)
+void Key_Check(Key_TypeDef* Key, uint32_t DelayTime, uint32_t AutoReleaseDelayTime, FlagStatus UndoReleaseFlag, TrueOrFalse_Flag_Struct_t* Flag)
 {
-	_GPIO_Read(Key);
+	if(UndoReleaseFlag == RESET) //松开按键不释放信号,等待自动超时释放,此时AutoReleaseDelayTime不能设置为0
+	{
+	  _GPIO_Read(Key, 1);
+	}
+	else //松开按键释放信号
+	{
+	  _GPIO_Read(Key, 2);
+	}
+	
 	if(Key->Trg & 0x01)//表示有触发(下降沿)
 	{
 	  Key->PressFlasg  = 1;
-		*Flag = TRUE;//有效信号
 		Key->TimeCnt = HAL_GetTick();//计时赋初值
 	}
 	if(Key->PressFlasg == 1)//被触发一次
@@ -53,27 +69,33 @@ void Key_Check(Key_TypeDef* Key, uint32_t DelayTime, TrueOrFalse_Flag_Struct_t*
 	  if(Key->Cont == 0x00)//表示松开
 	  {
 			Key->TimeCnt = HAL_GetTick();
+			Key->AutoReleaseTimeCnt = HAL_GetTick();
 		  Key->PressFlasg = 0;
 			*Flag = FALSE;//松开释放信号
 	  }
+		else
+		{
+		  if((HAL_GetTick() - Key->TimeCnt) > DelayTime)
+			{
+				Key->TimeCnt = HAL_GetTick();
+		    Key->PressFlasg = 0;
+				*Flag = TRUE;			
+				Key->AutoReleaseTimeCnt = HAL_GetTick();//自动释放计时赋初值
+			}
+		}
 	}
-	if(*Flag == 1)//超时自动释放信号
+	if(*Flag == TRUE)//超时自动释放信号
 	{
-    if(DelayTime != 0) //超时设置值为0时不自动释放信号
+    if(AutoReleaseDelayTime != 0) //超时设置值为0时不自动释放信号
 		{
-			if((HAL_GetTick() - Key->TimeCnt) > DelayTime)	 
+			if((HAL_GetTick() - Key->AutoReleaseTimeCnt) > AutoReleaseDelayTime)	 
 			{
-				Key->TimeCnt = HAL_GetTick();
+				Key->AutoReleaseTimeCnt = HAL_GetTick();
 				Key->PressFlasg = 0;
 				*Flag = FALSE;//超时自动释放信号
 			}	
 		}	
 	}
-	else
-	{
-	  Key->TimeCnt = HAL_GetTick();
-	}
-	return;
 }
 
 /*****************************全局函数定义*****************************/
@@ -138,8 +160,8 @@ void Break_Check(TrueOrFalse_Flag_Struct_t* BreakFlag)
   static TrueOrFalse_Flag_Struct_t IsBreakTrig_Left_Flag = FALSE;//刹车标志
   static TrueOrFalse_Flag_Struct_t IsBreakTrig_Right_Flag = FALSE;//刹车标志
 	
-	Key_Check(&Key_Break_Left, 0, &IsBreakTrig_Left_Flag);   //被触发时认为有效信号,松开时释放
-	Key_Check(&Key_Break_Right, 0, &IsBreakTrig_Right_Flag); //被触发时认为有效信号,松开时释放
+	Key_Check(&Key_Break_Left, 100, 0, SET, &IsBreakTrig_Left_Flag);   //被长按100ms时认为有效信号,松开时释放
+	Key_Check(&Key_Break_Right, 100, 0, SET, &IsBreakTrig_Right_Flag); //被长按100ms时认为有效信号,松开时释放
 	
 	*BreakFlag = (TrueOrFalse_Flag_Struct_t)((uint8_t)IsBreakTrig_Left_Flag & (uint8_t)IsBreakTrig_Right_Flag);
 	
@@ -152,7 +174,7 @@ void Break_Check(TrueOrFalse_Flag_Struct_t* BreakFlag)
 //GearSensor检测函数
 void GearSensor_Check(TrueOrFalse_Flag_Struct_t *Flag)
 {
-	Key_Check(&Key_GearSensor, 1000, Flag);//被触发时认为有效信号,松开时释放或超时1000ms释放
+	Key_Check(&Key_GearSensor, 10, 1000, SET, Flag);//被长按10ms时认为有效信号,松开时释放或超时1000ms释放	
 	
 	#if 0
 	static uint8_t GearSensorFlag_Debug;

+ 1 - 1
User/Src/var.c

@@ -489,7 +489,7 @@ void Var_Init(void)
 		
 	//MC版本信息初始化,Mode和SN从EEPROM读取
   strncpy(MC_VerInfo.HW_Version, (char*)"QD007G.         ", 16);
-	strncpy(MC_VerInfo.FW_Version, (char*)"V2r1r5_20201202.", 16);
+	strncpy(MC_VerInfo.FW_Version, (char*)"V2r1r5_20201207.", 16);
 	strncpy(Firmware_Special, (char*)"TC013054-MB2001-V1r0.           ", 32);
 		
 	//电机型号

+ 5 - 1
修改说明.txt

@@ -350,7 +350,11 @@ V2.1.5_20200903
 1、修改版本号为V1.0,准备受控;
 2、软件版本:2.1.5_20201202 特性说明:TC013054-MB2001-V1r0
 
-
+2.1.5_20201207 TC013054-MB2001-V1r0
+1、修改MCU温度采集方式,开始时根据NTC校准初始值,后面按照4.3mV/度进行计算;
+2、优化刹车和GearSensor信号检测,避免信号抖动导致误停机;
+3、系统清除指令,只清楚EEPROM前4个Flag字节,缩短擦除时间;
+4、软件版本:2.1.5_20201207 特性说明:TC013054-MB2001-V1r0