stm32 定时器 测量pwm波 频率ll库
时间: 2025-01-02 12:32:06 浏览: 8
### 使用 STM32 定时器和 LL 库测量 PWM 波频率
为了使用 STM32 的定时器和 LL 库来测量 PWM 波的频率,可以按照以下方法进行配置:
#### 1. 初始化硬件资源
首先初始化所需的硬件资源,包括 GPIO 和定时器。假设要使用的定时器为 TIM2。
```c
#include "stm32f4xx_ll_tim.h"
#include "stm32f4xx_ll_gpio.h"
// 配置GPIO引脚作为输入用于捕捉PWM信号
void configure_GPIO(void){
/* (省略部分代码) */
}
// 配置TIM2用于捕获功能
void configure_TIM2_for_capture(void){
// 设置定时器工作模式为向上计数模式
LL_TIM_SetCounterMode(TIM2, LL_TIM_COUNTERMODE_UP);
// 启用自动重装载预装载寄存器
LL_TIM_EnableARRPreload(TIM2);
// 设定预分频系数,这里设定为7200-1,即系统时钟除以7200
LL_TIM_SetPrescaler(TIM2, 7200 - 1);
// 输入滤波器设置,减少噪声影响
LL_TIM_IC_SetFilter(TIM2, LL_TIM_CHANNEL_CH1, LL_TIM_IC_FILTER_FDIV1_N8);
}
```
#### 2. 编写中断服务程序处理捕获事件
当检测到上升沿或下降沿变化时触发中断,在ISR中记录当前的时间戳并计算两次边沿之间的时间差从而得出周期T,则频率f=1/T。
```c
extern uint32_t capture_value_high;
extern uint32_t capture_value_low;
void TIM2_IRQHandler(void){
if(LL_TIM_IsActiveFlag_CC1(TIM2)){
// 清除标志位
LL_TIM_ClearFlag_CC1(TIM2);
static uint32_t last_capture = 0;
// 获取最新的捕获值
uint32_t current_capture = LL_TIM_GetCaptureCH1(TIM2);
// 计算两个相邻沿之间的差异得到周期
uint32_t period = current_capture - last_capture;
float frequency = SystemCoreClock / ((float)(period * 7200));
// 更新last_capture以便下次比较
last_capture = current_capture;
}
}
```
以上代码片段展示了如何基于 STM32F4 系列微控制器及其底层驱动库(LL Library),通过配置通用定时器来进行 PWM 脉宽调制信号频率的测量[^1]。需要注意的是实际应用过程中还需要考虑更多细节比如溢出情况下的特殊处理等。
阅读全文