STM32CubeMX实战:精准测量PWM频率与占空比的完整指南
最近在调试一个电机控制项目,需要实时监测外部控制器发来的PWM指令信号。一开始觉得用示波器看看就行了,结果发现要动态调整参数时,总不能一直挂着探头吧?于是琢磨着用STM32的定时器输入捕获功能自己做个频率计。网上教程不少,但要么讲得太理论,要么代码片段不完整,调试起来各种坑。折腾了两天后,我总结出了一套从CubeMX配置到代码调试的完整流程,实测5分钟内就能搭建起可用的测量系统,精度还相当不错。
这篇文章就是分享我这套实战经验,面向的是已经有一定STM32和HAL库基础,但被输入捕获各种细节困扰的嵌入式开发者。我会重点拆解配置中的关键选项、中断处理里的“坑”,以及如何从原始计数值算出实际的频率和占空比。无论你是要测量遥控器信号、编码器输出,还是传感器脉冲,这套方法都能直接套用。
1. 理解输入捕获:不仅仅是数脉冲
很多人一提到输入捕获,就想到“测量频率”。这没错,但输入捕获的能力远不止于此。本质上,它是在精确记录某个外部引脚上电平跳变发生的时刻。STM32的定时器单元就像一个高速运行的秒表,输入捕获功能允许你在特定事件(如上升沿)发生时,瞬间“冻结”并读取这个秒表的当前值。
1.1 定时器作为时基的核心原理
STM32的通用定时器(如TIM2, TIM3, TIM4等)通常由以下几部分组成:
- 预分频器 (PSC):对内部时钟源进行分频,决定计数器的“滴答”频率。
- 计数器 (CNT):核心的16位或32位寄存器,根据预分频后的时钟递增或递减。
- 自动重载寄存器 (ARR):决定计数器的周期上限。
当配置为输入捕获模式时,定时器依然在后台自由运行。关键在于捕获/比较寄存器 (CCR)。当指定的输入通道上发生边沿事件(如上升沿)时,硬件会自动将当前计数器CNT的值瞬间复制到对应的CCRx寄存器中,并可以产生中断。这个过程是硬件完成的,速度极快,精度取决于定时器的时钟频率。
注意:输入捕获的精度极限就是定时器计数器的时钟周期。例如,如果定时器时钟为72MHz,预分频为72-1,则计数器每1MHz(1微秒)计数一次,理论时间分辨率为1微秒。
1.2 测量频率与占空比的策略
要测一个PWM波的频率和占空比,至少需要捕获三个时间点:
- 第一个上升沿时刻 (T1):记录周期开始。
- 随后的下降沿时刻 (T2):记录高电平结束。
- 下一个上升沿时刻 (T3):记录周期结束。
有了这三个值,计算就很简单了:
- 周期 = (T3 - T1) * 计数器时钟周期
- 高电平时间 = (T2 - T1) * 计数器时钟周期
- 频率 = 1 / 周期
- 占空比 = (高电平时间 / 周期) * 100%
策略听起来简单,但实现时要处理好计数器溢出、中断响应延迟以及测量模式切换的逻辑。下面我们就从CubeMX配置开始,一步步构建一个健壮的系统。
2. CubeMX配置:图形化界面下的关键抉择
打开STM32CubeMX,创建新工程并选择你的芯片型号。系统时钟配置这些基础步骤这里不赘述,我们直奔主题——定时器的输入捕获配置。
2.1 定时器基础参数配置
在Pinout & Configuration标签页中,找到你想用的定时器(例如TIM2)。在左侧定时器树形图中点击它,选择Combined Channels中的某个通道(例如Channel 1)为Input Capture direct mode。
随后,右侧会出现详细的参数配置栏:
Parameter Settings 标签页:
- Clock Source:选择
Internal Clock。输入捕获模式使用内部时钟作为时基来驱动计数器。 - Counter Settings:
- Prescaler (PSC - 16 bits value):这是精度与量程的权衡点。预分频系数 = 输入值 + 1。
- 若系统时钟为72MHz,设置PSC为71,则定时器时钟 = 72MHz / (71+1) = 1MHz,计数器每1微秒加1。
- 若PSC设为0,则定时器时钟为72MHz,计数器每约13.9纳秒加1,精度高但容易溢出。
- Counter Mode
- Prescaler (PSC - 16 bits value):这是精度与量程的权衡点。预分频系数 = 输入值 + 1。

&spm=1001.2101.3001.5002&articleId=153724621&d=1&t=3&u=c2cbecfe997a40e3811e582a27f2bd96)
1万+

被折叠的 条评论
为什么被折叠?



