[STM32F10x] 利用定時器測量頻率


 轉載http://www.cnblogs.com/mr-bike/p/4197895.html

  硬件:STM32F103C8T6

  平台:ARM-MDk V5.11

 

  原理

  利用STM32F10x的定時器的捕獲(Capture)單元測量輸入信號的頻率。

  基本原理是通過兩次捕獲達到的計數器的差值,來計算輸入信號的頻率。假如第一次捕獲時計數器的值為Val1,第二次捕獲計數器的值為Val2,

  定時器的時鍾頻率為ftimer,那么輸入信號的頻率finput

                    finput = ftimer / (Val2 - Val1)               (Val2 > Val1)

  或

                    finput = ftimer / (MaxVal - Val1 + Val2)          (Val2 ≤ Val1)

   其中MaxVal為定時器的最大計數值

  

  代碼

  以TIM2 CH4為例,定時器配置代碼如下:

復制代碼
void CaptureConfig(void)
{
    TIM_ICInitTypeDef  TIM_ICInitStructure;
    
    TIM_ICInitStructure.TIM_Channel     = TIM_Channel_4;
    TIM_ICInitStructure.TIM_ICPolarity  = TIM_ICPolarity_Rising;
    TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
    TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
    TIM_ICInitStructure.TIM_ICFilter    = 0x0;

    TIM_ICInit(TIM2, &TIM_ICInitStructure);
    
    /* TIM enable counter */
    TIM_Cmd(TIM2, ENABLE);

    /* Enable the CC4 Interrupt Request */
    TIM_ITConfig(TIM2, TIM_IT_CC4, ENABLE);
}
復制代碼

 

  配置NVIC,使能TIM2的捕獲中斷:

復制代碼
void BSP_IntConfig(void)
{
    NVIC_InitTypeDef NVIC_InitStructure;

    /* Enable the TIM2 global Interrupt */
    NVIC_InitStructure.NVIC_IRQChannel                        = TIM2_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority      = 0;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority             = 1;
    NVIC_InitStructure.NVIC_IRQChannelCmd                     = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
}
復制代碼

 

  在TIM2中斷處理函數中計算出輸入信號的頻率:

復制代碼
void TIM2_IRQHandler(void)
{ 
    static U16   Capture, IC4ReadValue1, IC4ReadValue2;
    static U8    CaptureNumber = 0;
    
    if(TIM_GetITStatus(TIM2, TIM_IT_CC4) == SET) 
    {
        /* Clear TIM2 Capture compare interrupt pending bit */
        TIM_ClearITPendingBit(TIM2, TIM_IT_CC4);
        if(CaptureNumber == 0)
        {
            /* Get the Input Capture value */
            IC4ReadValue1 = TIM_GetCapture4(TIM2);
            CaptureNumber = 1;
        }
        else if(CaptureNumber == 1)
        {
            /* Get the Input Capture value */
            IC4ReadValue2 = TIM_GetCapture4(TIM2); 

            /* Capture computation */
            if (IC4ReadValue2 > IC4ReadValue1)
            {
                Capture = (IC4ReadValue2 - IC4ReadValue1); 
            }
            else
            {
                Capture = ((0xFFFF - IC4ReadValue1) + IC4ReadValue2); 
            }
            /* Frequency computation */ 
            Freq = (U32) SystemCoreClock / Capture;
            CaptureNumber = 0;
        }
    }
}
復制代碼

  注意:Freq是個全局變量。

 /×××××××××××××××××××××××××××××××××××××××× THE END ×××××××××××××××××××××××××××××××××××××××××××××××××/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM