Browse Source

V3.3.1_20201119
1、修改指拨模式的处理方式,参考力矩模式,控制电机力矩;
2、低压保护增加存储判断的类型;
3、版本号:V3.3.1_20201119

dail.zhou 4 năm trước cách đây
mục cha
commit
c314109937

+ 0 - 3
Core/Src/main.c

@@ -326,9 +326,6 @@ int main(void)
 			//定时发送传感器数据给TE
 			MC_TE_SensorData_Process(&MC_TE_SensorData);
 			
-			//指拨模式计算函数
-			SpdProportion_calculate();
-			
       //车姿态处理函数
 		  BikeAttitude_Process();
 

BIN
MDK-ARM/bin/MC_TTKZ010A_V3.3.1_20201119.bin


BIN
MDK-ARM/bin/QD007A_CTL_APP.bin


+ 212 - 228
User/Src/motor_control.c

@@ -206,234 +206,248 @@ MC_AssistRunMode_Struct_t MC_JudgeAsistRunMode_Process(MC_SupportFlag_Struct_t G
 	return MC_AssistRunMode_Result;
 }
 
-/*指拨模式相关变量*/
-
-static int32_t SpdMotorDivWheelFlt=0;
-int16_t SpdProportion=490; //车轮电机速度比
-static uint16_t SpdProportion_buff_CNT=0;
-uint8_t  SpdProportion_CAL_flag=0;
-static uint16_t SpdProportion_Save_CNT=0;
-uint16_t SpdProportion_buff[100]={0};
-float SpdProportion_StandardDeviation=0;
-int32_t test_StandardDeviation=0;
-uint16_t test_SpdProportionAver=0;
-int32_t SpeedSetMiddle=0;
-int16_t dbSpdWheelSet=0;  //调试用
-
-int16_t wheelSpeed=0;
-static int16_t DbSpdMotorPre=0;
-static int16_t wheelSpeedPre=0;
-int16_t SpdMotorDivWheel=0;
-int16_t SpdMotorDivWheelFlted=0;
-int16_t SpeedMax = 0;	// 最高时速
-int16_t SpeedSet = 0;	// 速度设定值
-uint32_t accStep = 0;	// 加速时间步进
-uint32_t decStep = 0;	// 减速时间步进
-int16_t SpeedSetReal = 0;	// 速度设定真实值
-
-/*指拨模式相关变量*/
-
 //指拨模式处理
 MC_CalParam_Struct_t MC_AssistRunMode_Gas_Process(uint16_t GasSensorData, uint16_t TorqueSensorData, MC_GearSt_Struct_t GearSt)
 {
-	int32_t Tmp;
-	int16_t TorQueBySpd = 0;
-	int32_t Ref_Speed_Temp;
-	int16_t SpdMotorByIdc = 0;
-	
-	MC_CalParam_Struct_t p_MC_CalParam = {MC_AssistRunMode_INVALID, 0,	0, RESET};
-	
-  //...插入指拨处理
-
-	/*车轮速度使用原始数据,滤波后的数据有滞后,影响控制回路*/
-	wheelSpeed = (int16_t)MC_SpeedSensorData.Speed_Data;
+  MC_CalParam_Struct_t p_MC_CalParam = {MC_AssistRunMode_INVALID, 0,	0, RESET};
+  uint8_t TorqueAccStep = 0;//力矩上升斜率
+	uint8_t TorqueDecStep = 0;//力矩下降斜率
+	int16_t Torque_Temp;
+	int32_t Torque_Ref_Temp;
+	static int16_t IqRefByInPower;           //限流计算结果
+  static uint16_t CurrentLimitPresent;     //限流实际值,做升降速处理
+	uint16_t CurrentLimitSet;                //限流设置值,不同助力档位更新
 	
-	/*实时计算电机转速与车轮速的比值*/
-	SpdMotorDivWheel = 	(uint32_t)(MC_RunInfo.MotorSpeed * 100) / wheelSpeed ;
-	Tmp = SpdMotorDivWheel;
-	SpdMotorDivWheelFlt += ((Tmp << 8) - SpdMotorDivWheelFlt) >> 6;
-	SpdMotorDivWheelFlted = SpdMotorDivWheelFlt >> 8;
+	static uint8_t TorqueRefEndUpdateCount = 0;
 	
-	/*在电机转速与车轮速比值,与实际速比一致时,更新速比*/
-	if(( MC_RunInfo.MotorSpeed > 100 ) && ( wheelSpeed > 0 ))
+	//踩踏力矩输入
+  MC_TorqueProcess_Param.TorqueApp = (GasSensorData < TorqueSensorData) ? TorqueSensorData : GasSensorData;
+		
+	//按照助力档位调节力矩输入值
+	switch(GearSt)
 	{
-		/*加速时,更新速比,比较法*/
-		if((wheelSpeed - wheelSpeedPre ) > 5)
+		case MC_GearSt_Torque_ECO:
 		{
-			if(( MC_RunInfo.MotorSpeed - DbSpdMotorPre ) > 0)
+			//控制输入给定加速斜率
+			if(MC_ConfigParam1.UserAdjParam_ECO.StarModel_GAIN <= 80)
+			{
+				TorqueAccStep = 2;
+			}
+			else if(MC_ConfigParam1.UserAdjParam_ECO.StarModel_GAIN >= 120)
+			{
+				TorqueAccStep = 4;
+			}
+			else
 			{
-				SpdProportion = SpdMotorDivWheel ;
+				TorqueAccStep = 3;
 			}
-			DbSpdMotorPre = MC_RunInfo.MotorSpeed;
+			TorqueAccStep = (TorqueAccStep <= 0) ? 1 : TorqueAccStep;
+			//控制输入给定减速斜率
+			TorqueDecStep = 7;
+			//随力矩输入调节助力比
+			Torque_Temp = (uint16_t)((uint32_t)(MC_TorqueProcess_Param.TorqueApp * Coefficient_GainCal(MC_AssisParam.Gear_ECO.Gain_K >> 1, MC_AssisParam.Gear_ECO.Gain_K, MC_AssisParam.Gear_ECO.TorqueApp_TH, MC_TorqueProcess_Param.TorqueApp)) >> 10);
+			//根据助力增益调节助力比
+			Torque_Temp = Torque_Temp * MC_ConfigParam1.UserAdjParam_ECO.Assist_K_GAIN / 100;
+			//给定下限
+			Torque_Temp = (Torque_Temp < MC_AssisParam.Gear_ECO.Lower_Iq) ? MC_AssisParam.Gear_ECO.Lower_Iq : Torque_Temp;
+			//给定上限
+			Torque_Temp = (Torque_Temp > MC_AssisParam.Gear_ECO.Upper_Iq) ? MC_AssisParam.Gear_ECO.Upper_Iq : Torque_Temp;
+			//限流参数设置
+			CurrentLimitSet = (uint32_t)(MC_AssisParam.Gear_ECO.CurrentMax_K * MC_ConfigParam1.CurrentLimit * 1000 >> 17) * 100;
+			CurrentLimitPresent = MC_DataSet_Linear_Process(CurrentLimitSet, CurrentLimitPresent, 5 ,1);
+			PID_IMax.hLower_Limit_Output = -(MC_AssisParam.Gear_ECO.Upper_Iq);   //Lower Limit for Output limitation
+			PID_IMax.hUpper_Limit_Output = 0; //Upper Limit for Output limitation
+			PID_IMax.wLower_Limit_Integral = -(MC_AssisParam.Gear_ECO.Upper_Iq << 10); // 放大1024
+			PID_IMax.wUpper_Limit_Integral = 0; // 放大1024
+			break;
 		}
-		wheelSpeedPre = wheelSpeed;
-			
-		/*求标准差,速比稳定后,更新速比*/
-		/*此处将数据保存到数组中,标准差计算,时间较长,放在主循环进行*/
-		if((SpdProportion_CAL_flag==0) && (MC_CalParam.Ref_Speed > 25))  //电机力矩控制量低于25时,认为是空载,此时不更新速比
+		case MC_GearSt_Torque_NORM:
 		{
-			SpdProportion_Save_CNT++;
-			/*40ms保存一次数据到数组*/
-			if(SpdProportion_Save_CNT >= 40 )
+			//控制输入给定加速斜率
+			if(MC_ConfigParam1.UserAdjParam_NORM.StarModel_GAIN <= 80)
 			{
-				SpdProportion_Save_CNT = 0;
-				
-				SpdProportion_buff[SpdProportion_buff_CNT] = SpdMotorDivWheelFlted;
-				SpdProportion_buff_CNT++;
-				if( SpdProportion_buff_CNT >=50 )
-				{
-					SpdProportion_buff_CNT = 0;
-					
-					/*标志位置1,主循环里求标准差*/
-					SpdProportion_CAL_flag = 1;
-				}
+				TorqueAccStep = 2;
 			}
-		}
-	}
-	else
-	{
-	  wheelSpeedPre = wheelSpeed;
-		DbSpdMotorPre = MC_RunInfo.MotorSpeed;
-	}
-
-	/*电机最高速度,上位机配置参数*/
-	SpeedMax = MC_MotorParam.Rate_Speed;
-	Tmp = ((GasSensorData < TorqueSensorData) ? TorqueSensorData : GasSensorData) + 50 ;  //加50偏移量,确保能达到最大值2048
-	Tmp = Tmp > 2048 ? 2048 : Tmp; 
-	
-	/*调试用,根据车速限速值,换算指拨对应的设定车速*/
-	dbSpdWheelSet = (Tmp * MC_ConfigParam1.SpeedLimit * 10 )>> 11;	
-
-	/*电机转速设定,根据指拨大小、车轮限速值和速比,换算*/
-	SpeedSet = ((Tmp * MC_ConfigParam1.SpeedLimit  * SpdProportion) / 10  >> 11);			//(Tmp >> 11) * cd_Speedlimit * ( SpdProportion / 10)
-	
-	//超过限速值,设定电机转速为0
-	if(wheelSpeed > (MC_ConfigParam1.SpeedLimit * 10 + 20))
-	{
-		SpeedSet = 0;
-	}
-	
-	SpeedSet = (SpeedSet > 0) ? SpeedSet : 0;
-	SpeedSet = (SpeedSet < SpeedMax) ? SpeedSet : SpeedMax;
-	
-	//根据档位调整加速度
-	switch (GearSt & 0x0F)
-	{
-		case 0x01:
-			accStep = StepCalc(SpeedMax, 1, 2100);
-			break;
-		case 0x02:
-			accStep = StepCalc(SpeedMax, 1, 1500);
-			break;
-		case 0x03:
-			accStep = StepCalc(SpeedMax, 1, 1071);
+			else if(MC_ConfigParam1.UserAdjParam_NORM.StarModel_GAIN >= 120)
+			{
+				TorqueAccStep = 4;
+			}
+			else
+			{
+				TorqueAccStep = 3;
+			}
+			TorqueAccStep = (TorqueAccStep <= 0) ? 1 : TorqueAccStep;
+			//控制输入给定减速斜率
+			TorqueDecStep = 7;
+			//随力矩输入调节助力比
+			Torque_Temp = (uint16_t)((uint32_t)(MC_TorqueProcess_Param.TorqueApp * Coefficient_GainCal(MC_AssisParam.Gear_NORM.Gain_K >> 1, MC_AssisParam.Gear_NORM.Gain_K, MC_AssisParam.Gear_NORM.TorqueApp_TH, MC_TorqueProcess_Param.TorqueApp)) >> 10);
+			//根据助力增益调节助力比
+			Torque_Temp = Torque_Temp * MC_ConfigParam1.UserAdjParam_NORM.Assist_K_GAIN / 100;
+			//给定下限
+			Torque_Temp = (Torque_Temp < MC_AssisParam.Gear_NORM.Lower_Iq) ? MC_AssisParam.Gear_NORM.Lower_Iq : Torque_Temp;
+			//给定上限
+			Torque_Temp = (Torque_Temp > MC_AssisParam.Gear_NORM.Upper_Iq) ? MC_AssisParam.Gear_NORM.Upper_Iq : Torque_Temp;
+			
+			//限流参数设置
+			CurrentLimitSet = (uint32_t)(MC_AssisParam.Gear_NORM.CurrentMax_K * MC_ConfigParam1.CurrentLimit * 1000 >> 17) * 100;
+			CurrentLimitPresent = MC_DataSet_Linear_Process(CurrentLimitSet, CurrentLimitPresent, 5 ,1);
+			PID_IMax.hLower_Limit_Output = -(MC_AssisParam.Gear_NORM.Upper_Iq);   //Lower Limit for Output limitation
+			PID_IMax.hUpper_Limit_Output = 0; //Upper Limit for Output limitation
+			PID_IMax.wLower_Limit_Integral = -(MC_AssisParam.Gear_NORM.Upper_Iq << 10); // 放大1024
+			PID_IMax.wUpper_Limit_Integral = 0; // 放大1024
 			break;
-		case 0x04:
-			accStep = StepCalc(SpeedMax, 1, 765);
+		}
+		case MC_GearSt_Torque_SPORT:
+		{
+			//控制输入给定加速斜率
+			if(MC_ConfigParam1.UserAdjParam_SPORT.StarModel_GAIN <= 80)
+			{
+				TorqueAccStep = 2;
+			}
+			else if(MC_ConfigParam1.UserAdjParam_SPORT.StarModel_GAIN >= 120)
+			{
+				TorqueAccStep = 4;
+			}
+			else
+			{
+				TorqueAccStep = 3;
+			}
+			TorqueAccStep = (TorqueAccStep <= 0) ? 1 : TorqueAccStep;
+			//控制输入给定减速斜率
+			TorqueDecStep = 7;
+			//随力矩输入调节助力比
+			Torque_Temp = (uint16_t)((uint32_t)(MC_TorqueProcess_Param.TorqueApp * Coefficient_GainCal(MC_AssisParam.Gear_SPORT.Gain_K >> 1, MC_AssisParam.Gear_SPORT.Gain_K, MC_AssisParam.Gear_SPORT.TorqueApp_TH, MC_TorqueProcess_Param.TorqueApp)) >> 10);
+			//根据助力增益调节助力比
+			Torque_Temp = Torque_Temp * MC_ConfigParam1.UserAdjParam_SPORT.Assist_K_GAIN / 100;
+			//给定下限
+			Torque_Temp = (Torque_Temp < MC_AssisParam.Gear_SPORT.Lower_Iq) ? MC_AssisParam.Gear_SPORT.Lower_Iq : Torque_Temp;
+			//给定上限
+			Torque_Temp = (Torque_Temp > MC_AssisParam.Gear_SPORT.Upper_Iq) ? MC_AssisParam.Gear_SPORT.Upper_Iq : Torque_Temp;
+			//限流参数设置
+			CurrentLimitSet = (uint32_t)(MC_AssisParam.Gear_SPORT.CurrentMax_K * MC_ConfigParam1.CurrentLimit * 1000 >> 17) * MC_CadenceLimit_K;
+			CurrentLimitPresent = MC_DataSet_Linear_Process(CurrentLimitSet, CurrentLimitPresent, 5 ,1);
+			PID_IMax.hLower_Limit_Output = -(MC_AssisParam.Gear_SPORT.Upper_Iq);   //Lower Limit for Output limitation
+			PID_IMax.hUpper_Limit_Output = 0; //Upper Limit for Output limitation
+			PID_IMax.wLower_Limit_Integral = -(MC_AssisParam.Gear_SPORT.Upper_Iq << 10); // 放大1024
+			PID_IMax.wUpper_Limit_Integral = 0; // 放大1024
 			break;
-		default:
-			/*计算周期1ms, 加减速时间为 2.00s  加减速步进计算*/
-			accStep = StepCalc(SpeedMax, 1, 1500);
+		}
+		case MC_GearSt_Torque_TURBO:
+		{
+			//控制输入给定加速斜率
+			if(MC_ConfigParam1.UserAdjParam_TURBO.StarModel_GAIN <= 80)
+			{
+				TorqueAccStep = 2;
+			}
+			else if(MC_ConfigParam1.UserAdjParam_TURBO.StarModel_GAIN >= 120)
+			{
+				TorqueAccStep = 4;
+			}
+			else
+			{
+				TorqueAccStep = 3;
+			}
+			TorqueAccStep = (TorqueAccStep <= 0) ? 1 : TorqueAccStep;
+			//控制输入给定减速斜率
+			TorqueDecStep = 7;
+			//随力矩输入调节助力比
+			Torque_Temp = (uint16_t)((uint32_t)(MC_TorqueProcess_Param.TorqueApp * Coefficient_GainCal(MC_AssisParam.Gear_TURBO.Gain_K >> 1, MC_AssisParam.Gear_TURBO.Gain_K, MC_AssisParam.Gear_TURBO.TorqueApp_TH, MC_TorqueProcess_Param.TorqueApp)) >> 10);
+			//根据助力增益调节助力比
+			Torque_Temp = Torque_Temp * MC_ConfigParam1.UserAdjParam_TURBO.Assist_K_GAIN / 100;
+			//给定下限
+			Torque_Temp = (Torque_Temp < MC_AssisParam.Gear_TURBO.Lower_Iq) ? MC_AssisParam.Gear_TURBO.Lower_Iq : Torque_Temp;
+			//给定上限
+			Torque_Temp = (Torque_Temp > MC_AssisParam.Gear_TURBO.Upper_Iq) ? MC_AssisParam.Gear_TURBO.Upper_Iq : Torque_Temp;
+			//限流参数设置
+			CurrentLimitSet = (uint32_t)(MC_AssisParam.Gear_TURBO.CurrentMax_K * MC_ConfigParam1.CurrentLimit * 1000 >> 17) * MC_CadenceLimit_K;
+			CurrentLimitPresent = MC_DataSet_Linear_Process(CurrentLimitSet, CurrentLimitPresent, 5 ,1);
+			PID_IMax.hLower_Limit_Output = -(MC_AssisParam.Gear_TURBO.Upper_Iq);   //Lower Limit for Output limitation
+			PID_IMax.hUpper_Limit_Output = 0; //Upper Limit for Output limitation
+			PID_IMax.wLower_Limit_Integral = -(MC_AssisParam.Gear_TURBO.Upper_Iq << 10); // 放大1024
+			PID_IMax.wUpper_Limit_Integral = 0; // 放大1024
 			break;
-	}
-	
-	/*减速步进*/
-	decStep = StepCalc(SpeedMax, 1, 2000);
-
-	/* 跟踪启动 */
-	if(MC_CalParam.Foc_Flag  == RESET)			
-	{
-		//MotorStartFlg = 1;
-		if(MC_RunInfo.MotorSpeed > 100)
+		}
+		default: 
 		{
-			SpeedSetReal = MC_RunInfo.MotorSpeed;
-			SpeedSetMiddle = SpeedSetReal << 16;
+			TorqueAccStep = 0;
+			TorqueDecStep = 0;
+			Torque_Temp = 0;
+			break;
 		}
 	}
