|
@@ -30,8 +30,8 @@ void MC_Fault_SpeedSensor_Process(TrueOrFalse_Flag_Struct_t IsStopFlag, MC_Caden
|
|
|
{
|
|
|
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, 延长2圈时间
|
|
|
+ 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, 延长2圈时间
|
|
|
+ DelayTime = DelayTime < 10000 ? 10000 : DelayTime;
|
|
|
if((HAL_GetTick() - TrigTimeCnt_2) > DelayTime)
|
|
|
{
|
|
|
p_MC_ErrorCode->ERROR_Bit.Fault_SpeedSensor = 1;
|
|
@@ -88,7 +88,7 @@ void MC_Fault_TorqueSensor_Process(uint16_t ADC_Data, MC_GearSt_Struct_t GearSt,
|
|
|
static uint16_t TorqueArray[25] = {0};
|
|
|
static uint32_t DiffSqrtResult = 0;
|
|
|
uint16_t i;
|
|
|
- uint16_t DelayTime;
|
|
|
+ //uint16_t DelayTime;
|
|
|
static uint32_t PeriodTimeCnt = 0;
|
|
|
|
|
|
if(HAL_GetTick() < 5000)
|
|
@@ -113,9 +113,9 @@ void MC_Fault_TorqueSensor_Process(uint16_t ADC_Data, MC_GearSt_Struct_t GearSt,
|
|
|
//传感器感应失效检测,进入力矩助力模式、踏频正转大于10rpm、标准差较小
|
|
|
if(((GearSt != 0x22) && ((GearSt & 0x0F) != 0)) && (CadenceData.Cadence_Data > 30) && (CadenceData.Cadence_Dir == MC_Cadence_Forward) && (AstMode == MC_AssistRunMode_TORQUE) && (DiffSqrtResult < 10))
|
|
|
{
|
|
|
- DelayTime = 60000 / CadenceData.Cadence_Data; //根据踏频计算踩踏1/4圈的时间,要考虑空踩情况
|
|
|
- DelayTime = (DelayTime < 250) ? 250 : DelayTime;
|
|
|
- if((HAL_GetTick() - TrigTimeCnt_1) > (DelayTime * 2))
|
|
|
+ //DelayTime = 60000 / CadenceData.Cadence_Data; //根据踏频计算踩踏1/4圈的时间,要考虑空踩情况
|
|
|
+ //DelayTime = (DelayTime < 250) ? 250 : DelayTime;
|
|
|
+ if((HAL_GetTick() - TrigTimeCnt_1) > 15000)
|
|
|
{
|
|
|
p_MC_ErrorCode->ERROR_Bit.Fault_TorqueSensor = 1;
|
|
|
//记录故障日志
|
|
@@ -137,7 +137,7 @@ void MC_Fault_TorqueSensor_Process(uint16_t ADC_Data, MC_GearSt_Struct_t GearSt,
|
|
|
//传感器短路或开路检测
|
|
|
if((ADC_Data < 50) || (ADC_Data > 4050))
|
|
|
{
|
|
|
- if((HAL_GetTick() - TrigTimeCnt_2) > 200)
|
|
|
+ if((HAL_GetTick() - TrigTimeCnt_2) > 1000)
|
|
|
{
|
|
|
p_MC_ErrorCode->ERROR_Bit.Fault_TorqueSensor = 1;
|
|
|
//记录故障日志
|
|
@@ -174,7 +174,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;
|
|
|
//记录故障日志
|
|
@@ -196,7 +196,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;
|
|
|
//记录故障日志
|
|
@@ -218,7 +218,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;
|
|
|
//记录故障日志
|
|
@@ -255,12 +255,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();
|
|
@@ -276,13 +276,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;
|
|
|
//存储故障次数
|
|
@@ -298,13 +300,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;
|
|
|
//存储故障次数
|
|
@@ -319,36 +323,45 @@ void MC_Fault_NTCSensor_Process(uint8_t T_PCB_Result, uint8_t T_Coil_Result, MC_
|
|
|
TrigTimeCnt_Coil = HAL_GetTick();
|
|
|
}
|
|
|
|
|
|
- //NTC为固定值的检测,检测3min内母线电流平均值 > 10A 时的前后温差
|
|
|
+ //NTC为固定值的检测,分别计算2个6.8min内母线电流平均值,当两段母线电流平均值不相等时判断NTC是否发生变化 if((HAL_GetTick() - NTC_Check_PeriodTimeCnt) >= 100)
|
|
|
if((HAL_GetTick() - NTC_Check_PeriodTimeCnt) >= 100)
|
|
|
{
|
|
|
NTC_Check_PeriodTimeCnt = HAL_GetTick();
|
|
|
- BusCurrentSum += (uint16_t)(MC_RunInfo.BusCurrent >> 7);//按照mA / 128 判断,约0.1A
|
|
|
+ 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个值取均值
|
|
|
+ //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,判断是否有温升
|
|
|
- if(BusCurrentAvg > 79) // 79 * 1.28 = 101
|
|
|
+ //总平均电流超过10A时,当两段平均电流变化超过3A,判断温度是否发生变化
|
|
|
+ if(((BusCurrentAvg1 + BusCurrentAvg2) >> 1) > 79) //79 * 128 = 10.1A
|
|
|
{
|
|
|
- if((abs(T_PCB_Result - T_PCB_Old) < 1) || //PCB 温升低于2度
|
|
|
- (abs(T_Coil_Result - T_Coil_Old) < 1)) //绕组温升低于2度
|
|
|
+ if(abs(BusCurrentAvg1 - BusCurrentAvg2) >= 25) //25 * 128 = 3.2A
|
|
|
{
|
|
|
- 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(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;
|
|
@@ -798,7 +811,7 @@ void MC_Fault_Circuit_Process(MC_ErrorCode_Struct_t* p_MC_ErrorCode)
|
|
|
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;//用于单个霍尔故障次数计数
|
|
@@ -815,7 +828,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;
|
|
|
//记录故障日志
|
|
@@ -850,8 +863,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;
|
|
|
//记录故障日志
|
|
@@ -913,7 +927,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;
|
|
|
//记录故障日志
|
|
@@ -934,7 +948,7 @@ void MC_Fault_CadenceSensor_Process(uint16_t Torque, uint16_t BikeSpeed, MC_Erro
|
|
|
//判断霍尔2
|
|
|
if(Hall_2_Trg == 0)
|
|
|
{
|
|
|
- if((HAL_GetTick() - Hall_2_Fault_TrigTimeCnt) > 5000)
|
|
|
+ if((HAL_GetTick() - Hall_2_Fault_TrigTimeCnt) > 10000)
|
|
|
{
|
|
|
p_MC_ErrorCode->ERROR_Bit.Fault_CadenceSensor = 1;
|
|
|
//记录故障日志
|
|
@@ -955,7 +969,7 @@ void MC_Fault_CadenceSensor_Process(uint16_t Torque, uint16_t BikeSpeed, MC_Erro
|
|
|
//判断霍尔1和霍尔2黏连
|
|
|
if(Hall_1_2_EQA_Flag == 0)
|
|
|
{
|
|
|
- if((HAL_GetTick() - Hall_1_2_EQA_TrigTimeCnt) > 5000)
|
|
|
+ if((HAL_GetTick() - Hall_1_2_EQA_TrigTimeCnt) > 10000)
|
|
|
{
|
|
|
p_MC_ErrorCode->ERROR_Bit.Fault_CadenceSensor = 1;
|
|
|
//记录故障日志
|