Эх сурвалжийг харах

V2.1.6_20201023
1、调整MCU温度采集的方式,开机时根据PCB上的NTC进行校准作为初始温度,后面按照斜率4.3mV/度进行计算;
2、速度的计算,除了根据传感器和踏频两种方式外,增加了根据通信获取车轮转速的方式及骑行里程的统计,0x55-车轮触发,0x-AA踏频计算,0xEE-通讯获取车轮旋转周期;
3、限速临界点,改为从+1km/h开始衰减,到+2.2km/断电;
4、版本号:V2.1.6_20201023

dail.zhou 4 жил өмнө
parent
commit
0bcc3a7b42

+ 26 - 31
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;
@@ -490,19 +498,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数据滑动滤波

+ 11 - 6
Core/Src/main.c

@@ -236,20 +236,25 @@ int main(void)
 			MC_UartRxCheck_Process();
 			
 			//速度传感器采集及计算
-			if(MC_ConfigParam1.No_SpeedSensor_Flag != MC_SUPPORT_ENABLE)
-			{
-				SpeedSensor_Process(&MC_SpeedSensorData, &MC_RunInfo.BikeSpeed, MC_ConfigParam1.WheelSize + MC_ConfigParam1.WheelSizeAdj, (MC_ConfigParam1.SpeedSensorPoles == 0) ? 1: MC_ConfigParam1.SpeedSensorPoles);
-			}
-			else
+			if(MC_ConfigParam1.SpeedSignal == MC_SPEED_CADENCE_CAL) //0xAA, 根据踏频估算
 			{
 				if(MC_RunInfo.CadenceDir != MC_Cadence_Forward) //脚踏向后或停止时,采用电机转速
 				{
 					SpeedCal_ByCadence(MC_RunInfo.MotorSpeed / 11, &MC_SpeedSensorData.Speed_Data, MC_ConfigParam1.TeethNum_F, MC_ConfigParam1.TeethNum_B, MC_ConfigParam1.WheelSize + MC_ConfigParam1.WheelSizeAdj, &MC_RunInfo.BikeSpeed);			
 				}
-				else //脚踏向前时,取最高
+				else //脚踏向前时,取
 				{
 					SpeedCal_ByCadence((MC_RunInfo.MotorSpeed / 11 > MC_RunInfo.Cadence) ?  MC_RunInfo.MotorSpeed / 11 : MC_RunInfo.Cadence, &MC_SpeedSensorData.Speed_Data, MC_ConfigParam1.TeethNum_F, MC_ConfigParam1.TeethNum_B, MC_ConfigParam1.WheelSize + MC_ConfigParam1.WheelSizeAdj, &MC_RunInfo.BikeSpeed);			
 				}
+				
+			}
+			else if(MC_ConfigParam1.SpeedSignal == MC_SPEED_COMMUNICATION) //0xEE, 根据通信获取的车轮旋转周期
+			{
+			  SpeedCal_ByCommunication(&MC_SpeedSensorData, &MC_RunInfo.BikeSpeed, MC_ConfigParam1.WheelSize + MC_ConfigParam1.WheelSizeAdj);
+			}
+			else
+			{	
+				SpeedSensor_Process(&MC_SpeedSensorData, &MC_RunInfo.BikeSpeed, MC_ConfigParam1.WheelSize + MC_ConfigParam1.WheelSizeAdj, (MC_ConfigParam1.SpeedSensorPoles == 0) ? 1: MC_ConfigParam1.SpeedSensorPoles);
 			}
 			
 			//检测变速信号

BIN
MDK-ARM/bin/MC_VOLANS_V2r1r6_20201023_JustForTest.bin


BIN
MDK-ARM/bin/QD007A_CTL_APP.bin


+ 2 - 1
User/Inc/speed_sensor.h

@@ -21,6 +21,7 @@ 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);
+extern void SpeedCal_ByCommunication(MC_SpeedSensorData_Struct_t* p_MC_SpeedSensorData, uint16_t* AvgResult, uint8_t WheelSize);
 #endif

+ 8 - 1
User/Inc/var.h

@@ -132,6 +132,13 @@ typedef enum MC_SUPPORTFLAG
 	MC_SUPPORT_DISABLE = (uint8_t)0x55  //不支持
 }MC_SupportFlag_Struct_t;
 