-		
-	/*速度指令的加减速处理*/
-	#if 1  //根据档位设定最高速度
 	
-	switch(GearSt & 0x0F)
+	//随车速调节助力比
+	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);
+		
+	//助力输出		
+	MC_TorqueProcess_Param.TorqueRef = Torque_Temp;
+	if(MC_TorqueProcess_Param.TorqueRef <= 0)
 	{
-	  case 0x01:
-			SpeedSetReal = accDecProcess((SpeedSet * 9) >> 4, accStep, decStep, &SpeedSetMiddle);  
-			break;
-		case 0x02:
-			SpeedSetReal = accDecProcess((SpeedSet * 11) >> 4, accStep, decStep, &SpeedSetMiddle);  
-			break;
-		case 0x03:
-			SpeedSetReal = accDecProcess((SpeedSet * 13) >> 4, accStep, decStep, &SpeedSetMiddle);  
-			break;
-		case 0x04:
-			SpeedSetReal = accDecProcess(SpeedSet, accStep, decStep, &SpeedSetMiddle);  
-			break;
-		default:
-			SpeedSetReal = accDecProcess(SpeedSet, accStep, decStep, &SpeedSetMiddle);  
-			break;
+		MC_TorqueProcess_Param.TorqueRef = 0;
 	}
-	
-	#else
-	
-	SpeedSetReal = accDecProcess(SpeedSet, accStep, decStep, &SpeedSetMiddle);  
-	
-	#endif
-
-	/*限制母线电流*/
-	#if 0 //根据档位设定最大电流,电流环在内环,不稳定
-	
-	static uint16_t CurrentLimitPresent;     //限流实际值,做升降速处理
-	uint16_t CurrentLimitSet;                //限流设置值,不同助力档位更新
-
-	switch(GearSt & 0x0F)
+			
+	//升降速曲线计算
+	if( MC_SpeedSensorData.Speed_Data > (MC_ConfigParam1.SpeedLimit * 10) ) //限速处理
 	{
-	  case 0x01://ECO
+		if((MC_TorqueProcess_Param.TorqueRef - MC_TorqueProcess_Param.TorqueRefEnd) > 2)
 		{
-		  CurrentLimitSet = (uint32_t)(MC_AssisParam.Gear_ECO.CurrentMax_K * MC_ConfigParam1.CurrentLimit * 1000 >> 17);
-			CurrentLimitPresent = MC_DataSet_Linear_Process(CurrentLimitSet, CurrentLimitPresent, 5 ,1);
-			break;
+			MC_TorqueProcess_Param.TorqueRefEnd += 1;
 		}
-		case 0x02://NORM
+		else if((MC_TorqueProcess_Param.TorqueRef - MC_TorqueProcess_Param.TorqueRefEnd) < (- 1))
 		{
-		  CurrentLimitSet = (uint32_t)(MC_AssisParam.Gear_NORM.CurrentMax_K * MC_ConfigParam1.CurrentLimit * 1000 >> 17);
-			CurrentLimitPresent = MC_DataSet_Linear_Process(CurrentLimitSet, CurrentLimitPresent, 5 ,1);
-			break;
+			MC_TorqueProcess_Param.TorqueRefEnd -= 10; 
 		}
-		case 0x03://SPORT
+	}
+	else if( (Bike_Attitude.UpWardSlope_flag == TRUE)&&(MC_SpeedSensorData.Speed_Data < 100))  //上坡处理			  
+	{
+		if((MC_TorqueProcess_Param.TorqueRef - MC_TorqueProcess_Param.TorqueRefEnd) > 2)
 		{
-		  CurrentLimitSet = (uint32_t)(MC_AssisParam.Gear_SPORT.CurrentMax_K * MC_ConfigParam1.CurrentLimit * 1000 >> 17);
-			CurrentLimitPresent = MC_DataSet_Linear_Process(CurrentLimitSet, CurrentLimitPresent, 5 ,1);
-			break;
+			MC_TorqueProcess_Param.TorqueRefEnd += TorqueAccStep;
 		}
-		case 0x04://TURBO			
+		else if((MC_TorqueProcess_Param.TorqueRef - MC_TorqueProcess_Param.TorqueRefEnd) < (- 1))
 		{
-		  CurrentLimitSet = (uint32_t)(MC_AssisParam.Gear_TURBO.CurrentMax_K * MC_ConfigParam1.CurrentLimit * 1000 >> 17);
-			CurrentLimitPresent = MC_DataSet_Linear_Process(CurrentLimitSet, CurrentLimitPresent, 5 ,1);
-			break;
+			TorqueRefEndUpdateCount++;			
+			if(TorqueRefEndUpdateCount >= 3)
+			{
+				TorqueRefEndUpdateCount = 0;
+				MC_TorqueProcess_Param.TorqueRefEnd -= TorqueDecStep;
+			}
+		}		
+	}	
+	
+	else //正常骑行
+	{
+		if((MC_TorqueProcess_Param.TorqueRef - MC_TorqueProcess_Param.TorqueRefEnd) > 2)
+		{
+			MC_TorqueProcess_Param.TorqueRefEnd += TorqueAccStep;
 		}
-		default://SMART
+		else if((MC_TorqueProcess_Param.TorqueRef - MC_TorqueProcess_Param.TorqueRefEnd) < (- 1))
 		{
-		  CurrentLimitSet = (uint32_t)(MC_AssisParam.Gear_SMART.CurrentMax_K * MC_ConfigParam1.CurrentLimit * 1000 >> 17);
-			CurrentLimitPresent = MC_DataSet_Linear_Process(CurrentLimitSet, CurrentLimitPresent, 5 ,1);
-			break;
+			MC_TorqueProcess_Param.TorqueRefEnd -= TorqueDecStep;
 		}
 	}
