一个定时器两个通道怎么玩?STM32 HAL库双通道输入捕获,同时测出PWM频率和占空比的保姆级教程
2026/5/30 4:05:13 网站建设 项目流程

STM32 HAL库双通道输入捕获实战:单定时器同步测量PWM频率与占空比

在嵌入式开发中,精确测量PWM信号的频率和占空比是常见需求。传统方法往往需要两个定时器或多次信号周期才能完成测量,而利用STM32单个定时器的两个输入捕获通道协同工作,可以实现单周期内同步获取这两个关键参数的高效方案。

1. 硬件配置与基础原理

1.1 定时器输入捕获工作机制

STM32的定时器输入捕获功能通过检测外部信号边沿触发,记录当前计数器值来实现信号参数测量。关键寄存器包括:

  • CCMRx:捕获/比较模式寄存器
  • CCER:捕获/比较使能寄存器
  • CCRx:捕获/比较寄存器
  • SR:状态寄存器

当配置为输入捕获模式时,定时器会在检测到指定边沿(上升沿/下降沿)时:

  1. 将当前计数器值锁存到对应CCRx寄存器
  2. 置位相应的中断标志位
  3. 触发中断请求(如果已使能)

1.2 双通道协同测量原理

利用TIM3的Channel1和Channel2实现同步测量的核心思路:

通道触发边沿测量目标数据用途
CH1上升沿信号周期起点频率计算基准点
CH2下降沿脉冲宽度终点占空比计算关键时间节点

测量流程

  1. CH1捕获上升沿,记录计数器值T1,重置计数器
  2. CH2捕获下降沿,记录计数器值T2
  3. 下一个CH1上升沿捕获,记录计数器值T3
  4. 计算:
    • 频率 = 定时器时钟 / (预分频系数 × T3)
    • 占空比 = T2 / T3 × 100%

2. CubeMX工程配置

2.1 定时器基础参数设置

在CubeMX中配置TIM3时需注意以下关键参数:

/* TIM3初始化参数示例 */ htim3.Instance = TIM3; htim3.Init.Prescaler = 79; // 80分频(当主频80MHz时,定时器时钟1MHz) htim3.Init.CounterMode = TIM_COUNTERMODE_UP; htim3.Init.Period = 0xFFFF; // 最大计数周期 htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; htim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;

2.2 输入捕获通道配置

两个通道需要独立配置:

  1. Channel1配置

    • Mode: Input Capture direct mode
    • IC Selection: Direct
    • IC Polarity: Rising Edge
    • IC Prescaler: No division
    • IC Filter: 0x0 (根据信号质量可选)
  2. Channel2配置

    • Mode: Input Capture indirect mode
    • IC Selection: Indirect
    • IC Polarity: Falling Edge
    • 其他参数与Channel1相同

提示:实际工程中建议开启输入滤波(如IC Filter=0xF)以消除信号抖动

3. 代码实现与中断处理

3.1 初始化与启动

在main.c中添加以下初始化代码:

/* 启动输入捕获中断 */ HAL_TIM_IC_Start_IT(&htim3, TIM_CHANNEL_1); // 上升沿捕获 HAL_TIM_IC_Start_IT(&htim3, TIM_CHANNEL_2); // 下降沿捕获 /* 启用定时器计数器 */ HAL_TIM_Base_Start(&htim3);

3.2 回调函数实现

核心逻辑在HAL_TIM_IC_CaptureCallback中实现:

volatile uint32_t riseTime = 0, fallTime = 0; volatile uint32_t period = 0; volatile float dutyCycle = 0.0f; void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim) { if (htim->Instance == TIM3) { if (htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1) { // Channel1上升沿捕获 riseTime = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1); __HAL_TIM_SetCounter(htim, 0); // 重置计数器 if (fallTime != 0) { // 确保已捕获下降沿 period = riseTime; dutyCycle = (float)fallTime / period * 100.0f; // 重置下降沿时间,准备下一周期测量 fallTime = 0; } } else if (htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2) { // Channel2下降沿捕获 fallTime = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_2); } } }

3.3 测量结果处理

建议添加互斥锁保护共享变量:

/* 添加osMutexId定义 */ osMutexId_t pwmMutexHandle; /* 获取测量结果的线程安全函数 */ void GetPWMParameters(uint32_t *freq, float *duty) { osMutexAcquire(pwmMutexHandle, osWaitForever); *freq = SystemCoreClock / (htim3.Init.Prescaler + 1) / period; *duty = dutyCycle; osMutexRelease(pwmMutexHandle); }

4. 实战优化与问题排查

4.1 精度提升技巧

  1. 时钟源选择

    • 优先使用内部高速时钟(如HSE)
    • 确保APB1/APB2预分频配置正确
  2. 计数器配置优化

    • 预分频系数选择:在信号频率范围内尽可能小
    • 自动重装载值:根据预期最大信号周期设置
  3. 软件补偿

    • 添加中断延迟补偿
    • 多次测量取平均值

4.2 常见问题解决方案

问题1:测量结果不稳定

可能原因及解决:

  • 信号抖动 → 增加输入滤波器值
  • 中断优先级冲突 → 调整定时器中断优先级
  • 计数器溢出 → 减小预分频或缩短测量间隔

问题2:占空比测量误差大

检查要点:

  1. 确保两个通道的GPIO配置一致
  2. 验证信号边沿是否干净
  3. 检查定时器时钟树配置

问题3:高频信号测量不准

应对策略:

  • 降低预分频系数
  • 使用定时器的溢出中断辅助计算
  • 考虑使用定时器从模式

4.3 性能优化建议

  1. 中断优化

    • 将非关键计算移出中断
    • 使用DMA传输捕获值
  2. 资源利用

    • 空闲通道可配置为PWM输出
    • 利用定时器从模式简化测量
  3. 代码结构优化

typedef struct { uint32_t frequency; float duty_cycle; uint32_t last_update; } PWM_Measure_t; void ProcessPWMMeasurement(PWM_Measure_t *measure) { // 在此处添加数据平滑滤波等后处理 }

5. 进阶应用场景

5.1 多通道扩展方案

对于需要测量多路PWM的场景,可采用以下方案:

方案优点缺点
单定时器多通道资源占用少通道数有限
多定时器协同可测更多信号需要同步机制
定时器级联扩展测量范围配置复杂

5.2 与RTOS集成实践

在FreeRTOS中的典型应用:

void PWMMeasureTask(void *argument) { PWM_Measure_t measure; while(1) { GetPWMParameters(&measure.frequency, &measure.duty_cycle); measure.last_update = HAL_GetTick(); // 发送到消息队列或通知其他任务 xQueueSend(pwmQueue, &measure, portMAX_DELAY); vTaskDelay(pdMS_TO_TICKS(10)); } }

5.3 工业级应用考量

对于可靠性要求高的场景:

  • 添加硬件看门狗监控
  • 实现测量值合理性检查
  • 增加故障恢复机制
  • 考虑EMC防护设计

在最近参与的智能舵机控制项目中,这种双通道测量方案将PWM参数刷新率从传统的50ms缩短到单信号周期(最快1ms),同时减少了约30%的CPU负载。实际部署时发现,为TIM3配置8MHz时钟源(预分频9)时,在100Hz-10kHz频率范围内可获得±0.5%的测量精度。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询