|
@@ -46,12 +46,24 @@ void HAL_SYSTICK_Callback(void)
|
|
|
}
|
|
|
|
|
|
//踏频传感器采集及计算
|
|
|
- CadenceSensor_Process(&MC_CadenceResult, MC_ConfigParam1.StopTime, (MC_ConfigParam1.CadenceStarNum == 0) ? 2 : MC_ConfigParam1.CadenceStarNum, FALSE);
|
|
|
+ if(VersionIdentifyFinishedFlag == TRUE)
|
|
|
+ {
|
|
|
+ if(MC_VerInfo.HW_Version[7] < 'C')
|
|
|
+ CadenceSensor_Process1(&MC_CadenceResult, MC_ConfigParam1.StopTime, (MC_ConfigParam1.CadenceStarNum == 0) ? 2 : MC_ConfigParam1.CadenceStarNum, FALSE);
|
|
|
+ else
|
|
|
+ CadenceSensor_Process2(&MC_CadenceResult, MC_ConfigParam1.StopTime, (MC_ConfigParam1.CadenceStarNum == 0) ? 2 : MC_ConfigParam1.CadenceStarNum, FALSE);
|
|
|
+ }
|
|
|
|
|
|
//踏频传感器故障检测
|
|
|
if(MC_WorkMode == MC_WorkMode_Run)
|
|
|
{
|
|
|
- MC_Fault_CadenceSensor_Process(ADC_SensorData.TorqueSensor, MC_RunInfo.BikeSpeed, &MC_ErrorCode);
|
|
|
+ if(VersionIdentifyFinishedFlag == TRUE)
|
|
|
+ {
|
|
|
+ if(MC_VerInfo.HW_Version[7] < 'C')
|
|
|
+ MC_Fault_CadenceSensor_Process1(ADC_SensorData.TorqueSensor, MC_RunInfo.BikeSpeed, &MC_ErrorCode);
|
|
|
+ else
|
|
|
+ MC_Fault_CadenceSensor_Process2(ADC_SensorData.TorqueSensor, MC_RunInfo.BikeSpeed, &MC_ErrorCode);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
//根据电机工作模式(MC_WorkMode)、力矩传感器和指拨AD值(ADC_SensorData)、控制档位(MC_ControlCode.GearSt)计算控制FOC输入值(MC_CalParam)
|
|
@@ -173,6 +185,9 @@ void MC_RunInfo_Update(void)
|
|
|
//计算力矩值
|
|
|
MC_RunInfo.Torque = ADC_SensorData.TorqueSensor / 28;
|
|
|
|
|
|
+ //踩踏功率计算
|
|
|
+ PedalPowerFltSum += (((int32_t)(MC_RunInfo.Cadence * MC_RunInfo.Torque * 107) - PedalPowerFltSum) >> 4); //P = n * T / 9.55
|
|
|
+
|
|
|
//当前助力档位
|
|
|
MC_RunInfo.GearSt = MC_ControlCode.GearSt;
|
|
|
|
|
@@ -239,7 +254,7 @@ void MC_RunInfo_Update(void)
|
|
|
MC_RunInfo.Ride_Km++;
|
|
|
MC_RunInfo.ODO_Km = MC_RideLog.ODO_Km / 10;
|
|
|
|
|
|
- #if 1 //自动存储骑行里程
|
|
|
+ #if 0 //自动存储骑行里程
|
|
|
static uint8_t SavePeriodCount = 0;
|
|
|
SavePeriodCount++;
|
|
|
if(SavePeriodCount >= 30)//存储周期为3km
|
|
@@ -276,23 +291,50 @@ void MC_RunInfo_Update(void)
|
|
|
//更新骑行历史信息中骑行时间
|
|
|
MC_RideLog.ODO_Time++;
|
|
|
MC_RunLog1.ODO_Time++;
|
|
|
+ MC_RideLog.TRIP_Time++;
|
|
|
#if 0 //时间是否自动归零
|
|
|
- MC_RideLog.ODO_Time = (MC_RideLog.ODO_Time > 599999) ? 0 : MC_RideLog.ODO_Time; //超过9999h59min,清零
|
|
|
- MC_RideLog.TRIP_Time = (MC_RideLog.TRIP_Time > 599999) ? 0 : MC_RideLog.TRIP_Time;//超过9999h59min,清零
|
|
|
+ if(MC_RideLog.ODO_Time > 599999)
|
|
|
+ MC_RideLog.ODO_Time = 0;
|
|
|
+ if(MC_RideLog.TRIP_Info.TripTime_MaxSpeed.TRIP_Time > 599999)
|
|
|
+ MC_RideLog.TRIP_Info.TripTime_MaxSpeed.TRIP_Time > 599999 = 0;
|
|
|
#endif
|
|
|
- MC_RideLog.TRIP_Time++;
|
|
|
+ //骑行功率累计
|
|
|
+ MC_AvgPower.PedalPowerSum += (PedalPowerFltSum >> 10); //Wmin
|
|
|
}
|
|
|
//存储骑行总时间
|
|
|
+ #if 0 //根据骑行时间自动存储
|
|
|
if(SavePeriod_Cnt >= 600) //累计骑行600s进行存储
|
|
|
{
|
|
|
SavePeriod_Cnt = 0;
|
|
|
- SaveParamToEEprom_24C02(&I2C_Handle_EEPROM, EEPROM_24C02_ADDR_RUN_LOG1, sizeof(MC_RunLog1_Struct_t), (uint8_t*)&MC_RunLog1.PowerOnCnt);
|
|
|
- SaveParamToEEprom_24C02(&I2C_Handle_EEPROM, EEPROM_24C02_ADDR_RIDE_LOG, sizeof(MC_RideLog_Struct_t), (uint8_t*)&MC_RideLog.ODO_Km);
|
|
|
+ SaveParamToEEprom_24C02(&I2C_Handle_EEPROM, EEPROM_24C02_ADDR_RUN_LOG1, sizeof(MC_RunLog1_Struct_t), (uint8_t*)&MC_RunLog1.PowerOnCnt);
|
|
|
+ SaveParamToEEprom_24C02(&I2C_Handle_EEPROM, EEPROM_24C02_ADDR_RIDE_LOG, sizeof(MC_RideLog_Struct_t), (uint8_t*)&MC_RideLog.ODO_Km);
|
|
|
}
|
|
|
+ #endif
|
|
|
|
|
|
//平均功耗
|
|
|
MC_RunInfo.PowerPerKm = RemainDis.Power_per_km_result / 10;
|
|
|
|
|
|
+ //骑行信息计算
|
|
|
+ do
|
|
|
+ {
|
|
|
+ uint16_t PowerAvg;
|
|
|
+ //最大车速
|
|
|
+ if(MC_AvgPower.SpeedMax < MC_RunInfo.BikeSpeed)
|
|
|
+ MC_AvgPower.SpeedMax = MC_RunInfo.BikeSpeed;
|
|
|
+ MC_RideInfo.SpeedMax = MC_AvgPower.SpeedMax;
|
|
|
+ //平均车速
|
|
|
+ if(MC_RideLog.TRIP_Time == 0)
|
|
|
+ MC_RideInfo.SpeedAvg = 0;
|
|
|
+ else
|
|
|
+ MC_RideInfo.SpeedAvg = MC_RideLog.TRIP_Km * 60 / MC_RideLog.TRIP_Time;
|
|
|
+ //卡路里
|
|
|
+ if(MC_RideLog.ODO_Time == 0)
|
|
|
+ PowerAvg = 0;
|
|
|
+ else
|
|
|
+ PowerAvg = MC_AvgPower.PedalPowerSum / MC_RideLog.ODO_Time;
|
|
|
+ MC_RideInfo.Cal_Trip = PowerAvg * 66 * MC_RideLog.TRIP_Time / 1000; //Cal = P * 1.1 * 3.6 * t(h)
|
|
|
+ MC_RideInfo.Cal_Once = PowerAvg * 11 * MC_RunInfo.Ride_Time / 10000; //Cal = P * 1.1 * 3.6 * t(h)
|
|
|
+ }while(0);
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -308,8 +350,8 @@ void MC_DebugInfo_Update(void)
|
|
|
MC_DebugInfo.SysFSM2 = FOC_Status; //FOC状态
|
|
|
MC_DebugInfo.SysFSM3 = 0;
|
|
|
MC_DebugInfo.SysFSM4 = 0;
|
|
|
- MC_DebugInfo.IdRef = IqFluxLessRef; //IdRef
|
|
|
- MC_DebugInfo.IqRef = IdFluxLessRef; //IqRef
|
|
|
+ MC_DebugInfo.IdRef = IdFluxLessRef; //IdRef
|
|
|
+ MC_DebugInfo.IqRef = IqFluxLessRef; //IqRef
|
|
|
MC_DebugInfo.UdRef = Stat_Volt_q_d.qV_Component2; //UdRef
|
|
|
MC_DebugInfo.UqRef = Stat_Volt_q_d.qV_Component1; //UqRef
|
|
|
MC_DebugInfo.PedalTorquePer = ADC_SensorData.TorqueSensor; //力矩AD,减去零点
|
|
@@ -647,6 +689,7 @@ void PowerOff_Process(TrueOrFalse_Flag_Struct_t ReturnEnable)
|
|
|
MC_PowerOffBkp.Run_Time = MC_RunLog1.RunTime;
|
|
|
MC_PowerOffBkp.Log_ODO_Km = MC_RunLog1.ODO_Km;
|
|
|
MC_PowerOffBkp.Log_ODO_Time = MC_RunLog1.ODO_Time;
|
|
|
+ MC_PowerOffBkp.PedalPoweSum = MC_AvgPower.PedalPowerSum;
|
|
|
SaveDataToEEPROM_Flash(EEPROM_FLASH_ADDR_POWEROFF_BKP, (uint8_t*)&MC_PowerOffBkp.ODO_Km, 40);//写入掉电临时保存数据,写入前该区域需擦除为0xFF才能操作成功
|
|
|
SaveDataToEEPROM_Flash(EEPROM_FLASH_ADDR_POWEROFF_BKP_FLAG, (uint8_t*)"FLAG", 4); //掉电存储的数据标志更新
|
|
|
SaveFlag = SET;
|
|
@@ -767,20 +810,25 @@ void MC_UartRxCheck_Process(void)
|
|
|
}
|
|
|
|
|
|
//运行总时间计算
|
|
|
-void MC_RunTime_Cal(uint32_t* p_Runtime)
|
|
|
+void MC_RunTime_Cal()
|
|
|
{
|
|
|
static uint32_t PeriodTimeCnt = 0;
|
|
|
- static uint8_t SavePeriodCount = 0;
|
|
|
+ static uint32_t SavePeriodCount = 0;
|
|
|
|
|
|
if((HAL_GetTick()- PeriodTimeCnt) >= 60000)
|
|
|
{
|
|
|
- PeriodTimeCnt = HAL_GetTick();
|
|
|
- (*p_Runtime)++;
|
|
|
- //存储运行总时间
|
|
|
+ PeriodTimeCnt = HAL_GetTick();
|
|
|
+ MC_RunLog1.RunTime++;
|
|
|
SavePeriodCount++;
|
|
|
- if(SavePeriodCount >= 10) //自动存储周期10min
|
|
|
+ }
|
|
|
+ //自动存储历史数据
|
|
|
+ if(SavePeriodCount >= 10) //自动存储周期10min
|
|
|
+ {
|
|
|
+ if(MC_CalParam.Foc_Flag == RESET)
|
|
|
{
|
|
|
SaveParamToEEprom_24C02(&I2C_Handle_EEPROM, EEPROM_24C02_ADDR_RUN_LOG1, sizeof(MC_RunLog1_Struct_t), (uint8_t*)&MC_RunLog1.PowerOnCnt);
|
|
|
+ SaveParamToEEprom_24C02(&I2C_Handle_EEPROM, EEPROM_24C02_ADDR_RIDE_LOG, sizeof(MC_RideLog_Struct_t), (uint8_t*)&MC_RideLog.ODO_Km);
|
|
|
+ SaveParamToEEprom_24C02(&I2C_Handle_EEPROM, EEPROM_24C02_ADDR_AVG_POWER, sizeof(MC_AvgPower_Struct_t), (uint8_t*)&MC_AvgPower.GearSt_ECO);
|
|
|
SavePeriodCount = 0;
|
|
|
}
|
|
|
}
|
|
@@ -912,7 +960,7 @@ void MC_DeviceCheck(Device_CheckInfo_Struct_t* p_Device, MC_ErrorCode_Struct_t*
|
|
|
{
|
|
|
p_ErrorCode->ERROR_Bit.Fault_BMS_Check = 1;
|
|
|
MC_RunLog1.BMS_Check_FaultCnt++;
|
|
|
- SaveParamToEEprom_24C02(&I2C_Handle_EEPROM, EEPROM_24C02_ADDR_RUN_LOG1, sizeof(MC_RunLog1_Struct_t), (uint8_t*)&MC_RunLog1.PowerOnCnt);
|
|
|
+ RunLogSaveIndex = 1;
|
|
|
}
|
|
|
break;
|
|
|
}
|
|
@@ -926,7 +974,7 @@ void MC_DeviceCheck(Device_CheckInfo_Struct_t* p_Device, MC_ErrorCode_Struct_t*
|
|
|
{
|
|
|
p_ErrorCode->ERROR_Bit.Fault_PBU_Check = 1;
|
|
|
MC_RunLog1.PBU_Check_FaultCnt++;
|
|
|
- SaveParamToEEprom_24C02(&I2C_Handle_EEPROM, EEPROM_24C02_ADDR_RUN_LOG1, sizeof(MC_RunLog1_Struct_t), (uint8_t*)&MC_RunLog1.PowerOnCnt);
|
|
|
+ RunLogSaveIndex = 1;
|
|
|
}
|
|
|
break;
|
|
|
}
|
|
@@ -940,7 +988,7 @@ void MC_DeviceCheck(Device_CheckInfo_Struct_t* p_Device, MC_ErrorCode_Struct_t*
|
|
|
{
|
|
|
p_ErrorCode->ERROR_Bit.Fault_HMI_Check = 1;
|
|
|
MC_RunLog1.HMI_Check_FaultCnt++;
|
|
|
- SaveParamToEEprom_24C02(&I2C_Handle_EEPROM, EEPROM_24C02_ADDR_RUN_LOG1, sizeof(MC_RunLog1_Struct_t), (uint8_t*)&MC_RunLog1.PowerOnCnt);
|
|
|
+ RunLogSaveIndex = 1;
|
|
|
}
|
|
|
break;
|
|
|
}
|
|
@@ -961,8 +1009,7 @@ void Cal_SyncClockFreq(uint16_t* Result)
|
|
|
//温度历史信息处理
|
|
|
void MC_TemperatureLogProcess(void)
|
|
|
{
|
|
|
- static uint32_t PeriodTimeCnt = 0;
|
|
|
- static uint16_t SavePeriodCnt = 0;
|
|
|
+ static uint32_t PeriodTimeCnt = 0;
|
|
|
static TrueOrFalse_Flag_Struct_t DataChangeFlag = FALSE;
|
|
|
|
|
|
if(HAL_GetTick() < 10000) //开机前10s不处理
|
|
@@ -1011,6 +1058,8 @@ void MC_TemperatureLogProcess(void)
|
|
|
}
|
|
|
|
|
|
//自动存储
|
|
|
+ #if 0
|
|
|
+ static uint16_t SavePeriodCnt = 0;
|
|
|
SavePeriodCnt++;
|
|
|
if((SavePeriodCnt > 12) && (DataChangeFlag == TRUE)) //1min
|
|
|
{
|
|
@@ -1018,6 +1067,7 @@ void MC_TemperatureLogProcess(void)
|
|
|
DataChangeFlag = FALSE;
|
|
|
SaveParamToEEprom_24C02(&I2C_Handle_EEPROM, EEPROM_24C02_ADDR_RUN_LOG1, sizeof(MC_RunLog1_Struct_t), (uint8_t*)&MC_RunLog1.PowerOnCnt);
|
|
|
}
|
|
|
+ #endif
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -1082,22 +1132,40 @@ void Device_Handshake_Process(void)
|
|
|
{
|
|
|
static uint32_t PeriodCnt = 0;
|
|
|
static uint8_t i = 0;
|
|
|
- if((HAL_GetTick() - PeriodCnt) >= 500)
|
|
|
+ static uint8_t HandShakeFlag1 = 0, HandShakeFlag2 = 0;
|
|
|
+
|
|
|
+ //开机时判断是否发送心跳
|
|
|
+ if(HandShakeFlag1 == 0)
|
|
|
+ {
|
|
|
+ if(IsComOK_BMS.IsOK_Flag == TRUE)
|
|
|
+ HandShakeFlag1 = 1;
|
|
|
+ }
|
|
|
+
|
|
|
+ if(HandShakeFlag2 == 0)
|
|
|
+ {
|
|
|
+ if(IsComOK_PBU.IsOK_Flag == TRUE)
|
|
|
+ HandShakeFlag2 = 1;
|
|
|
+ }
|
|
|
+
|
|
|
+ //定时循环发送心跳
|
|
|
+ if((HAL_GetTick() - PeriodCnt) >= 1000)
|
|
|
{
|
|
|
PeriodCnt = HAL_GetTick();
|
|
|
if(i == 0)
|
|
|
{
|
|
|
//BMS
|
|
|
- SendData(ID_MC_TO_BMS, MODE_READ, 0x3009, (uint8_t*)"HANDSHAKE");
|
|
|
+ if(HandShakeFlag1 == 1)
|
|
|
+ SendData(ID_MC_TO_BMS, MODE_READ, 0x3009, (uint8_t*)"HANDSHAKE");
|
|
|
i = 1;
|
|
|
}
|
|
|
else if(i == 1)
|
|
|
{
|
|
|
//OBC
|
|
|
- SendData(ID_MC_TO_PBU, MODE_READ, 0x5009, (uint8_t*)"HANDSHAKE");
|
|
|
+ if(HandShakeFlag2 == 1)
|
|
|
+ SendData(ID_MC_TO_PBU, MODE_READ, 0x5009, (uint8_t*)"HANDSHAKE");
|
|
|
i = 0;
|
|
|
}
|
|
|
|
|
|
- }
|
|
|
+ }
|
|
|
}
|
|
|
/**************************全局函数定义结束*****************/
|