-	SpdMotorByIdc = PID_Regulator(CurrentLimitPresent, MC_RunInfo.BusCurrent >> 7, &PID_ConstantPower);
-	
-	#else
-	
-	SpdMotorByIdc = PID_Regulator((MC_ConfigParam1.CurrentLimit * 1000) >> 7, MC_RunInfo.BusCurrent >> 7, &PID_ConstantPower);
+	MC_TorqueProcess_Param.TorqueRefEnd = (MC_TorqueProcess_Param.TorqueRefEnd < 6) ? 6 : MC_TorqueProcess_Param.TorqueRefEnd;
 	
+	//限速点处理
+	if( MC_SpeedSensorData.Speed_Data > (MC_ConfigParam1.SpeedLimit * 10 + 22) ) //限速值+2.2
+	{
+		MC_TorqueProcess_Param.MotorStopLock_Flag = SET;
+		MC_TorqueProcess_Param.TorqueRefEnd = 0;
+		//停机处理
+		MC_MotorStop(&MC_StarFlag);
+	}
+	#if 0  //低于限速点启动电机
+	else if(MC_RunInfo.BikeSpeed < ((MC_ConfigParam1.SpeedLimit) * 10))
+	{
+		MC_MotorStar(&MC_StarFlag);
+	}
+	#elif 1  //低于断电点即启动电机
+	else
+	{
+		MC_MotorStar(&MC_StarFlag);
+	}
 	#endif
 	
-	/* 电机速度闭环 */
-	//最大力矩为4档的力矩参数
-	PID_MotorSpd.hLower_Limit_Output= -(MC_AssisParam.Gear_TURBO.Upper_Iq / 2);
-	PID_MotorSpd.hUpper_Limit_Output= (MC_AssisParam.Gear_TURBO.Upper_Iq / 2);
-	TorQueBySpd = PID_Regulator(SpeedSetReal, MC_RunInfo.MotorSpeed, &PID_MotorSpd);
-
-	TorQueBySpd += SpdMotorByIdc;
-	
 	#if 1
 	static uint16_t K_ByVoltage_Set_Old = 1024;
 	uint16_t K_ByVoltage_Set;
@@ -454,24 +468,16 @@ MC_CalParam_Struct_t MC_AssistRunMode_Gas_Process(uint16_t GasSensorData, uint16
 	
 	uint16_t K_ByVoltage_Result = 1024;
 	uint16_t K_ByTemperature_Result = 1024;
-	
 	#endif
 	
-	//速度环控制量为0时停机,防止电机出现异响
-	if(SpeedSetReal == 0)
-	{
-		MC_MotorStop(&MC_StarFlag);
-	}
-	else
-	{
-		//电机启动
-		MC_MotorStar(&MC_StarFlag);
-	}
+  //限流计算
+  IqRefByInPower =  PID_Regulator(CurrentLimitPresent / 100, (MC_RunInfo.BusCurrent >> 7), &PID_IMax);
 	
-	Ref_Speed_Temp = ((int32_t)TorQueBySpd * K_ByVoltage_Result) >> 10;
-	Ref_Speed_Temp = ((int32_t)Ref_Speed_Temp * K_ByTemperature_Result) >> 10;
-
-	p_MC_CalParam.Ref_Speed = (int16_t)(Ref_Speed_Temp);
+	Torque_Ref_Temp = ((int32_t)MC_TorqueProcess_Param.TorqueRefEnd * K_ByVoltage_Result) >> 10;
+	Torque_Ref_Temp = (Torque_Ref_Temp * K_ByTemperature_Result) >> 10;
+	Torque_Ref_Temp = (Torque_Ref_Temp + IqRefByInPower) >> 1;
+	
+	p_MC_CalParam.Ref_Torque = (int16_t)Torque_Ref_Temp;
 	p_MC_CalParam.Foc_Flag = SET;
 	p_MC_CalParam.AssistRunMode = MC_AssistRunMode_GAS;
 	
@@ -1780,9 +1786,6 @@ void MC_CalParam_Cal(MC_WorkMode_Struct_t p_MC_WorkMode, \
 		{
 	  	MC_AssistRunMode_Temp = MC_AssistRunMode_INVALID;
 			MC_AssistRunMode_ShiftFlag = SET;
-			
-			SpeedSetMiddle = 0;  //指拨模式,清零速度中间量
-			SpdMotorDivWheelFlt = 0;
 		}
 	}
 	//助力模式处理
@@ -1879,22 +1882,3 @@ void MC_MotorStar(FlagStatus* StarFlag)
 	}
 }	
 
