Explorar el Código

1.同步white单向器打滑故障检测代码
2.同步white解决在指拨突然松开电机会反转的问题

leechard.li hace 3 años
padre
commit
c054114fa9

La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 2328 - 2328
MDK-ARM/QD007A_CTL_APP/QD007A_CTL_APP_CRC.hex


BIN
MDK-ARM/bin/QD007A_CTL_APP.bin


+ 4 - 3
User/Inc/var.h

@@ -75,7 +75,7 @@ typedef union MC_ERRORCODE
 		uint32_t Fault_TE_MCU             :1;//TE MCU故障
 		uint32_t Fault_TE_Circuit         :1;//TE 电路故障
 		uint32_t Fault_MC_Check           :1;//MC校验失败
-		uint32_t RS1 :1;
+		uint32_t Fault_Machine            :1;//机械故障
 		uint32_t RS2 :1;
 		uint32_t RS3 :1;
 		uint32_t RS4 :1;
@@ -256,7 +256,8 @@ typedef struct
 	uint16_t PBU_Check_FaultCnt;     //PBU校验错误次数 ,地址偏移32
 	uint8_t T_PCB_Max;               //PCB历史最高温,地址偏移34
 	uint8_t T_PCB_Min;               //PCB历史最低温,地址偏移35
-	uint8_t RS1[4];                  //预留,地址偏移36
+	uint8_t MachineFaultCnt;         //单向器打滑故障次数,地址偏移36
+    uint8_t RS1[3];
 	uint8_t T_Coil_Max;              //绕组历史最高温,地址偏移40
 	uint8_t T_Coil_Min;	             //绕组历史最低温,地址偏移41
 	uint8_t T_MCU_Max;               //MCU历史最高温,地址偏移42
@@ -316,7 +317,7 @@ typedef struct
 }MC_PowerOffBkp_Struct_t;
 
 //电池运行状态,占用空间1bytes
