stm32G4输入捕获测量频率
时间: 2025-02-23 20:27:50 浏览: 80
### 使用STM32G4进行输入捕获以测量信号频率的方法
#### 配置环境与工具
为了方便配置和生成代码,建议使用STM32CubeMX和STM32CubeIDE工具来初始化项目并完成硬件抽象层(HAL)库的集成。这些工具提供了图形化界面,使得定时器和其他外设的配置更加直观。
#### 初始化定时器
选择合适的定时器作为输入捕获单元,并对其进行必要的参数设置。通常情况下,会选用高级控制定时器(TIM1, TIM8),因为它们具有更多的特性支持复杂的捕捉需求;但对于一般应用来说,通用型定时器如TIM2至TIM5也完全适用[^1]。
```c
// 假定已创建好工程框架,在main.c中添加如下代码片段
#include "stm32g4xx_hal.h"
TIM_HandleTypeDef htimX; // X代表所选定时器编号
void MX_TIMX_Init(void){
__HAL_RCC_TIMX_CLK_ENABLE(); // 启用定时器时钟
htimX.Instance = TIMX;
// 设置定时器模式为输入捕获模式
TIM_IC_InitTypeDef sConfigIC;
sConfigIC.ICPolarity = TIM_INPUTCHANNELPOLARITY_RISING; // 上升沿触发
sConfigIC.ICSelection = TIM_ICSELECTION_DIRECTTI; // 直接映射通道到输入端口
sConfigIC.ICPrescaler = TIM_ICPSC_DIV1; // 不分频
sConfigIC.ICFilter = 0x0F; // 数字滤波器系数
HAL_TIM_IC_ConfigChannel(&htimX,&sConfigIC,TIM_CHANNEL_1);
}
```
#### 编写回调函数处理中断事件
每当检测到指定边沿变化时就会触发一次中断请求(IRQ),此时可以在相应的ISR (Interrupt Service Routine) 中读取当前计数值并与前次记录做对比从而得出时间间隔即周期T。进而根据公式 f=1/T 计算得到实际频率值。
```c
uint32_t lastCaptureValue = 0;
float frequency = 0.0f;
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim){
if(htim->Instance==TIMX){ // 确认是哪个定时器产生的中断
uint32_t currentCaptureValue = __HAL_TIM_GET_COMPARE(htim,TIM_CHANNEL_1);
int32_t diff = (int32_t)(currentCaptureValue - lastCaptureValue);
/* 如果溢出了,则加上最大计数值 */
if(diff<0){
diff += 65536L; // 对于16位定时器而言
}
float period_us = ((float)diff / (float)SystemCoreClock)*1e6; // 将周期转换成微秒单位
frequency = 1E6/period_us ; // 得到Hz形式下的频率
lastCaptureValue=currentCaptureValue ;
printf("Frequency:%.2f Hz\n",frequency);
}
}
```
以上就是利用STM32G4系列MCU实现简单而有效的频率测量方案。
阅读全文
相关推荐


















