在STM32上实现精确频率测量,常用的方法是利用定时器的输入捕获模式或外部中断配合定时器计数。以下是两种方法的详细说明和实现步骤:
方法1:输入捕获模式(推荐)
利用定时器的捕获/比较通道,在信号边沿触发时记录定时器计数值,通过计算两次捕获的差值得到信号周期,从而计算频率。
实现步骤:
-
配置定时器基础参数:
- 选择定时器(如TIM2、TIM3等)。
- 设置预分频器(PSC)和自动重装载值(ARR),使定时器工作在较高频率(例如72 MHz)。
- 计数模式:向上计数(Up-counting)。
-
配置输入捕获通道:
- 选择输入通道(如TIM_Channel_1)。
- 设置捕获极性(上升沿/下降沿/双边沿)。
- 配置输入滤波器(减少噪声干扰)。
- 启用捕获中断。
-
处理捕获中断:
- 在中断中记录两次捕获的计数值(
TIMx->CCR1)。 - 计算两次捕获的差值(需处理定时器溢出)。
- 在中断中记录两次捕获的计数值(
-
计算频率:
- 频率公式:
[ 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),通过外部中断记录边沿次数,配合定时器计时计算频率。
实现步骤:
-
配置外部中断:
- 设置GPIO为输入模式(对应信号引脚)。
- 配置外部中断(上升沿/下降沿触发)。
-
配置定时器计时:
- 定时器设为1秒中断(或其他固定时间)。
- 在中断中读取外部中断的触发次数(即信号边沿数)。
-
计算频率:
- 频率公式:
[ 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; // 重置计数
}
精度优化技巧
-
提高定时器分辨率:
- 减小预分频(PSC),提高定时器计数频率。
- 使用32位定时器(如TIM2/TIM5)避免溢出。
-
减小中断延迟:
- 优化中断服务函数(快速执行)。
- 使用DMA传输捕获数据(减少CPU干预)。
-
噪声抑制:
- 启用输入捕获的数字滤波器(例如设置
ICFilter = 0x0F)。 - 硬件上增加RC滤波电路。
- 启用输入捕获的数字滤波器(例如设置
-
频率范围适配:
- 高频信号:输入捕获模式(精度高)。
- 低频信号:外部中断+定时器(避免定时器溢出)。
关键注意事项
- 定时器时钟配置:确保定时器时钟源正确(如内部时钟
TIM_CLOCKSOURCE_INTERNAL)。 - 中断优先级:输入捕获中断优先级应高于其他中断。
- 信号幅度:输入信号需满足STM32 GPIO的电平要求(3.3V TTL)。
通过上述方法,可实现从几Hz到数十MHz范围的精确频率测量。实际应用中需根据信号特性选择合适方案,并结合硬件设计优化精度。
如何精确的测量正弦频率的频率?
你好,我需要精确测量正弦频率的频率,容限为0.01赫兹。主振荡器被设置为24MHz的外部晶体(低ppm和温度ToIP COEF)。除了网站上提供的众多主题和文档之外,有没有人有线索或轨道来进行如此
tongjingyang
2019-07-30 12:18:38
STM32H7时钟I/O响应频率和定时器最高频率的测试方法
针对常规STM32系列性能测试所引起的准确度低、可靠性差、操作困难等问题,文中提出了一种关于I/O响应频率以及定时器最高频率的极限性能测试方法。通过对STM32H7时钟频率进行最高频率配置,分别
2023-10-24 14:51:18
介绍一下STM32下一种精确延时函数的实现
在与传感器或者模块的总线进行通信的时候,常常需要使用到精确延时,一般我们会封装几个常用延时函数,下面我们以STM32F103芯片为例,详细介绍一下STM32下一种精确延时函数的实现:时钟树下图中紫色
lining870815844
2021-12-07 12:02:41
基于STM32的频率计(采用输入捕获的方式)精选资料分享
参考博客:STM32 HAL库STM32脉冲宽度和周期测量感谢大佬!!!前言之前拿外部中断做了一个频率计,范围到了1MHz,但是精确度并不是很高,误差在%0.5左右(看了一下那些大佬的频率计,基本上
kingnet_520890
2021-08-16 07:24:35
STM32精确延时方式记录学习历程
STM32精确延时方式使用TIM定时器方式延时使用空代码方式延时F103系列F429系列本文纯属记录自己学习历程,如有不妥之处,欢迎指正。使用TIM定时器方式延时使用STM32CubeMX配制
xymbmcu
2021-12-07 11:32:04
STM32 ADC采样频率的确定
时间是你通过寄存器告诉stm32采样模拟量的时间,设置越长越精确一 STM32 ADC采样频率的确定1. :先看一些资料,确定一下ADC的时钟:(1),由时钟控制器提供的ADCCLK...
叹久
2021-12-10 07:16:46
stm32使用基本定时器实现精确延时
在stm32中,系统滴答定时器可以实现精确的延时,但有时需要使用基本定时器实现精确延时,保证接下来采取的方法是全网最简单的方法。使用的平台是野火mini开发板第一步 配置
nhonglan
2021-08-16 07:32:03
stm32 24l01按键 改 发射频率
stm32 24l01按键如何改发射频率?STM32开发nrf24L01的是开发代码的时候基本比较常见的做主机时初始化相关流程几个开发板的源代码,STM32开发nrf24L01按键主要任务是负责记录某一时刻按键状态。
2021-07-23 09:39:07
stm32最高工作频率是多少
工作频率。 首先,我们需要了解STM32的基本架构。STM32采用了一种高度模块化的设计,主要包括三个部分:处理器核心、存储器和外设。处理器核心是STM32的核心部件,负责执行程序指令;存储器用于存储
2024-01-03 15:54:23
STM32F429NIH6 一款STM32位控制MCU
2023-09-21 10:51:59
定时器倍频系数如何在小数点后面两位精确
前言:做STM32的时候,定时器有两个倍频系数,有时候频率需要精确到小数后面,本例说明如何在小数点后面两位精确:STM31F103的最大频率为7.2000e+07,那么如果要精确到小数点后面两位
胖子的逆袭
2021-08-17 07:02:19
STM32F407VET6 一款STM32位微控制器MCU(ST意法)
2023-11-28 15:50:30
STM32F429IIT6 一款STM32位微控制器MCU(ST意法)
2023-11-28 15:53:48
生成的频率仍在精确生成,但在200M输出上只有192M的原因?
大家好!我对7系列MMCM向导有一个奇怪的行为;希望有人能够帮助我:我的参考时钟为100M。使用MMCM,我得到480M,120M,40M,20M和10M。所有这些频率似乎都能够精确生成。内部VCO
60user66
2020-07-27 07:30:00
STM32的SPI峰值工作频率
【嵌入式】STM32时钟系统复习前言时钟系统SPI时钟频率问题前言SPI的初始化中需要配置波特率分频系数,需要了解stm32的时钟和总线等基础结构知识才能搞清楚SPI的实际可配置的工作频率。此外
flowerddd
2021-08-18 08:19:07
数字频率合成器的作用
数字频率合成器(Digital Frequency Synthesizer)是一种电子设备,用于生成精确的、可编程的高稳定度的频率信号。它的主要作用是在各种应用中提供精确的频率合成和调整。
2023-06-30 09:15:49