Jelajahi Sumber

20231124:
1、变速器通信超时时间设置3s;
2、增加根据SOC计算最大电流和最大车速系数,指拨和助力模式根据SOC限制最大电流和最大车速;
3、转把启动偏移电压由0.1V调整为1.25V;
4、欠压保护值高4位改用欠压保护方式和保护延时设置,bit15为0-根据电压保护,bit15为1-根据SOC保护,bit14~bit12用于设置保护延时时间,保护延时=5+设置值*10,同时修改欠压保护处理;
5、修改开机电量初始化时间;
6、运行信息电功率采用额定功率和高5位的分频系数进行计算,计算方法如下:
发送功率 = 母线电流 / 最大电流 * (额定功率 * (分频系数 + 1) / 32)
7、BMS通信状态检测超时时间设置5s。

Dail 1 tahun lalu
induk
melakukan
53ee0add1f

+ 1 - 1
MDK-ARM/QD007A_CTL_APP.uvprojx

@@ -362,7 +362,7 @@
             <useXO>0</useXO>
             <VariousControls>
               <MiscControls></MiscControls>
-              <Define>USE_HAL_DRIVER,STM32F103xB</Define>
+              <Define>USE_HAL_DRIVER,STM32F103xB,PEGASI_36V</Define>
               <Undefine></Undefine>
               <IncludePath>../Core/Inc;../Drivers/STM32F1xx_HAL_Driver/Inc;../Drivers/STM32F1xx_HAL_Driver/Inc/Legacy;../Drivers/CMSIS/Device/ST/STM32F1xx/Include;../Drivers/CMSIS/Include;..\User\Inc;..\SEGGER_RTT\Inc;..\SelfTestUser\Inc</IncludePath>
             </VariousControls>

File diff ditekan karena terlalu besar
+ 2675 - 2675
MDK-ARM/QD007A_CTL_APP/QD007A_CTL_APP_CRC.hex


TEMPAT SAMPAH
MDK-ARM/bin/QD007A_CTL_APP.bin


+ 5 - 5
User/Inc/enviolo_can.h

