码迷,mamicode.com
首页 > 其他好文 > 详细

STM32频率计算

时间:2015-05-23 11:29:11      阅读:268      评论:0      收藏:0      [点我收藏+]

标签:time   stm32   stm32   

STM32采用定时器捕获的方法测低频信号很准确,我测高频100K-120K就误差太大了,大概200Hz,这儿的误差是个范围,不是某个值。有的人说两个定时器一个定时,一个计数,这样太浪费资源了吧。我项目要采集两个地感线圈的频率,所以用两个定时器捕获,这儿只说一个定时器的方法,用的是定时器3通道2,下面是用捕获的方法计算频率:

void Time3_Configuration()
{  
    TIM_ICInitTypeDef  TIM_ICInitStructure;
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
    //RCC_ClocksTypeDef freq;
    //RCC_GetClocksFreq(&freq);
    /*TIM3时基*/
    TIM_DeInit(TIM3);
  TIM_TimeBaseStructure.TIM_Period = 0xffff;
  TIM_TimeBaseStructure.TIM_Prescaler = 0;
  TIM_TimeBaseStructure.TIM_ClockDivision = 0;
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
  TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);  // Time base configuration
    /*TIM3输入捕获*/
  TIM_ICInitStructure.TIM_Channel = TIM_Channel_2;
  TIM_ICInitStructure.TIM_ICPolarity = TIM_CounterMode_Up;
  TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
  TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;   /*输入预分频*/
  TIM_ICInitStructure.TIM_ICFilter = 0;

  TIM_ICInit(TIM3, &TIM_ICInitStructure);

  TIM_PWMIConfig(TIM3, &TIM_ICInitStructure);

  /* Select the TIM3 Input Trigger: TI2FP2 */
  TIM_SelectInputTrigger(TIM3, TIM_TS_TI2FP2);

  /* Select the slave Mode: Reset Mode */
  TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Reset);

  /* Enable the Master/Slave Mode */
  TIM_SelectMasterSlaveMode(TIM3, TIM_MasterSlaveMode_Enable);

  /* TIM enable counter */
  TIM_Cmd(TIM3, ENABLE);

  /* Enable the CC2 Interrupt Request */
  TIM_ITConfig(TIM3, TIM_IT_CC2, ENABLE);
}
中断部分计算频率:
void TIM3_IRQHandler(void)
{ 
  if(TIM_GetITStatus(TIM3, TIM_IT_CC2) == SET) 
  {
    /* Clear TIM5 Capture compare interrupt pending bit */
    TIM_ClearITPendingBit(TIM3, TIM_IT_CC2);
    if(capture_number2 == 0)
    {
      /* Get the Input Capture value */
      ic3_readvalue3 = TIM_GetCapture2(TIM3);
      capture_number2 = 1;
    }
    else if(capture_number2 == 1)
    {
      /* Get the Input Capture value */
      ic3_readvalue4 = TIM_GetCapture2(TIM3); 

      /* Capture computation */
      if (ic3_readvalue4 > ic3_readvalue3)
      {
        CAPTURE2 = ic3_readvalue4 ; 
      }

      /* Frequency computation */ 
      Frequency2 = (u32)72000000 / CAPTURE2;
      capture_number2 = 0;
    }
        else
        {
            Frequency2=0;
        }
  }
}

还有一种方法就是用外部中断计算频率,不过我没用过。更精确的计算方法我得慢慢研究。接触STM32也不是太久。

STM32频率计算

标签:time   stm32   stm32   

原文地址:http://blog.csdn.net/u012246376/article/details/45933145

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!