Kaynağa Gözat

MC_VS7500-TC033001-MS2001-V2.1.5.0.2_20210115
1、修改MCU温度计算方式,开始时根据NTC校准初始温度,后面按4.3mV/℃斜率计算;
2、修改踏频计算方式,反向踩踏时不计算踏频;
3、优化Gearsensor和刹把信号的采集,避免抖动引起误停机;
4、接收到上位机系统清除指令时,只清除EEPROM前4个字节,缩短时间;
5、取消踏频模式,该模式无助力。

dail.zhou 4 yıl önce
ebeveyn
işleme
f8df1037ec

+ 27 - 32
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;
@@ -488,21 +496,8 @@ void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
 	//更新指拨
 	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 = 84ms
+	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-TC033001-MS2001-V2.1.5.0.2_20210115.bin


BIN
MDK-ARM/bin/QD007A_CTL_APP.bin


+ 0 - 1
User/Inc/cadence_sensor.h

@@ -38,7 +38,6 @@ extern const uint8_t BackwardDir_EncoderData[4];
 
 //̤ƵֵÂ˲¨»º´æ
 extern MC_CadenceResult_Struct_t MC_CadenceResult;
-extern uint16_t MC_Cadence_Array[10];
 
 extern uint8_t Cadence_ReadHallState(void);
 extern void CadenceSensor_GPIO_Init(void);

+ 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;//变速传感器标志

+ 2 - 1
User/Inc/motor_control.h

@@ -94,7 +94,8 @@ extern FlagStatus MC_StarFlag;
 		                                      MC_CalParam_Back.Foc_Flag = (FlagStatus)~MC_CalParam.Foc_Flag;\
 	                                      	MC_CalParam_Back.Ref_Torque = ~MC_CalParam.Ref_Torque;\
 	                                      	MC_CalParam_Back.Ref_Speed = ~MC_CalParam.Ref_Speed; }		
-
+#define CADENCE_MODE_ENABLE 0
+																					
 /*****************************º¯ÊýÉùÃ÷******************************/
 extern void MC_SensorInit(void);
 extern void MC_Init(void);

+ 0 - 1
User/Src/cadence_sensor.c

@@ -7,7 +7,6 @@ const uint8_t BackwardDir_EncoderData[4] = {1,3,0,2};//
 
 //全局变量定义
 MC_CadenceResult_Struct_t MC_CadenceResult = {0, MC_Cadence_Stop, TRUE, 0};
-uint16_t MC_Cadence_Array[10] = {0};
 
 /**************************局部函数定义*************************/
 uint16_t torqueFilteredThroughCadence(uint16_t torque_temp, uint8_t modeFlag);

+ 3 - 1
User/Src/can_process.c

@@ -254,6 +254,7 @@ void DataProcess(uint16_t ID, uint8_t Mode, uint16_t Cmd, uint8_t* Data)
 				  ReadDataFromEEPROM_Flash(EEPROM_FLASH_ADDR_MODE, (uint8_t*)MC_VerInfo.Mode, 16);
 					ReadDataFromEEPROM_Flash(EEPROM_FLASH_ADDR_SN, (uint8_t*)MC_VerInfo.SN_Num, 16);
 					SendData(ID_MC_BC, MODE_REPORT, 0x1240, (uint8_t*)MC_VerInfo.Mode);
+					SendData(ID_MC_BC, MODE_REPORT, 0x1720, (uint8_t*)Firmware_Special);
 					break;
 				}
 				
@@ -290,6 +291,7 @@ void DataProcess(uint16_t ID, uint8_t Mode, uint16_t Cmd, uint8_t* Data)
 				  ReadDataFromEEPROM_Flash(EEPROM_FLASH_ADDR_MODE, (uint8_t*)MC_VerInfo.Mode, 16);
 					ReadDataFromEEPROM_Flash(EEPROM_FLASH_ADDR_SN, (uint8_t*)MC_VerInfo.SN_Num, 16);
 					SendData(ID_MC_BC, MODE_REPORT, 0x1240, (uint8_t*)MC_VerInfo.Mode);