-/*
-指拨模式计算速比,计算费时,在主循环调用
-*/
-void SpdProportion_calculate(void)
-{
-	if(SpdProportion_CAL_flag==1)
-	{
-		SpdProportion_StandardDeviation = Standard_deviation_aver(SpdProportion_buff, 50, &test_SpdProportionAver);
-		test_StandardDeviation = (int32_t)(SpdProportion_StandardDeviation );
-		SpdProportion_CAL_flag = 0;
-		/*更新速比*/
-		if(test_StandardDeviation < 30)
-		{
-			SpdProportion = test_SpdProportionAver;
-		}
-	}
-}
-
-

+ 10 - 0
User/Src/protect_check.c

@@ -36,6 +36,15 @@ void MC_Protect_UnderVoltage_Process(uint16_t BusVoltage, uint8_t DesignVoltage,
 				if(BMS_RC < 200)
 				{
 					p_MC_ErrorCode->ERROR_Bit.Protect_UnderVoltage = 1;
+					//记录故障日志
+					MC_ErrorLogSaveInfo.NotesInfo1 = 1;
+					MC_ErrorLogSaveInfo.NotesInfo2 = BMS_RunInfo.RC;
+					MC_ErrorLogSaveInfo.NotesInfo3 = BMS_RunInfo.Voltage;
+					ErrorLogSave_Update(&MC_ErrorLogSaveInfo);
+					IsErrorLogSaveInfoUpdateFlag = TRUE;
+					//存储故障次数
+					MC_RunLog1.UV_ProtectCnt++;
+					RunLogSaveIndex = 1;
 					uvAlarmTimeCnt = HAL_GetTick();
 					AlarmFlag = SET;
 				}			
@@ -85,6 +94,7 @@ void MC_Protect_UnderVoltage_Process(uint16_t BusVoltage, uint8_t DesignVoltage,
 		{
 			p_MC_ErrorCode->ERROR_Bit.Protect_UnderVoltage = 1;
 			//记录故障日志
+			MC_ErrorLogSaveInfo.NotesInfo1 = 2;
 			ErrorLogSave_Update(&MC_ErrorLogSaveInfo);
 			IsErrorLogSaveInfoUpdateFlag = TRUE;
 			//存储故障次数

+ 2 - 2
User/Src/tim.c

@@ -438,12 +438,12 @@ void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
 		  	//꽝옘令�땍
 				switch(MC_CalParam.AssistRunMode)
 				{
-				  case MC_AssistRunMode_TORQUE: case MC_AssistRunMode_CADENCE: //제앤친駕
+				  case MC_AssistRunMode_TORQUE: case MC_AssistRunMode_CADENCE: case MC_AssistRunMode_GAS: //제앤친駕
 					{
 					  FOC_Model(MC_CalParam.Ref_Torque, MC_RunInfo.MotorSpeed, MC_HallSensorData.SVM_Angle);
 						break;
 					}
-					case MC_AssistRunMode_WALK: case MC_AssistRunMode_GAS:      //醵똑친駕
+					case MC_AssistRunMode_WALK:       //醵똑친駕
 					{
   				  FOC_Model(MC_CalParam.Ref_Speed, MC_RunInfo.MotorSpeed, MC_HallSensorData.SVM_Angle);
 						break;

+ 1 - 1
User/Src/var.c

@@ -489,7 +489,7 @@ void Var_Init(void)
 		
 	//MC版本信息初始化,Mode和SN从EEPROM读取
   strncpy(MC_VerInfo.HW_Version, (char*)"TT_KZ_010D.     ", 16);
-	strncpy(MC_VerInfo.FW_Version, (char*)"V3r3r1_20201118.", 16);
+	strncpy(MC_VerInfo.FW_Version, (char*)"V3r3r1_20201119.", 16);
 	
 	//电机型号
 	strncpy(MC_VerInfo.Mode, (char*)"PG8000 & PSX000.", 16);

+ 5 - 0
修改说明.txt

@@ -346,6 +346,11 @@ V3.3.1_20201118
 7、低压保护增加根据电池通信状态按照剩余容量进行判断的处理;
 8、版本号:V3.3.1_20201118
 
+V3.3.1_20201119
+1、修改指拨模式的处理方式,参考力矩模式,控制电机力矩;
+2、低压保护增加存储判断的类型;
+3、版本号:V3.3.1_20201119
+