⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bldczc.c

📁 MC56F802BLDC 可以使用的算法 就是电机启动有点慢
💻 C
📖 第 1 页 / 共 5 页
字号:
    {
/* -------------------[ 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 + -