@@ -66,7 +66,7 @@ typedef struct GEAR_INFO2
 //变速器配置参数
 typedef struct CONFIG_PARAMS
 {
-    uint8_t FrontChain;                      //前牙盘 1bit = 1tooth
+  uint8_t FrontChain;                      //前牙盘 1bit = 1tooth
 	uint8_t RearTeeth;                       //后牙盘 1bit = 1tooth
 	uint8_t CadenceMin;                      //自动模式最低踏频 1bit = 1rpm
 	uint8_t CadenceMax;                      //自动模式最高踏频 1bit = 1rpm
@@ -112,19 +112,19 @@ typedef struct GEARBOX_CAN_DATA
 //发送仪表运行信息变速器运行状态
 typedef enum GEAR_BOX_STATUS
 {
-    GEAR_STATUS_INITIAL = (uint8_t)(1 << 5),    //初始化模式
+  GEAR_STATUS_INITIAL = (uint8_t)(1 << 5),    //初始化模式
 	GEAR_STATUS_MANUAL = (uint8_t)(2 << 5),     //手动模式
 	GEAR_STATUS_AUTO = (uint8_t)(4 << 5),       //自动模式
-    GEAR_STATUS_OFFLINE = (uint8_t)0xF0         //离线模式
+  GEAR_STATUS_OFFLINE = (uint8_t)0xF0         //离线模式
 }GearBox_Status_Struct_t;
 
 //仪表发送变速器工作模式
 typedef enum GEAR_BOX_MODE
 {
-    GEAR_MODE_NULL = (uint8_t)0x00,    //初始化模式位无效值
+  GEAR_MODE_NULL = (uint8_t)0x00,    //初始化模式位无效值
 	GEAR_MODE_MANUAL = (uint8_t)0x03,  //自动模式
 	GEAR_MODE_AUTO = (uint8_t)0x04,    //手动模式
-    GEAR_MODE_CAL = (uint8_t)0x08      //校准模式
+  GEAR_MODE_CAL = (uint8_t)0x08      //校准模式
 }GearBox_Mode_Struct_t;
 
 //发送仪表校准状态

+ 2 - 2
User/Src/enviolo_can.c

@@ -165,7 +165,7 @@ void GearBox_Loop(void)
 	//变速器在线检测
 	if(GearBox_OnlineFlag.IsOK_Flag == TRUE)
 	{
-    if((HAL_GetTick() - GearBox_OnlineFlag.OK_TrigTime) > 1000) //变速器超时1s认为离线
+    if((HAL_GetTick() - GearBox_OnlineFlag.OK_TrigTime) > 3000) //变速器超时3s认为离线
 		{
 			GearBox_OnlineFlag.IsOK_Flag = FALSE;
 		}
@@ -198,7 +198,7 @@ void GearBox_Loop(void)
 		}
 		case GEAR_STATUS_INITIAL:  //初始化模式,发送变速器状态给仪表
 		{
-            MC_RunInfo.GearBoxInfo = (GearBox_Status & 0xE0) + 0x00;
+      MC_RunInfo.GearBoxInfo = (GearBox_Status & 0xE0) + 0x00;
 			//初始化完成,主动发送OBC变速器参数,发送5次。
 			do
 			{

+ 61 - 22
User/Src/motor_control.c

@@ -129,6 +129,40 @@ uint16_t MC_Cal_K_ByVoltage(uint16_t Voltage, uint16_t DesignVol, uint16_t K_Vol
 	return(Result);
 }
 
+//随SOC计算限流衰减系数
+uint16_t MC_LimitCurrent_Cal_K_BySOC(uint16_t SOC)
+{
+  uint16_t Limit_K_BySOC = 1024;
+	if(SOC <= 2)
+		Limit_K_BySOC = 256;
+	else if(SOC <= 6)
+		Limit_K_BySOC = 256 + (SOC - 2) * 64;
+	else if(SOC <= 22)
+	  Limit_K_BySOC = 512 + (SOC - 6) * 24;
+	else if(SOC <= 30)
+		Limit_K_BySOC = 896 + (SOC - 22) * 16;
+	else
+		Limit_K_BySOC = 1024;
+	return Limit_K_BySOC;
+}
+
+//随SOC计算限速衰减系数
+uint16_t MC_LimitSpeed_Cal_K_BySOC(uint16_t SOC)
+{
+  uint16_t Limit_K_BySOC = 1024;
+	if(SOC <= 2)
+		Limit_K_BySOC = 512;
+	else if(SOC <= 6)
+		Limit_K_BySOC = 512 + (SOC - 2) * 32;
+	else if(SOC <= 22)
+	  Limit_K_BySOC = 640 + (SOC - 6) * 20;
+	else if(SOC <= 30)
+		Limit_K_BySOC = 960 + (SOC - 22) * 8;
+	else
+		Limit_K_BySOC = 1024;
+	return Limit_K_BySOC;
+}
+
 //随温度计算助力衰减系数
 uint16_t MC_Cal_K_ByTemperature(uint16_t CoilTemp, uint16_t AlarmTempTH)
 {
@@ -155,15 +189,15 @@ MC_AssistRunMode_Struct_t MC_JudgeAsistRunMode_Process(MC_GasMode_Struct_t GasMo
 	
 	if(MC_ErrorCode.Code == 0)  // 无故障
 	{
-	  if((GearSt != MC_GearSt_OFF) && (StopFlag == FALSE) && (HAL_GetTick()>3000))
+	  if((GearSt != MC_GearSt_OFF) && (StopFlag == FALSE) && (HAL_GetTick() > 3000))
 		{
 		  //进入指拨模式
-			if((GasSensorData > 100) && (GasMode_Param.Mode != (uint8_t)MC_SUPPORT_DISABLE)) 
+			if((GasSensorData > 200) && (GasMode_Param.Mode != (uint8_t)MC_SUPPORT_DISABLE)) //转把启动电压 = 零点电压 + (TH / 4096 * 3.3) / 10 * 15.6,5V转把0.3V启动
 			{
 				MC_AssistRunMode_Result = MC_AssistRunMode_GAS;
 			}
 			//退出指拨模式
-			else if(GasSensorData < 50)  
+			else if(GasSensorData < 100)  
 			{
 				//进入推行模式
 				if(GearSt == MC_GearSt_WALK)
@@ -295,18 +329,20 @@ MC_CalParam_Struct_t MC_AssistRunMode_GasSpeed_Process(MC_GasMode_Struct_t GasMo
 
 	/*电机最高速度,上位机配置参数*/
 	SpeedMax = MC_MotorParam.Rate_Speed;
-	Tmp = SensorData-50;  //指拨100启动,减去50能控低速
+	Tmp = SensorData - 100;  //指拨200启动,减去100能控低速
 	Tmp = Tmp > 2048 ? 2048 : Tmp; 
-	Tmp = (Tmp*Tmp)/2048;   //指拨值改为抛物线,低速控制行程变大
+	Tmp = (Tmp * Tmp) / 2048;   //指拨值改为抛物线,低速控制行程变大
 	
 	/*电机转速设定,根据指拨大小、车轮限速值和速比,换算,以0xAA >> 3*为中心根据整车限速对称偏移,调整上限±15km/h*/
 	if(MC_GasMode_Param.Mode_bit.SpeedLimit <= 5)
-	  SpeedLimit = MC_ConfigParam1.SpeedLimit + (int8_t)MC_ConfigParam2.SpeedLimitAdj + MC_GasMode_Param.Mode_bit.SpeedLimit + 0x1F - (0xAA >> 3);
+	  SpeedLimit = ((MC_ConfigParam1.SpeedLimit + (int8_t)MC_ConfigParam2.SpeedLimitAdj + MC_GasMode_Param.Mode_bit.SpeedLimit + 0x1F - (0xAA >> 3)) * MC_LimitSpeed_Cal_K_BySOC(MC_RunInfo.SOC)) >> 10;
 	else
-		SpeedLimit = MC_ConfigParam1.SpeedLimit + (int8_t)MC_ConfigParam2.SpeedLimitAdj + MC_GasMode_Param.Mode_bit.SpeedLimit - (0xAA >> 3);
-	SpeedSet = Tmp * (SpeedLimit * SpdProportion) / 10  >> 11; //(Tmp >> 11) * cd_Speedlimit * ( SpdProportion / 10)
+		SpeedLimit = ((MC_ConfigParam1.SpeedLimit + (int8_t)MC_ConfigParam2.SpeedLimitAdj + MC_GasMode_Param.Mode_bit.SpeedLimit - (0xAA >> 3)) * MC_LimitSpeed_Cal_K_BySOC(MC_RunInfo.SOC)) >> 10;
+	//根据SOC限制最大车速
+	SpeedSet = Tmp * (SpeedLimit * SpdProportion) / 10  >> 11; //(Tmp >> 11) * cd_Speedlimit * ( SpdProportion / 10)  	
+	
 	//超过限速值,设定电机转速为0
-	if(wheelSpeed > ((MC_ConfigParam1.SpeedLimit + (int8_t)MC_ConfigParam2.SpeedLimitAdj + MC_GasMode_Param.Mode_bit.SpeedLimit - (0xAA >> 3)) * 10 + 20))
+	if(wheelSpeed > (SpeedLimit * 10 + 20))
 	{
 		SpeedSet = 0;
 	}
@@ -396,7 +432,7 @@ MC_CalParam_Struct_t MC_AssistRunMode_GasSpeed_Process(MC_GasMode_Struct_t GasMo
 	PID_MotorSpd.hLower_Limit_Output = -100;
 	PID_MotorSpd.hUpper_Limit_Output = 1050;	
 	/*限制母线电流*/
-	SpdMotorByIdc = PID_Regulator((MC_ConfigParam1.CurrentLimit * 1000) >> 7, MC_RunInfo.BusCurrent >> 7, &PID_ConstantPower);
+	SpdMotorByIdc = PID_Regulator((MC_ConfigParam1.CurrentLimit * 1000 * MC_LimitCurrent_Cal_K_BySOC(MC_RunInfo.SOC)) >> 17, MC_RunInfo.BusCurrent >> 7, &PID_ConstantPower);
 	
 	#if 1
 	static uint16_t K_ByVoltage_Set_Old = 1024;
@@ -596,14 +632,14 @@ MC_CalParam_Struct_t MC_AssistRunMode_GasTorque_Process(MC_GasMode_Struct_t GasM
 	
   if(MC_GasMode_Param.Mode_bit.SpeedLimit <= 5)
 	{
-	  speedLimitStart = (MC_ConfigParam1.SpeedLimit + (int8_t)MC_ConfigParam2.SpeedLimitAdj + GasMode_Param.Mode_bit.SpeedLimit + 0x1F - (0xAA >> 3)) * 10 + MC_ConfigParam2.SpeedLimitStartAdj;
-	  speedLimitEnd = (MC_ConfigParam1.SpeedLimit + (int8_t)MC_ConfigParam2.SpeedLimitAdj + GasMode_Param.Mode_bit.SpeedLimit + 0x1F - (0xAA >> 3)) * 10 + MC_ConfigParam2.SpeedLimitEndAdj + 22;
+	  speedLimitStart = (((MC_ConfigParam1.SpeedLimit + (int8_t)MC_ConfigParam2.SpeedLimitAdj + GasMode_Param.Mode_bit.SpeedLimit + 0x1F - (0xAA >> 3) - 2) * 10 + MC_ConfigParam2.SpeedLimitStartAdj) * MC_LimitSpeed_Cal_K_BySOC(MC_RunInfo.SOC)) >> 10;
+	  speedLimitEnd = (((MC_ConfigParam1.SpeedLimit + (int8_t)MC_ConfigParam2.SpeedLimitAdj + GasMode_Param.Mode_bit.SpeedLimit + 0x1F - (0xAA >> 3)) * 10 + MC_ConfigParam2.SpeedLimitEndAdj + 22) * MC_LimitSpeed_Cal_K_BySOC(MC_RunInfo.SOC)) >> 10;
 	  slewRate = 1024 / (speedLimitEnd - speedLimitStart - 3);		
 	}
 	else
 	{
-	  speedLimitStart = (MC_ConfigParam1.SpeedLimit + (int8_t)MC_ConfigParam2.SpeedLimitAdj + GasMode_Param.Mode_bit.SpeedLimit - (0xAA >> 3)) * 10 + MC_ConfigParam2.SpeedLimitStartAdj;
-	  speedLimitEnd = (MC_ConfigParam1.SpeedLimit + (int8_t)MC_ConfigParam2.SpeedLimitAdj + GasMode_Param.Mode_bit.SpeedLimit - (0xAA >> 3)) * 10 + MC_ConfigParam2.SpeedLimitEndAdj + 22;
+	  speedLimitStart = (((MC_ConfigParam1.SpeedLimit + (int8_t)MC_ConfigParam2.SpeedLimitAdj + GasMode_Param.Mode_bit.SpeedLimit - (0xAA >> 3) - 2) * 10 + MC_ConfigParam2.SpeedLimitStartAdj) * MC_LimitSpeed_Cal_K_BySOC(MC_RunInfo.SOC)) >> 10;
+	  speedLimitEnd = (((MC_ConfigParam1.SpeedLimit + (int8_t)MC_ConfigParam2.SpeedLimitAdj + GasMode_Param.Mode_bit.SpeedLimit - (0xAA >> 3)) * 10 + MC_ConfigParam2.SpeedLimitEndAdj + 22) * MC_LimitSpeed_Cal_K_BySOC(MC_RunInfo.SOC)) >> 10;
 	  slewRate = 1024 / (speedLimitEnd - speedLimitStart - 3);		
 	}	
 	
@@ -699,13 +735,14 @@ MC_CalParam_Struct_t MC_AssistRunMode_GasTorque_Process(MC_GasMode_Struct_t GasM
 	uint16_t K_ByTemperature_Result = 1024;
 	#endif
 	
-  //限流计算
-	IqRefByInPower = PID_Regulator(CurrentLimitPresent * (MC_RunInfo.SOC <= 5 ? 5 : (MC_RunInfo.SOC >= 10 ? 10 : MC_RunInfo.SOC)) / 1000, (MC_RunInfo.BusCurrent >> 7), &PID_IMax);
-	
+	//根据SOC计算限流
+	IqRefByInPower = PID_Regulator((CurrentLimitPresent * MC_LimitCurrent_Cal_K_BySOC(MC_RunInfo.SOC) / 100) >> 10, (MC_RunInfo.BusCurrent >> 7), &PID_IMax);
+		
 	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;
 	
+	//Iq输出
 	p_MC_CalParam.Ref_Torque = (int16_t)Torque_Ref_Temp;
 	p_MC_CalParam.Foc_Flag = SET;
 	p_MC_CalParam.AssistRunMode = MC_AssistRunMode_GAS;
@@ -770,7 +807,8 @@ MC_CalParam_Struct_t MC_AssistRunMode_Walk_Process(MC_WorkMode_Struct_t p_MC_Wor
 		{
 		  MC_WalkProcess_Param.MotorSpeedSetBigin = WalkMode_MotorSpeedSet << 5;
 		}
-		SpdMotorByIdc = PID_Regulator((MC_ConfigParam1.CurrentLimit * 500) >> 7, MC_RunInfo.BusCurrent >> 7, &PID_ConstantPower); // 母线电流闭环
+		//根据SOC计算限流
+	  SpdMotorByIdc = PID_Regulator((MC_ConfigParam1.CurrentLimit * 500 * MC_LimitCurrent_Cal_K_BySOC(MC_RunInfo.SOC)) >> 17, MC_RunInfo.BusCurrent >> 7, &PID_ConstantPower); // 母线电流闭环
 	}
 	
 	//速度环
@@ -1176,8 +1214,8 @@ MC_CalParam_Struct_t MC_AssistRunMode_Torque_Process(uint16_t SenorData, MC_Gear
 		if((MC_ConfigParam2.SpeedLimitStartAdj > 50) || (MC_ConfigParam2.SpeedLimitStartAdj < -50)) MC_ConfigParam2.SpeedLimitStartAdj = 0;
 		if((MC_ConfigParam2.SpeedLimitEndAdj > 50) || (MC_ConfigParam2.SpeedLimitEndAdj < -50)) MC_ConfigParam2.SpeedLimitEndAdj = 0;
 		
-		speedLimitStart = (MC_ConfigParam1.SpeedLimit + (int8_t)MC_ConfigParam2.SpeedLimitAdj) * 10 + MC_ConfigParam2.SpeedLimitStartAdj;
-		speedLimitEnd   = (MC_ConfigParam1.SpeedLimit + (int8_t)MC_ConfigParam2.SpeedLimitAdj) * 10 + MC_ConfigParam2.SpeedLimitEndAdj + 22;
+		speedLimitStart = (((MC_ConfigParam1.SpeedLimit + (int8_t)MC_ConfigParam2.SpeedLimitAdj) * 10 + MC_ConfigParam2.SpeedLimitStartAdj) * MC_LimitSpeed_Cal_K_BySOC(MC_RunInfo.SOC)) >> 10;
+		speedLimitEnd   = (((MC_ConfigParam1.SpeedLimit + (int8_t)MC_ConfigParam2.SpeedLimitAdj) * 10 + MC_ConfigParam2.SpeedLimitEndAdj + 22) * MC_LimitSpeed_Cal_K_BySOC(MC_RunInfo.SOC)) >> 10;
 		slewRate        = 1024 / (speedLimitEnd - speedLimitStart - 3);		
 		//随车速调节助力比
 		Torque_Temp = (uint16_t)((uint32_t)(Torque_Temp * Function_Linear_3Stage(speedLimitStart, 0, speedLimitStart, slewRate, MC_SpeedSensorData.Speed_Data)) >> 10);
@@ -1313,13 +1351,14 @@ MC_CalParam_Struct_t MC_AssistRunMode_Torque_Process(uint16_t SenorData, MC_Gear
 	uint16_t K_ByTemperature_Result = 1024;
 	#endif
 	
-  //限流计算
-	IqRefByInPower = PID_Regulator(CurrentLimitPresent * (MC_RunInfo.SOC <= 5 ? 5 : (MC_RunInfo.SOC >= 10 ? 10 : MC_RunInfo.SOC)) / 1000, (MC_RunInfo.BusCurrent >> 7), &PID_IMax);
+  //根据SOC计算限流
+	IqRefByInPower = PID_Regulator((CurrentLimitPresent * MC_LimitCurrent_Cal_K_BySOC(MC_RunInfo.SOC) / 100) >> 10, (MC_RunInfo.BusCurrent >> 7), &PID_IMax);
 	
 	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;
 	
+	//Iq输出
 	p_MC_CalParam.Ref_Torque = (int16_t)Torque_Ref_Temp;
 	p_MC_CalParam.Foc_Flag = SET;
 	p_MC_CalParam.AssistRunMode = MC_AssistRunMode_TORQUE;

+ 33 - 32
User/Src/protect_check.c

@@ -17,41 +17,17 @@ void MC_Protect_UnderVoltage_Process(TrueOrFalse_Flag_Struct_t IsBMS_ComOK, uint
 	static uint32_t uvFaultTimeCnt = 0;
 	uint16_t UV_Voltage = 0;
 	
-	//根据额定电压更新保护阈值
-	switch(DesignVoltage)
-	{
-		case 24:
-		{
-			UV_Voltage = UV_TH * 7;//低压保护时,电芯电压为3100mV
-			break;
-		}
-		case 36:
-		{
-			UV_Voltage = UV_TH * 10;//低压保护时,电芯电压为3100mV
-			break;
-		}
-		case 48:
-		{
-			UV_Voltage = UV_TH * 13;//低压保护时,电芯电压为3100mV
-			break;
-		}
-		default:
-		{
-			UV_Voltage = BusVoltage;
-			break;
-		}
-	}
-	
-	if(IsBMS_ComOK == TRUE)//电池通讯正常,根据BMS的SOC作为低压保护
+	//UV_TH Bit15 = 1,按照SOC进行低电量保护
+	if((UV_TH >> 15) == 1)
 	{
 	  if(p_MC_ErrorCode->ERROR_Bit.Protect_UnderVoltage == 0)
 		{
 			//低压保护判断
-			if((SOC >= 1) && (BusVoltage >= UV_Voltage))
+			if(SOC >= 1)
 			{
 				uvTimeCnt = HAL_GetTick();
 			}
-			if((HAL_GetTick() - uvTimeCnt) > 5000)
+			if((HAL_GetTick() - uvTimeCnt) > ((5 + ((UV_TH >> 12) & 0x07) * 10) * 1000))
 			{
 				p_MC_ErrorCode->ERROR_Bit.Protect_UnderVoltage = 1;
 				//记录故障日志
@@ -68,7 +44,7 @@ void MC_Protect_UnderVoltage_Process(TrueOrFalse_Flag_Struct_t IsBMS_ComOK, uint
 		else
 		{
 			//低压保护恢复
-			if((SOC < 1) || (BusVoltage < (UV_Voltage + 1000)))
+			if(SOC < 5)
 			{
 				uvFaultTimeCnt = HAL_GetTick();
 			}	
@@ -77,9 +53,34 @@ void MC_Protect_UnderVoltage_Process(TrueOrFalse_Flag_Struct_t IsBMS_ComOK, uint
 				p_MC_ErrorCode->ERROR_Bit.Protect_UnderVoltage = 0;
 			}
 		}
-	}
+	}	
+	//按照电压保护
 	else
 	{
+	  //根据额定电压更新保护阈值
+		switch(DesignVoltage)
+		{
+			case 24:
+			{
+				UV_Voltage = (UV_TH & 0x0FFF) * 7;//低压保护时,电芯电压为3000mV
+				break;
+			}
+			case 36:
+			{
+				UV_Voltage = (UV_TH & 0x0FFF) * 10;//低压保护时,电芯电压为3000mV
+				break;
+			}
+			case 48:
+			{
+				UV_Voltage = (UV_TH & 0x0FFF) * 13;//低压保护时,电芯电压为3000mV
+				break;
+			}
+			default:
+			{
+				UV_Voltage = BusVoltage;
+				break;
+			}
+		}
 		if(p_MC_ErrorCode->ERROR_Bit.Protect_UnderVoltage == 0)
 		{
 			//低压保护判断
@@ -87,7 +88,7 @@ void MC_Protect_UnderVoltage_Process(TrueOrFalse_Flag_Struct_t IsBMS_ComOK, uint
 			{
 				uvTimeCnt = HAL_GetTick();
 			}
-			if((HAL_GetTick() - uvTimeCnt) > 5000)
+			if((HAL_GetTick() - uvTimeCnt) > ((5 + ((UV_TH >> 12) & 0x07) * 10) * 1000))
 			{
 				p_MC_ErrorCode->ERROR_Bit.Protect_UnderVoltage = 1;
 				//记录故障日志
@@ -449,7 +450,7 @@ void MC_Protect_Check_Process(void)
 {
 	//低压保护检测
   MC_Protect_UnderVoltage_Process(IsComOK_BMS.IsOK_Flag, MC_RunInfo.SOC, ((IsComOK_BMS.IsOK_Flag == TRUE) ? BMS_RunInfo.Voltage : MC_RunInfo.BusVoltage), 
-	                                MC_MotorParam.Rate_Voltage, ((MC_ConfigParam1.UV_Protect_TH == 0) ? 3000 : MC_ConfigParam1.UV_Protect_TH), 
+	                                MC_MotorParam.Rate_Voltage, (((MC_ConfigParam1.UV_Protect_TH & 0x0FFF) == 0) ? 3000 : MC_ConfigParam1.UV_Protect_TH), 
 	                                &MC_ErrorCode);
 	
 	//过压保护检测

+ 39 - 27
User/Src/remain_distance.c

@@ -450,6 +450,7 @@ uint8_t Battery_SocCal(Battery_Info_t* p_Battery_Info, uint8_t SOC_Old, uint8_t
 	uint32_t batteryTotalQ, batteryRemainQ;
 	static uint8_t u8LoopCnt = 0;
 	static uint16_t u16MaxVoltage = 0;
+  static uint32_t u32VolSum = 0;
 	static TrueOrFalse_Flag_Struct_t FlagFristCal = TRUE;
 	
 	TableNum = sizeof(battery_VoltageQuantity) / 4;
@@ -458,18 +459,38 @@ uint8_t Battery_SocCal(Battery_Info_t* p_Battery_Info, uint8_t SOC_Old, uint8_t
 	
 	if(InitFlag == FALSE) //初始化动态显示百分比
 	{
-	  TimeDelayCnt++;
-		if(TimeDelayCnt <= 10) return 0;
-	  else if(TimeDelayCnt <= 15) return 10;
-	  else if(TimeDelayCnt <= 20) return 25;
-	  else if(TimeDelayCnt <= 25) return 45;
-	  else if(TimeDelayCnt <= 30) return 65;
-	  else if(TimeDelayCnt <= 35) return 85;
+	  if(HAL_GetTick() < 2500)
+			return 0;
 		else
 		{
-		  InitFlag = TRUE;
-			return 100;
-		}
+			TimeDelayCnt++;
+			u32VolSum += p_Battery_Info->u16CurVoltage;
+			if(TimeDelayCnt <= 1) return 25;
+			else if(TimeDelayCnt <= 3) return 50;
+			else if(TimeDelayCnt <= 5) return 75;
+			else if(TimeDelayCnt <= 7) return 100;
+			else
+			{
+				InitFlag = TRUE;
+				u16MaxVoltage = (Vol_Design == 24) ? (uint16_t)(u32VolSum >> 3) * 10 / 7
+																						 : ((Vol_Design == 48) ? (uint16_t)(u32VolSum >> 3) * 10 / 13
+																																	 : (uint16_t)(u32VolSum >> 3));	
+				//查表计算SOC
+				for(i=0; i<TableNum; i++)
+				{
+					if(battery_VoltageQuantity[i][0] <= u16MaxVoltage)
+					{
+						batteryRemainQ = batteryTotalQ - battery_VoltageQuantity[i][1]; //A*s
+						break;
+					}
+					else//电池电压低于最小值
+					{
+						batteryRemainQ = 0;
+					}
+				}				 
+				return batteryRemainQ * 100 / batteryTotalQ;
+			}
+		}		
 	}
 	else	//初始化后根据电压平均值计算百分比
 	{
@@ -478,24 +499,15 @@ uint8_t Battery_SocCal(Battery_Info_t* p_Battery_Info, uint8_t SOC_Old, uint8_t
 		
 		if(p_Battery_Info->BFlagCalSoc == TRUE)
 		{
-			if(FlagFristCal == TRUE) //第一次计算采用当前值
-			{
-				u16MaxVoltage = (Vol_Design == 24) ? (uint16_t)(p_Battery_Info->u32TotalBusVoltage / 15000) * 10 / 7
-				                                   : ((Vol_Design == 48) ? (uint16_t)(p_Battery_Info->u32TotalBusVoltage / 15000) * 10 / 13
-				                                                         : (uint16_t)(p_Battery_Info->u32TotalBusVoltage / 15000));
-				FlagFristCal = FALSE;
-			}
-			else //后面取12个值的最大值
+			//后面取12个值的最大值		
+			p_Battery_Info->u16BusAverageVol[u8LoopCnt++] = (uint16_t)(p_Battery_Info->u32TotalBusVoltage / 15000);
+			if(u8LoopCnt >= 12)
 			{
-				p_Battery_Info->u16BusAverageVol[u8LoopCnt++] = (uint16_t)(p_Battery_Info->u32TotalBusVoltage / 15000);
-				if(u8LoopCnt >= 12)
-				{
-					u16MaxVoltage = (Vol_Design == 24) ? GetMaxData(p_Battery_Info->u16BusAverageVol, 12) * 10 / 7
-				                                     : ((Vol_Design == 48) ? GetMaxData(p_Battery_Info->u16BusAverageVol, 12) * 10 / 13
-				                                                           : GetMaxData(p_Battery_Info->u16BusAverageVol, 12));				
-					u8LoopCnt = 0;
-				}
-			}
+				u16MaxVoltage = (Vol_Design == 24) ? GetMaxData(p_Battery_Info->u16BusAverageVol, 12) * 10 / 7
+																					 : ((Vol_Design == 48) ? GetMaxData(p_Battery_Info->u16BusAverageVol, 12) * 10 / 13
+																																 : GetMaxData(p_Battery_Info->u16BusAverageVol, 12));				
+				u8LoopCnt = 0;
+			}			
 			
 			//查表计算SOC
 			for(i=0; i<TableNum; i++)

+ 10 - 3
User/Src/tasks.c

@@ -153,8 +153,15 @@ void MC_RunInfo_Update(void)
 	{
 	  PeriodTimeCnt = HAL_GetTick();
 		
-		//计算电功率
-		MC_RunInfo.Power = ((uint32_t)MC_RunInfo.BusCurrent) * 25 / (MC_ConfigParam1.CurrentLimit*100);
+		//计算电功率,额定功率高5位用于显示功率分频系数,低11位额定功率
+		if((MC_MotorParam.Rate_Power >> 11) == 0) //旧程序未配
+		{
+		  MC_RunInfo.Power = ((uint32_t)MC_RunInfo.BusCurrent) * 250 / (MC_ConfigParam1.CurrentLimit * 1000);
+		}
+		else //新程序高5位为显示最大功率分频系数,最大显示功率 = 配置额定功率 * 分频系数 / 32
+		{
+		  MC_RunInfo.Power = ((uint32_t)MC_RunInfo.BusCurrent) * (((MC_MotorParam.Rate_Power & 0x07FF) * ((MC_MotorParam.Rate_Power >> 11) + 1)) >> 5) / (MC_ConfigParam1.CurrentLimit * 1000);
+		}
 		MC_RunInfo.Power = (MC_RunInfo.Power < 20) ? 0 : MC_RunInfo.Power;
 		
 		//更新踏频方向
@@ -665,7 +672,7 @@ void MC_CanRxCheck_Process(MC_SupportFlag_Struct_t NoPBU_Flag, MC_SupportFlag_St
 		//BMS通信状态检测
 		if(IsComOK_BMS.IsOK_Flag == TRUE)
 		{
-			if((HAL_GetTick() - IsComOK_BMS.OK_TrigTime) > 1000)  
+			if((HAL_GetTick() - IsComOK_BMS.OK_TrigTime) > 5000)  
 			{  
 				IsComOK_BMS.IsOK_Flag = FALSE;
 				DeviceOnLine_Status.Status_Bit.BMS_OffLine = 1;

+ 44 - 0
User/Src/var.c

@@ -63,6 +63,36 @@ const PBU_ConfigParam_Struct_t PBU_ConfigParam_Default =
 };
 
 //MC默认配置参数1,占用32bytes
+#if defined (PEGASI_36V)
+const MC_ConfigParam1_Struct_t MC_ConfigParam1_Default =
+{
+  (uint8_t)0x55,                                   //指拨模式参数,0x55-不支持
+	(MC_StarMode_Struct_t)MC_StarMode_NORM,          //启动模式 
+	(uint16_t)100,                                   //停机时间 ms	
+	(uint8_t)25,                                     //限速 km/h
+	(uint8_t)3,                                      //下降速度
+	(uint8_t)14,                                     //前齿数 T
+	(uint8_t)9,                                      //后齿数 T
+	(uint8_t)17,                                     //限流 A
+	(uint8_t)135,                                    //高温预警值 +40℃
+	(uint8_t)165,                                    //高温保护值 +40℃
+  (MC_SupportFlag_Struct_t)MC_SUPPORT_DISABLE,     //无码表支持,0x55-不支持,0x-AA支持	
+  (uint8_t)219,                                    //轮胎周长 cm
+  (uint8_t)3,                                      //系列号,
+	{100,100},                                       //ECO
+  {100,100},                                       //NORM
+  {100,100},                                       //SPORT
+  {100,100},                                       //TURBO
+  {100,100},                                       //SMART
+	(uint8_t)1,                                      //速度传感器极数
+	(uint8_t)2,                                      //踏频启动信号个数
+	(MC_SpeedSignal_Struct_t)MC_SPEED_WHEEL_TRIG,    //速度信号来源,0x55-车轮触发,0x-AA踏频估算,0x-EE通信获取车轮旋转周期	
+	(int8_t)0,                                       //轮胎周长微调值 
+	(uint16_t)3000,                                  //低压保护阈值,单位mV,针对单节电芯的设置值	
+  (uint8_t)60,                                     //推行限速值,单位0.1km/h
+	(uint8_t)135                                     //推行模式电机转速设置值
+};
+#elif defined (PEGASI_48V)
 const MC_ConfigParam1_Struct_t MC_ConfigParam1_Default =
 {
   (uint8_t)0x55,                                   //指拨模式参数,0x55-不支持
@@ -91,6 +121,7 @@ const MC_ConfigParam1_Struct_t MC_ConfigParam1_Default =
   (uint8_t)60,                                     //推行限速值,单位0.1km/h
 	(uint8_t)135                                     //推行模式电机转速设置值
 };
+#endif
 
 //MC配置参数2,占用32bytes
 const MC_ConfigParam2_Struct_t MC_ConfigParam2_Default = 
@@ -116,6 +147,18 @@ const MC_ConfigParam2_Struct_t MC_ConfigParam2_Default =
 };
 
 //MC默认马达参数,占用16bytes
+#if defined (PEGASI_36V)
+const MC_MotorParam_Struct_t MC_MotorParam_Default =
+{
+  (uint16_t)250,    //W
+	(uint16_t)1400,   //rpm
+	(uint16_t)200,    //mohm
+	(uint16_t)10,     //mH
+	(uint16_t)10,     //mH
+	(uint16_t)36000,  //mV
+	(uint8_t)36       //V
+};
+#elif defined (PEGASI_48V)
 const MC_MotorParam_Struct_t MC_MotorParam_Default =
 {
   (uint16_t)250,    //W
@@ -126,6 +169,7 @@ const MC_MotorParam_Struct_t MC_MotorParam_Default =
 	(uint16_t)48000,  //mV
 	(uint8_t)48       //V
 };
+#endif
 
 //MC默认历史信息,占用48bytes
 const MC_RunLog1_Struct_t MC_RunLog1_Default =

TEMPAT SAMPAH
低电量降功率方案.xlsx


Beberapa file tidak ditampilkan karena terlalu banyak file yang berubah dalam diff ini