久芯网

定时器捕获/计数测频率 STM32H743,TIM5,200Mhz,无分频,单周期误差200ns/160ns

avatar 迷路的萤火虫 提问时间: 2023-08-18 14:03:32 / 未解决

大家好

我在使用STM32H743做外部方波的频率计算。外部高速晶振25M,SYSCLK=400MHz, 使用了两种方法都有误差。

方法一,TIM5,200Mhz没有分频,捕获两次上升沿时间,运行后时间为23.74us(换算频率:42122Hz),实际示波器显示23.94us(41771Hz).不清楚这个误差 少200ns哪里产生的?

方法二,方法一基础上做计数,TIM3定义1s的溢出中断,每次中断读取上升沿的次数(TIM5中断中Frq_cnt计数),TIM3 200MHz时钟,Prescaler=20000-1,产生1s的溢出中断,运行后计数为41493Hz(换算单周期时间:24.1us),同上示波器是23.94us(41771),误差 160ns,两种方法偏差还有差异。

示波器截图如下

定时器捕获/计数测频率 STM32H743,TIM5,200Mhz,无分频,单周期误差200ns/160ns [相关图片]

代码如下:

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)//更新中断(溢出)发生时执行
{
  if(htim==(&TIM3_Handler))
  {
    LED1_Toggle;        //LED0反转
    FRQ_FLAG = 1;
    Frq_data = Frq_cnt;
    Frq_cnt = 0;
  }
  if(htim==(&TIM5_Handler))
  {
    if((TIM5CH1_CAPTURE_STA&0X80)==0)//还未成功捕获
    {
      if(TIM5CH1_CAPTURE_STA&0X40)//已经捕获到高电平了
      {
        if((TIM5CH1_CAPTURE_STA&0X3F)==0X3F)//高电平太长了
        {
          TIM5CH1_CAPTURE_STA|=0X80;        //标记成功捕获了一次
          TIM5CH1_CAPTURE_VAL=0XFFFFFFFF;
        }else TIM5CH1_CAPTURE_STA++;
      }
    }
  }
}

void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)//捕获中断发生时执行
{
  if((TIM5CH1_CAPTURE_STA&0X80)==0)//还未成功捕获
  {
    if(TIM5CH1_CAPTURE_STA&0X40)        //捕获到第二个上升沿 
    {     
      TIM5CH1_CAPTURE_STA|=0X80;        //标记成功捕获到一次高电平脉宽
      TIM5CH1_CAPTURE_VAL=HAL_TIM_ReadCapturedValue(&TIM5_Handler,TIM_CHANNEL_1);//获取当前的
    }else   //还未开始,第一次捕获上升沿
    {
    TIM5CH1_CAPTURE_STA=0;          //清空
    TIM5CH1_CAPTURE_VAL=0;
    TIM5CH1_CAPTURE_STA|=0X40;      //标记捕获到了第一个上升沿
    __HAL_TIM_SET_COUNTER(&TIM5_Handler,0);     //计数器清零xs

    }         
    }
    Frq_cnt++;

如需获得 200ns 等器件的更多信息,请点击链接或 点击此处 联系在线客服!

2个回答
  • avatar xmshao
    回答时间: 2023-08-18 14:34:29

    如果待测频率较高的话,采用第二种方式可能更好点, 测量N+1个上沿或者下沿,得到N个脉冲的数据。这里你要注意两点: 第一,注意统计溢出次数;第二,在一轮测试完成前在中断程序里尽量不要逗留太久以免丢失脉冲统计。这样有篇文章可以参考下: 基于定时基于定时器捕获测量脉宽的应用示例 ,它介绍了基于单个定时器通道和双通道PWM输入模式的测量方式。

  • avatar xmshao
    回答时间: 2023-08-18 15:07:38

    刚提到的文章链接是 基于定时器捕获测量脉宽的应用示例 (qq.com)

会员中心 微信客服
客服
回到顶部