☰
STM32定时器PWM输入模式实现四路PWM周期占空比测量
2026/10/14 3:30:51 网站建设 项目流程

简介:本资源是面向嵌入式开发初学者与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。

软件端只需要在中断里读两个寄存器值,再套个简单公式,省掉了判断边沿状态、保存上次时间戳、做减法这些逻辑。中断处理代码可以从十几行压缩到三五行,自然就不容易出错了。

更关键的是,由于计数器由硬件在每个

本文还有配套的精品资源,点击获取

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

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

立即咨询