Selaa lähdekoodia

V3.2.3_20201203
1、调整MCU温度采集的方式,开机时根据PCB上的NTC进行校准作为初始温度,后面按照斜率4.3mV/度进行计算;
2、速度传感器信号增加限值处理,避免较大值出现引起99.9km/h;
2、车速停止时,清零均值滤波数组,避免第一个信号会有速值;
3、增加软件特殊性字符串和相关协议,发送版本信息同时发出;
4、收到系统清除指令时,EEPROM只清除前面4个字节,缩短时间,解决越南测工机报错的问题;
5、修改刹车和GearSensor信号的检测方法,增加延时,避免信号抖动引起异常停机;
6、版本号:V3.2.3_20201203。

dail.zhou 4 vuotta sitten
vanhempi
sitoutus
08e55e8406

+ 26 - 31
Core/Src/adc.c

@@ -441,22 +441,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;
 	}
 	
 	//更新母线电压 
@@ -464,16 +482,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;
@@ -587,19 +595,6 @@ void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
 	Temp_32 = (Temp_32 <= 0) ? 0 : Temp_32;
 	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数据滑动滤波

+ 7 - 1
Core/Src/gpio.c

@@ -151,6 +151,7 @@ void Disable_PwmGpio_Out(void)
 void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
 {
 	static uint32_t SignalTrigCount = 0;
+	static uint32_t DiffTime_ms_Old = 0;
 	
 	if(GPIO_Pin == SPEED_SENSOR_Pin)
 	{
@@ -159,14 +160,19 @@ void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
 		if(MC_SpeedSensorData.IsStopFlag == TRUE)
 		{
 		  MC_SpeedSensorData.TrigSysTime = HAL_GetTick();
-			MC_SpeedSensorData.DiffTime_ms = 0;
+			MC_SpeedSensorData.DiffTime_ms = 0xFFFFFFFF;
 			MC_SpeedSensorData.IsStopFlag = FALSE;
 		}
 		else
 		{
 		  MC_SpeedSensorData.DiffTime_ms = HAL_GetTick() - MC_SpeedSensorData.TrigSysTime;
+			if(MC_SpeedSensorData.DiffTime_ms < 75)//限制车速测量最高值,抗干扰,3600/0.075*2.19/1000 = 105km/h
+			{
+			  MC_SpeedSensorData.DiffTime_ms = DiffTime_ms_Old;
+			}
 			MC_SpeedSensorData.TrigSysTime = HAL_GetTick();
 		}
+		DiffTime_ms_Old = MC_SpeedSensorData.DiffTime_ms;
 		//车轮圈数更新
 		SignalTrigCount++;
 		MC_SpeedSensorData.WheelTurnCount = SignalTrigCount / ((MC_ConfigParam1.SpeedSensorPoles == 0) ? 1: MC_ConfigParam1.SpeedSensorPoles);

BIN
MDK-ARM/bin/MC_TTKZ010A_V3.2.3_20201203.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 - 0
User/Inc/math_tools.h

@@ -24,4 +24,5 @@ extern int16_t accDecProcess(int16_t V_Set,	\
 											int32_t* V_SetMiddle);
 extern uint16_t Standard_deviation_aver(uint16_t *data,uint8_t len, uint16_t *pAver);
 extern uint8_t CheckArrayIs0(uint8_t* Data, uint16_t Len);
+extern void ArrayFillZero(uint16_t* Array, uint16_t Length);
 #endif

+ 1 - 1
User/Inc/speed_sensor.h

@@ -21,6 +21,6 @@ extern MC_SpeedSensorData_Struct_t MC_SpeedSensorData;
 extern uint16_t MC_Speed_Array[10];
 
 extern void SpeedSensor_GPIO_Init(void);
-extern void SpeedSensor_Process(MC_SpeedSensorData_Struct_t* MC_SpeedSensorData, uint16_t* AvgResult, uint8_t WheelSize, uint8_t Poles);
+void SpeedSensor_Process(MC_SpeedSensorData_Struct_t* p_MC_SpeedSensorData, uint16_t* AvgResult, uint8_t WheelSize, uint8_t Poles);
 extern void SpeedCal_ByCadence(uint16_t CadenceData, uint16_t* SpeedData, uint8_t T_Front, uint8_t T_Tail, uint16_t WheelSize, uint16_t* BikeSpeed);
 #endif

+ 1 - 0
User/Inc/var.h

@@ -414,6 +414,7 @@ typedef struct
 extern MC_RunInfo_Struct_t MC_RunInfo;
 extern MC_ErrorCode_Struct_t MC_ErrorCode;
 extern MC_VerInfo_Struct_t MC_VerInfo;
+extern char Firmware_Special[32];
 extern OnLine_Status_Struct_t DeviceOnLine_Status;
 extern BMS_RunInfo_Struct_t BMS_RunInfo;
 extern Device_CheckInfo_Struct_t BMS_CheckInfo;

+ 4 - 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://查询电机配置参数
@@ -365,6 +367,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 0x1300://查询自定义字符串1
@@ -514,7 +517,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;

+ 9 - 0
User/Src/math_tools.c

@@ -387,3 +387,12 @@ uint8_t CheckArrayIs0(uint8_t* Data, uint16_t Len)
 	return 0;
 }
 
+/*Ęý×éĚîłä0*/
+void ArrayFillZero(uint16_t* Array, uint16_t Length)
+{
+  uint16_t i;
+	for(i=0; i<Length; i++)
+	{
+	  Array[i] = 0;
+	}
+}

+ 1 - 0
User/Src/speed_sensor.c

@@ -74,6 +74,7 @@ void SpeedSensor_Process(MC_SpeedSensorData_Struct_t* p_MC_SpeedSensorData, uint
 		{
 			p_MC_SpeedSensorData->Speed_Data = 0;
 			*AvgResult = 0;
+			ArrayFillZero(FiltTemp, sizeof(FiltTemp) >> 1);
 			p_MC_SpeedSensorData->DiffTime_ms = 0xFFFFFFFF;
 			return;
 		}

+ 3 - 1
User/Src/var.c

@@ -4,6 +4,7 @@
 MC_RunInfo_Struct_t MC_RunInfo;                           //MC运行信息
 MC_ErrorCode_Struct_t MC_ErrorCode;                       //MC故障代码
 MC_VerInfo_Struct_t MC_VerInfo;                           //MC版本信息
+char Firmware_Special[32];                                //MC软件版本特性说明
 OnLine_Status_Struct_t DeviceOnLine_Status;               //设备在线检测结果
 BMS_RunInfo_Struct_t BMS_RunInfo;                         //BMS运行信息
 Device_CheckInfo_Struct_t BMS_CheckInfo;                  //BMS授权校验
@@ -489,7 +490,8 @@ void Var_Init(void)
 		
 	//MC版本信息初始化,Mode和SN从EEPROM读取
   strncpy(MC_VerInfo.HW_Version, (char*)"TT_KZ_010D.     ", 16);
-	strncpy(MC_VerInfo.FW_Version, (char*)"V3r2r2_20201111.", 16);
+	strncpy(MC_VerInfo.FW_Version, (char*)"V3r2r3_20201203.", 16);
+	strncpy(Firmware_Special, (char*)"TC011000-MS0000-V0r0.           ", 32);
 	
 	//电机型号
 	strncpy(MC_VerInfo.Mode, (char*)"PG8000 & PSX000.", 16);

+ 8 - 2
修改说明.txt

@@ -330,8 +330,14 @@ V3.2.2_20201111
 1、修改Smart档位的助力参数;
 2、版本号:V3.2.1_20201111
 
-
-
+V3.2.3_20201203
+1、调整MCU温度采集的方式,开机时根据PCB上的NTC进行校准作为初始温度,后面按照斜率4.3mV/度进行计算;
+2、速度传感器信号增加限值处理,避免较大值出现引起99.9km/h;
+2、车速停止时,清零均值滤波数组,避免第一个信号会有速值;
+3、增加软件特殊性字符串和相关协议,发送版本信息同时发出;
+4、收到系统清除指令时,EEPROM只清除前面4个字节,缩短时间,解决越南测工机报错的问题;
+5、修改刹车和GearSensor信号的检测方法,增加延时,避免信号抖动引起异常停机;
+6、版本号:V3.2.3_20201203。