#include "Data_ESpeed\Data_ESpeed.h"
#include "Application.h"
/*** 发动机转速 ***/
uint16_t DataESpeedActual;
uint16_t DataESpeedDisp;
uint8_t DataESpeedValid;
DataESpeedSamplerStruct DataESpeedSampler;
DataESPeedDampingStruct DataESPeedDamping;
DataESpeedIdleStruct DataESpeedIdle;
#define DATA_APPR_DIR_INC 0x01
#define DATA_APPR_DIR_DEC 0x02
/******************************************************************************
函数名:Data_Engine_Speed_KL30_Wakeup_Init
功 能:发动机转速初始化函数
参 数:无
返回值:无
******************************************************************************
注 意:该函数KL30初始化/Wakeup初始化被调用一次
******************************************************************************/
void Data_Engine_Speed_KL30_Wakeup_Init (void)
{
DataESpeedIdle.Timer = 0;
DataESpeedActual = 0;
DataESpeedDisp = 0;
DataESpeedValid = 0;
DataESpeedSampler.Cnt = 0;
DataESPeedDamping.Speed = 0;
DataESPeedDamping.Delta = 0;
DataESPeedDamping.Dir = DATA_APPR_DIR_INC;
}
/******************************************************************************
函数名:Data_Engine_Speed_Processing_Service
功 能:发动机转速数据处理函数
参 数:无
返回值:无
******************************************************************************
注 意:该函数必须每10ms被调用一次
******************************************************************************/
void Data_Engine_Speed_Processing_Service ( void )
{
uint8_t i;
uint16_t ESpeed;
uint16_t Delta;
uint16_t Engine_Speed_Value;
uint8_t Engine_Speed_State;
Engine_Speed_Value = Get_CAN_CH0_ID_101_Sig_ECU_Engine_Speed();
Engine_Speed_State = Get_CAN_CH0_ID_101_Sig_ECU_Engine_Speed_State();
//第1步:获取实际转速值及转速有效性
if ( Common_Get_IG_Sts( ) == COMMON_POWER_ON)
{
if((CAN_MSG_Status(&CAN_CH0_CanMsgOp, CAN_CH0_ID_CAN_0x101_Msg_Count) == CAN_SIG_LOST)||(Engine_Speed_State == 1))
{
DataESpeedValid = 0;
DataESpeedActual = 0;
DataESpeedSampler.Cnt = 0;
}
else
{
if ( DataESpeedValid == 0 )
{
DataESpeedValid = 1;
ESpeed = Engine_Speed_Value;
ESpeed /= 4;
if ( ESpeed > 12000 )
ESpeed = 12000;
DataESpeedActual = ESpeed;
}
else
{
DataESpeedSampler.Buffer[DataESpeedSampler.Cnt] = Engine_Speed_Value;
i = DataESpeedSampler.Cnt;
while ( ( i > 0 ) && ( DataESpeedSampler.Buffer[i] < DataESpeedSampler.Buffer[i - 1] ) )
{
ESpeed = DataESpeedSampler.Buffer[i];
DataESpeedSampler.Buffer[i] = DataESpeedSampler.Buffer[i - 1];
DataESpeedSampler.Buffer[i - 1] = ESpeed;
i--;
}
DataESpeedSampler.Cnt++;
if ( DataESpeedSampler.Cnt >= 5 )
{
DataESpeedSampler.Cnt = 0;
ESpeed = DataESpeedSampler.Buffer[3];
ESpeed /= 4;
if ( ESpeed > 12000 )
ESpeed = 12000;
DataESpeedActual = ESpeed;
}
}
}
}
else
{
DataESpeedValid = 0;
DataESpeedActual = 0;
DataESpeedSampler.Cnt = 0;
}
//第2步:怠速模式
ESpeed = DataESpeedActual;
#if 0
if ( ( ESpeed >= 500 ) && ( ESpeed <= 1000 ) )
{
DataESpeedIdle.Timer++;
if ( ESpeed > DataESpeedIdle.ESpeedBackup )
Delta = ESpeed - DataESpeedIdle.ESpeedBackup;
else
Delta = DataESpeedIdle.ESpeedBackup - ESpeed;
if ( DataESpeedIdle.Mode == 0 )
{
if ( Delta < 150 )
{
if ( DataESpeedIdle.Timer >= 200 )
{
DataESpeedIdle.Mode = 1;
DataESpeedIdle.Timer = 0;
}
}
else
DataESpeedIdle.Timer = 0;
DataESpeedIdle.ESpeedBackup = ESpeed;
}
else
{
if ( Delta < 150 )
{
if ( DataESpeedIdle.Timer >= 200 ) //怠速模式下每10秒转速数据更新一次
{
DataESpeedIdle.Timer = 0;
DataESpeedIdle.ESpeedBackup = ESpeed;
}
else
ESpeed = DataESpeedIdle.ESpeedBackup;
}
else //转速变化大于等于300立即退出怠速模式
{
DataESpeedIdle.Mode = 0;
DataESpeedIdle.Timer = 0;
DataESpeedIdle.ESpeedBackup = ESpeed;
}
}
}
else
{
DataESpeedIdle.Mode = 0;
DataESpeedIdle.Timer = 0;
DataESpeedIdle.ESpeedBackup = ESpeed;
}
#endif
//第3步:转速的阻尼处理
if ( ESpeed > DataESPeedDamping.Speed ) //实际值比当前显示值大时
{
Delta = ESpeed - DataESPeedDamping.Speed;
if ( DataESPeedDamping.Dir == DATA_APPR_DIR_INC ) //显示值正在向实际值增加,则维持当前方向调节增加速度
{
if ( DataESPeedDamping.Delta < Delta ) //当前增量小于显示值与实际值的差值,则提升增加的速度
{
DataESPeedDamping.Delta += DATA_ESPEED_INC_STEP;
if ( DataESPeedDamping.Delta > Delta )
DataESPeedDamping.Delta = Delta;
}
else //当前增量大于等于显示值与实际值的差值,保持增量与当前差值同步,增加的速度即逐步减小
DataESPeedDamping.Delta = Delta;
Delta = DataESPeedDamping.Delta;
Delta /= DATA_ESPEED_DAMPING_FACTOR;
if ( Delta < DATA_ESPEED_APPR_SPEED_MIN )
Delta = DATA_ESPEED_APPR_SPEED_MIN;
DataESPeedDamping.Speed += Delta;
if ( DataESPeedDamping.Speed > ESpeed )
DataESPeedDamping.Speed = ESpeed;
}
else //显示值正在减小,则尽快减速至速度为最小时更换方向
{
if ( DataESPeedDamping.Delta > DATA_ESPEED_DEC_STEP )
DataESPeedDamping.Delta -= DATA_ESPEED_DEC_STEP;
else
DataESPeedDamping.Delta = 0;
Delta = DataESPeedDamping.Delta;
Delta /= DATA_ESPEED_DAMPING_FACTOR;
if ( Delta < DATA_ESPEED_APPR_SPEED_MIN ) //已减速至最小速度
DataESPeedDamping.Dir = DATA_APPR_DIR_INC; //更换方向
else
{
if ( DataESPeedDamping.Speed > Delta )
DataESPeedDamping.Speed -= Delta;
else
DataESPeedDamping.Speed = 0;
}
}
}
else if ( ESpeed < DataESPeedDamping.Speed ) //实际值比当前显示值小时
{
Delta = DataESPeedDamping.Speed - ESpeed;
if ( DataESPeedDamping.Dir == DATA_APPR_DIR_INC ) //显示值仍在增加,则尽快减速至速度为最小时更换方向
{
if ( DataESPeedDamping.Delta > DATA_ESPEED_DEC_STEP )
DataESPeedDamping.Delta -= DATA_ESPEED_DEC_STEP;
else
DataESPeedDamping.Delta = 0;
Delta = DataESPeedDamping.Delta;
Delta /= DATA_ESPEED_DAMPING_FACTOR;
if ( Delta < DATA_ESPEED_APPR_SPEED_MIN ) //已减速至最小速度
DataESPeedDamping.Dir = DATA_APPR_DIR_DEC; //更换方向
else
{
DataESPeedDamping.Speed += Delta;
if ( DataESPeedDamping.Speed > 12000 )
DataESPeedDamping.Speed = 12000;
}
}
else //显示值正在向实际值减小,则维持当前方向调节增加速度
{
if ( DataESPeedDamping.Delta < Delta ) //当前(负)增量小于显示值与实际值的差值,则提升减小的速度
{
DataESPeedDamping.Delta += DATA_ESPEED_INC_STEP;
if ( DataESPeedDamping.Delta > Delta )
DataESPeedDamping.Delta = Delta;
}
else //当前(负)增量大于等于显示值与实际值的差值,保持(负)增量与当前差值同步,减小的速度即逐步减小
DataESPeedDamping.Delta = Delta;
Delta = DataESPeedDamping.Delta;
Delta /= DATA_ESPEED_DAMPING_FACTOR;
if ( Delta < DATA_ESPEED_APPR_SPEED_MIN )
Delta = DATA_ESPEED_APPR_SPEED_MIN;
if ( DataESPeedDamping.Speed < ESpeed + Delta )
DataESPeedDamping.Speed = ESpeed;
else
DataESPeedDamping.Speed -= Delta;
}
}
else //实际值与当前显示值相等时
{
Delta = DataESPeedDamping.Delta;
Delta /= DATA_ESPEED_DAMPING_FACTOR;
if ( Delta > DATA_ESPEED_APPR_SPEED_MIN ) //当前的速度不是最小,说明数值正在增加/减小中,则继续原过程
{
if ( DataESPeedDamping.Delta > DATA_ESPEED_DEC_STEP ) //显示值越过了实际值,必然要先减速至最小速度,再改变方向返回实际值
DataESPeedDamping.Delta -= DATA_ESPEED_DEC_STEP;
else
DataESPeedDamping.Delta = 0;
Delta = DataESPeedDamping.Delta;
Delta /= DATA_ESPEED_DAMPING_FACTOR;
if ( DataESPeedDamping.Dir == DATA_APPR_DIR_INC ) //显示值当前是增加方向
{
if ( Delta < DATA_ESPEED_APPR_SPEED_MIN ) //已减速至最小速度
DataESPeedDamping.Dir = DATA_APPR_DIR_DEC; //更换方向
else
{
DataESPeedDamping.Speed += Delta;
if ( DataESPeedDamping.Speed > 12000 )
DataESPeedDamping.Speed = 12000;
}
}
else //显示值当前是减小方向
{
if ( Delta < DATA_ESPEED_APPR_SPEED_MIN ) //已减速至最小速度
DataESPeedDamping.Dir = DATA_APPR_DIR_INC; //更换方向
else
{
if ( DataESPeedDamping.Speed > Delta )
DataESPeedDamping.Speed -= Delta;
else
DataESPeedDamping.Speed = 0;
}
}
}
}
//第4步 增加回差
if (DataESpeedDisp <= 80)
{
DataESpeedDisp = DataESPeedDamping.Speed;
}
else
{
if ( DataESpeedDisp < DataESPeedDamping.Speed )
{
DataESpeedDisp = DataESPeedDamping.Speed;
}
else
{
Delta = DataESpeedDisp - DataESPeedDamping.Speed;
if ( Delta >= DATA_ESPEED_HYSTERESIS )
{
DataESpeedDisp = DataESPeedDamping.Speed;
}
}
}
}
uint8_t Get_EngineValid(void)
{
return DataESpeedValid;
}
uint16_t Get_ActualEngineSpeed(void)
{
return DataESpeedActual;
}
uint16_t Get_DispEngineSpeed(void)
{
return DataESpeedDisp;
}