什么是输入捕获

由下图可知定时器总共有四个通道,这四个通道既可以作为输入也可以作为输出。作为输入通道时,可以将外部信号从左侧通道输入进来,之后用定时器对这个信号的时间参数进行测量,将种功能叫做输入捕获;输出时可以向外输出精确的方波信号,将这种功能成为输出比较。

输入捕获的原理和秒表即使很像,如下图所示:

最左侧有一个外部信号,它通过通道1输入到定时器中,之后让通道1工作在输入捕获模式下,注意观察左边信号有一个信号的变化,计数器CNT会对这个变化的信号进行拍照保存到CCR1当中,然后再将CCR1寄存器当中的值读取出来,这样就可以得知外部信号在什么时候发生过什么变化。

输入捕获:捕获信号变化的时间节点,并保存

使用输入捕获的原理就可以对输入信号的时间参数进行测量,比如要测一段脉冲的宽度,一个脉冲有上升沿和下降沿两个边沿,之后将这段脉冲同时输入给通道1和通道2,让通道1捕获脉冲的上升沿,通道2捕获脉冲的下降沿。

输入捕获流程

首先闭合时基单元的开关来启动这个定时器,闭合开关之后计数器CNT的值就会从0开始递增,在CNT计数的过程中,当计数到上升沿时CNT的值=4,这个值会被拍照保存到CCR1当中,之后会遇到下降沿,此时CNT的值=7会被保存到CCR2当中。因此脉冲的宽度就=(CCR2-CCR1)*分辨率(这里的分辨率就是计数器每跳一次所消耗的时间),假设分辨率为1us,即脉冲的宽度就=(7-4)*1us=3us。

如下图所示是输入捕获的详细流程图,有定时器的四个通道和时基单元,可以将图中不重要的部分先删除(比如最左边的霍尔传感器)

因为这四个通道都是相同的所以可以通过一个通道来进行讲解,如下图所示:

输入捕获主要分为四个阶段:1.输入滤波、2.边沿检测、3.信号选择、4.分频

为了分析发方便先标记几个关键节点,首先原始信号从节点1处的通道输入进来,由于干扰输入进来的信号上有很多毛刺,这些毛刺的存在会影响后续的测量。

1.输入滤波

第一个阶段的输入滤波就是为了滤除这些毛刺的,之后就会在节点2得到一个纯净的方波信号;

2.边沿检测

第二个阶段边沿检测,这一部分边沿检测分别有两种输出分别是上升沿脉冲和下降沿脉冲,所谓上升沿脉冲就是每检测到信号上升沿就发送脉冲,下降沿脉冲就是每检测到信号下降沿就发送脉冲。

3.信号选择

第三个阶段节点选择,可以看到节点5有三种信号来源,分别是直接、间接和TRC,其中TRC表示从从模式控制器来的信号,这里用不到,所以只需要考虑直接和间接。

定时器有四个通道现在将这些通道两两分成一对,通道1和通道2是一对,通道3和通道4是一对,在这一对通道的内部,信号是可以相互引用的,如果通道来自于信号本事这种方式就叫做直接,如果通道来自于对侧的通道这种方式就叫做间接。

如下图所示,信号通过上升沿直接或者是上升沿间接信号流向如下图所示:

现在选择上升沿脉冲和直接那么信号流向就如下图所示:

此时节点3和节点5的波形应当相同,所以节点5的波形也是每遇到一个上升沿就向外发送一个脉冲。

4.分频

最后第四个阶段是分频

如图所示有一个分频器,分频系数可以是1/2/4/8,比如这里将分频系数设置为2,那么本来在节点5每遇到一个上升沿就会捕获到一个脉冲,经过分频之后在节点6需要经过两个脉冲才会捕获到一个脉冲,而在节点6触发的脉冲会触发一个叫做CCx的事件,这个事件发生时CNT的值会被拍照保存到CCR当中,此时只需将CCR1的值读出来就知道信号发生变化的时间点了。

由于通道之间是可以相互引用的,所以只需要把相应的脉冲信号输入到其中一个通道就可以了,其它的通道保持悬空。

将脉冲信号输入到通道1当中,通道2保持悬空,通道1选择上升沿脉冲、直接、分频系数为1;之后通道2选择下降沿脉冲、间接、分频系数为1。所以输入信号进入后分为了两个流向,通道1捕获的是脉冲的上升沿,通道2捕获的是脉冲的下降沿。

现在启动定时器,定时器启动之后,首先遇到上升沿,这个值被保存到CCR1当中,之后遇到下降沿这个值会被保存到CCR2当中,之后套用公式:脉宽=(CCR2-CCR1)*分辨率,计算出脉冲的宽度。

超声波实验实践

如下图所示超声波模块有两个圆柱形凸起,一个用来发送超声波,一个用来接收超声波

这里解释一下什么是超声波,人能听到声音是因为声音在震动,而人耳能听到的声音的频率范围是:20Hz~20KHz,低于20Hz的声音叫做次声波,高于20KHz的声音叫做超声波。所以所谓超声波就是声音超过人耳范围的声波。

超声波测距原理

而超声波传感器可以用来测量和障碍物之间的距离,其中一个“眼睛”发送超声波,超声波遇到障碍物会将声波反弹回到另一个“眼睛”接收。之后使用声速340m/s*传播时间/2就是超声波传感器到障碍物的距离了。(因为超声波是经反射回来的所以需要将计算的距离/2)

超声波模块引脚接线如下所示

