登录/注册

STM32精确测频率

STM32精确测频率

更多

在STM32上实现精确频率测量,常用的方法是利用定时器的输入捕获模式外部中断配合定时器计数。以下是两种方法的详细说明和实现步骤:


方法1:输入捕获模式(推荐)

利用定时器的捕获/比较通道,在信号边沿触发时记录定时器计数值,通过计算两次捕获的差值得到信号周期,从而计算频率。

实现步骤:

  1. 配置定时器基础参数:

    • 选择定时器(如TIM2、TIM3等)。
    • 设置预分频器(PSC)和自动重装载值(ARR),使定时器工作在较高频率(例如72 MHz)。
    • 计数模式:向上计数(Up-counting)。
  2. 配置输入捕获通道:

    • 选择输入通道(如TIM_Channel_1)。
    • 设置捕获极性(上升沿/下降沿/双边沿)。
    • 配置输入滤波器(减少噪声干扰)。
    • 启用捕获中断。
  3. 处理捕获中断:

    • 在中断中记录两次捕获的计数值(TIMx->CCR1)。
    • 计算两次捕获的差值(需处理定时器溢出)。
  4. 计算频率:

    • 频率公式
      [ f{\text{信号}} = \frac{f{\text{定时器}}}{( \text{差值} \times (\text{PSC} + 1) )} ]
    • ( f_{\text{定时器}} ):定时器时钟源频率(如72 MHz)。

示例代码(STM32 HAL库)

// 全局变量
uint32_t last_capture = 0;
uint32_t period = 0;
float frequency_hz = 0.0;

void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim) {
  if (htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1) {
    uint32_t current_capture = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1);

    // 第一次捕获:仅记录值
    if (last_capture == 0) {
      last_capture = current_capture;
    } 
    // 后续捕获:计算周期
    else {
      if (current_capture > last_capture) {
        period = current_capture - last_capture;
      } else {
        period = (0xFFFF - last_capture) + current_capture; // 处理溢出
      }
      last_capture = current_capture;

      // 计算频率(假设定时器时钟72MHz,预分频PSC=0)
      frequency_hz = 72000000.0f / (period * 1); // 实际需计入(PSC+1)
    }
  }
}

方法2:外部中断 + 定时器计数

适用于低频信号(<1 kHz),通过外部中断记录边沿次数,配合定时器计时计算频率。

实现步骤:

  1. 配置外部中断:

    • 设置GPIO为输入模式(对应信号引脚)。
    • 配置外部中断(上升沿/下降沿触发)。
  2. 配置定时器计时:

    • 定时器设为1秒中断(或其他固定时间)。
    • 在中断中读取外部中断的触发次数(即信号边沿数)。
  3. 计算频率:

    • 频率公式
      [ f_{\text{信号}} = \frac{\text{边沿次数}}{\text{计时时间}} ]

示例代码(HAL库)

// 全局变量
volatile uint32_t edge_count = 0;
float frequency_hz = 0.0;

// 外部中断回调函数
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) {
  if (GPIO_Pin == GPIO_PIN_0) { // 假设信号接在PA0
    edge_count++;
  }
}

// 定时器中断回调(1秒触发)
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) {
  frequency_hz = (float)edge_count / 1.0f; // 计时1秒
  edge_count = 0; // 重置计数
}

精度优化技巧

  1. 提高定时器分辨率

    • 减小预分频(PSC),提高定时器计数频率。
    • 使用32位定时器(如TIM2/TIM5)避免溢出。
  2. 减小中断延迟

    • 优化中断服务函数(快速执行)。
    • 使用DMA传输捕获数据(减少CPU干预)。
  3. 噪声抑制

    • 启用输入捕获的数字滤波器(例如设置ICFilter = 0x0F)。
    • 硬件上增加RC滤波电路。
  4. 频率范围适配

    • 高频信号:输入捕获模式(精度高)。
    • 低频信号:外部中断+定时器(避免定时器溢出)。

