上两次我们学习了定时器的定时中断,定时模式,输出比较模式。外部时钟,内部时钟。还有PWM。这次我们来看输入捕获模式。首先我们先来简单看一下输入捕获模式。
一. 输入捕获工作原理
输入捕获的核心是:当检测到定时器通道引脚上出现指定的电平跳变(如上升沿或下降沿)时,当前定时器计数器(TIMx_CNT)的值会被自动锁存到对应的捕获/比较寄存器(TIMx_CCRx)中。通过记录两次跳变沿对应的CNT值,结合定时器的计数频率,就可以计算出时间间隔。
根据测量需求,通常有两种工作模式:
| 工作模式 | 测量目标 | 实现方式 |
|---|---|---|
| 单通道捕获 | 频率或脉宽 | 单个通道需在上升沿和下降沿捕获模式间切换 ,并配合中断处理,可测量频率或脉宽-5。 |
| PWM输入模式 | 频率和占空比 | 仅TIMx_CH1或TIMx_CH2 支持。一个信号同时连接到两个捕获通道 (如IC1和IC2),分别设置为上升沿和下降沿触发。结合从模式 ,可自动复位CNT,一次捕获即可获得周期和占空比-4。 |
二. 输入捕获配置步骤
以下是配置STM32F103C8T6输入捕获功能的一般步骤,以使用库函数为例:
-
开启时钟
-
使能所用定时器(如TIM2、TIM3、TIM5等)的时钟,通常通过
RCC_APB1PeriphClockCmd()函数实现。 -
使能对应GPIO端口的时钟(如GPIOA),通过
RCC_APB2PeriphClockCmd()函数实现。
-
-
初始化GPIO
- 将用于捕获的GPIO引脚(例如TIM2_CH1对应PA0)配置为复用功能上拉/下拉输入 模式。
-
初始化定时器时基单元
- 配置
TIM_TimeBaseInitTypeDef结构体成员,包括预分频器(TIM_Prescaler)、自动重装载值(TIM_Period)、计数模式等,以设定CNT的计数频率和计数范围。
- 配置
-
配置输入捕获通道
-
配置
TIM_ICInitTypeDef结构体,这是核心步骤:-
TIM_Channel:选择捕获通道(如TIM_Channel_1)。 -
TIM_ICPolarity:设置捕获极性(上升沿/下降沿)。 -
TIM_ICSelection:设置输入选择,通常直连(TIM_ICSelection_DirectTI)。 -
TIM_ICPrescaler:设置捕获分频,通常不分频(TIM_ICPSC_DIV1)。 -
TIM_ICFilter:设置滤波器参数,用于抑制毛刺。
-
-
-
配置中断/DMA(可选)
-
如果需要,使能捕获比较中断(TIM_IT_CCx)和更新中断(TIM_IT_Update)。
-
配置NVIC,设置中断优先级并编写中断服务函数。
-
-
使能定时器
- 调用
TIM_Cmd()使能定时器,开始计数。
- 调用
三.输入捕获的简介


跟我们输出比较做一下对比。

也就是这里CNT和CCR是作为比较电路的输入。根据CNT和CCR的大小关系,从引脚输出,高,低电平。

输入捕获的话就是,一旦这四个通道,有边沿的变化,那么输入滤波和边沿检测就会发现这个变化,让输入捕获电路产生动作。让当前CNT的值,锁存到CCR中,和外部中断差不多,外部中断是向CPU申请中断,然而输入捕获是控制后续电路。
对比输出比较,输出比较引脚是输出端口,是根据CNT和CCR的大小关系来进行输出动作
输入捕获引脚是输入端口。是接收到输入信号,让当前CNT的值,锁存到CCR中。

来到原理图我们就可看到,输入捕获电路是我们左边的一部分。右面就是我们了解过的,输出比较部分,可以看到,4个输入捕获,和4个输出比较通道,共用4个CCR寄存器。另外他们的
CH1-CH4四个通道引脚也是共用的。所以对应同一个定时器,输入捕获和输出比较,只能使用其中一个,不能同时使用。
拿输入捕获电路来说,通用定时器和高级定时器,他们的通道是一样的

剩下的两个功能非常巧妙,把这两个功能组合起来,测量频率和占空比就可以硬件全自动执行。软件不需要任何干预,也不需要进行中断。需要测量时候,直接读取CCR的值就可以了,极大的减轻了软件的压力。
四.频率是如何测量的
1.频率的解释
越往左频率越高,越往右频率越低。这里信号都是只有高低电平的数字信号。对于STM32测频率而言,也只能测量数字信号。如果需要测量一个正弦波,那还需要搭建一个信号预处理电路,最简单的就是用运放,搭建一个比较器。把正弦波变为数字信号,再输入给我们的STM32就可以了。
如果测量的电压非常高,那还需要考虑一下,隔离的问题。
2.测频法

在闸门时间T内,对上升沿计次(计次下降沿也可以,只是极性不同)的到N。
待测信号的频率就是fx = N/T。

自定义一个闸门时间T,通常为1S。在1S时间内对信号进行计次,每来一个上升沿记次+1,每来一个上升沿就是来了一个周期信号。所以在1S时间内,来了多少个周期,那么他的频率就是多少Hz。这符合频率的定义,频率的定义就是1S内出现了多少个重复的周期。
3.测周法
测周法就是,周期的倒数就是频率,我们如果能测出一个周期的时间,那么周期在取倒数就是我们的频率了。

我们捕获两个上升沿,然后测量一下,这两个上升沿之间持续的时间。就可以了,实际上也是定时器计次,我们使用一个已知的标准频率fc计次时钟来驱动计数器,然后从一个上升沿开始记,计数器从0开始,一直记到下一个上升沿。记一个数的时间是1/fc。记N个数,时间就是N/fc。N/fc就是周期再去一个倒数,就得到了频率。fx=fc/N。
4.区别以及优缺点
1.测频法适合高频率信号,测周法适合低频率信号。
2.测频法在闸门时间内,最好要多出现一些上升沿。计数数量多一些,这样有助于减少误差。在计次N很少时误差会非常大。
3.测周法要求频率低一些。低频信号,周期比较长,计次就会比较多。有助于减小误差。
4.测频法测的是闸门时间内的多个周期,所以自带一个均值滤波。如果在闸门时间内波形有变化,那么得到的实际上是这个闸门时间内的平均频率,如果1S为闸门时间,那么1S才更i性能一次,所以测频法更新时间慢,测量结果是一段平均值,值比较平滑。
5.测周法,测量一个周期就能出现结果,所以结果的速度取决于待测信号的频率。一般而言待测信号都是几百--几千赫兹。所以测周法更新结果块。因为只测量一个周期,那么受噪声影响,波动比较大。
这就是这两种方法的对比。两种测量的方法N都要大一些,N越大,测量的误差越小。
5.方法的选择
我们了解到,高频适合测频法,低频适合测周法,那么多少频率算高,多少频率算低呢
这里就要引入我们中界频率的概念

当待测信号小于中界频率时测周法误差小,当待测信号大于中介频率时,测频法误差小。

五.用单片机实现
1.电路

我们可以看到这里有一个三通道的异或门,异或门是当三个引脚的电平有任意一个反转时候,就会输出低电平。之后输出通过数据选择器,进入到输入捕获通道1,数据选择器如果选择上面的。那么输入捕获1的通道,就是三个引脚的异或值。如果选择下面的一个,那么异或门就没有用,输出是下面各自的通道。设计这个异或门其实还是为了三项无刷电机服务的。
无刷电机有三个霍尔传感器,检测转子位置,可以根据转子的位置进行换向。有了异或门就可以在前三个通道接上无刷电机的霍尔传感器。然后这个定时器,就作为无刷电机的接口定时器。去驱动换向电路工作。

输入信号过来,介入了输入滤波器,边沿检测器,可以对信号进行滤波,避免一些毛刺信号误触发。边沿检测器可以检测,高电平触发,还是低电平触发。
其实它设计了两套滤波的选择,第一套经过滤波和极性选择,输入给通道1,第二套经过滤波和极性选择,得到TI1FP2。

输入给下面,通道2的后续电路。同理下面的信号进来,也可以有一路信号去到通道一。
这样做的目的,可以灵活的更改电路,比如想要CH1作为输出,一会要以CH2作为输出。
又可以把一个引脚的输入,映射给两个输出比较单元。这也是PWMI模式的经典结构。
2.解释
因为这样子可以一路使用上升沿触发,用来捕获周期,第二个通道,使用下降沿触发,用来捕获占空比。两个通道同时对一个引脚进行捕获,就可以同时测量频率和占空比。