+					SendData(ID_MC_BC, MODE_REPORT, 0x1720, (uint8_t*)Firmware_Special);
 					break;
 				}
 				case 0x3100://²éѯµç»úÅäÖòÎÊý
@@ -512,7 +514,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");

+ 45 - 20
User/Src/key_driver.c

@@ -8,44 +8,61 @@ 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,26 +70,34 @@ 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 +163,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 +177,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;

+ 3 - 1
User/Src/motor_control.c

@@ -169,7 +169,9 @@ MC_AssistRunMode_Struct_t MC_JudgeAsistRunMode_Process(MC_GearSt_Struct_t GearSt
 			//쏵흙劫틉친駕
 			else if((GearSt & 0xF0) == 0x10)
 			{
-			  MC_AssistRunMode_Result = MC_AssistRunMode_CADENCE;
+			  #if CADENCE_MODE_ENABLE
+				MC_AssistRunMode_Result = MC_AssistRunMode_CADENCE;
+				#endif
 			}
 			//쏵흙제앤친駕
 			else

+ 15 - 3
User/Src/tasks.c

@@ -82,7 +82,20 @@ void HAL_SYSTICK_Callback(void)
 	if(TimeCnt_10ms >= 10)
 	{
 	  TimeCnt_10ms = 0;
-
+    
+	  //踏频计算滤波
+		static int32_t MC_Cadence_Filt_Sum = 0;
+		if(MC_CadenceResult.Cadence_Dir == MC_Cadence_Forward)
+		{
+	    MC_Cadence_Filt_Sum += ((MC_CadenceResult.Cadence_Data << 10) - MC_Cadence_Filt_Sum) >> 7;
+			MC_RunInfo.Cadence = (uint16_t)(MC_Cadence_Filt_Sum >> 10);
+		}
+		else
+		{
+		  MC_RunInfo.Cadence = 0;
+      MC_Cadence_Filt_Sum = 0;
+		}
+		MC_RunInfo.Cadence = (MC_RunInfo.Cadence <= 10) ? 0 : MC_RunInfo.Cadence;
 	}
 	
 	//50ms任务
@@ -99,8 +112,7 @@ void HAL_SYSTICK_Callback(void)
 	if(TimeCnt_100ms >= 100)
 	{
 	  TimeCnt_100ms = 0;
-	  //踏频计算滑动均值滤波
-	  MC_RunInfo.Cadence = MovingAverageFilter(MC_CadenceResult.Cadence_Data, MC_Cadence_Array, sizeof(MC_Cadence_Array) / 2);
+		
 	}
 	
 	//1000ms任务

+ 2 - 2
User/Src/var.c

@@ -489,8 +489,8 @@ 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(Firmware_Special, (char*)"TC033001-MS2001-V0r1.           ", 32);
+	strncpy(MC_VerInfo.FW_Version, (char*)"V2r1r5_20210115.", 16);
+	strncpy(Firmware_Special, (char*)"TC033001-MS2001-V0r2.           ", 32);
 		
 	//电机型号
 	strncpy(MC_VerInfo.Mode, (char*)"VL6500 & VS7500.", 16);

+ 7 - 0
修改说明.txt

@@ -361,6 +361,13 @@ V2.1.5_20200903
 2、踏频模式还原为以前的力矩控制方式;
 3、指拨模式去掉低踏频限流。
 
+MC_VS7500-TC033001-MS2001-V2.1.5.0.2_20210115
+1、修改MCU温度计算方式,开始时根据NTC校准初始温度,后面按4.3mV/℃斜率计算;
+2、修改踏频计算方式,反向踩踏时不计算踏频;
+3、优化Gearsensor和刹把信号的采集,避免抖动引起误停机;
+4、接收到上位机系统清除指令时,只清除EEPROM前4个字节,缩短时间;
+5、取消踏频模式,该模式无助力。
+