|
@@ -29,9 +29,9 @@ void MC_Fault_SpeedSensor_Process(TrueOrFalse_Flag_Struct_t IsStopFlag, MC_Caden
|
|
|
else if( (AssistRunMode == MC_AssistRunMode_WALK)||(AssistRunMode == MC_AssistRunMode_GAS) )
|
|
|
{
|
|
|
if((MotorSpeed > 50) && (IsStopFlag == TRUE))
|
|
|
- {
|
|
|
- DelayTime = 1650000 / MotorSpeed;//考虑前后齿比为0.8的情况下,轮子转一圈的时间为:60 / (电机转速 / (4.55 * 2.4) * 0.8) s, 延长2圈时间
|
|
|
- DelayTime = DelayTime < 2000 ? 2000 : DelayTime;
|
|
|
+ {
|
|
|
+ DelayTime = 4125000 / MotorSpeed;//考虑前后齿比为0.8的情况下,轮子转一圈的时间为:60 / (电机转速 / (4.55 * 2.4) * 0.8) s, 延长5圈时间
|
|
|
+ DelayTime = DelayTime < 10000 ? 10000 : DelayTime;
|
|
|
if((HAL_GetTick() - TrigTimeCnt_1) > DelayTime)
|
|
|
{
|
|
|
p_MC_ErrorCode->ERROR_Bit.Fault_SpeedSensor = 1;
|
|
@@ -56,8 +56,8 @@ void MC_Fault_SpeedSensor_Process(TrueOrFalse_Flag_Struct_t IsStopFlag, MC_Caden
|
|
|
{
|
|
|
if((CadenceSensor.Cadence_Data >= 5) && (CadenceSensor.Cadence_Dir == MC_Cadence_Forward) && (IsStopFlag == TRUE))
|
|
|
{
|
|
|
- DelayTime = 150000 / CadenceSensor.Cadence_Data;//考虑前后齿比为0.8的情况下,轮子转一圈的时间为:60 / (踏频 * 0.8) s, 延长2圈时间
|
|
|
- DelayTime = DelayTime < 2000 ? 2000 : DelayTime;
|
|
|
+ DelayTime = 375000 / CadenceSensor.Cadence_Data;//考虑前后齿比为0.8的情况下,轮子转一圈的时间为:60 / (踏频 * 0.8) s, 延长5圈时间
|
|
|
+ DelayTime = DelayTime < 10000 ? 10000 : DelayTime;
|
|
|
if((HAL_GetTick() - TrigTimeCnt_2) > DelayTime)
|
|
|
{
|
|
|
p_MC_ErrorCode->ERROR_Bit.Fault_SpeedSensor = 1;
|
|
@@ -107,9 +107,9 @@ void MC_Fault_TorqueSensor_Process_Single(uint16_t ADC_Data, uint8_t Num, Toruqe
|
|
|
//标准差较小
|
|
|
if(p_SensorCheck->DiffStdResult < 10)
|
|
|
{
|
|
|
- DelayTime = 120000 / Cadence; //根据踏频计算踩踏2圈的时间,要考虑空踩情况
|
|
|
- DelayTime = (DelayTime < 250) ? 250 : DelayTime;
|
|
|
- if((HAL_GetTick() - p_SensorCheck->TrigTimeCnt_1) > (DelayTime * 2))
|
|
|
+// DelayTime = 120000 / Cadence; //根据踏频计算踩踏2圈的时间,要考虑空踩情况
|
|
|
+// DelayTime = (DelayTime < 250) ? 250 : DelayTime;
|
|
|
+ if((HAL_GetTick() - p_SensorCheck->TrigTimeCnt_1) > 15000)
|
|
|
{
|
|
|
SensorFaultStatus->FaultStatusCode |= 1 << (Num - 1);
|
|
|
p_SensorCheck->FaultType = 1;
|
|
@@ -124,7 +124,7 @@ void MC_Fault_TorqueSensor_Process_Single(uint16_t ADC_Data, uint8_t Num, Toruqe
|
|
|
//传感器短路或开路检测
|
|
|
if((ADC_Data < 50) || (ADC_Data > 4050))
|
|
|
{
|
|
|
- if((HAL_GetTick() - p_SensorCheck->TrigTimeCnt_2) > 250)
|
|
|
+ if((HAL_GetTick() - p_SensorCheck->TrigTimeCnt_2) > 1000)
|
|
|
{
|
|
|
SensorFaultStatus->FaultStatusCode |= 1 << (Num - 1);
|
|
|
p_SensorCheck->FaultType = 2;
|
|
@@ -223,7 +223,7 @@ void MC_Fault_PhaseLine_Process(FlagStatus Foc_Flag, uint16_t BusCurrent, uint16
|
|
|
//A相电流
|
|
|
if(abs(Phase_Current.uw_phase_a) < 300)
|
|
|
{
|
|
|
- if((HAL_GetTick() - TrigTimeCnt_PhaseA) > 3000)
|
|
|
+ if((HAL_GetTick() - TrigTimeCnt_PhaseA) > 5000)
|
|
|
{
|
|
|
p_MC_ErrorCode->ERROR_Bit.Fault_PhaseLine = 1;
|
|
|
//记录故障日志
|
|
@@ -245,7 +245,7 @@ void MC_Fault_PhaseLine_Process(FlagStatus Foc_Flag, uint16_t BusCurrent, uint16
|
|
|
//B相电流
|
|
|
if(abs(Phase_Current.uw_phase_b) < 300)
|
|
|
{
|
|
|
- if((HAL_GetTick() - TrigTimeCnt_PhaseB) > 3000)
|
|
|
+ if((HAL_GetTick() - TrigTimeCnt_PhaseB) > 5000)
|
|
|
{
|
|
|
p_MC_ErrorCode->ERROR_Bit.Fault_PhaseLine = 1;
|
|
|
//记录故障日志
|
|
@@ -267,7 +267,7 @@ void MC_Fault_PhaseLine_Process(FlagStatus Foc_Flag, uint16_t BusCurrent, uint16
|
|
|
//C相电流
|
|
|
if(abs(Phase_Current.uw_phase_c) < 300)
|
|
|
{
|
|
|
- if((HAL_GetTick() - TrigTimeCnt_PhaseC) > 3000)
|
|
|
+ if((HAL_GetTick() - TrigTimeCnt_PhaseC) > 5000)
|
|
|
{
|
|
|
p_MC_ErrorCode->ERROR_Bit.Fault_PhaseLine = 1;
|
|
|
//记录故障日志
|
|
@@ -304,12 +304,12 @@ void MC_Fault_NTCSensor_Process(uint8_t T_PCB_Result, uint8_t T_Coil_Result, MC_
|
|
|
static uint32_t NTC_Check_PeriodTimeCnt = 0; //NTC检测,母线电流采集周期
|
|
|
static uint16_t NTC_Check_Count = 0;
|
|
|
static uint32_t BusCurrentSum = 0;
|
|
|
- uint8_t BusCurrentAvg = 0;
|
|
|
+ static uint16_t BusCurrentAvg1 = 0, BusCurrentAvg2 = 0;
|
|
|
static uint8_t T_PCB_Old = 0;
|
|
|
static uint8_t T_Coil_Old = 0;
|
|
|
|
|
|
//初始化5s,且50度以上,不检测NTC故障
|
|
|
- if((HAL_GetTick() < 5000) || (MC_RunInfo.T_MCU > 90))
|
|
|
+ if((HAL_GetTick() < 5000) || (T_PCB_Result > 90))
|
|
|
{
|
|
|
TrigTimeCnt_PCB = HAL_GetTick();
|
|
|
TrigTimeCnt_PCB = HAL_GetTick();
|
|
@@ -325,13 +325,15 @@ void MC_Fault_NTCSensor_Process(uint8_t T_PCB_Result, uint8_t T_Coil_Result, MC_
|
|
|
if(p_MC_ErrorCode->ERROR_Bit.Fault_NtcSensor == 0)
|
|
|
{
|
|
|
//PCB上NTC短路或开路检测,判断AD值是否为异常值
|
|
|
- if((T_PCB_Result < 5) || (T_PCB_Result > 180)) //5(-35度):AD为4000,180(140度):AD为80
|
|
|
+ if((T_PCB_Result < 5) || (T_PCB_Result > 190)) //5(-35度):AD为4000,180(140度):AD为80
|
|
|
{
|
|
|
- if((HAL_GetTick() - TrigTimeCnt_PCB) > 500)
|
|
|
+ if((HAL_GetTick() - TrigTimeCnt_PCB) > 5000)
|
|
|
{
|
|
|
p_MC_ErrorCode->ERROR_Bit.Fault_NtcSensor = 1;
|
|
|
//记录故障日志
|
|
|
MC_ErrorLogSaveInfo.NotesInfo1 = 1;
|
|
|
+ MC_ErrorLogSaveInfo.NotesInfo2 = T_PCB_Result;
|
|
|
+ MC_ErrorLogSaveInfo.NotesInfo3 = T_Coil_Result;
|
|
|
ErrorLogSave_Update(&MC_ErrorLogSaveInfo);
|
|
|
IsErrorLogSaveInfoUpdateFlag = TRUE;
|
|
|
//存储故障次数
|
|
@@ -347,13 +349,15 @@ void MC_Fault_NTCSensor_Process(uint8_t T_PCB_Result, uint8_t T_Coil_Result, MC_
|
|
|
}
|
|
|
|
|
|
//NTC短路或开路检测,判断AD值是否为异常值
|
|
|
- if((T_Coil_Result < 5) || (T_Coil_Result > 180)) //5(-35度):AD为4000,180(140度):AD为80
|
|
|
+ if((T_Coil_Result < 5) || (T_Coil_Result > 190)) //5(-35度):AD为4000,180(140度):AD为80
|
|
|
{
|
|
|
- if((HAL_GetTick() - TrigTimeCnt_Coil) > 500)
|
|
|
+ if((HAL_GetTick() - TrigTimeCnt_Coil) > 5000)
|
|
|
{
|
|
|
p_MC_ErrorCode->ERROR_Bit.Fault_NtcSensor = 1;
|
|
|
//记录故障日志
|
|
|
MC_ErrorLogSaveInfo.NotesInfo1 = 2;
|
|
|
+ MC_ErrorLogSaveInfo.NotesInfo2 = T_PCB_Result;
|
|
|
+ MC_ErrorLogSaveInfo.NotesInfo3 = T_Coil_Result;
|
|
|
ErrorLogSave_Update(&MC_ErrorLogSaveInfo);
|
|
|
IsErrorLogSaveInfoUpdateFlag = TRUE;
|
|
|
//存储故障次数
|
|
@@ -368,40 +372,49 @@ void MC_Fault_NTCSensor_Process(uint8_t T_PCB_Result, uint8_t T_Coil_Result, MC_
|
|
|
TrigTimeCnt_Coil = HAL_GetTick();
|
|
|
}
|
|
|
|
|
|
- //NTC为固定值的检测,检测设定时间内内母线电流平均值 > 10A 时的前后温差
|
|
|
+ //NTC为固定值的检测,分别计算2个6.8min内母线电流平均值,当两段母线电流平均值不相等时判断NTC是否发生变化
|
|
|
if((HAL_GetTick() - NTC_Check_PeriodTimeCnt) >= 100)
|
|
|
{
|
|
|
- NTC_Check_PeriodTimeCnt = HAL_GetTick();
|
|
|
- BusCurrentSum += (uint16_t)(MC_RunInfo.BusCurrent >> 7);//按照mA / 128 判断,约0.1A
|
|
|
+ NTC_Check_PeriodTimeCnt = HAL_GetTick();
|
|
|
+ BusCurrentSum += (uint16_t)((MC_RunInfo.BusCurrent > 20000) ? 156
|
|
|
+ : MC_RunInfo.BusCurrent >> 7);//按照mA / 128 判断,约0.1A,限幅20A
|
|
|
NTC_Check_Count++;
|
|
|
- //采集100 * 8192 = 819.2s内母线电流平均值
|
|
|
- if(NTC_Check_Count >= 8192)
|
|
|
+ if(NTC_Check_Count == 4096) //计算第一个6.8min平均值
|
|
|
{
|
|
|
- NTC_Check_Count = 0;
|
|
|
- BusCurrentAvg = BusCurrentSum >> 13;//8192个值取均值
|
|
|
- BusCurrentSum = 0;
|
|
|
- //平均电流超过10A,判断是否有温升
|
|
|
- if(BusCurrentAvg > 79) // 79 * 1.28 = 101
|
|
|
- {
|
|
|
- if((abs(T_PCB_Result - T_PCB_Old) < 1) || //PCB 温升低于1度
|
|
|
- (abs(T_Coil_Result - T_Coil_Old) < 1)) //绕组温升低于1度
|
|
|
+ //avg1 = (x1 + x2 + ... + x4096) / 4096
|
|
|
+ BusCurrentAvg1 = BusCurrentSum >> 12;
|
|
|
+ }
|
|
|
+ else if(NTC_Check_Count >= 8192) //第二个6.8min
|
|
|
+ {
|
|
|
+ NTC_Check_Count = 0;
|
|
|
+ //avg2 = (x4097 + x4098 + ... +x8192) / 4096 = 2 * (x1 + x2 + ... + x8192) / 8192 - avg1
|
|
|
+ BusCurrentAvg2 = (BusCurrentSum >> 12) - BusCurrentAvg1;
|
|
|
+ BusCurrentSum = 0;
|
|
|
+ //总平均电流超过10A时,当两段平均电流变化超过3A,判断温度是否发生变化
|
|
|
+ if(((BusCurrentAvg1 + BusCurrentAvg2) >> 1) > 79) //79 * 128 = 10.1A
|
|
|
{
|
|
|
- p_MC_ErrorCode->ERROR_Bit.Fault_NtcSensor = 1;
|
|
|
- //记录故障日志
|
|
|
- MC_ErrorLogSaveInfo.NotesInfo1 = 3;
|
|
|
- MC_ErrorLogSaveInfo.NotesInfo2 = BusCurrentAvg;
|
|
|
- MC_ErrorLogSaveInfo.NotesInfo3 = (uint16_t)((abs(T_PCB_Result - T_PCB_Old) << 8) + (abs(T_Coil_Result - T_Coil_Old) < 2));
|
|
|
- ErrorLogSave_Update(&MC_ErrorLogSaveInfo);
|
|
|
- IsErrorLogSaveInfoUpdateFlag = TRUE;
|
|
|
- //存储故障次数
|
|
|
- MC_RunLog1.NTC_FaultCnt++;
|
|
|
- RunLogSaveIndex = 1;
|
|
|
-
|
|
|
- return;
|
|
|
+ if(abs(BusCurrentAvg1 - BusCurrentAvg2) >= 25) //25 * 128 = 3.2A
|
|
|
+ {
|
|
|
+ if((abs(T_PCB_Result - T_PCB_Old) < 1) || //PCB 温升小于1度
|
|
|
+ (abs(T_Coil_Result - T_Coil_Old) < 1)) //绕组温升小于1度
|
|
|
+ {
|
|
|
+ p_MC_ErrorCode->ERROR_Bit.Fault_NtcSensor = 1;
|
|
|
+ //记录故障日志
|
|
|
+ MC_ErrorLogSaveInfo.NotesInfo1 = 3;
|
|
|
+ MC_ErrorLogSaveInfo.NotesInfo2 = (BusCurrentAvg1 << 8) + (BusCurrentAvg2);
|
|
|
+ MC_ErrorLogSaveInfo.NotesInfo3 = (uint16_t)((abs(T_PCB_Result - T_PCB_Old) << 8)
|
|
|
+ + (abs(T_Coil_Result - T_Coil_Old) < 2));
|
|
|
+ ErrorLogSave_Update(&MC_ErrorLogSaveInfo);
|
|
|
+ IsErrorLogSaveInfoUpdateFlag = TRUE;
|
|
|
+ //存储故障次数
|
|
|
+ MC_RunLog1.NTC_FaultCnt++;
|
|
|
+ RunLogSaveIndex = 1;
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
- }
|
|
|
- T_PCB_Old = T_PCB_Result;
|
|
|
- T_Coil_Old = T_Coil_Result;
|
|
|
+ T_PCB_Old = T_PCB_Result;
|
|
|
+ T_Coil_Old = T_Coil_Result;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
@@ -859,7 +872,7 @@ void MC_Fault_Machine_Process(uint16_t MotorSpeed, uint16_t CadenceSpeed, ADC_Se
|
|
|
if( speedratio > 1500 )
|
|
|
{
|
|
|
ClutchFaultCount++;
|
|
|
- if( ClutchFaultCount>= 50) //速比连续出错50次判断为故障,时间将近1s
|
|
|
+ if( ClutchFaultCount>= 250) //速比连续出错50次判断为故障,时间将近5s
|
|
|
{
|
|
|
ClutchFaultCount=0;
|
|
|
p_MC_ErrorCode->ERROR_Bit.Fault_Machine = 1;
|
|
@@ -912,7 +925,7 @@ void MC_Fault_Hardware_Identify(TrueOrFalse_Flag_Struct_t TEComOKFlag, uint16_t
|
|
|
else
|
|
|
{
|
|
|
HardwareFaultCount++;
|
|
|
- if( HardwareFaultCount>= 50)
|
|
|
+ if( HardwareFaultCount>= 250)
|
|
|
{
|
|
|
HardwareFaultCount = 0;
|
|
|
p_MC_ErrorCode->ERROR_Bit.Fault_Circuit = 1;
|
|
@@ -939,7 +952,7 @@ void MC_Fault_Hardware_Identify(TrueOrFalse_Flag_Struct_t TEComOKFlag, uint16_t
|
|
|
if( (Hardware_AD>3723)||(Hardware_AD<372) )
|
|
|
{
|
|
|
HardwareFaultCount2++;
|
|
|
- if( HardwareFaultCount2>= 50)
|
|
|
+ if( HardwareFaultCount2>= 250)
|
|
|
{
|
|
|
HardwareFaultCount2 = 0;
|
|
|
p_MC_ErrorCode->ERROR_Bit.Fault_Circuit = 1;
|
|
@@ -969,7 +982,7 @@ void MC_Fault_Hardware_Identify(TrueOrFalse_Flag_Struct_t TEComOKFlag, uint16_t
|
|
|
void MC_Fault_HallSensor_Process(MC_HallSensorStatus_Struct_t HallSensorStatus, MC_ErrorCode_Struct_t* p_MC_ErrorCode)
|
|
|
{
|
|
|
static TrueOrFalse_Flag_Struct_t IsFirstEnterFlag = TRUE;
|
|
|
- static uint32_t TrigTimeCnt_1 = 0;//用于检测霍尔全部短路或开路检测 延时判断
|
|
|
+ static uint32_t TrigTimeCnt_1 = 0, TrigTimeCnt_2 = 0;//用于检测霍尔全部短路或开路检测 延时判断
|
|
|
static uint8_t HallGroupOldBak[6];//用于单个霍尔故障判断霍尔状态缓存
|
|
|
static uint8_t Count = 0;
|
|
|
static uint32_t TrigCnt_2 = 0;//用于单个霍尔故障次数计数
|
|
@@ -986,7 +999,7 @@ void MC_Fault_HallSensor_Process(MC_HallSensorStatus_Struct_t HallSensorStatus,
|
|
|
//霍尔传感器全部短路或开路检测
|
|
|
if((HallSensorStatus.HallGropuStatus == 0x00) || (HallSensorStatus.HallGropuStatus == 0x07))
|
|
|
{
|
|
|
- if((HAL_GetTick() - TrigTimeCnt_1) > 250)
|
|
|
+ if((HAL_GetTick() - TrigTimeCnt_1) > 1000)
|
|
|
{
|
|
|
p_MC_ErrorCode->ERROR_Bit.Fault_HallSensor = 1;
|
|
|
//记录故障日志
|
|
@@ -1021,8 +1034,9 @@ void MC_Fault_HallSensor_Process(MC_HallSensorStatus_Struct_t HallSensorStatus,
|
|
|
else
|
|
|
{
|
|
|
TrigCnt_2 = 0;
|
|
|
+ TrigTimeCnt_2 = HAL_GetTick();
|
|
|
}
|
|
|
- if(TrigCnt_2 > 50)
|
|
|
+ if( (TrigCnt_2 > 50) && (HAL_GetTick()>(TrigTimeCnt_2+500)) )
|
|
|
{
|
|
|
p_MC_ErrorCode->ERROR_Bit.Fault_HallSensor = 1;
|
|
|
//记录故障日志
|
|
@@ -1084,7 +1098,7 @@ void MC_Fault_CadenceSensor_Process(uint16_t Torque, uint16_t BikeSpeed, MC_Erro
|
|
|
//判断霍尔1
|
|
|
if(Hall_1_Trg == 0)
|
|
|
{
|
|
|
- if((HAL_GetTick() - Hall_1_Fault_TrigTimeCnt) > 5000)
|
|
|
+ if((HAL_GetTick() - Hall_1_Fault_TrigTimeCnt) > 10000)
|
|
|
{
|
|
|
p_MC_ErrorCode->ERROR_Bit.Fault_CadenceSensor = 1;
|
|
|
//记录故障日志
|