STM32G431实战:用CubeMX+中断搞定两个555定时器PWM捕获(附完整代码)
STM32G431双路PWM捕获实战从CubeMX配置到信号分析仪实现在嵌入式开发中精确测量外部PWM信号的频率和占空比是常见需求。当需要同时处理两路独立信号时如何合理分配硬件资源并确保数据同步就成为关键挑战。本文将基于STM32G431的TIM3和TIM8定时器构建一个完整的双路PWM信号分析仪解决方案。1. 硬件架构设计与CubeMX基础配置STM32G431系列微控制器搭载了多个高级定时器特别适合处理PWM输入捕获任务。我们选择TIM3和TIM8这两个定时器主要基于以下考虑TIM8作为高级定时器具有更强的抗干扰能力适合处理精度要求更高的信号TIM3作为通用定时器配置灵活可与TIM8形成互补两个定时器拥有独立的中断向量便于实现并行处理在CubeMX中的基础配置步骤如下启用TIM3和TIM8时钟将TIM3_CH1和TIM8_CH1配置为输入捕获模式设置触发源为TI1FP1上升沿触发配置预分频器使定时器时钟为1MHz方便计算启用两个定时器的中断// TIM3基础配置示例 htim3.Instance TIM3; htim3.Init.Prescaler 71; // 72MHz/(711)1MHz htim3.Init.CounterMode TIM_COUNTERMODE_UP; htim3.Init.Period 0xFFFF; htim3.Init.ClockDivision TIM_CLOCKDIVISION_DIV1;提示实际项目中建议使用外部晶振而非内部RC振荡器可获得更稳定的时钟基准2. 双定时器捕获逻辑实现PWM捕获的核心原理是利用定时器记录两个连续上升沿之间的时间差周期以及高电平持续时间占空比。对于双路信号我们需要特别注意中断处理的时序问题。2.1 输入捕获电路连接典型连接方式如下表所示信号源STM32引脚定时器通道推荐电阻配置555定时器1输出PA6TIM3_CH11kΩ上拉555定时器2输出PC6TIM8_CH11kΩ上拉2.2 中断服务程序实现关键是要区分不同定时器的中断源并正确处理捕获事件void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim) { if(htim-Instance TIM3) { // TIM3捕获处理 static uint32_t lastCapture 0; uint32_t currentCapture HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1); if(htim-Channel HAL_TIM_ACTIVE_CHANNEL_1) { if(isFirstCapture) { lastCapture currentCapture; isFirstCapture 0; } else { period currentCapture - lastCapture; lastCapture currentCapture; } } } else if(htim-Instance TIM8) { // TIM8捕获处理 // 类似逻辑但使用独立变量存储 } }注意在多中断环境下建议将耗时计算移至主循环中断服务函数仅做标记和基础数据采集3. 频率与占空比计算优化获得原始捕获数据后需要进行转换计算才能得到有物理意义的参数。这里介绍几种优化算法3.1 基本计算公式频率(Hz) 定时器时钟频率 / 周期计数值 占空比(%) (高电平计数值 / 周期计数值) × 100%3.2 滑动平均滤波实现为提高测量稳定性可采用滑动平均算法#define FILTER_SIZE 5 typedef struct { float buffer[FILTER_SIZE]; uint8_t index; float sum; } FilterType; float updateFilter(FilterType* filter, float newValue) { filter-sum - filter-buffer[filter-index]; filter-buffer[filter-index] newValue; filter-sum newValue; filter-index (filter-index 1) % FILTER_SIZE; return filter-sum / FILTER_SIZE; }3.3 异常值处理策略在实际应用中需要考虑信号异常情况信号丢失检测当超过预期最大周期时判定为信号丢失毛刺过滤设置合理的最小脉宽阈值范围校验根据应用场景限制频率和占空比的有效范围4. 完整项目集成与性能优化将上述模块整合为一个信号分析仪系统还需要考虑以下方面4.1 数据显示方案常见的数据输出方式包括LCD显示适合独立设备串口输出便于调试LED指示简单状态反馈4.2 资源占用对比下表比较了不同实现方式的资源消耗实现方式CPU负载内存占用精度轮询法高低中单中断中中高双中断低高最高4.3 低功耗优化技巧对于电池供电设备可采取以下措施动态调整定时器采样率在无信号时进入休眠模式使用DMA传输减少CPU唤醒次数void enterLowPowerMode(void) { HAL_TIM_Base_Stop_IT(htim3); HAL_TIM_Base_Stop_IT(htim8); HAL_SuspendTick(); HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON, PWR_SLEEPENTRY_WFI); }在实际项目中双路PWM捕获的稳定性很大程度上取决于PCB布局和信号完整性。建议将555定时器输出端靠近STM32的捕获引脚并确保良好的电源去耦。遇到信号抖动问题时可尝试在输入端添加小容量电容如100pF进行滤波。