[STM32F10x] 利用定时器测量频率

简介: [STM32F10x] 利用定时器测量频率

硬件: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为例,定时器配置代码如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

voidCaptureConfig(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的捕获中断:

1

2

3

4

5

6

7

8

9

10

11

voidBSP_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;

       }

       elseif(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是个全局变量。

相关文章
|
3月前
|
传感器 存储
STM32--TIM定时器(3)
STM32--TIM定时器(3)
100 0
STM32--TIM定时器(3)
|
3月前
|
编解码 芯片
STM32--TIM定时器(2)
STM32--TIM定时器(2)
|
3月前
|
传感器
STM32--TIM定时器(1)
STM32--TIM定时器(1)
115 0
|
3月前
STM32F103标准外设库——SysTick系统定时器(八)
STM32F103标准外设库——SysTick系统定时器(八)
224 0
STM32F103标准外设库——SysTick系统定时器(八)
|
1月前
|
传感器
stm32f407探索者开发板(二十二)——通用定时器基本原理讲解
stm32f407探索者开发板(二十二)——通用定时器基本原理讲解
|
1月前
|
芯片
stm32f407探索者开发板(十二)——Systick滴答定时器-延时函数讲解
stm32f407探索者开发板(十二)——Systick滴答定时器-延时函数讲解
|
2月前
使用STM32F103标准库实现定时器控制LED点亮和关闭
通过这篇博客,我们学习了如何使用STM32F103标准库,通过定时器来控制LED的点亮和关闭。我们配置了定时器中断,并在中断处理函数中实现了LED状态的切换。这是一个基础且实用的例子,适合初学者了解STM32定时器和中断的使用。 希望这篇博客对你有所帮助。如果有任何问题或建议,欢迎在评论区留言。
158 2
|
1月前
STM32CubeMX 定时器
STM32CubeMX 定时器
37 0
|
2月前
|
芯片
【STM32】STM32简述定时器
【STM32】STM32简述定时器
|
1月前
stm32f407探索者开发板(二十三)——定时器中断实验
stm32f407探索者开发板(二十三)——定时器中断实验