zoukankan      html  css  js  c++  java
  • [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 ×××××××××××××××××××××××××××××××××××××××××××××××××/

  • 相关阅读:
    Json字串转换成Java复杂对象
    [Code Snipper]图片轮换
    将CSDN600W用户及密码帐号存入本地MySql数据库
    【转】一个隐形的java int溢出
    【转】展望未来,总结过去10年的程序员生涯,给程序员小弟弟小妹妹们的一些总结性忠告
    如何在Android 4.0 ICS中禁用StatusBar | SystemBar | 状态栏 【完美版】
    【转】提问的智慧(How To Ask Questions the Smart)
    商业开发实战之VB篇精彩视频
    我的设计原语
    RAPIDXML 中文手册,根据官方文档完整翻译!
  • 原文地址:https://www.cnblogs.com/CaesarTao/p/7851383.html
Copyright © 2011-2022 走看看