-typedef union BMS_STATUS
+typedef union 
 {
   struct
 	{

+ 6 - 3
User/Src/cadence_sensor.c

@@ -99,7 +99,7 @@ void CadenceSensor_Process(MC_CadenceResult_Struct_t* p_MC_CadenceResult, uint16
 	//踏频计算及启动和停止判断
 	static uint32_t CadenceCalTimeCnt = 0;       //用于计算蹋频值
 	static int32_t Cadence_ActiveFlt = 0;
-	uint16_t CadenceTemp;
+	static uint16_t CadenceTemp;
 	
 	static uint8_t CadenceStarFlagCnt = 0;       //用于判断启动
 	static uint32_t CadenceStopJudgeTimeCnt = 0; //用于判断停止
@@ -112,8 +112,8 @@ void CadenceSensor_Process(MC_CadenceResult_Struct_t* p_MC_CadenceResult, uint16
 	  CadenceTemp	= 1000 / (HAL_GetTick() - CadenceCalTimeCnt);//转1圈有60个信号,根据两个信号之间的时间计算踏频值rpm
 		CadenceCalTimeCnt = HAL_GetTick();
 		
-		Cadence_ActiveFlt += (((int32_t)CadenceTemp << 8) - Cadence_ActiveFlt) >> 4;
-		p_MC_CadenceResult->Cadence_Data = (uint8_t)(Cadence_ActiveFlt >> 8);
+//		Cadence_ActiveFlt += (((int32_t)CadenceTemp << 8) - Cadence_ActiveFlt) >> 4;
+//		p_MC_CadenceResult->Cadence_Data = (uint8_t)(Cadence_ActiveFlt >> 8);
 		
 		/*上坡时,启动阈值为1*/
 		if(UpSlopeFlag == TRUE)
@@ -146,6 +146,9 @@ void CadenceSensor_Process(MC_CadenceResult_Struct_t* p_MC_CadenceResult, uint16
 		CadenceStopJudgeTimeCnt = HAL_GetTick();
 	}
 	
+	Cadence_ActiveFlt += (((int32_t)CadenceTemp << 10) - Cadence_ActiveFlt) >> 8;
+	p_MC_CadenceResult->Cadence_Data = (uint8_t)(Cadence_ActiveFlt >> 10);
+	
 	//停机判断
 	if(p_MC_CadenceResult->Cadence_Data < (1500 / StopDelayTime))
 	{

+ 66 - 1
User/Src/fault_check.c

@@ -80,6 +80,16 @@ void MC_Fault_SpeedSensor_Process(TrueOrFalse_Flag_Struct_t IsStopFlag, MC_Caden
 	}
 }
 
+//力矩传感器故障检测
+typedef struct
+{
+	uint32_t TrigTimeCnt_1;
+	uint32_t TrigTimeCnt_2;
+	uint16_t TorqueArray[25];
+	uint16_t FaultType;
+	uint32_t DiffStdResult;
+}ToruqeSensorFaultCheck_Struct_t;
+
 //力矩传感器故障检测
 void MC_Fault_TorqueSensor_Process(uint16_t ADC_Data, MC_GearSt_Struct_t GearSt, MC_CadenceResult_Struct_t CadenceData, MC_AssistRunMode_Struct_t AstMode, MC_ErrorCode_Struct_t* p_MC_ErrorCode)
 {
@@ -160,6 +170,7 @@ void MC_Fault_TorqueSensor_Process(uint16_t ADC_Data, MC_GearSt_Struct_t GearSt,
 	}
 }
 
+
 //缺相检测
 void MC_Fault_PhaseLine_Process(FlagStatus Foc_Flag, uint16_t BusCurrent, uint16_t MotorSpeed, ADC_3ShuntCurrent_Struct_t Phase_Current, MC_ErrorCode_Struct_t* p_MC_ErrorCode)
 {
@@ -712,7 +723,7 @@ void MC_Fault_Circuit_Process(MC_ErrorCode_Struct_t* p_MC_ErrorCode)
 				
 				if((IqFdbFlt >> 10) > 200) //250时,相电流为9.6A;330时,相电流为12.4A;350时,相电流为13.6A。得到,相电流 = 0.038 * IqFdb
 				{
-					if(((BusCurrent_Flt >> 5) - uw_current_offset) < 50) //50对应的母线电流约1.2A, DATA / 2048 * 50A
+					if(((BusCurrent_Flt >> 5) - uw_current_offset) < 25) //25对应的母线电流约0.6A, DATA / 2048 * 50A
 					{
 						CurrentFaultCount++;
 						if(CurrentFaultCount > 10)
@@ -793,6 +804,54 @@ void MC_Fault_Circuit_Process(MC_ErrorCode_Struct_t* p_MC_ErrorCode)
 	}
 }
 
+
+//机械故障
+void MC_Fault_Machine_Process(uint16_t MotorSpeed, uint16_t CadenceSpeed, ADC_SensorData_Struct_t SensorData, uint16_t speedratio, MC_ErrorCode_Struct_t* p_MC_ErrorCode)
+{
+	static uint32_t TimeCount_ClutchFault=0;
+	static uint16_t ClutchFaultCount=0;
+	
+	if( p_MC_ErrorCode->ERROR_Bit.Fault_Machine == 0)  //单向器没有故障时开始检测,有故障后故障一直存在,故障检测不再执行
+	{
+		if( (HAL_GetTick()-TimeCount_ClutchFault)>=20 )  //20ms执行一次故障判断
+		{
+			TimeCount_ClutchFault = HAL_GetTick();
+			if( (MotorSpeed > 500)&&(CadenceSpeed >= 15)&&(SensorData.TorqueSensor > 200)&&(SensorData.GasSensor < 50) )
+			{
+				if( speedratio > 1500 ) 
+				{
+					ClutchFaultCount++;
+					if( ClutchFaultCount>= 50)                  //速比连续出错50次判断为故障,时间将近1s
+					{
+						ClutchFaultCount=0;
+						p_MC_ErrorCode->ERROR_Bit.Fault_Machine = 1;
+						//记录故障日志
+						MC_ErrorLogSaveInfo.NotesInfo1 = 1;       //单向器打滑故障
+						MC_ErrorLogSaveInfo.NotesInfo2 = SensorData.TorqueSensor;
+						MC_ErrorLogSaveInfo.NotesInfo3 = SensorData.GasSensor;
+						ErrorLogSave_Update(&MC_ErrorLogSaveInfo);
+						IsErrorLogSaveInfoUpdateFlag = TRUE;
+						//存储故障次数
+						MC_RunLog1.MachineFaultCnt++;
+						RunLogSaveIndex = 1;
+					}
+				}
+				else 
+				{
+					ClutchFaultCount=0;			
+				}					
+			}
+			else
+			{
+				ClutchFaultCount=0;
+			}
+		}
+	}
+}
+
+
+
+
 //硬件识别故障
 void MC_Fault_Hardware_Identify(TrueOrFalse_Flag_Struct_t TEComOKFlag, uint16_t SyncClockFreqScan, uint16_t Hardware_AD, TrueOrFalse_Flag_Struct_t *inverterExistFlag, MC_ErrorCode_Struct_t* p_MC_ErrorCode)
 {
@@ -1088,4 +1147,10 @@ void MC_Fault_Check_Process(void)
 	
 	//电路故障检测
 	MC_Fault_Circuit_Process(&MC_ErrorCode);
+	
+	//单向器打滑故障检测
+	MC_Fault_Machine_Process(MC_RunInfo.MotorSpeed, MC_CadenceResult.Cadence_Data, ADC_SensorData, SpeedRatio, &MC_ErrorCode);
+
+	//硬件识别故障
+	MC_Fault_Hardware_Identify(IsComOK_TE.IsOK_Flag, MC_TE_SyncClockFreqScan, ADC1_Result_Filt[ADC1_RANK_HARDWARE_VER], &MC_HallSensorData.InverterExistFlag, &MC_ErrorCode);
 }

+ 1 - 1
User/Src/motor_control.c

@@ -429,7 +429,7 @@ MC_CalParam_Struct_t MC_AssistRunMode_Gas_Process(uint16_t SensorData, MC_GearSt
 	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 = (TorQueBySpd<6) ? 6 : TorQueBySpd;//·ÀÖ¹·´×ª
 	TorQueBySpd += SpdMotorByIdc;
 	
 	#if 1

+ 1 - 1
User/Src/var.c

@@ -501,7 +501,7 @@ void Var_Init(void)
 		
 	//MC版本信息初始化,Mode和SN从EEPROM读取
 	strncpy(MC_VerInfo.HW_Version, (char*)"QD007H.       ", 16);
-	strncpy(MC_VerInfo.FW_Version, (char*)"V6r2r0_20220519.", 16);
+	strncpy(MC_VerInfo.FW_Version, (char*)"V6r2r0_20220531.", 16);
 	strncpy(Firmware_Special, (char*)"TC011000-MS0000-V0r0.           ", 32);
 	if(MCUManufacturer == NoName) MC_VerInfo.HW_Version[10] = '0';
 	else if(MCUManufacturer == STM32F103RBT6) MC_VerInfo.HW_Version[10] = '1';

Algunos archivos no se mostraron porque demasiados archivos cambiaron en este cambio