STM32定时器PWM输入模式实现四路PWM周期占空比测量

发布时间:2026/8/31 20:05:33
STM32定时器PWM输入模式实现四路PWM周期占空比测量 简介本资源是面向嵌入式开发初学者与STM32进阶工程师的4路PWM信号高精度测量实战项目聚焦STM32F103芯片输入捕获功能解决多路PWM周期与占空比同步采集这一典型工业控制需求。压缩包共187个文件含34个头文件.h定义寄存器与接口、33个源文件.c实现TIM定时器配置、中断服务及计算逻辑辅以.o、.d、.crf等编译中间文件和keilkilll.bat、uvproj工程文件等完整Keil MDK开发环境支持整体4.65MB结构规范可直接编译下载运行。已有294人学习下载资源包含stm32f10x_tim.c、stm32f10x_rcc.c等标准外设库关键驱动以及带边沿捕获时序处理、双缓冲时间戳计算、周期/占空比实时更新等核心代码模块特别适合用于电机驱动反馈、电源监控或PWM解码类项目快速移植与原理验证。 做多电机驱动或者多路舵机反馈的时候我经常要同时盯着好几路PWM信号既要知道每一路频率又想知道占空比。很多人第一反应是拿外部中断去数边沿但真到了4路20kHz信号同时进来你会发现中断服务函数里的代码稍微多写几行波形就开始丢边沿了。后来我换成STM32F103定时器的输入捕获尤其是硬件PWM输入模式四路PWM的周期和占空比测量一下子变得干净利落CPU负担也小得多。这篇就完整拆一遍这个方案原理、选型、配置、中断处理、实测数据和踩坑记录。想直接抄作业的照着代码改就行。1. 4路PWM测量为什么不能靠外部中断硬数1.1 外部中断测PWM的常见思路和致命伤先说说很多人第一反应会用的方案外部中断加定时器计时。思路很简单把PWM信号接到单片机的外部中断引脚比如PA0的EXTI0上升沿进中断时读一次定时器CNT值下降沿再读一次。两次上升沿之间就是周期上升沿到下降沿之间就是高电平时间。听起来逻辑完全没问题我以前做单路PWM测量时也这么干过单路确实能跑。但问题出在扩展到4路之后。假设你测4路20kHz的PWM每路信号每秒钟会有20000个上升沿和20000个下降沿4路加起来就是每秒160000次中断。每次中断进出的固定开销大约几十个CPU周期中断里再读一读CNT、判断一下边沿类型、做几个减法运算轻松跑到三四百个周期。72MHz主频下每秒16万次中断每次哪怕只花200个周期也要吃掉3200万个周期CPU占用接近一半。这还没算上其他任务被打断的代价。更要命的是外部中断方案里存在一个很难彻底解决的时序问题中断响应本身有延迟从边沿触发到CPU真正读到计数器值中间隔了几十甚至上百个周期。这个延迟虽然每次不大但在高频PWM下会直接转化成测量误差你很难在软件里把它完全补偿掉。我之前就遇到过单路测出来挺准四路一起上数据就开始跳排查了半天发现是中断嵌套导致读取CNT的时机不稳定。1.2 输入捕获为什么是更优解STM32F103的定时器输入捕获本质上就是给每个捕获通道配了一个硬件时间戳锁存器。输入引脚上的边沿一到硬件自动把当前计数器值锁存到捕获寄存器CCR里完全不需要CPU参与。这个特性带来的好处是决定性的测量精度不依赖中断响应速度。中断哪怕晚了几百个周期才进入服务函数你从CCR里读出来的值依然是边沿到来那一瞬间的计数值误差被硬件锁住了。普通输入捕获能解决单边沿时间戳的问题但周期和占空比还需要两套边沿数据做减法。于是STM32在输入捕获的基础上做了个更聪明的设计——PWM输入模式。1.3 PWM输入模式到底省了什么PWM输入模式是输入捕获的一种特殊形态它的核心思路是把同一个输入信号同时映射到两个捕获通道上。IC1捕获上升沿IC2捕获下降沿然后配合从模式的复位功能让计数器在每个上升沿自动清零。这样一来硬件就帮你把周期和占空比都算好了CCR1在上升沿锁存的是整个周期的计数值也就是相邻两个上升沿间隔的计数个数CCR2在下降沿锁存的是上升沿到下降沿之间的计数值也就是高电平持续时间的计数个数占空比就是CCR2除以CCR1。软件端只需要在中断里读两个寄存器值再套个简单公式省掉了判断边沿状态、保存上次时间戳、做减法这些逻辑。中断处理代码可以从十几行压缩到三五行自然就不容易出错了。更关键的是由于计数器由硬件在每个本文还有配套的精品资源点击获取