+typedef enum MC_SPEED_SIGNAL
+{
+  MC_SPEED_CADENCE_CAL = (uint8_t)0xAA,  //根据踏频估算
+	MC_SPEED_WHEEL_TRIG = (uint8_t)0x55,   //根据车轮信号触发
+	MC_SPEED_COMMUNICATION = (uint8_t)0xEE //根据通信数据,车轮旋转1圈的时间
+}MC_SpeedSignal_Struct_t;
+
 //用户配置参数1,占用空间32bytes
 typedef struct
 {
@@ -155,7 +162,7 @@ typedef struct
 	UserAdjParam_Struct_t UserAdjParam_SMART;    //用户微调助力比增益和加速度增益,地址偏移22
   uint8_t SpeedSensorPoles;                    //速度传感器极数,地址偏移24
 	uint8_t CadenceStarNum;                      //踏频启动信号个数,地址偏移25
-	MC_SupportFlag_Struct_t No_SpeedSensor_Flag; //0x55-不支持,0x-AA支持,地址偏移26
+	MC_SpeedSignal_Struct_t SpeedSignal;         //0x55-车轮触发,0x-AA踏频计算,0xEE-通讯获取车轮旋转周期,地址偏移26
 	int8_t WheelSizeAdj;                         //周长微调值,地址偏移27
 	uint16_t UV_Protect_TH;                      //低压保护值,地址偏移28
 	uint8_t WalkMode_SpeedLimit;                 //推行模式限速,地址偏移30

+ 10 - 2
User/Src/can_process.c

@@ -8,6 +8,7 @@
 #include "tasks.h"
 #include "ctf_process.h"
 #include "log_save.h"
+#include "speed_sensor.h"
 
 /**********局部函数定义**********/
 uint8_t cd_ReadChar(CAN_Buf_TypeDef * ptCANRx, uint8_t ucNum)	 
@@ -225,10 +226,17 @@ void DataProcess(uint16_t ID, uint8_t Mode, uint16_t Cmd, uint8_t* Data)
 				}
 				case 0x3708://ECU控制指令
 				{
-				if(MC_WorkMode == MC_WorkMode_Run)
+			  	if(MC_WorkMode == MC_WorkMode_Run)
 					{
-					  memcpy(&MC_ControlCode.GearSt, Data, 2);
+					  //更新档位
+						memcpy(&MC_ControlCode.GearSt, Data, 2);
 					  Update_MC_ControlCode_Back();
+						//更新轮速,仅配置为通过通信获取车轮周期时更新
+						if(MC_ConfigParam1.SpeedSignal == MC_SPEED_COMMUNICATION)
+						{
+							MC_SpeedSensorData.DiffTime_ms = (Data[3] << 8) + Data[2];
+							MC_SpeedSensorData.IsTrigFlag = TRUE;
+						}
 					}			
 		      MC_RunInfo.GearSt = MC_ControlCode.GearSt;//当前助力档位更新
 					MC_RunInfo.LightSwitch = MC_ControlCode.LightSwitch;

+ 1 - 1
User/Src/fault_check.c

@@ -987,7 +987,7 @@ void MC_Fault_CadenceSensor_Process(uint16_t Torque, uint16_t BikeSpeed, MC_Erro
 void MC_Fault_Check_Process(void)
 {	
 	//ËÙ¶È´«¸ÐÆ÷¹ÊÕϼì²â
-	if((MC_WorkMode == MC_WorkMode_Run) && (MC_ConfigParam1.No_SpeedSensor_Flag != MC_SUPPORT_ENABLE))
+	if((MC_WorkMode == MC_WorkMode_Run) && (MC_ConfigParam1.SpeedSignal == MC_SPEED_WHEEL_TRIG))
 	{
 		MC_Fault_SpeedSensor_Process(MC_SpeedSensorData.IsStopFlag, MC_CadenceResult, MC_RunInfo.MotorSpeed, MC_CalParam.AssistRunMode, &MC_ErrorCode);
 	}

+ 2 - 2
User/Src/motor_control.c

@@ -993,7 +993,7 @@ MC_CalParam_Struct_t MC_AssistRunMode_Torque_Process(uint16_t SenorData, MC_Gear
 		}
 		
 		//随车速调节助力比
-		Torque_Temp = (uint16_t)((uint32_t)(Torque_Temp * Function_Linear_3Stage(MC_ConfigParam1.SpeedLimit * 10, 0, MC_ConfigParam1.SpeedLimit * 10, 52, MC_SpeedSensorData.Speed_Data)) >> 10);
+		Torque_Temp = (uint16_t)((uint32_t)(Torque_Temp * Function_Linear_3Stage(0, 0, MC_ConfigParam1.SpeedLimit * 10 + 10, 68, MC_SpeedSensorData.Speed_Data)) >> 10);
 			
     //助力输出		
 		MC_TorqueProcess_Param.TorqueRef = Torque_Temp;
@@ -1003,7 +1003,7 @@ MC_CalParam_Struct_t MC_AssistRunMode_Torque_Process(uint16_t SenorData, MC_Gear
 		}
 				
 		//升降速曲线计算
-		if( MC_SpeedSensorData.Speed_Data > (MC_ConfigParam1.SpeedLimit * 10) ) //限速处理
+		if( MC_SpeedSensorData.Speed_Data > (MC_ConfigParam1.SpeedLimit * 10 + 10) ) //限速处理
 		{
 			if((MC_TorqueProcess_Param.TorqueRef - MC_TorqueProcess_Param.TorqueRefEnd) > 2)
 			{

+ 55 - 0
User/Src/speed_sensor.c

@@ -101,3 +101,58 @@ void SpeedCal_ByCadence(uint16_t CadenceData, uint16_t* SpeedData, uint8_t T_Fro
 		}	
 	}
 }
+
+void SpeedCal_ByCommunication(MC_SpeedSensorData_Struct_t* p_MC_SpeedSensorData, uint16_t* AvgResult, uint8_t WheelSize)
+{
+  //车速计算
+	static uint32_t PeriodTimeCnt = 0;
+	static uint16_t FiltTemp[10];
+	
+	if((HAL_GetTick() - PeriodTimeCnt) >= 50)
+	{
+		//超时清零
+		static uint32_t ClearDelayTimeCnt = 0;
+		
+		if(p_MC_SpeedSensorData->IsTrigFlag == TRUE)
+		{
+			ClearDelayTimeCnt = HAL_GetTick();
+			p_MC_SpeedSensorData->IsTrigFlag = FALSE;
+		}
+		if((HAL_GetTick() - ClearDelayTimeCnt) > 4000) // 超时信号触发标志未更新,认为停车
+		{
+			p_MC_SpeedSensorData->IsStopFlag = TRUE;
+			p_MC_SpeedSensorData->DiffTime_ms = 0xFFFF;
+		}
+	  
+		//停止判断
+		if((p_MC_SpeedSensorData->DiffTime_ms & 0xFFFF) == 0xFFFF)
+		{
+		  p_MC_SpeedSensorData->IsStopFlag = TRUE;
+		}
+		else
+		{
+			p_MC_SpeedSensorData->IsStopFlag = FALSE;
+		}
+		
+		//车速计算
+		if(p_MC_SpeedSensorData->IsStopFlag == FALSE)
+		{
+		  if(p_MC_SpeedSensorData->DiffTime_ms == 0)
+			{
+				p_MC_SpeedSensorData->DiffTime_ms = 0xFFFFFFFF;
+			}
+			p_MC_SpeedSensorData->Speed_Data = (uint32_t)WheelSize * 360 / p_MC_SpeedSensorData->DiffTime_ms;//单位0.1km/h
+			
+			//滑动均值滤波
+			*AvgResult = MovingAverageFilter(p_MC_SpeedSensorData->Speed_Data, FiltTemp, sizeof(FiltTemp) >> 1);
+		}
+		else
+		{
+		  p_MC_SpeedSensorData->Speed_Data = 0;
+			*AvgResult = 0;
+			return;
+		}
+		
+		PeriodTimeCnt = HAL_GetTick();
+	}
+}

+ 22 - 13
User/Src/tasks.c

@@ -160,25 +160,34 @@ void MC_RunInfo_Update(void)
 		MC_RunInfo.RemainDistance = (DeviceOnLine_Status.Status_Bit.BMS_OffLine == 1) ? 0xEEEE : RemainDis.remainDistance;
 		
 		//骑行总里程计算
-		static uint32_t WheelTurnCount  = 0;
+		static uint32_t WheelTurnCount = 0;
     static FlagStatus RefreshFlag = RESET;
-		if(MC_ConfigParam1.No_SpeedSensor_Flag != MC_SUPPORT_ENABLE) //不支持无速度传感器
+		
+		if(MC_ConfigParam1.SpeedSignal == MC_SPEED_COMMUNICATION) //根据通信获取的车轮旋转周期计算
 		{
-			if((MC_SpeedSensorData.WheelTurnCount - WheelTurnCount) >= (10000 / (MC_ConfigParam1.WheelSize + MC_ConfigParam1.WheelSizeAdj))) //0.1km车轮所需圈数
-			{	 
-				RefreshFlag = SET;
-				WheelTurnCount = MC_SpeedSensorData.WheelTurnCount;
+		  static uint32_t WheelTurnCount_Temp = 0;
+			//运算周期是200ms,根据车轮旋转周期计算200ms内旋转的圈数,存在小数,放大100倍
+			if(MC_SpeedSensorData.IsStopFlag == FALSE)
+			{
+				WheelTurnCount_Temp += 20000 / MC_SpeedSensorData.DiffTime_ms;
+				MC_SpeedSensorData.WheelTurnCount = WheelTurnCount_Temp / 100;			
 			}
 		}
-		else //支持无速度传感器
+		else if(MC_ConfigParam1.SpeedSignal == MC_SPEED_CADENCE_CAL) //根据踏频计算
 		{
-	  	//车轮转过的圈数 = 踏频信号个数 / 120 * 2.4 * 前飞齿数 / 后飞齿数
-			if(((MC_CadenceResult.TrigCount - WheelTurnCount) * MC_ConfigParam1.TeethNum_F / MC_ConfigParam1.TeethNum_B / 50) >= (10000 / (MC_ConfigParam1.WheelSize + MC_ConfigParam1.WheelSizeAdj))) //0.1km车轮所需圈数
-			{	  
-				RefreshFlag = SET;
-				WheelTurnCount = MC_CadenceResult.TrigCount;
-			}
+		  //车轮转过的圈数 = 踏频信号个数 / 120 * 2.4 * 前飞齿数 / 后飞齿数
+			MC_SpeedSensorData.WheelTurnCount = MC_CadenceResult.TrigCount * MC_ConfigParam1.TeethNum_F / MC_ConfigParam1.TeethNum_B / 50;
+		}
+		else
+		{
+	  	//车轮转过的圈数在速度传感器中断已处理
 		}
+		if((MC_SpeedSensorData.WheelTurnCount - WheelTurnCount) >= (10000 / (MC_ConfigParam1.WheelSize + MC_ConfigParam1.WheelSizeAdj))) //0.1km车轮所需圈数
+		{	 
+			RefreshFlag = SET;
+			WheelTurnCount = MC_SpeedSensorData.WheelTurnCount;
+		}
+		
    if(RefreshFlag == SET)
    {
 			RefreshFlag = RESET;

+ 2 - 2
User/Src/var.c

@@ -77,7 +77,7 @@ const MC_ConfigParam1_Struct_t MC_ConfigParam1_Default =
   {100,100},                                       //SMART
 	(uint8_t)1,                                      //速度传感器极数
 	(uint8_t)2,                                      //踏频启动信号个数
-	(MC_SupportFlag_Struct_t)MC_SUPPORT_DISABLE,     //无速度传感器支持,0x55-不支持,0x-AA支持	
+	(MC_SpeedSignal_Struct_t)MC_SPEED_WHEEL_TRIG,    //速度信号来源,0x55-车轮触发,0x-AA踏频估算,0x-EE通信获取车轮旋转周期	
 	(int8_t)0,                                       //轮胎周长微调值 
 	(uint16_t)3100,                                  //低压保护阈值,单位mV,针对单节电芯的设置值	
   (uint8_t)60,                                     //推行限速值,单位0.1km/h
@@ -488,7 +488,7 @@ void Var_Init(void)
 		
 	//MC版本信息初始化,Mode和SN从EEPROM读取
   strncpy(MC_VerInfo.HW_Version, (char*)"QD007G.         ", 16);
-	strncpy(MC_VerInfo.FW_Version, (char*)"V2r1r5_20200904.", 16);
+	strncpy(MC_VerInfo.FW_Version, (char*)"V2r1r6_20201023.", 16);
 		
 	//电机型号
 	strncpy(MC_VerInfo.Mode, (char*)"VL6500 & VS7500.", 16);

+ 6 - 2
修改说明.txt

@@ -325,11 +325,15 @@ V2.1.5_20200903
 2、程序开始运行前两秒不执行续航里程初始化和计算程序,等母线电压采集稳定后再计算续航里程;
 3、修改电池版本号为V2.1.5_20200903;
 
-2.1.5_20200904
+V2.1.5_20200904
 1、优化开机时刻初始续航里程的计算,根据电池通讯状态计算,解决轮子转5圈后续航跳变的问题;
 2、软件版本:V2r1r5_20200904
 
-
+V2.1.6_20201023
+1、调整MCU温度采集的方式,开机时根据PCB上的NTC进行校准作为初始温度,后面按照斜率4.3mV/度进行计算;
+2、速度的计算,除了根据传感器和踏频两种方式外,增加了根据通信获取车轮转速的方式及骑行里程的统计,0x55-车轮触发,0x-AA踏频计算,0xEE-通讯获取车轮旋转周期;
+3、限速临界点,改为从+1km/h开始衰减,到+2.2km/断电;
+4、版本号:V2.1.6_20201023