📄 bldczc.c
字号:
{
/* -------------------[ ZCToffEndHndlr - Begin ]---------------------*/
/* pTimes->T_Next = pTimes->T_Cmt0 + pTimes->Per_CmtPreset;
16 bits rest, no saturation
- loose MSB part - for timer capture register UWord16!!! */
Temp1F32.RegParts.MSBpart = 0;
Temp1F32.RegParts.LSBpart = pTimes->T_Cmt0;
Temp2F32.RegParts.MSBpart = 0;
Temp2F32.RegParts.LSBpart = pTimes->Per_CmtPreset;
Temp2F32.Reg32bit = L_add( Temp1F32.Reg32bit, Temp2F32.Reg32bit );
pTimes->T_Next = Temp2F32.RegParts.LSBpart;
/* Removed asm(move OMR,TempOMR); */ /* store OMR status */
/* Removed archSetNoSat(); */ /* switch saturation off */
/* Removed pTimes->T_Next = pTimes->T_Cmt0 + pTimes->Per_CmtPreset; */
/* Removed asm(move TempOMR,OMR); */ /* store OMR status */
pStates->State_General.Cmd_General.B.CmtPreset_TimedFlag = 1;
pStates->State_General.Cmd_General.B.Cmt_TimedFlag = 1;
pStates->State_General.Cmd_General.B.CmtTimedStart_CmdFlag = 0;
pStates->State_General.Cmd_General.B.CmtTest_Hndlr_RqFlag = 0;
pStates->State_General.Cmd_General.B.Timer_DrvRqFlag = 1;
pStates->State_ZCros.Cmd_ZCros.B.ZCToffEnd_ZCrosServ_RqFlag = 1;
pStates->State_General.Cmd_General.B.ZCToffEnd_CmdFlag = 0;
pStates->State_Comput.Cmd_Comput.B.CmtPreComp_CmdFlag = 0;
/* -------------------[ ZCToffEndHndlr - End ]-----------------------*/
}
if ( pStates->State_ZCros.Cmd_ZCros.B.ZCOKGet_CmdFlag )
{
/* -------------------[ ZCOKGetHndlr - Begin ]-----------------------*/
pStates->State_Comput.Cmd_Comput.B.ToffComp_CmdFlag = 0;
pStates->State_General.Cmd_General.B.ToffComp_Timeout_InfoFlag = 0;
pStates->State_Comput.Cmd_Comput.B.ZCOKGet_Comput_RqFlag = 1;
pStates->State_ZCros.Cmd_ZCros.B.ZCOKGet_CmdFlag = 0;
/* -------------------[ ZCOKGetHndlr - End ]-------------------------*/
}
if ( pStates->State_ZCros.Cmd_ZCros.B.ZCMiss_CmdFlag )
{
/* -------------------[ ZCMissHndlr - Begin ]------------------------*/
pStates->State_Comput.Cmd_Comput.B.ToffComp_CmdFlag = 0;
pStates->State_General.Cmd_General.B.ToffComp_Timeout_InfoFlag = 0;
pStates->State_Comput.Cmd_Comput.B.ZCMiss_Comput_RqFlag = 1;
pStates->State_ZCros.Cmd_ZCros.B.ZCMiss_CmdFlag = 0;
/* -------------------[ ZCMissHndlr - End ]--------------------------*/
}
if ( pStates->State_Comput.Cmd_Comput.B.CmtComp_CmdFlag )
{
/* -------------------[ CmtCompHndlr - Begin ]-----------------------*/
/* pTimes->T_Next = pTimes->T_ZCros + pTimes->Per_HlfCmt;
16 bits rest, no saturation
- loose MSB part - for timer capture register UWord16!!! */
Temp1F32.RegParts.MSBpart = 0;
Temp1F32.RegParts.LSBpart = pTimes->T_ZCros;
Temp2F32.RegParts.MSBpart = 0;
Temp2F32.RegParts.LSBpart = pTimes->Per_HlfCmt;
Temp2F32.Reg32bit = L_add( Temp1F32.Reg32bit, Temp2F32.Reg32bit );
pTimes->T_Next = Temp2F32.RegParts.LSBpart;
/* Removed asm(move OMR,TempOMR); */ /* store OMR status */
/* Removed archSetNoSat(); */ /* switch saturation off */
/* Removed pTimes->T_Next = pTimes->T_ZCros + pTimes->Per_HlfCmt; */
/* Removed asm(move TempOMR,OMR); */ /* store OMR status */
pStates->State_General.Cmd_General.B.Cmt_TimedFlag = 1;
pStates->State_General.Cmd_General.B.CmtTimedStart_CmdFlag = 1;
pStates->State_General.Cmd_General.B.CmtTest_Hndlr_RqFlag = 1;
pStates->State_General.Cmd_General.B.Timer_DrvRqFlag = 1;
pStates->State_Comput.Cmd_Comput.B.CmtComp_CmdFlag = 0;
/* -------------------[ CmtCompHndlr - End ]-------------------------*/
}
if ( pStates->State_General.Cmd_General.B.ZCToff_TimedFlag )
{
if ( pStates->State_General.Cmd_General.B.ZCToffStart_CmdFlag )
{
/* -------------------[ ZCToffStartHndlr - Begin ]-------------------*/
pStates->State_General.Cmd_General.B.ZCToffTest_Hndlr_RqFlag = 1;
pStates->State_General.Cmd_General.B.ZCToffStart_CmdFlag = 0;
/* -------------------[ ZCToffStartHndlr - End ]---------------------*/
}
}
if ( pStates->State_General.Cmd_General.B.Cmt_TimedFlag )
{
if ( pStates->State_General.Cmd_General.B.CmtTest_Hndlr_RqFlag )
{
/* -------------------[ CmtTestHndlr - Begin ]-----------------------*/
/* solving of hazard states when Cmt time passed before Timer was set */
/* if ( pTimes->Per_HlfCmt < T_Actual - pTimes->T_ZCros ) */
Temp1F32.RegParts.MSBpart = 0;
Temp1F32.RegParts.LSBpart = T_Actual;
Temp2F32.RegParts.MSBpart = 0;
Temp2F32.RegParts.LSBpart = pTimes->T_ZCros;
Temp2F32.Reg32bit = L_sub( Temp1F32.Reg32bit, Temp2F32.Reg32bit );
Temp1UW16 = Temp2F32.RegParts.LSBpart;
/* Removed asm(move OMR,TempOMR); */ /* store OMR status */
/* Removed archSetNoSat(); */ /* switch saturation off */
/* Removed Temp1UW16 = T_Actual - pTimes->T_ZCros; */
/* Removed asm(move TempOMR,OMR); */ /* restore OMR status */
if ( pTimes->Per_HlfCmt < Temp1UW16)
{
CmtTimeout ( pStates, pTimes, T_Actual);
}
pStates->State_General.Cmd_General.B.CmtTest_Hndlr_RqFlag = 0;
/* -------------------[ CmtTestHndlr - End ]-------------------------*/
}
if ( pStates->State_General.Cmd_General.B.CmtTimedStart_CmdFlag )
{
/* -------------------[ CmtTimedStartHndlr - Begin ]-----------------*/
pStates->State_General.Cmd_General.B.CmtTest_Hndlr_RqFlag = 1;
pStates->State_General.Cmd_General.B.CmtTimedStart_CmdFlag = 0;
/* -------------------[ CmtTimedStartHndlr - End ]-------------------*/
}
}
/* setting of Algorithm functions request flags */
if ( pStates->State_Cmt.Cmd_Cmt.B.CmtDone_CmtServ_RqFlag )
{
pStates->State_General.Cmd_General.B.CmtServ_AlgoRqFlag = 1;
}
else pStates->State_General.Cmd_General.B.CmtServ_AlgoRqFlag = 0;
if ( pStates->State_ZCros.Cmd_ZCros.B.CmtDone_ZCrosServ_RqFlag | \
pStates->State_ZCros.Cmd_ZCros.B.CmtProcEnd_ZCrosServ_RqFlag | \
pStates->State_ZCros.Cmd_ZCros.B.CmtServ_ZCrosServ_RqFlag |
pStates->State_ZCros.Cmd_ZCros.B.ZCToffEnd_ZCrosServ_RqFlag )
{
pStates->State_General.Cmd_General.B.ZCrosServ_AlgoRqFlag = 1;
}
else pStates->State_General.Cmd_General.B.ZCrosServ_AlgoRqFlag = 0;
if ( pStates->State_Comput.Cmd_Comput.B.CmtDone_Comput_RqFlag | \
pStates->State_Comput.Cmd_Comput.B.ZCOKGet_Comput_RqFlag | \
pStates->State_Comput.Cmd_Comput.B.ZCMiss_Comput_RqFlag )
{
pStates->State_General.Cmd_General.B.Comput_AlgoRqFlag = 1;
}
else pStates->State_General.Cmd_General.B.Comput_AlgoRqFlag = 0;
return (PASS);
}
/* -------------------[ bldczcHndlr - End ]--------------------------------*/
/****************************************************************************************************
*
* MODULE: bldczcTimeoutIntAlg ( bldczc_sStates *pStates, bldczc_sTimes *pTimes , UWord16 T_Actual )
*
* DESCRIPTION: function bldczcTimeoutIntAlg is Interrupt Algorithm is intended to be called from
* the Timer interrupt. So it sets required actions according to time events.
* In cooperation with bldczcHndlr it is also a command interface between bldczc software
* modules and their State_Comput, State_Cmt, State_ZCros, State_General data structures.
* Refer to SDK documentation for detailes
*
* RETURNS: The function returns the PASS (0)
*
* SUBMODULES USED: CmtTimeout( pStates, pTimes, T_Actual )
* PrepareProcTiming ( bldczc_uCmdGeneral *pCmd_General,
* UWord16 *T_Next,
* UWord16 T_Cmt0,
* UWord16 Const_PerProcCmt )
* CmtProcTimeout ( bldczc_sStates *pStates, bldczc_sTimes *pTimes )
* PrepareToffTiming ( bldczc_uCmdGeneral *pCmd_General,
* UWord16 *T_Next,
* UWord16 T_Cmt0,
* UWord16 Per_Toff )
* ZCToffTimeout ( bldczc_sStates *pStates )
*
* ARGUMENTS: The function has three arguments: in/out - pointer to bldczc_sStates structure that
* contains the status variables for all
* BLDC motor BEMF Zero Crossing algorithms
* in/out - pointer to bldczc_sTimes structure that
* contains the time variables for all
* BLDC motor BEMF Zero Crossing algorithms
* in - T_Actual - 16bit range Actual Time
*
* RANGE ISSUES: All the time variables and components T_x in bldczc_sTimes structure are
* computed as 16 bit rollower registers. It mean that if their results overflows
* 16 bits, they are not saturated, just the overflow bit is ignored and low 16 bits
* word is taken as a result. Then the T_x variables can be used as outputs and inputs
* from a 16 bit past compare timer used as a system clock base!
*
* SPECIAL ISSUES: The function calculates correct results if the saturaion mode is set or not .
*
****************************************************************************************************/
/*--------------------[ bldczcTimeoutIntAlg - Begin ]----------------------*/
Result bldczcTimeoutIntAlg ( bldczc_sStates *pStates, bldczc_sTimes *pTimes , UWord16 T_Actual )
{
if ( pStates->State_General.Cmd_General.B.Cmt_TimedFlag )
{
CmtTimeout( pStates, pTimes, T_Actual);
}
else if ( pStates->State_General.Cmd_General.B.CmtProc_TimedFlag )
{
CmtProcTimeout( pStates, pTimes );
}
else if ( pStates->State_General.Cmd_General.B.ZCToff_TimedFlag )
{
ZCToffTimeout ( pStates );
}
return (PASS);
}
/*--------------------[ bldczcTimeoutIntAlg - End ]------------------------*/
/*--------------------[ CmtTimeout - Begin ]-------------------------------*/
inline static Result CmtTimeout (bldczc_sStates *pStates, bldczc_sTimes *pTimes , UWord16 T_Actual)
{
pStates->State_General.Cmd_General.B.Cmt_TimedFlag = 0;
pStates->State_General.Cmd_General.B.CmtTimedStart_CmdFlag = 0;
pStates->State_General.Cmd_General.B.CmtTest_Hndlr_RqFlag = 0;
pStates->State_General.Cmd_General.B.CmtPreset_TimedFlag = 0;
pStates->State_ZCros.Cmd_ZCros.B.Cmt_ProcFlag = 1;
pStates->State_ZCros.Cmd_ZCros.B.ZC_ToffFlag = 1;
pStates->State_ZCros.Cmd_ZCros.B.ZCrosInt_EnblFlag = 0;
/* disable Zero crossing Interrupts */
pTimes->T_Cmt0 = T_Actual; /* T_Cmt0 must be set before PrepareProcTiming function */
PrepareProcTiming (&pStates->State_General.Cmd_General, &pTimes->T_Next,\
pTimes->T_Cmt0, pStates->State_Comput.Const_PerProcCmt);
pStates->State_Cmt.Step_Cmt = pStates->State_Cmt.Step_Cmt_Next;
pStates->State_ZCros.Mask_ZCInp = pStates->State_ZCros.Mask_ZCInpNext;
pStates->State_ZCros.Index_ZC_Phase = pStates->State_ZCros.Index_ZC_PhaseNext;
pStates->State_ZCros.Expect_ZCInp = pStates->State_ZCros.Expect_ZCInpNext;
pStates->State_ZCros.Cmd_ZCros.B.Expect_ZCInp_PositivFlag = pStates->State_ZCros.Cmd_ZCros.B.Expect_ZCInp_PositivNextFlag;
pStates->State_General.Cmd_General.B.ZCPrepared_Timeout_InfoFlag = 0;
pStates->State_General.Cmd_General.B.StepPrepared_Timeout_InfoFlag = 0;
pStates->State_Cmt.Cmd_Cmt.B.CmtDone_CmdFlag = 1; /* Set Commutation Done Command Flag */
pStates->State_Cmt.Cmd_Cmt.B.Cmt_DrvRqFlag = 1;
pStates->State_ZCros.Cmd_ZCros.B.ZCInpSet_DrvRqFlag = 1;
return (PASS);
}
/*--------------------[ CmtTimeout - End ]----------------------------------*/
/*--------------------[ CmtProcTimeout - Begin ]----------------------------*/
inline static Result CmtProcTimeout ( bldczc_sStates *pStates, bldczc_sTimes *pTimes )
{
pStates->State_ZCros.Cmd_ZCros.B.Cmt_ProcFlag = 0;
pStates->State_General.Cmd_General.B.CmtProc_TimedFlag = 0;
pStates->State_General.Cmd_General.B.ToffComp_Timeout_InfoFlag = 0;
PrepareToffTiming (&pStates->State_General.Cmd_General, &pTimes->T_Next, pTimes->T_Cmt0, pTimes->Per_Toff);
pStates->State_General.Cmd_General.B.CmtProcEnd_CmdFlag = 1;
return (PASS);
}
/*--------------------[ CmtProcTimeout - End ]-----------------------------*/
/*--------------------[ ZCToffTimeout - Begin ]----------------------------*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -