轉載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 ×××××××××××××××××××××××××××××××××××××××××××××××××/