如下图所示在开始时需要给Trig引脚一个大于10ms的脉冲,之后左边的“眼睛”就开始发送超声波,超声波的频率是40KHz总共发送八个周期,整个过程大约持续大概0.2ms;声波发送完成之后Echo引脚上会出现一个上升沿,之后发送出去的超声波会在空气中传播,遇到障碍物时会反射回来之后被右侧的“眼睛”接收到,当八个周期的超声波接收完成之后,Echo引脚上又会出现一个下降沿,这样在Echo引脚上就形成了一个脉冲,我们只需要测量测量脉冲的宽度就能得到超声波在空气中的传播时间。

脉冲宽度就等于传播时间所以只需要侧处传播时间就知道了超声波传感器和障碍物之间的距离了

接线和引脚连接如下所示:VCC接3.3 V、GND接地、Trig接PA0推挽输出即可(只需要能够输出10ms的高电平即可),将传感器的Echo引脚连接到定时器的通道1中,上升沿直接,同时也接通通道2的下降沿间接,这样就能直接测量出超声波的上升和下降沿从而计算出脉冲的宽度了。

在定时器的通道选择如下图所示前三个选项都是和输入捕获相关的:所以这里通道1选择输入捕获直接,通道2选择输入捕获间接。

下图中是对输入捕获的两个通道进行设置

Input Capture Channel1代表输入捕获通道1的参数

Input Capture Channel2代表输入捕获通道2的参数

之后是对输入捕获的几个参数进行设置

1.Polarity Selection 选择需要捕获的脉冲边沿的极性(上升沿/下降沿),(这里通道1选择上升沿,通道2选下降沿)

2.IC Selection 用来选择IC信号来源(总共有直接、间接和TRC三种),刚才在选择通道时已经将通道1选择为直接,通道2选择为间接。

3.Prescaler Division Ratio 用来设置后边的分频系数(有四个选项分别是分频系数1/2/4/8),这里两个通道都选择1分频(即No division)

4.Input Filter 用来设置前面输入捕获的滤波器参数的(这里暂不设置)

最终电路分配连接图如下

如下图所示假设下图中信号就是Echo引脚的脉冲信号,计数器开始计数遇到上升沿就将此时的计数器CNT的当前值保存到CCR1寄存器当中,遇到下降沿就将计数器CNT的当前值保存到CCR2当中。

如下图是计数器CNT的计数递增图,计数器每计一个数所需要的时间就是该计数器的分辨率,下图中的计数器的分辨率就是1us,短于1us的时间是测量不出来的,1us就是计数器测量的最大精度,那么经过计算测距的分辨率此时就等于0.17mm

分辨率1us就需要进行以下设置(默认时钟源为8MHz)

另外还要保证定时器的测量周期大于所需要测量的脉冲的脉宽,而Echo引脚上接收脉宽的最大宽度为38ms,所以应当保证周期大于这个38ms.

这里可以将自动重装寄存器ARR的值设置为65535,65535*1us=65.536 ms>38ms,满足要求。

具体实验流程如下图所示

如下图来表示整个测量的过程,其中Trig代表传感器的Tirg引脚在开始测量之前需要先向其发送一个>10us的脉冲信号,Echo是测量脉冲信号脉宽的引脚,CNT是计数器随时间递增。

第一步让CNT的值归零

因为程序是写在while循环内部的,所以这个测量过程是不断重复的,比如在下图中最两边画两条线,左边的线就代表上次测量的结束,右边的线就代表下次测量的开始。上次测量结束后CNT的值很可能不是0,所以需要手动地将其归零,也就是向CNT写0.

如下图调用这个编程接口并写0即可

第2步:清除CCR1和CCR2地标志位

如下图这些标志位,当CNT发生溢出时,会触发update事件,此时update标志位会自动由0变为1,所以我们只需要查询一下update标志位就可以知道CNT是否发生溢出了

再比如将定时器的通道设置为输入捕获模式,并且这个通道捕捉到相应的信号变化时就会产生一个CCx事件,当CCx事件发生的时候单片机会自动地让CCx的标志位从0变成1,所以只需要查询一下CCx标志位就可以知道此通道当前是否捕捉到信号变化了。

但是还要注意在使用这些标志位之前我们还要对这些标志位进行清零

第三步启动定时器

当启动定时器之后计数器CNT的值就开始递增

下面是定时器输入捕获开启和停止的编程接口,两个参数分别为定时器句柄和选择的通道,作用就是开启和闭合下图中的两个开关。

第四步向Trig引脚发送脉冲

Trig连接的是PA0引脚,具体写法如下图所示

注意:使用HAL的延迟函数最小延迟时间是1000us,所以需要使用一个for循环来进行延迟(8个指令周期消耗的时间大概是1us左右,8MHZ是内核默认情况下的频率)

第五步等待测量的结束

通过查询CC1和CC2标志位来判断当前的进度,如果检测到CC1标志位的值从0变为1就代表捕获到了上升沿,如果检测到CC2标志位的值从0变为1就代表捕获到了下降沿,当捕获到下降沿之后就意味着整个测量结束了

可以使用下图中内容来查询标志位的值(因为Echo脉冲的最大宽度为38ms,所以就算有其他损耗加起来最长不会超过50ms),之后还要在while循环中判断是否超时(即测量失败了),当检测到CC1标志位和CC2标志位都=1时标志位success置1,跳出while循环。

第六步关闭定时器

当检测到下降沿出现时就代表测试结束,可以关闭定时器了

第七步计算测量结果

首先计算Echo引脚上的脉宽公式为:脉宽 = (CCR2 - CCR1)*分辨率。

定时器的分辨率为1us,因此单位换算时要乘以10的负六次方。

之后计算传感器和障碍物之间的距离=声速 * 传播时间 /2

声速就是340m/s,传播时间就是刚才计算出来的脉宽,

具体代码如下

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