RabbitECUTeensyMCUXpresso/source/Client/IAC.c

757 lines
22 KiB
C

/******************************************************************************/
/* Copyright (c) 2016 MD Automotive Controls. Original Work. */
/* License: http://www.gnu.org/licenses/gpl.html GPL version 2 or higher */
/******************************************************************************/
/* CONTEXT:USER_APP */
/* PACKAGE TITLE: Idle Air Control */
/* DESCRIPTION: This code module initialises the required */
/* resources and functions for idle air control */
/* */
/* FILE NAME: IAC.c */
/* REVISION HISTORY: 28-03-2016 | 1.0 | Initial revision */
/* */
/******************************************************************************/
#define _IAC_C
/******************************************************************************/
/* HEADER FILES */
/******************************************************************************/
#include "build.h"
#ifdef BUILD_USER
#include "IAC.h"
#include "usercal.h"
/* LOCAL VARIABLE DEFINITIONS (STATIC) ****************************************/
#ifdef BUILD_BSP_IAC_STEPPER
uint32 IAC_u32TargetStep;
uint32 IAC_u32TargetStepNormalised;
uint32 IAC_u32FeedbackStep;
// mode=readvalue name="IAC Step" type=uint32 offset=0 min=0 max=255 m=1 b=0 units="dl" format=5.3 help="IAC Current Stepper Position"
uint32 IAC_u32StepsLearnedMin;
// mode=readvalue name="IAC Step Learned Min" type=uint32 offset=0 min=0 max=255 m=1 b=0 units="dl" format=5.3 help="IAC Learned Min Position"
IAC_tenStepperState IAC_enStepperState;
uint32 IAC_u32StepCounter;
uint32 IAC_u32StepCounterLimit;
uint8 IAC_u8StepArray[4];
#endif
uint32 IAC_u32IdleEntryTimer;
uint32 IAC_u32RPMLongAverage;
SPREADAPI_ttSpreadIDX IAC_tSpreadISCTargetIDX;
TABLEAPI_ttTableIDX IAC_tTableISCTargetIDX;
SPREADAPI_ttSpreadIDX IAC_tSpreadOpenLoopPosIDX;
TABLEAPI_ttTableIDX IAC_tTableOpenLoopPosIDX;
uint16 IAC_u16ISCTarget;
uint16 IAC_u16OpenLoopPos;
uint16 IAC_u16ISCTargetRamp;
//ASAM mode=readvalue name="IAC Target RPM" type=uint16 offset=0 min=0 max=4095 m=1 b=0 units="RPM" format=4.0 help="IAC Current Target RPM"
uint16 IAC_u16ISCTargetRampOld;
bool IAC_boRun;
/* LOCAL FUNCTION PROTOTYPES (STATIC) *****************************************/
#ifdef BUILD_BSP_IAC_STEPPER
static bool IAC_boUnderStepMins(void);
static uint32 IAC_u32GetOpenStepsTempNormalised(uint32 u32Temp);
#endif //BUILD_BSP_IAC_STEPPER
/* GLOBAL FUNCTION DEFINITIONS ************************************************/
void IAC_vStart(puint32 const pu32Arg)
{
#ifdef BUILD_BSP_IAC_STEPPER
IOAPI_tenEHIOResource enEHIOResource;
IOAPI_tenEHIOType enEHIOType;
IOAPI_tenDriveStrength enDriveStrength = IOAPI_enWeak;
IAC_u32TargetStep = 0;
IAC_u32FeedbackStep = 0;
IAC_enStepperState = IAC_enResetHome;
IAC_u32StepCounter = 0;
IAC_u32StepCounterLimit = 0;
enEHIOType = IOAPI_enDIOOutput;
enDriveStrength = IOAPI_enStrong;
if (EH_IO_Invalid > USERCAL_stRAMCAL.aIACIOResource[0])
{
enEHIOResource = USERCAL_stRAMCAL.aIACIOResource[0];
SETUP_vSetupDigitalIO(enEHIOResource, enEHIOType, enDriveStrength, pu32Arg);
}
if (EH_IO_Invalid > USERCAL_stRAMCAL.aIACIOResource[1])
{
enEHIOResource = USERCAL_stRAMCAL.aIACIOResource[1];
SETUP_vSetupDigitalIO(enEHIOResource, enEHIOType, enDriveStrength, pu32Arg);
}
if (EH_IO_Invalid > USERCAL_stRAMCAL.aIACIOResource[2])
{
enEHIOResource = USERCAL_stRAMCAL.aIACIOResource[2];
SETUP_vSetupDigitalIO(enEHIOResource, enEHIOType, enDriveStrength, pu32Arg);
}
if (EH_IO_Invalid > USERCAL_stRAMCAL.aIACIOResource[3])
{
enEHIOResource = USERCAL_stRAMCAL.aIACIOResource[3];
SETUP_vSetupDigitalIO(enEHIOResource, enEHIOType, enDriveStrength, pu32Arg);
}
#endif
IAC_u32IdleEntryTimer = 0;
IAC_u32RPMLongAverage = 0;
IAC_enControlState = IAC_enOpenLoop;
/* Request and initialise required Kernel managed spread for ISC target spread*/
IAC_tSpreadISCTargetIDX = SETUP_tSetupSpread((void*)&CTS_tTempCFiltered, (void*)&USERCAL_stRAMCAL.aUserISCSpeedTargetSpread , TYPE_enInt32, 17, SPREADAPI_enSpread4ms, NULL);
/* Request and initialise required Kernel managed table for ISC target */
IAC_tTableISCTargetIDX = SETUP_tSetupTable((void*)&USERCAL_stRAMCAL.aUserISCSpeedTargetTable, (void*)&IAC_u16ISCTarget, TYPE_enUInt16, 17, IAC_tSpreadISCTargetIDX, NULL);
/* Request and initialise required Kernel managed spread for ISC open loop position spread*/
IAC_tSpreadOpenLoopPosIDX = SETUP_tSetupSpread((void*)&CTS_tTempCFiltered, (void*)&USERCAL_stRAMCAL.aUserISCOpenLoopPosSpread , TYPE_enInt32, 17, SPREADAPI_enSpread4ms, NULL);
/* Request and initialise required Kernel managed table for ISC open loop position */
IAC_tTableOpenLoopPosIDX = SETUP_tSetupTable((void*)&USERCAL_stRAMCAL.aUserISCOpenLoopPosTable, (void*)&IAC_u16OpenLoopPos, TYPE_enUInt16, 17, IAC_tSpreadOpenLoopPosIDX, NULL);
}
void IAC_vRun(puint32 const pu32Arg)
{
#ifdef BUILD_BSP_IAC_STEPPER
IOAPI_tenTriState enTriState;
IOAPI_tenEHIOResource enEHIOResource;
uint32 u32OpenLoopTargetStep;
uint32 u32OpenLoopTargetStepNormalised;
uint32 u32TempClipped;
static uint32 u32StepsLearnedCount;
#endif
uint32 u32Temp;
sint32 s32Temp;
static sint32 s32RPMErrOld;
sint32 s32ErrDelta;
sint32 s32ErrDeltaAbs;
uint32 u32IdleEntryRPM;
static uint32 u32ISCCount;
static uint16 u16TargetRamp = 200;
static uint16 u16AfterStartTargetRamp = 200;
static uint32 u32OBDAdvFiltered = 500 * (0x80 + 40);
static uint16 u16ISCMin = 0;
static uint16 u16ISCMax = 4096;
uint16 u16TempMin;
uint16 u16TempMax;
if (TRUE == IAC_boRun)
{
/* Calculate the current spread for ISC target */
USER_vSVC(SYSAPI_enCalculateSpread, (void*)&IAC_tSpreadISCTargetIDX,
NULL, NULL);
/* Lookup the current value for ISC target */
USER_vSVC(SYSAPI_enCalculateTable, (void*)&IAC_tTableISCTargetIDX,
NULL, NULL);
/* Calculate the current spread for ISC target */
USER_vSVC(SYSAPI_enCalculateSpread, (void*)&IAC_tSpreadOpenLoopPosIDX,
NULL, NULL);
/* Lookup the current value for ISC target */
USER_vSVC(SYSAPI_enCalculateTable, (void*)&IAC_tTableOpenLoopPosIDX,
NULL, NULL);
if ((TRUE == USERCAL_stRAMCAL.u8VehicleStoppedFuelCutEnable) ||
((FALSE == USERCAL_stRAMCAL.u8VehicleStoppedFuelCutEnable) &&
(TRUE == TORQUE_boVehicleMovingUS)))
{
IAC_boOverrunCutRPMEnable = (IAC_u16ISCTarget + USERCAL_stRAMCAL.u16OverrunCutEnableRPM) > CAM_u32RPMRaw ? FALSE : IAC_boOverrunCutRPMEnable;
IAC_boOverrunCutRPMEnable = (IAC_u16ISCTarget + USERCAL_stRAMCAL.u16OverrunCutDisableRPM) < CAM_u32RPMRaw ? TRUE : IAC_boOverrunCutRPMEnable;
}
else
{
IAC_boOverrunCutRPMEnable = FALSE;
}
u32IdleEntryRPM = IAC_u16ISCTarget + USERCAL_stRAMCAL.u16IdleEntryOffset;
IAC_u16ISCTargetRamp = IAC_u16ISCTarget + u16TargetRamp + u16AfterStartTargetRamp;
if (USERCAL_stRAMCAL.u16RPMRunThreshold < CAM_u32RPMRaw)
{
(void)USERMATH_u16SinglePoleLowPassFilter16((uint16)CAM_u32RPMRaw,
0x10, &IAC_u32RPMLongAverage);
}
else
{
IAC_u32RPMLongAverage = 0x100 * CAM_u32RPMRaw;
}
if ((u32IdleEntryRPM > CAM_u32RPMRaw) &&
(TRUE == TPS_boThrottleClosed) &&
(0 != CAM_u32RPMRaw))
{
s32Temp = (sint32)(IAC_u32RPMLongAverage / 0x100) - (sint32)CAM_u32RPMRaw;
s32Temp = ABS(s32Temp);
if (300 > s32Temp)
{
if (10 < IAC_u32IdleEntryTimer)
{
IAC_enControlState = IAC_enClosedLoop;
}
else
{
IAC_u32IdleEntryTimer++;
}
}
else
{
IAC_u32IdleEntryTimer = 0;
}
}
else
{
IAC_u32IdleEntryTimer = 0;
IAC_enControlState = IAC_enOpenLoop;
}
if (0 > CTS_tTempCFiltered)
{
u16TempMin = USERCAL_stRAMCAL.u16ISCColdISCMin;
u16TempMax = USERCAL_stRAMCAL.u16ISCColdISCMax;
}
else if (50000 < CTS_tTempCFiltered)
{
u16TempMin = USERCAL_stRAMCAL.u16ISCHotISCMin;
u16TempMax = USERCAL_stRAMCAL.u16ISCHotISCMax;
}
else if ((USERCAL_stRAMCAL.u16ISCColdISCMin >= USERCAL_stRAMCAL.u16ISCHotISCMin) &&
(USERCAL_stRAMCAL.u16ISCColdISCMax >= USERCAL_stRAMCAL.u16ISCHotISCMax))
{
u16TempMin = USERCAL_stRAMCAL.u16ISCHotISCMin +
((USERCAL_stRAMCAL.u16ISCColdISCMin - USERCAL_stRAMCAL.u16ISCHotISCMin) * (50 - (CTS_tTempCFiltered / 1000)) /
50);
u16TempMax = USERCAL_stRAMCAL.u16ISCHotISCMax +
((USERCAL_stRAMCAL.u16ISCColdISCMax - USERCAL_stRAMCAL.u16ISCHotISCMax) * (50 - (CTS_tTempCFiltered / 1000)) /
50);
}
/* Ramp the min/max */
if (400 > CAM_u32RPMFiltered)
{
u16ISCMin = 2048;
u16ISCMax = 4096;
}
else
{
if ((u16TempMin + 10) < u16ISCMin)
{
u16ISCMin -= 10;
}
else if (u16TempMin > (u16ISCMin + 10))
{
u16ISCMin += 10;
}
if ((u16TempMax + 10) < u16ISCMax)
{
u16ISCMax -= 10;
}
else if (u16TempMax > (u16ISCMax + 10))
{
u16ISCMax += 10;
}
}
if (IAC_enClosedLoop == IAC_enControlState)
{
if (TRUE == USERCAL_stRAMCAL.boOBDISCADV)
{
if (TRUE == SENSORS_boOBDAdvNewSample)
{
s32Temp = 500 * SENSORS_u8OBDAdv;
u32OBDAdvFiltered = ((7 * u32OBDAdvFiltered) / 8) + s32Temp / 8;
if ((128 * 500) < s32Temp)
{
IAC_s32ISCESTTrim[0] = s32Temp - 128 * 500;
IAC_s32ISCESTTrim[1] = s32Temp - 128 * 500;
}
else
{
IAC_s32ISCESTTrim[0] = 0;
IAC_s32ISCESTTrim[1] = 0;
}
SENSORS_boOBDAdvNewSample = FALSE;
}
else
{
if (((sint32)u32OBDAdvFiltered - 128 * 500 + 2000) < IAC_s32ISCESTTrim[0])
{
IAC_s32ISCESTTrim[0] -= 2000;
IAC_s32ISCESTTrim[1] -= 2000;
}
if (((sint32)u32OBDAdvFiltered - 128 * 500 - 2000) > IAC_s32ISCESTTrim[0])
{
IAC_s32ISCESTTrim[0] += 2000;
IAC_s32ISCESTTrim[1] += 2000;
}
}
}
else
{
if ((IAC_u16ISCTargetRamp - USERCAL_stRAMCAL.u16StallSaverRPMThreshold) > (uint16)CAM_u32RPMRaw)
{
/* Stall saver */
u16TargetRamp = USERCAL_stRAMCAL.u16ISCEntryRamp;
}
/* Hold the rpm error in s32Temp */
s32Temp = (sint32)IAC_u16ISCTargetRamp - (sint32)CAM_u32RPMRaw;
if (IAC_u16ISCTargetRamp <= IAC_u16ISCTargetRampOld)
{
if ((IAC_u16ISCTargetRampOld - IAC_u16ISCTargetRamp) < 20)
{
s32ErrDelta = s32Temp - s32RPMErrOld;
}
else
{
s32ErrDelta = 0;
}
}
else
{
if ((IAC_u16ISCTargetRamp - IAC_u16ISCTargetRampOld) < 20)
{
s32ErrDelta = s32Temp - s32RPMErrOld;
}
else
{
s32ErrDelta = 0;
}
}
s32ErrDeltaAbs = ABS(s32ErrDelta);
s32RPMErrOld = (sint32)IAC_u16ISCTargetRamp - (sint32)CAM_u32RPMRaw;
IAC_u16ISCTargetRampOld = IAC_u16ISCTargetRamp;
if (0 <= s32Temp)
{
s32Temp = 40 < s32Temp ? s32Temp - 40 : 0;
}
else
{
s32Temp = -40 > s32Temp ? s32Temp + 40 : 0;
}
if (20 > s32ErrDeltaAbs)
{
s32ErrDelta = 0;
}
else
{
if (0 > s32ErrDelta)
{
s32ErrDelta += 20;
s32ErrDelta *= 2;
}
else
{
s32ErrDelta -= 20;
s32ErrDelta *= 2;
}
}
s32Temp /= 4;
s32Temp += s32ErrDelta;
if ((0 == TPS_u16CANTPSDeltaNegCount) && (0 == TPS_u16CANTPSDeltaPosCount))
{
if (0 <= s32Temp)
{
CPU_xEnterCritical();
IAC_s32ISCESTTrim[0] = (sint32)USERCAL_stRAMCAL.u32ISCESTTrimPos > (USERCAL_stRAMCAL.u16ESTCLGain * s32Temp) ? (USERCAL_stRAMCAL.u16ESTCLGain * s32Temp) : USERCAL_stRAMCAL.u32ISCESTTrimPos;
IAC_s32ISCESTTrim[1] = (sint32)USERCAL_stRAMCAL.u32ISCESTTrimPos > (USERCAL_stRAMCAL.u16ESTCLGain * s32Temp) ? (USERCAL_stRAMCAL.u16ESTCLGain * s32Temp) : USERCAL_stRAMCAL.u32ISCESTTrimPos;
CPU_xExitCritical();
}
else
{
CPU_xEnterCritical();
IAC_s32ISCESTTrim[0] = (sint32)~USERCAL_stRAMCAL.u32ISCESTTrimNeg < (USERCAL_stRAMCAL.u16ESTCLGain * s32Temp) ? (USERCAL_stRAMCAL.u16ESTCLGain * s32Temp) : (sint32)~USERCAL_stRAMCAL.u32ISCESTTrimNeg;
IAC_s32ISCESTTrim[1] = (sint32)~USERCAL_stRAMCAL.u32ISCESTTrimNeg < (USERCAL_stRAMCAL.u16ESTCLGain * s32Temp) ? (USERCAL_stRAMCAL.u16ESTCLGain * s32Temp) : (sint32)~USERCAL_stRAMCAL.u32ISCESTTrimNeg;
CPU_xExitCritical();
}
}
}
#ifndef BUILD_BSP_IAC_STEPPER
/* Closed loop airflow */
s32Temp = (sint32)IAC_u16ISCTargetRamp - (sint32)CAM_u32RPMRaw;
s32Temp = ABS(s32Temp);
if (60 < s32Temp)
{
if (IAC_u16ISCTargetRamp > CAM_u32RPMRaw)
{
IAC_u32ISCDuty += (IAC_u16ISCTargetRamp - CAM_u32RPMRaw - 60);
IAC_u32ISCDuty = 0x1000 < IAC_u32ISCDuty ? 0x1000 : IAC_u32ISCDuty;
}
else
{
u32Temp = CAM_u32RPMRaw - IAC_u16ISCTargetRamp - 60;
u32Temp = 50 < u32Temp ? 50 : u32Temp;
if (IAC_u32ISCDuty > u32Temp)
{
IAC_u32ISCDuty -= (u32Temp / 8);
}
}
IAC_u32ISCDuty = u16ISCMin <= IAC_u32ISCDuty ? IAC_u32ISCDuty : u16ISCMin;
IAC_u32ISCDuty = u16ISCMax >= IAC_u32ISCDuty ? IAC_u32ISCDuty : u16ISCMax;
}
s32Temp = (IAC_u32ISCDuty - 2048) + 3 * ((sint32)IAC_u16OpenLoopPos << 4);
s32Temp /= 4;
s32Temp = 0 > s32Temp ? 0 : s32Temp;
IAC_u8SlaveTarget = 0x10 + (s32Temp / 0x100);
#endif //BUILD_BSP_IAC_STEPPER
if ((IAC_u16ISCTargetRamp + 250) > (uint16)CAM_u32RPMRaw)
{
u16TargetRamp = 0 < u16TargetRamp ? u16TargetRamp - 1 : 0;
}
}
else
{
IAC_s32ISCESTTrim[0] = 0;
IAC_s32ISCESTTrim[1] = 0;
/* Open loop duty */
IAC_u32ISCDuty = IAC_u16OpenLoopPos << 4;
IAC_u8SlaveTarget = 0x10 + (IAC_u32ISCDuty / 0x100);
u16TargetRamp = USERCAL_stRAMCAL.u16ISCEntryRamp;
}
IAC_boRun = FALSE;
}
#ifdef BUILD_BSP_IAC_STEPPER
if (TRUE == USERCAL_stRAMCAL.u8StepperIACEnable)
{
if (IAC_enResetHome == IAC_enStepperState)
{
if (0 == IAC_u32StepCounterLimit)
{
/* If we have just started the stepper reset sequence */
IAC_u32StepCounter = 0;
IAC_u32TargetStepNormalised = 0;
IAC_u32TargetStep = 0;
IAC_u32StepCounterLimit = 4 * USERCAL_stRAMCAL.u32UserStepperHomeSteps;
IAC_u32StepsLearnedMin = ~0;
u32StepsLearnedCount = 0;
IAC_u8StepArray[0] = USERCAL_stRAMCAL.aUserStepperCloseTable[0];
IAC_u8StepArray[1] = USERCAL_stRAMCAL.aUserStepperCloseTable[1];
IAC_u8StepArray[2] = USERCAL_stRAMCAL.aUserStepperCloseTable[2];
IAC_u8StepArray[3] = USERCAL_stRAMCAL.aUserStepperCloseTable[3];
}
else if (IAC_u32StepCounterLimit == IAC_u32StepCounter)
{
/* If the stepper reset sequence is complete */
IAC_u32StepCounter = 0;
if (0 <= CTS_tTempCFiltered)
{
u32Temp = 100000 > CTS_tTempCFiltered ? CTS_tTempCFiltered : 100000;
}
else
{
u32Temp = 0;
}
IAC_u32TargetStepNormalised = IAC_u32GetOpenStepsTempNormalised(u32Temp);
IAC_u32TargetStep = (USERCAL_stRAMCAL.u16IACStepsOpenCold * IAC_u32TargetStepNormalised) / 256;
IAC_u32FeedbackStep = 0;
IAC_u32StepCounterLimit = 4 * IAC_u32TargetStep;
IAC_u8StepArray[0] = USERCAL_stRAMCAL.aUserStepperOpenTable[0];
IAC_u8StepArray[1] = USERCAL_stRAMCAL.aUserStepperOpenTable[1];
IAC_u8StepArray[2] = USERCAL_stRAMCAL.aUserStepperOpenTable[2];
IAC_u8StepArray[3] = USERCAL_stRAMCAL.aUserStepperOpenTable[3];
IAC_enStepperState = IAC_enNormal;
}
}
else if (IAC_enNormal == IAC_enStepperState)
{
if (IAC_u32StepCounterLimit == IAC_u32StepCounter)
{
if (0 <= CTS_tTempCFiltered)
{
u32TempClipped = 100000 > CTS_tTempCFiltered ? CTS_tTempCFiltered : 100000;
}
else
{
u32TempClipped = 0;
}
u32OpenLoopTargetStepNormalised = IAC_u32GetOpenStepsTempNormalised(u32TempClipped);
if (IAC_enOpenLoop == IAC_enControlState)
{
IAC_u32TargetStepNormalised = u32OpenLoopTargetStepNormalised;
u32StepsLearnedCount = 0;
}
else
{
/* Closed loop */
s32Temp = (sint32)IAC_u16ISCTarget - (sint32)CAM_u32RPMRaw;
s32Temp = ABS(s32Temp);
if (60 < s32Temp)
{
u32ISCCount++;
u32StepsLearnedCount = 0;
if (IAC_u16ISCTarget > CAM_u32RPMRaw)
{
if (0 == (u32ISCCount % 4))
{
IAC_u32TargetStepNormalised = u32OpenLoopTargetStepNormalised > IAC_u32TargetStepNormalised ?
IAC_u32TargetStepNormalised + 1 : IAC_u32TargetStepNormalised;
}
}
else
{
if (USERCAL_stRAMCAL.u16IACStepsOpenHot > ((IAC_u32TargetStepNormalised * USERCAL_stRAMCAL.u16IACStepsOpenHot) / 256))
{
if (250 < s32Temp)
{
if (false == IAC_boUnderStepMins())
{
if (0 == (u32ISCCount % 8))
{
IAC_u32TargetStepNormalised = (0 < IAC_u32TargetStepNormalised) ?
IAC_u32TargetStepNormalised - 1 : IAC_u32TargetStepNormalised;
}
}
else
{
/* Proceed very slowly to learn when under min learn */
if (0 == (u32ISCCount % 16))
{
IAC_u32TargetStepNormalised = (0 < IAC_u32TargetStepNormalised) ?
IAC_u32TargetStepNormalised - 1 : IAC_u32TargetStepNormalised;
}
}
}
else
{
if (false == IAC_boUnderStepMins())
{
if (0 == (u32ISCCount % 16))
{
IAC_u32TargetStepNormalised = (0 < IAC_u32TargetStepNormalised) ?
IAC_u32TargetStepNormalised - 1 : IAC_u32TargetStepNormalised;
}
}
else
{
/* Proceed very slowly to learn when under min learn */
if (0 == (u32ISCCount % 64))
{
IAC_u32TargetStepNormalised = (0 < IAC_u32TargetStepNormalised) ?
IAC_u32TargetStepNormalised - 1 : IAC_u32TargetStepNormalised;
}
}
}
}
else
{
if (0 == (u32ISCCount % 16))
{
IAC_u32TargetStep = (0 < IAC_u32TargetStep) ?
IAC_u32TargetStep - 1 : IAC_u32TargetStep;
}
}
}
}
else
{
u32ISCCount = 0;
u32StepsLearnedCount++;
if ((IAC_LEARN_COUNTS - 1) == (u32StepsLearnedCount % IAC_LEARN_COUNTS))
{
if (~0 == IAC_u32StepsLearnedMin)
{
IAC_u32StepsLearnedMin = IAC_u32FeedbackStep;
}
else
{
if (IAC_u32FeedbackStep < IAC_u32StepsLearnedMin)
{
if ((IAC_u32StepsLearnedMin - IAC_u32FeedbackStep) > (USERCAL_stRAMCAL.u16IACStepsOpenHot / 2))
{
IAC_u32StepsLearnedMin -= (USERCAL_stRAMCAL.u16IACStepsOpenHot / 2);
}
else
{
IAC_u32StepsLearnedMin = IAC_u32StepsLearnedMin - 1;
}
}
else if (IAC_u32FeedbackStep > IAC_u32StepsLearnedMin)
{
IAC_u32StepsLearnedMin = IAC_u32FeedbackStep;
}
}
}
}
}
IAC_u32TargetStep = IAC_u32TargetStepNormalised * USERCAL_stRAMCAL.u16IACStepsOpenCold / 0x100;
s32Temp = (sint32)IAC_u32TargetStep - (sint32)IAC_u32FeedbackStep;
if (1 < (ABS(s32Temp)))
{
if (IAC_u32TargetStep < IAC_u32FeedbackStep)
{
IAC_u8StepArray[0] = USERCAL_stRAMCAL.aUserStepperCloseTable[0];
IAC_u8StepArray[1] = USERCAL_stRAMCAL.aUserStepperCloseTable[1];
IAC_u8StepArray[2] = USERCAL_stRAMCAL.aUserStepperCloseTable[2];
IAC_u8StepArray[3] = USERCAL_stRAMCAL.aUserStepperCloseTable[3];
IAC_u32StepCounterLimit = 4;
IAC_u32StepCounter = 0;
}
else
{
IAC_u8StepArray[0] = USERCAL_stRAMCAL.aUserStepperOpenTable[0];
IAC_u8StepArray[1] = USERCAL_stRAMCAL.aUserStepperOpenTable[1];
IAC_u8StepArray[2] = USERCAL_stRAMCAL.aUserStepperOpenTable[2];
IAC_u8StepArray[3] = USERCAL_stRAMCAL.aUserStepperOpenTable[3];
IAC_u32StepCounterLimit = 4;
IAC_u32StepCounter = 0;
}
}
}
}
if (IAC_u32StepCounterLimit > IAC_u32StepCounter)
{
if (EH_IO_Invalid > USERCAL_stRAMCAL.aIACIOResource[0])
{
enEHIOResource = USERCAL_stRAMCAL.aIACIOResource[0];
enTriState = (0 == (0x01 & IAC_u8StepArray[IAC_u32StepCounter & 0x03])) ? IOAPI_enLow : IOAPI_enHigh;
USER_vSVC(SYSAPI_enAssertDIOResource, (void*)&enEHIOResource,
(void*)&enTriState, (void*)NULL);
}
if (EH_IO_Invalid > USERCAL_stRAMCAL.aIACIOResource[1])
{
enEHIOResource = USERCAL_stRAMCAL.aIACIOResource[1];
enTriState = (0 == (0x02 & IAC_u8StepArray[IAC_u32StepCounter & 0x03])) ? IOAPI_enLow : IOAPI_enHigh;
USER_vSVC(SYSAPI_enAssertDIOResource, (void*)&enEHIOResource,
(void*)&enTriState, (void*)NULL);
}
if (EH_IO_Invalid > USERCAL_stRAMCAL.aIACIOResource[2])
{
enEHIOResource = USERCAL_stRAMCAL.aIACIOResource[2];
enTriState = (0 == (0x04 & IAC_u8StepArray[IAC_u32StepCounter & 0x03])) ? IOAPI_enLow : IOAPI_enHigh;
USER_vSVC(SYSAPI_enAssertDIOResource, (void*)&enEHIOResource,
(void*)&enTriState, (void*)NULL);
}
if (EH_IO_Invalid > USERCAL_stRAMCAL.aIACIOResource[3])
{
enEHIOResource = USERCAL_stRAMCAL.aIACIOResource[3];
enTriState = (0 == (0x08 & IAC_u8StepArray[IAC_u32StepCounter & 0x03])) ? IOAPI_enLow : IOAPI_enHigh;
USER_vSVC(SYSAPI_enAssertDIOResource, (void*)&enEHIOResource,
(void*)&enTriState, (void*)NULL);
}
IAC_u32StepCounter++;
if (0 == (0x03 & IAC_u32StepCounter))
{
if (IAC_u32FeedbackStep > IAC_u32TargetStep)
{
IAC_u32FeedbackStep--;
}
else if (IAC_u32FeedbackStep < IAC_u32TargetStep)
{
IAC_u32FeedbackStep++;
}
}
}
}
#endif //BUILD_BSP_IAC_STEPPER
if (400 > CAM_u32RPMFiltered)
{
u16AfterStartTargetRamp = USERCAL_stRAMCAL.u16ISCPostStartRamp;
}
else
{
if (0 == (u32ISCCount % 8))
{
if (0 < u16AfterStartTargetRamp)
{
u16AfterStartTargetRamp--;
}
}
}
u32ISCCount++;
}
#ifdef BUILD_BSP_IAC_STEPPER
static uint32 IAC_u32GetOpenStepsTempNormalised(uint32 u32Temp)
{
static volatile uint32 u32OpenStepsNormalised;
static volatile uint32 u32ColdNormalisedSteps = 255;
static volatile uint32 u32HotNormalisedSteps;
//u32HotNormalisedSteps = ((uint32)USERCAL_stRAMCAL.u16IACStepsOpenCold * 0x100ul) / (uint32)USERCAL_stRAMCAL.u16IACStepsOpenHot;
u32HotNormalisedSteps = 50;
u32OpenStepsNormalised = (((100000ul - u32Temp) * u32ColdNormalisedSteps) + (u32Temp * u32HotNormalisedSteps)) / 100000ul;
return u32OpenStepsNormalised;
}
#endif //BUILD_BSP_IAC_STEPPER
#ifdef BUILD_BSP_IAC_STEPPER
static bool IAC_boUnderStepMins(void)
{
bool boUnderMins = IAC_u32StepsLearnedMin >= IAC_u32TargetStep;
return boUnderMins;
}
#endif //BUILD_BSP_IAC_STEPPER
void IAC_vTerminate(puint32 const pu32Arg)
{
}
void IAC_vCallBack(puint32 const pu32Arg)
{
IAC_boRun = TRUE;
}
#endif //BUILD_USER