I am getting the hall fault in the below code which i have highlighted in red. When i run in open load the below error does not come but only in vehicle condition the fault happens.
__weak void *HALL_TIMx_CC_IRQHandler(void *pHandleVoid)
{
uint32_t wCaptBuf;
uint16_t hPrscBuf;
uint16_t hHighSpeedCapture;
HALL_Handle_t *pHandle = (HALL_Handle_t *)pHandleVoid; //cstat !MISRAC2012-Rule-11.5
TIM_TypeDef *TIMx = pHandle->TIMx;
uint8_t bPrevHallState;
int8_t PrevDirection;
if (pHandle->SensorIsReliable)
{
/* A capture event generated this interrupt */
bPrevHallState = pHandle->HallState;
PrevDirection = pHandle->Direction;
if (DEGREES_120 == pHandle->SensorPlacement)
{
pHandle->HallState = (uint8_t)((LL_GPIO_IsInputPinSet(pHandle->H3Port, pHandle->H3Pin) << 2U)
| (LL_GPIO_IsInputPinSet(pHandle->H2Port, pHandle->H2Pin) << 1U)
| LL_GPIO_IsInputPinSet(pHandle->H1Port, pHandle->H1Pin));
}
else
{
pHandle->HallState = (uint8_t)(((LL_GPIO_IsInputPinSet(pHandle->H2Port, pHandle->H2Pin) ^ 1U) << 2U)
| (LL_GPIO_IsInputPinSet(pHandle->H3Port, pHandle->H3Pin) << 1U)
| LL_GPIO_IsInputPinSet(pHandle->H1Port, pHandle->H1Pin));
}
switch (pHandle->HallState)
{
case STATE_5:
{
if (STATE_4 == bPrevHallState)
{
pHandle->Direction = POSITIVE;
pHandle->MeasuredElAngle = pHandle->PhaseShift;
}
else if (STATE_1 == bPrevHallState)
{
pHandle->Direction = NEGATIVE;
pHandle->MeasuredElAngle = (int16_t)(pHandle->PhaseShift + S16_60_PHASE_SHIFT);
}
else
{
/* Nothing to do */
}
break;
}
case STATE_1:
{
if (STATE_5 == bPrevHallState)
{
pHandle->Direction = POSITIVE;
pHandle->MeasuredElAngle = pHandle->PhaseShift + S16_60_PHASE_SHIFT;
}
else if (STATE_3 == bPrevHallState)
{
pHandle->Direction = NEGATIVE;
pHandle->MeasuredElAngle = (int16_t)(pHandle->PhaseShift + S16_120_PHASE_SHIFT);
}
else
{
/* Nothing to do */
}
break;
}
case STATE_3:
{
if (STATE_1 == bPrevHallState)
{
pHandle->Direction = POSITIVE;
pHandle->MeasuredElAngle = (int16_t)(pHandle->PhaseShift + S16_120_PHASE_SHIFT);
}
else if (STATE_2 == bPrevHallState)
{
pHandle->Direction = NEGATIVE;
pHandle->MeasuredElAngle = (int16_t)(pHandle->PhaseShift + S16_120_PHASE_SHIFT + S16_60_PHASE_SHIFT);
}
else
{
/* Nothing to do */
}
break;
}
case STATE_2:
{
if (STATE_3 == bPrevHallState)
{
pHandle->Direction = POSITIVE;
pHandle->MeasuredElAngle = (int16_t)(pHandle->PhaseShift + S16_120_PHASE_SHIFT + S16_60_PHASE_SHIFT);
}
else if (STATE_6 == bPrevHallState)
{
pHandle->Direction = NEGATIVE;
pHandle->MeasuredElAngle = (int16_t)(pHandle->PhaseShift - S16_120_PHASE_SHIFT);
}
else
{
/* Nothing to do */
}
break;
}
case STATE_6:
{
if (STATE_2 == bPrevHallState)
{
pHandle->Direction = POSITIVE;
pHandle->MeasuredElAngle = (int16_t)(pHandle->PhaseShift - S16_120_PHASE_SHIFT);
}
else if (STATE_4 == bPrevHallState)
{
pHandle->Direction = NEGATIVE;
pHandle->MeasuredElAngle = (int16_t)(pHandle->PhaseShift - S16_60_PHASE_SHIFT);
}
else
{
/* Nothing to do */
}
break;
}
case STATE_4:
{
if (STATE_6 == bPrevHallState)
{
pHandle->Direction = POSITIVE;
pHandle->MeasuredElAngle = (int16_t)(pHandle->PhaseShift - S16_60_PHASE_SHIFT);
}
else if (STATE_5 == bPrevHallState)
{
pHandle->Direction = NEGATIVE;
pHandle->MeasuredElAngle = (int16_t)(pHandle->PhaseShift);
}
else
{
/* Nothing to do */
}
break;
}
default:
{
/* Bad hall sensor configutarion so update the speed reliability */
pHandle->SensorIsReliable = false;
break;
}
}
Fault 2:
Sometimes i get the fault in
__weak bool SPD_IsMecSpeedReliable(SpeednPosFdbk_Handle_t *pHandle, const int16_t *pMecSpeedUnit)
but both faults does not come when in open load and happens only in vehicle condition. Why?