关键注意事项

  1. 定时器时钟配置:确保定时器时钟源正确(如内部时钟TIM_CLOCKSOURCE_INTERNAL)。
  2. 中断优先级:输入捕获中断优先级应高于其他中断。
  3. 信号幅度:输入信号需满足STM32 GPIO的电平要求(3.3V TTL)。

通过上述方法,可实现从几Hz到数十MHz范围的精确频率测量。实际应用中需根据信号特性选择合适方案,并结合硬件设计优化精度。

stm32最高工作频率是多少

工作频率。 首先,我们需要了解STM32的基本架构。STM32采用了一种高度模块化的设计,主要包括三个部分:处理器核心、存储器和外设。处理器核心

2024-01-03 15:54:23

STM32H7时钟I/O响应频率和定时器最高频率的测试方法

针对常规STM32系列性能测试所引起的准确度低、可靠性差、操作困难等问题,文中提出了一种关于I/O响应频率以及定时器最高频率的极限性能测试方法。

2023-10-24 14:51:18

STM32 ADC采样频率的确定

时间是你通过寄存器告诉stm32采样模拟量的时间,设置越长越精确一 STM32 ADC采样

2021-12-10 07:16:46

STM32精确延时函数的实现

在与传感器或者模块的总线进行通信的时候,常常需要使用到精确延时,一般我们会封装几个常用延时函数,下面我们以STM32F103芯片为例,详细介绍一下STM32

资料下载 杨海清 2021-11-24 18:51:02

STM32 检测信号频率

STM32 检测信号频率

资料下载 佚名 2021-11-23 18:21:47

基于STM32f103的输入捕获测频率和占空比

基于STM32f103的输入捕获测频率和占空比

资料下载 shyshyshy 2021-08-02 10:10:24

基于STM32f103的FFT频率测试程序下载

基于STM32f103的FFT频率测试程序下载

资料下载 shyshyshy 2021-08-02 10:07:20

32.768Hz频率晶振与精确计时资料下载

电子发烧友网为你提供32.768Hz频率晶振与精确计时资料下载的电子资料下载,更有其他相关的电路图、源代码、课件教程、中文资料、英文资料、参考设计、用户指南、解决方案等资料,希望可以帮助到广大的电子工程师们。

资料下载 佚名 2021-04-21 08:49:37

介绍一下STM32下一种精确延时函数的实现

在与传感器或者模块的总线进行通信的时候,常常需要使用到精确延时,一般我们会封装几个常用延时函数,下面我们以STM32F103芯片为例,详细介绍一下STM32

2021-12-07 12:02:41

STM32精确延时方式记录学习历程

STM32精确延时方式使用TIM定时器方式延时使用空代码方式延时F103系列F429系列本文纯属记录自己学习历程,如有不妥之处,欢迎指正。使用TIM定时器方式延时使用

2021-12-07 11:32:04

stm32使用基本定时器实现精确延时

在stm32中,系统滴答定时器可以实现精确的延时,但有时需要使用基本定时器实现精确延时,保证接下来采取的方法是全网最简单的方法。使用的平台是野火

2021-08-16 07:32:03

基于STM32频率计(采用输入捕获的方式)精选资料分享

参考博客:STM32 HAL库STM32脉冲宽度和周期测量感谢大佬!!!前言之前拿外部中断做了一个频率计,范围到了1MHz,但是

2021-08-16 07:24:35

stm32 24l01按键 改 发射频率

stm32 24l01按键如何改发射频率?STM32开发nrf24L01的是开发代码的时候基本比较常见的做主机时初始化相关流程几个开发板的源代码

2021-07-23 09:39:07

STM32F4_TIM输入波形捕获 (脉冲频率

STM32F4_TIM输入波形捕获(脉冲频率)

2020-04-07 10:35:30

如何精确的测量正弦频率频率

你好,我需要精确测量正弦频率的频率,容限为0.01赫兹。主振荡器被设置为24MHz的外部晶体(低ppm和温度ToIP COEF)。除了网站上提供

2019-07-30 12:18:38
7天热门专题 换一换
相关标签