Kaynağa Gözat

1.主控代码调整为兼容航顺的TE程序
2.踏频目标值上限修改为90rpm
3.前齿和后齿从EEPROM中读出然后发送给变速器,前齿×2.4
4.目前给变速的配置指令只在开机时发送一次,调整为与控制指令间隔发送,控制指令发送100次后,配置指令发送1次
5.给变速器发送关机指令调整到发送Ready指令前
6.速度传感器故障记录日志时,如果是来源于变速器,UserInfo设为3
7.GPIO初始化里面删掉对2个灯控制IO的配置
8.添加主控芯片芯片识别功能

leechard.li 3 yıl önce
ebeveyn
işleme
18304e2676

+ 1 - 1
Core/Src/gpio.c

@@ -89,7 +89,7 @@ void MX_GPIO_Init(void)
 
   /*Configure GPIO pins : PB0 PB1 PB2 PB10 
                            PB11 PB13 PB14 PB15 */
-  GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_10 
+  GPIO_InitStruct.Pin = GPIO_PIN_1|GPIO_PIN_10 
                           |GPIO_PIN_11|GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15;
   GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
   HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

+ 1 - 1
Core/Src/main.c

@@ -97,7 +97,7 @@ int main(void)
 {
   /* USER CODE BEGIN 1 */
   IAP_Init();  //Bootloader 200ms
-	
+	MCUManufacturer = IdentifyMCUManufacturer();
   //Flash¶Á±£»¤ÉèÖÃ
   #if 1
   Flash_ReadProtection();

Dosya farkı çok büyük olduğundan ihmal edildi
+ 284 - 284
MDK-ARM/QD007A_CTL_APP/QD007A_CTL_APP_CRC.hex


BIN
MDK-ARM/bin/QD007A_CTL_APP.bin


+ 23 - 5
MDK-ARM/crc_gen_keil.bat

@@ -110,10 +110,28 @@ ECHO Modified BIN file with CRC stored at %OUTPUT_BIN%
  %SREC_PATH%\srec_cmp.exe ^
 	%OUTPUT_BIN_NO_CRC% -binary %OUTPUT_BIN% -binary -v
 
-SET OUTPUT_FILENAME_TITLE=MC_VOLANS
-SET OUTPUT_FILENAME_VERSION=V8r0r0
-SET FULL_FILENAME=%OUTPUT_FILENAME_TITLE%_%OUTPUT_FILENAME_VERSION%_%date:~0,4%%date:~5,2%%date:~8,2%.bin
-type nul>.\%BIN_PATH%\%FULL_FILENAME%
-copy %OUTPUT_BIN% .\%BIN_PATH%\%FULL_FILENAME%
+REM AUTO COPY FILE NEW FILENAME 
+@SET SOLT_FILE=..\User\Src\var.c
+@SET FW_FILE=FW_Version.txt
+@SET SP_FILE=SP_Version.txt
+
+@more %SOLT_FILE% | findstr "MC_VerInfo.FW_Version," >%FW_FILE%
+@more %SOLT_FILE% | findstr "Firmware_Special," >%SP_FILE%
+
+@echo off
+@for /f tokens^=^5delims^=^.^_^" %%a in (%FW_FILE%) do set FW_STRING=%%a
+@for /f tokens^=^6delims^=^.^_^" %%a in (%FW_FILE%) do set DATE_STRING=%%a
+@for /f tokens^=^4delims^=^.^-^V^" %%a in (%SP_FILE%) do set SP_STRING=%%a
+
+
+
+@SET OUTPUT_FILENAME_TITLE=MC_VOLANS
+@SET OUTPUT_FILENAME_VERSION=%FW_STRING%r%SP_STRING%_%DATE_STRING%
+@SET FULL_FILENAME=%OUTPUT_FILENAME_TITLE%_%OUTPUT_FILENAME_VERSION%.bin
+@type nul>.\%BIN_PATH%\%FULL_FILENAME%
+@copy %OUTPUT_BIN% .\%BIN_PATH%\%FULL_FILENAME%
+
+REM @DEL %FW_FILE%
+REM @DEL %SP_FILE%
 REM pause
 ECHO -------------------------------------

+ 2 - 2
SelfTestUser/src_middlewares/stm32fxx_STUaddressing.c

@@ -3,8 +3,8 @@
 #include "stm32fxx_STUaddressing.h"
 
 
-volatile uint32_t testCell_1    __attribute__((at(0x20000500)));
-volatile uint32_t testCell_2    __attribute__((at(0x20000510)));
+volatile uint32_t testCell_1    __attribute__((at(0x20000600)));  //±?D??úZero??,·??ò±àò??áìáê??ú′?3?í?
+volatile uint32_t testCell_2    __attribute__((at(0x20000610)));
 
 uint8_t STU_AddressingTest(void)
 {

+ 2 - 2
User/Inc/app_loader.h

@@ -5,7 +5,7 @@
 /* Includes ------------------------------------------------------------------*/
 #define STM32F103                1
 #define STM32F072                0
-
+#include "var.h"
 #if  STM32F103 
 	#include "stm32f1xx_hal.h"
 	#define NEW_VECTOR_OFFSET        (uint32_t)0x00003000
@@ -19,7 +19,7 @@
 
 
 extern void IAP_Init(void);
-
+extern MCU_Manufacturter_Struct_t IdentifyMCUManufacturer( void );
 
 
 

+ 8 - 1
User/Inc/enviolo_can.h

@@ -16,7 +16,7 @@
 #define DU_FRONT_CHAINRING			43
 #define DU_REARSPROCKET					20
 #define DU_CADENCE_LOWLIMIT			30
-#define DU_CADENCE_HIGHLIMIT		85
+#define DU_CADENCE_HIGHLIMIT		90
 #define DU_SLEEPTIME						 5
 
 typedef enum
@@ -40,6 +40,13 @@ typedef enum
 	NEED_CALIB=1,
 }ENUM_CALIBRATION;
 
+typedef enum 
+{
+	SEND_CONFIG=0,
+	SEND_DATA,
+	SEND_POWEROFF,
+}ENVIOLO_STATUS;
+
 typedef struct 
 {
 	uint8_t u8Get_Gear_Pedal_RPM;									//·´À¡µÄ̤Ƶֵ

+ 10 - 0
User/Inc/var.h

@@ -7,6 +7,15 @@
 #include "string.h"
 
 /******************************ÀàÐͶ¨ÒåBegin*************************/
+typedef enum
+{
+	NoName = 0x00,
+  STM32F103RBT6,
+	APM32F103RBT6,
+	HK32F103RBT6,
+	GD32F103RBT6
+}MCU_Manufacturter_Struct_t;
+
 typedef enum
 {
   MC_LightSwitch_OFF = 0xF0,
@@ -470,6 +479,7 @@ extern ComOK_Check_Struct_t IsComOK_BMS;
 extern MC_AttitudeAngle_Struct_t MC_AttitudeAngle;
 extern MC_RideLog_Struct_t MC_RideLog;
 extern MC_AvgPower_Struct_t MC_AvgPower;
+extern MCU_Manufacturter_Struct_t MCUManufacturer;
 
 /**************************È«¾Ö±äÁ¿ÉùÃ÷End***************************/
 

+ 32 - 0
User/Src/app_loader.c

@@ -27,3 +27,35 @@ void IAP_Init(void)
 		__HAL_SYSCFG_REMAPMEMORY_SRAM();
   #endif		
 }
+
+MCU_Manufacturter_Struct_t IdentifyMCUManufacturer( void )
+{
+	MCU_Manufacturter_Struct_t manufacturer = STM32F103RBT6;
+  if( (*(uint8_t *)0xE00FFFD0 == 0x05)&&(*(uint8_t *)0xE00FFFE0 == 0x9B)&&(*(uint8_t *)0xE00FFFE4 == 0x52)&&(*(uint8_t *)0xE00FFFE8 == 0x05) )
+	{
+    manufacturer = HK32F103RBT6;
+		MC_VerInfo.HW_Version[10] = '3';
+	}
+	else if( (*(uint32_t *)0xE0042000) == 0x13030410 )
+	{
+		manufacturer = GD32F103RBT6;
+		MC_VerInfo.HW_Version[10] = '4';
+	}		
+	else if( (*(uint8_t *)0xE00FFFD0 == 0x04)&&(*(uint8_t *)0xE00FFFE0 == 0xC3)&&(*(uint8_t *)0xE00FFFE4 == 0xB4)&&(*(uint8_t *)0xE00FFFE8 == 0x0B) )
+	{
+		manufacturer = APM32F103RBT6;
+		MC_VerInfo.HW_Version[10] = '2';
+	}	
+	else if( (*(uint8_t *)0xE00FFFD0 == 0x00)&&(*(uint8_t *)0xE00FFFE0 == 0x10)&&(*(uint8_t *)0xE00FFFE4 == 0x04)&&(*(uint8_t *)0xE00FFFE8 == 0x0A) ) //4¨¬¡§?¨¦?¡è?y¨¨¡¤
+	{
+    manufacturer = STM32F103RBT6;
+		MC_VerInfo.HW_Version[10] = '1';
+	}
+	else
+	{
+		manufacturer = NoName;
+		MC_VerInfo.HW_Version[10] = '0';
+	}
+	
+	return manufacturer;
+}	

+ 3 - 2
User/Src/can_process.c

@@ -93,7 +93,7 @@ void DataProcess(uint16_t ID, uint8_t Mode, uint16_t Cmd, uint8_t* Data)
 					break;
 				}
 				case 0x1308://关机指令
-				{					
+				{							
 					PowerOff_Process(FALSE);
 					break;
 				}
@@ -519,7 +519,7 @@ void DataProcess(uint16_t ID, uint8_t Mode, uint16_t Cmd, uint8_t* Data)
 					//助力参数初始化
 	        UpdateGearParam(MC_ConfigParam1.SerialNum);
 					SendData(ID_MC_TO_CDL, MODE_REPORT, 0xA903, (uint8_t*)"ACK");
-					CanEnvioloData.u8SendConfigDataToEnviolo = 0;//保证再次发送0X300的参数配置
+					CanEnvioloData.u8SendConfigDataToEnviolo = SEND_CONFIG;//保证再次发送0X300的参数配置
 					break;
 				}
 				case 0x1C00://查询马达参数
@@ -589,6 +589,7 @@ void DataProcess(uint16_t ID, uint8_t Mode, uint16_t Cmd, uint8_t* Data)
 				  if(strncmp("RESET", (char*)Data, DataLength) == 0)
 					{
 						SendData(ID_MC_TO_CDL, MODE_REPORT, 0xA903, (uint8_t*)"ACK");
+						
 						PowerOff_Process(TRUE);
 		    	  HAL_Delay(100);
 			      __set_FAULTMASK(1);//关闭所有中断

+ 68 - 59
User/Src/enviolo_can.c

@@ -4,7 +4,7 @@
 #include "motor_control.h"
 #include "log_save.h"
 #include "can_process.h"
-
+#include "eeprom_24c02.h"
 
 Enviolo_Struct_t CanEnvioloData = {0};
 Enviolo_SetVal_Struct_t EnvioloSetData = {0};
@@ -83,88 +83,97 @@ void GetWorkSetVal(uint8_t* Data, Enviolo_SetVal_Struct_t *RetVal, Calibration_S
 *******************************************************************************/
 void sendDataToEnviolo(Enviolo_SetVal_Struct_t *st_SendData, Calibration_Struct_t *st_Calib)
 {
+	static uint8_t u8SendCnt = 0;
 	uint8_t sendbuf[8]={0};
+	
+	//发送100次控制指令后再发送一次配置指令
+	u8SendCnt++;
+	if(u8SendCnt >= 100)
+	{
+		u8SendCnt = 0;
+		CanEnvioloData.u8SendConfigDataToEnviolo = SEND_CONFIG;
+	}
 	//参数配置只发送一次
-	if((st_SendData->u8DesiredGearBoxMode == WORKMODE_MANUAL)||(st_SendData->u8DesiredGearBoxMode == WORKMODE_AUTO))
+	if(CanEnvioloData.u8SendConfigDataToEnviolo == SEND_CONFIG)
 	{
-		if(CanEnvioloData.u8SendConfigDataToEnviolo == 0)
+		if((st_SendData->u8DesiredGearBoxMode == WORKMODE_MANUAL)||(st_SendData->u8DesiredGearBoxMode == WORKMODE_AUTO))
 		{
-			sendbuf[0] = DU_FRONT_CHAINRING;	//DU_Front_Chainring
-			sendbuf[1] = DU_REARSPROCKET;			//DU_RearSprocket
-			sendbuf[2] = DU_CADENCE_LOWLIMIT;	//DU_Cadence_LowLimit
-			sendbuf[3] = DU_CADENCE_HIGHLIMIT;//DU_Cadence_HighLimit
-			sendbuf[4] = 0x00;								//Reserved
+			GetParamFromEEprom_24C02(&I2C_Handle_EEPROM, EEPROM_24C02_ADDR_CONFIG_PARAM1, sizeof(MC_ConfigParam1), (uint8_t*)&MC_ConfigParam1.GasCtrlMode_Flag);
+			sendbuf[0] = MC_ConfigParam1.TeethNum_F*2.4;	//DU_Front_Chainring
+			sendbuf[1] = MC_ConfigParam1.TeethNum_B;			//DU_RearSprocket
+			sendbuf[2] = DU_CADENCE_LOWLIMIT;							//DU_Cadence_LowLimit
+			sendbuf[3] = DU_CADENCE_HIGHLIMIT;						//DU_Cadence_HighLimit
+			sendbuf[4] = 0x00;														//Reserved
 			sendbuf[5] = (MC_ConfigParam1.WheelSize > 100)?(MC_ConfigParam1.WheelSize - 100):0;//
 			sendbuf[6] = DU_SLEEPTIME;				//DU_SleepTime
 			sendbuf[7] = 0x00;								//Reserved
 			CAN_SendData(ID_ENVIOLO_CONFIG, sendbuf, sizeof(sendbuf));
-			CanEnvioloData.u8SendConfigDataToEnviolo = 1;
+			CanEnvioloData.u8SendConfigDataToEnviolo = SEND_DATA;
 		}
 	}
-	if((MC_ControlCode.GearSt == MC_GearSt_WALK)||(MC_ControlCode.GearSt == MC_GearSt_OFF))//推行模式和0档位将档位设置为最低档
+	else if(CanEnvioloData.u8SendConfigDataToEnviolo == SEND_DATA)
 	{
-		sendbuf[0] = WORKMODE_MANUAL;
-		sendbuf[1] = (uint8_t)(Ratio_Table[0]>>8);
-		sendbuf[2] = (uint8_t)(Ratio_Table[0]);
-		sendbuf[3] = 0X00;
-		sendbuf[4] = 0X00;
-		CAN_SendData(ID_ENVIOLO_CONTROL, sendbuf, sizeof(sendbuf));
-	}
-//	else if(MC_ControlCode.GearSt == MC_GearSt_OFF)//关机状态 关闭自动变速器
-//	{
-//		CAN_SendData(ID_ENVIOLO_CONTROL,sendbuf,sizeof(sendbuf));
-//	}
-	else
-	{
-		if(st_SendData->u8DesiredGearBoxMode == WORKMODE_MANUAL)//如果是手动模式
+		if((MC_ControlCode.GearSt == MC_GearSt_WALK)||(MC_ControlCode.GearSt == MC_GearSt_OFF))//推行模式和0档位将档位设置为最低档
 		{
-			sendbuf[0] = st_SendData->u8DesiredGearBoxMode;
-			sendbuf[1] = (uint8_t)(st_SendData->u16DesiredGearRatio>>8);
-			sendbuf[2] = (uint8_t)(st_SendData->u16DesiredGearRatio);
+			sendbuf[0] = WORKMODE_MANUAL;
+			sendbuf[1] = (uint8_t)(Ratio_Table[0]>>8);
+			sendbuf[2] = (uint8_t)(Ratio_Table[0]);
 			sendbuf[3] = 0X00;
 			sendbuf[4] = 0X00;
-			CAN_SendData(ID_ENVIOLO_CONTROL,sendbuf,sizeof(sendbuf));
-		}
-		else if(st_SendData->u8DesiredGearBoxMode == WORKMODE_AUTO)//如果是自动模式
-		{
-			sendbuf[0] = st_SendData->u8DesiredGearBoxMode;
-			sendbuf[1] = 0X00;
-			sendbuf[2] = 0X00;
-			sendbuf[3] = (uint8_t)(st_SendData->u16DesiredCanence>>8);
-			sendbuf[4] = (uint8_t)(st_SendData->u16DesiredCanence);
-			CAN_SendData(ID_ENVIOLO_CONTROL,sendbuf,sizeof(sendbuf));
+			CAN_SendData(ID_ENVIOLO_CONTROL, sendbuf, sizeof(sendbuf));
 		}
-		else if(st_SendData->u8DesiredGearBoxMode == WORKMODE_CALIB)//校准模式
+		else
 		{
-			if(st_Calib->u8CalibrationCmdToEnviolo == 1)//第一次关闭自动变速器
+			if(st_SendData->u8DesiredGearBoxMode == WORKMODE_MANUAL)//如果是手动模式
 			{
-				sendbuf[0] = 0X00;
+				sendbuf[0] = st_SendData->u8DesiredGearBoxMode;
+				sendbuf[1] = (uint8_t)(st_SendData->u16DesiredGearRatio>>8);
+				sendbuf[2] = (uint8_t)(st_SendData->u16DesiredGearRatio);
+				sendbuf[3] = 0X00;
+				sendbuf[4] = 0X00;
 				CAN_SendData(ID_ENVIOLO_CONTROL,sendbuf,sizeof(sendbuf));
-				st_Calib->u8CalibrationCmdToEnviolo++;
 			}
-			else if(st_Calib->u8CalibrationCmdToEnviolo == 2)//第二次让enviolo进入到校准指令中
+			else if(st_SendData->u8DesiredGearBoxMode == WORKMODE_AUTO)//如果是自动模式
 			{
-				sendbuf[0] = 0X08;
+				sendbuf[0] = st_SendData->u8DesiredGearBoxMode;
+				sendbuf[1] = 0X00;
+				sendbuf[2] = 0X00;
+				sendbuf[3] = (uint8_t)(st_SendData->u16DesiredCanence>>8);
+				sendbuf[4] = (uint8_t)(st_SendData->u16DesiredCanence);
 				CAN_SendData(ID_ENVIOLO_CONTROL,sendbuf,sizeof(sendbuf));
-				st_Calib->u8CalibrationCmdToEnviolo++;
 			}
-			else if(st_Calib->u8CalibrationCmdToEnviolo == 3)//第三次使能enviolo的ACTIVE模式
+			else if(st_SendData->u8DesiredGearBoxMode == WORKMODE_CALIB)//校准模式
+			{
+				if(st_Calib->u8CalibrationCmdToEnviolo == 1)//第一次关闭自动变速器
+				{
+					sendbuf[0] = 0X00;
+					CAN_SendData(ID_ENVIOLO_CONTROL,sendbuf,sizeof(sendbuf));
+					st_Calib->u8CalibrationCmdToEnviolo++;
+				}
+				else if(st_Calib->u8CalibrationCmdToEnviolo == 2)//第二次让enviolo进入到校准指令中
+				{
+					sendbuf[0] = 0X08;
+					CAN_SendData(ID_ENVIOLO_CONTROL,sendbuf,sizeof(sendbuf));
+					st_Calib->u8CalibrationCmdToEnviolo++;
+				}
+				else if(st_Calib->u8CalibrationCmdToEnviolo == 3)//第三次使能enviolo的ACTIVE模式
+				{
+					sendbuf[0] = 0X01;//开启变速器的数据报文模式做监听 Active
+					CAN_SendData(ID_ENVIOLO_CONTROL,sendbuf,sizeof(sendbuf));
+					st_Calib->u8CalibrationCmdToEnviolo++;
+					st_Calib->u8CalibrationCmdToOBC = DIS_PEDALLING;//让ui显示校准中
+				}
+			}
+			else
 			{
-				sendbuf[0] = 0X01;//开启变速器的数据报文模式做监听 Active
+				sendbuf[0] = WORKMODE_OFF; //关闭
+				sendbuf[1] = 0X00;
+				sendbuf[2] = 0X00;
+				sendbuf[3] = 0X00;
+				sendbuf[4] = 0X00;
 				CAN_SendData(ID_ENVIOLO_CONTROL,sendbuf,sizeof(sendbuf));
-				st_Calib->u8CalibrationCmdToEnviolo++;
-				st_Calib->u8CalibrationCmdToOBC = DIS_PEDALLING;//让ui显示校准中
 			}
 		}
-		else
-		{
-			sendbuf[0] = WORKMODE_OFF; //关闭
-			sendbuf[1] = 0X00;
-			sendbuf[2] = 0X00;
-			sendbuf[3] = 0X00;
-			sendbuf[4] = 0X00;
-			CAN_SendData(ID_ENVIOLO_CONTROL,sendbuf,sizeof(sendbuf));
-		}
 	}
 }
 
@@ -230,7 +239,7 @@ void sendDataToOBC(uint8_t u8Step)
 void sendDataToEnvioloPwroff(void)
 {
 	uint8_t sendbuf[8]={0};
-	CAN_SendData(ID_ENVIOLO_CONTROL,sendbuf,sizeof(sendbuf));
+	CAN_SendData(ID_ENVIOLO_CONTROL,sendbuf,8);
 }
 
 /******************************************************************************
@@ -294,7 +303,7 @@ void MC_Fault_Enviolo_SpeedSensor_Process(MC_ErrorCode_Struct_t* p_MC_ErrorCode)
 		{
 			p_MC_ErrorCode->ERROR_Bit.Fault_SpeedSensor = 1;
 			//记录故障日志
-			MC_ErrorLogSaveInfo.NotesInfo1 = 1;
+			MC_ErrorLogSaveInfo.NotesInfo1 = 3;
 			ErrorLogSave_Update(&MC_ErrorLogSaveInfo);
 			IsErrorLogSaveInfoUpdateFlag = TRUE;
 			//存储故障次数

+ 3 - 8
User/Src/fault_check.c

@@ -324,7 +324,7 @@ void MC_Fault_NTCSensor_Process(uint8_t T_PCB_Result, uint8_t T_Coil_Result, MC_
 		if((HAL_GetTick() - NTC_Check_PeriodTimeCnt) >= 100)
 		{
 		  NTC_Check_PeriodTimeCnt = HAL_GetTick();
-			BusCurrentSum += MC_RunInfo.BusCurrent >> 7;//按照mA / 128 判断,约0.1A
+			BusCurrentSum += (uint16_t)(MC_RunInfo.BusCurrent >> 7);//按照mA / 128 判断,约0.1A
 			NTC_Check_Count++;
 			//采集100 * 8192 = 819.2s内母线电流平均值
 			if(NTC_Check_Count >= 8192)
@@ -335,8 +335,8 @@ void MC_Fault_NTCSensor_Process(uint8_t T_PCB_Result, uint8_t T_Coil_Result, MC_
 				//平均电流超过10A,判断是否有温升
 				if(BusCurrentAvg > 79) // 79  * 1.28 = 101
 				{
-				  if((abs(T_PCB_Result - T_PCB_Old) < 2) ||  //PCB 温升低于2度
-						 (abs(T_Coil_Result - T_Coil_Old) < 2))  //绕组温升低于2度
+				  if((abs(T_PCB_Result - T_PCB_Old) < 1) ||  //PCB 温升低于2度
+						 (abs(T_Coil_Result - T_Coil_Old) < 1))  //绕组温升低于2度
 					{
 					  p_MC_ErrorCode->ERROR_Bit.Fault_NtcSensor = 1;
 						//记录故障日志
@@ -1014,11 +1014,6 @@ void MC_Fault_Check_Process(void)
 
   //TE故障检测
 	#if 0
-	if(TE_CheckFlag == SET)//针对样机的TE软件版本,不检测故障
-	{
-  	MC_Fault_TE_Process(&MC_TE_SensorStatus, IsComOK_TE.IsOK_Flag, &MC_ErrorCode);
-	}	
-	#elif 1
 	MC_Fault_TE_Process(&MC_TE_SensorStatus, IsComOK_TE.IsOK_Flag, &MC_ErrorCode);
 	#endif
 	

+ 1 - 1
User/Src/motor_control.c

@@ -1132,7 +1132,7 @@ MC_CalParam_Struct_t MC_AssistRunMode_Torque_Process(uint16_t SenorData, MC_Gear
 	#endif
 	
   //ÏÞÁ÷¼ÆËã
-  IqRefByInPower =  PID_Regulator(CurrentLimitPresent / 100, (MC_RunInfo.BusCurrent >> 7), &PID_IMax);
+	IqRefByInPower = PID_Regulator(CurrentLimitPresent * (MC_RunInfo.SOC <= 5 ? 5 : (MC_RunInfo.SOC >= 10 ? 10 : MC_RunInfo.SOC)) / 1000, (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;

+ 69 - 32
User/Src/protect_check.c

@@ -11,7 +11,7 @@ FlagStatus MC_Protect_OverCurrentTrig_Flag = RESET;
 
 /******************************局部函数定义******************************/
 //低压保护检测
-void MC_Protect_UnderVoltage_Process(uint16_t BusVoltage, uint8_t DesignVoltage, uint16_t UV_TH, MC_ErrorCode_Struct_t* p_MC_ErrorCode)
+void MC_Protect_UnderVoltage_Process(TrueOrFalse_Flag_Struct_t IsBMS_ComOK, uint8_t SOC, uint16_t BusVoltage, uint8_t DesignVoltage, uint16_t UV_TH, MC_ErrorCode_Struct_t* p_MC_ErrorCode)
 {
   static uint32_t uvTimeCnt = 0;
 	static uint32_t uvFaultTimeCnt = 0;
@@ -23,54 +23,95 @@ void MC_Protect_UnderVoltage_Process(uint16_t BusVoltage, uint8_t DesignVoltage,
 		case 24:
 		{
 			UV_Voltage = UV_TH * 7;//低压保护时,电芯电压为3100mV
-		  break;
+			break;
 		}
 		case 36:
 		{
 			UV_Voltage = UV_TH * 10;//低压保护时,电芯电压为3100mV
-		  break;
+			break;
 		}
 		case 48:
 		{
 			UV_Voltage = UV_TH * 13;//低压保护时,电芯电压为3100mV
-		  break;
+			break;
 		}
 		default:
 		{
-  		UV_Voltage = BusVoltage;
+			UV_Voltage = BusVoltage;
 			break;
 		}
 	}
-	if(p_MC_ErrorCode->ERROR_Bit.Protect_UnderVoltage == 0)
+	
+	if(IsBMS_ComOK == TRUE)//电池通讯正常,根据BMS的SOC作为低压保护
 	{
-		//低压保护判断
-		if(BusVoltage >= UV_Voltage)
+	  if(p_MC_ErrorCode->ERROR_Bit.Protect_UnderVoltage == 0)
 		{
-			uvTimeCnt = HAL_GetTick();
+			//低压保护判断
+			if((SOC >= 1) && (BusVoltage >= UV_Voltage))
+			{
+				uvTimeCnt = HAL_GetTick();
+			}
+			if((HAL_GetTick() - uvTimeCnt) > 5000)
+			{
+				p_MC_ErrorCode->ERROR_Bit.Protect_UnderVoltage = 1;
+				//记录故障日志
+				MC_ErrorLogSaveInfo.NotesInfo1 = BusVoltage;
+				MC_ErrorLogSaveInfo.NotesInfo2 = (uint16_t)IsBMS_ComOK;
+				ErrorLogSave_Update(&MC_ErrorLogSaveInfo);
+				IsErrorLogSaveInfoUpdateFlag = TRUE;
+				//存储故障次数
+				MC_RunLog1.UV_ProtectCnt++;
+				RunLogSaveIndex = 1;
+			}
+			uvFaultTimeCnt = HAL_GetTick();
 		}
-		if((HAL_GetTick() - uvTimeCnt) > 5000)
+		else
 		{
-			p_MC_ErrorCode->ERROR_Bit.Protect_UnderVoltage = 1;
-			//记录故障日志
-			MC_ErrorLogSaveInfo.NotesInfo1 = BusVoltage;
-			ErrorLogSave_Update(&MC_ErrorLogSaveInfo);
-			IsErrorLogSaveInfoUpdateFlag = TRUE;
-			//存储故障次数
-			MC_RunLog1.UV_ProtectCnt++;
-			RunLogSaveIndex = 1;
+			//低压保护恢复
+			if((SOC < 1) || (BusVoltage < (UV_Voltage + 1000)))
+			{
+				uvFaultTimeCnt = HAL_GetTick();
+			}	
+			if((HAL_GetTick() - uvFaultTimeCnt) > 5000)
+			{
+				p_MC_ErrorCode->ERROR_Bit.Protect_UnderVoltage = 0;
+			}
 		}
-		uvFaultTimeCnt = HAL_GetTick();
 	}
 	else
 	{
-		//低压保护恢复
-		if(BusVoltage < (UV_Voltage + 500))
+		if(p_MC_ErrorCode->ERROR_Bit.Protect_UnderVoltage == 0)
 		{
+			//低压保护判断
+			if(BusVoltage >= UV_Voltage)
+			{
+				uvTimeCnt = HAL_GetTick();
+			}
+			if((HAL_GetTick() - uvTimeCnt) > 5000)
+			{
+				p_MC_ErrorCode->ERROR_Bit.Protect_UnderVoltage = 1;
+				//记录故障日志
+				MC_ErrorLogSaveInfo.NotesInfo1 = BusVoltage;
+				MC_ErrorLogSaveInfo.NotesInfo2 = (uint16_t)IsBMS_ComOK;
+				ErrorLogSave_Update(&MC_ErrorLogSaveInfo);
+				IsErrorLogSaveInfoUpdateFlag = TRUE;
+				//存储故障次数
+				MC_RunLog1.UV_ProtectCnt++;
+				RunLogSaveIndex = 1;
+			}
 			uvFaultTimeCnt = HAL_GetTick();
-		}	
-		if((HAL_GetTick() - uvFaultTimeCnt) > 5000)
+		}
+		else
 		{
-			p_MC_ErrorCode->ERROR_Bit.Protect_UnderVoltage = 0;
+			//低压保护恢复
+			if(BusVoltage < (UV_Voltage + 1000))
+			{
+				uvFaultTimeCnt = HAL_GetTick();
+			}	
+			if((HAL_GetTick() - uvFaultTimeCnt) > 5000)
+			{
+				p_MC_ErrorCode->ERROR_Bit.Protect_UnderVoltage = 0;
+			}
 		}
 	}
 }
@@ -378,16 +419,13 @@ void MC_Protect_OverCurrent_Process(FlagStatus* OverCurrentTrigFlag, MC_ErrorCod
 	{
 		//开启PWM计数清零
 		StarPwmCnt = 0;
+		//关闭PWM
+		Disable_PwmGpio_Out();
 		//2个PWM周期后,过流触发标志复位
 		if(OffPwmCnt >= 1)
 		{
 			*OverCurrentTrigFlag = RESET;
 		}
-		else
-		{
-			//关闭PWM
-			Disable_PwmGpio_Out();
-		}
 		OffPwmCnt++;
 	}
 }
@@ -396,9 +434,8 @@ void MC_Protect_OverCurrent_Process(FlagStatus* OverCurrentTrigFlag, MC_ErrorCod
 void MC_Protect_Check_Process(void)
 {
 	//低压保护检测
-  MC_Protect_UnderVoltage_Process(((IsComOK_BMS.IsOK_Flag == TRUE) ? BMS_RunInfo.Voltage : MC_RunInfo.BusVoltage), 
-	                                MC_MotorParam.Rate_Voltage, 
-	                                ((MC_ConfigParam1.UV_Protect_TH == 0) ? 3100 : MC_ConfigParam1.UV_Protect_TH), 
+  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_ErrorCode);
 	
 	//过压保护检测

+ 7 - 7
User/Src/tasks.c

@@ -596,6 +596,7 @@ void PowerOff_Process(TrueOrFalse_Flag_Struct_t ReturnEnable)
 	//关闭助力档位,关闭车灯
 	MC_ControlCode.GearSt = MC_GearSt_OFF;
 	MC_ControlCode.LightSwitch = MC_LightSwitch_OFF;
+	CanEnvioloData.u8SendConfigDataToEnviolo = SEND_POWEROFF;//停止task200ms的301报文
 	Update_MC_ControlCode_Back();
 	LightDriver_Process(MC_ConfigParam2.MC_TailLight_Mode, IsBreakTrig_Flag, MC_ControlCode.LightSwitch);
 	
@@ -612,11 +613,11 @@ void PowerOff_Process(TrueOrFalse_Flag_Struct_t ReturnEnable)
 		SaveFlag = SET;
 	}
 	#endif
-	
+	//发送自动变速器关机指令
+	sendDataToEnvioloPwroff();
 	//发送关机就绪信号
 	SendData(ID_MC_BC, MODE_REPORT, 0x1305, (uint8_t*)"READY");
-	//发送自动变速器
-	sendDataToEnvioloPwroff();
+	
 	//等待关机
 	if(ReturnEnable == TRUE)
 	{
@@ -626,7 +627,7 @@ void PowerOff_Process(TrueOrFalse_Flag_Struct_t ReturnEnable)
 	{
 		PeriodTimeCnt = HAL_GetTick();
 		Count = 0;
-	  while(Count < 50)
+	  while(Count < 10)
 		{
 		  if((HAL_GetTick() - PeriodTimeCnt) > 100)
 			{
@@ -648,8 +649,7 @@ void MC_CanRxCheck_Process(MC_SupportFlag_Struct_t NoPBU_Flag, MC_SupportFlag_St
 		//PBU通信状态检测
 		if(IsComOK_PBU.IsOK_Flag == TRUE)
 		{
-			//if((HAL_GetTick() - IsComOK_PBU.OK_TrigTime) > 1000)
-			if((HAL_GetTick() - IsComOK_PBU.OK_TrigTime) > 3000)//lichao				
+			if((HAL_GetTick() - IsComOK_PBU.OK_TrigTime) > 1000)  
 			{  
 				IsComOK_PBU.IsOK_Flag = FALSE;
 				*GearSt = MC_GearSt_OFF;
@@ -925,7 +925,7 @@ void MC_TemperatureLogProcess(void)
 	static uint16_t SavePeriodCnt = 0;
 	static TrueOrFalse_Flag_Struct_t DataChangeFlag = FALSE;
 	
-	if((IsSendDataToTE_Step == SENDUPDATA) || (IsComOK_TE.IsOK_Flag == FALSE))  //TE升级状态,或TE通讯失败状态下,不存储历史温度,TE无APP时对主控采集AD有影响
+	if(HAL_GetTick() < 10000)  //开机前10s不处理
 	{
 	  PeriodTimeCnt = HAL_GetTick();
 		return;

+ 3 - 2
User/Src/var.c

@@ -39,6 +39,7 @@ ComOK_Check_Struct_t IsComOK_BMS = {FALSE, 0};            //BMS通
 MC_AttitudeAngle_Struct_t MC_AttitudeAngle;               //姿态传感器数值
 MC_RideLog_Struct_t MC_RideLog;                    //骑行历史
 MC_AvgPower_Struct_t MC_AvgPower;                         //助力平均功耗
+MCU_Manufacturter_Struct_t MCUManufacturer;               //MCU生厂商
 
 //BMS默认设计信息
 const BMS_DesignInfo_Struct_t BMS_DesignInfo_Default =
@@ -80,7 +81,7 @@ const MC_ConfigParam1_Struct_t MC_ConfigParam1_Default =
 	(uint8_t)2,                                      //踏频启动信号个数
 	(MC_SpeedSignal_Struct_t)MC_SPEED_WHEEL_TRIG,    //速度信号来源,0x55-车轮触发,0x-AA踏频估算,0x-EE通信获取车轮旋转周期	
 	(int8_t)0,                                       //轮胎周长微调值 
-	(uint16_t)3100,                                  //低压保护阈值,单位mV,针对单节电芯的设置值	
+	(uint16_t)3000,                                  //低压保护阈值,单位mV,针对单节电芯的设置值	
   (uint8_t)60,                                     //推行限速值,单位0.1km/h
 	(uint8_t)135                                     //推行模式电机转速设置值
 };
@@ -490,7 +491,7 @@ void Var_Init(void)
 		
 	//MC版本信息初始化,Mode和SN从EEPROM读取
   strncpy(MC_VerInfo.HW_Version, (char*)"QD007E/F/G/H.   ", 16);
-	strncpy(MC_VerInfo.FW_Version, (char*)"V6r0r1_20220221.", 16);
+	strncpy(MC_VerInfo.FW_Version, (char*)"V6r0r2_20220302.", 16);
 	strncpy(Firmware_Special, (char*)"TC043023-AB2103-V0r2.           ", 32);//客户编号+车架号
 		
 	//电机型号

Bu fark içinde çok fazla dosya değişikliği olduğu için bazı dosyalar gösterilmiyor