后面经过预分频之后,就可以触发捕获电路,每来一个信号CNT的值就会向CCR转运一次,转运的同时会发生一个捕获事件,可以用来中断。
3.主从触发模式

主模式可以将定时器内部的信号,映射到TRGO引脚,用于触发别的外设,所以这部分叫主模式
从模式就是接收其他外设,或者自身外设的一些信号。用于控制自身定时器的运行,也就是被别的信号控制。触发源选择,就是选择从模式的触发源的。可以认为是从模式的一部分,触发源选择,选择指定的一个信号,得到TRGI,TRGI去触发从模式。从模式可以在后面的列表里,选择一个来进行执行。

如果想要完成我们刚才的任务,让TI1FP1自动触发CNT清零,那么触发源选择,就可以选择TI1FP1,映射到TRGI,然后执行reset操作。这样TI1FP1的信号就可以自动触发从模式,然后从模式就会自动清零CNT的值。实现硬件全自动清零。

可以打开手册,然后看看各种主模式的解释。如果想要实现定时器的级联,就可以选择一个定时器主模式,输出更新信号到TRGO。另一个定时器,选择上一个定时器,触发从模式。从模式选择,执行外部时钟模式1操作,这样子就能实现定时器的级联了。
4.输入捕获基本结构

这个结构我们只使用了一个通道,所以只能用来测量频率。右上角是时基单元,我们把时基单元配置好,然后启动定时器。那么CNT就会在预分频之后的时钟驱动下,不断自增。这个CNT就是我们测周法用来计数记时的东西。
经过预分频之后的时钟频率,就是我们驱动CNT的标准频率fc。
标准频率=72MHz/预分频系数
然后下面输入捕获通道1的I/O口输入一个方波信号。经过滤波器和边沿检测,选择TI1FP1为上升沿触发。之后输入选择直连通道,分频器选择不分频,当TI1FP1出现上升沿之后,CNT当前计数值,转运到CCR1里面,同时触发源选择TI1FP1为触发信号,从模式选择复位操作,这样TI1FP1的上升沿,也会通过上面的通道,去触发CNT清零0。但是有先后顺序,先转移CNT的值,在进行CNT的清零,这就是主从的原因,先主后从。
5.波形讲解

在这里我们可以看到信号出现一个上升沿时候,CCR1=CNT,就是把CNT的值放在CCR1里面。然后CNT=0,计数器清零。这是从模式自动执行的。然后一个周期内,CNT在基准时钟的信号下,不断自增。直到下一个上升沿到来。

这里CNT的计数值,就是我们的N,fc/N就是信号的频率。这里我们不读取的话整个电路自动测量,不占用软件资源。
值得注意的是,ARR的值是有上线的,一般我们设置为最大,65535,那么CNT最大也只能计65535个数。如果信号频率太低,CNT可能会溢出。

还有就是触发源从模式的选择,这里可以看到,只有TI1FP1,TI2FP2没有3和4.

所以如果使用从模式,自动清零,CNT,就只能选择通道1和通道2.对于通道3和通道4,就只能开启捕获中断,在中断里手动清零0。过这样子,程序就会处于频繁的中断状态,比较消耗软件资源。
6.PWMI的基本结构


这里使用了两个通道,同时捕获一个输入引脚,可以同时测量频率和占空比。
首先TI1FP1设置上升沿触发,触发捕获和CNT清零。正常的捕获周期,这时候我们再来一个TI1FP2配置为下降沿触发,通过交叉通道,去触发通道2的捕获单元。

这时会发生,上升沿,CCR1捕获,同时清零CNT的值。之后CNT一直++,直到下降沿到来触发CCR2捕获,所以这时候CCR2的值就是从信号的上升沿,到下降沿的计数值,就是高电平期间的计数值,CCR2捕获,并不会触发CNT的清零,所以CNT继续++,直到下一个上生沿到来,触发CCR1捕获,CNT清零。这样子执行之后CCR1就是一整个周期的计数值,CCR2就是高电平期间的计数值,我们用CCR2/CCR1就是占空比了。
这就是PWMI模式,使用两个通道,来进行捕获频率和占空比的思路。

这里还可以两个通道同时对第一个引脚进行捕获,这样子通道二的前面部分就没有用到。
到这里我们输入捕获就结束了,下一篇博客我们来学习代码部分。