欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 教育 > 培训 > 超声波测距

超声波测距

2024/10/25 19:29:37 来源:https://blog.csdn.net/2301_81764359/article/details/142958787  浏览:    关键词:超声波测距

一、参考资料

B站:http://【【STM32】动画讲解输入捕获 并实现超声波测距】https://www.bilibili.com/video/BV1HM4m1R75B?vd_source=70e3aaa6cbfe13f5858272f48dacf336

单片机:

STM32F103C8T6

二、测距原理

        如果超声波扩散范围内有比被测物体更近的障碍物 ,超声波就会被提前反射,测得的就是模块到障碍物的距离

         用于供电的VCC和GND

         控制端Trig和一个输出端Echo

三、测距思路

(1)一般测距

        当我们需要进行测量时,只需要通过一个GPIO口向Trig引脚发送一个脉冲信号,超声波模块接收到脉冲信号后就会向外发送一段超声波,紧接着模块将Echo拉高,当魔魁啊接收到反射回来的超声波后,模块便将Echo拉低,那么Echo上高电平的持续时间也就是超声波在往返路途中消耗的时间

         通过一个GPIO口向Trig引脚发送一个脉冲信号

         测量Echo上高电平的持续时间:一直监听Echo口所连接的GPIO口的电平变化,当读取到GPIO口是高电平时就操作定时器开始计数,然后继续监听;当读取到GPIO口是低电平时,就读取定时器的数值

(2)输入捕获测距

        但是程序软件循环读取GPIO硬件是否检测到高电平,再软件控制启动定时器硬件,再软件循环读取GPIO硬件是否检测到低电平,再读取此时定时器的数值,这其中软硬件的交互以及软件运行总归是要消耗些时间,所以可以用输入捕获的方法解决耗时的问题

        这种方案的优势在于即使过一会儿程序再来读取数值,读取的也是硬件上记录下来的电平变化那一刻的计数器值,不会引入软件运行时间的干扰,因而更加的精准

        本次例子使用的是内部时钟源。每个输入通道都有它自己的捕获寄存器:TI1FP1经过一个预分频器之后连接到了捕获寄存器1上,TI1FP2经过一个预分频器之后连接到了捕获寄存器2上。(这些预分频器可以进行/2/4以及/8分频)。

        假设我们启用了输入通道1的输入捕获模式,并且设定为上升沿捕获,定时器启动计数后,若输入到输入通道1的信号出现了一个上升沿,边沿检测器立即检测到,随后一个触发信号就会通过TI1FP1传递到捕获寄存器1,捕获寄存器1便立刻将此计数器的值复制到自身(如果我们为此输入捕获开启了中断,就还会促发输入捕获中断,通知程序尽快读取捕获寄存器中的数值,这样我们就获取到了上升沿出现时定时器的时刻)那么只要我们再获取到下降沿出现时定时器的时刻,二者相减也就能获取到高电平的持续时间了。

        但是一个输入通道的输入捕获只能进行上升沿捕获或者下降沿捕获,并不能设定为双边沿捕获。所以STM32又从TI1上引出了一条线,连接到了捕获寄存器2上,这条线就是TI1FP2。

        信号从TI1引入,在自己的捕获寄存器1上进行输入捕获,就叫做输入捕获的直接模式。而借用捕获寄存器2进行输入捕获,则叫做输入捕获的间接模式

        TI2FP1接入了捕获寄存器1,如果信号从TI2的GPIO口引入,则就是输入通道TI2叫做直接模式,TI1叫做间接模式

        TI3和TI4与TI1和TI2的区别就是, TI3FP3与TI4FP4没有接入到从模式控制器中,也没有接入到编码器上

         总结:

        输入捕获可以在输入信号上出现上升沿或者下降沿的时候,将此时计数器的值捕获到捕获寄存器中,并且可以借用另一个输入通道的捕获寄存器进行输入捕获。捕获到自己的捕获寄存器中叫做直接模式,借用另一通道的捕获寄存器叫做间接模式。TI1与TI2是一对,可以相互借用;TI3与TI4是一对,可以相互借用。

 四、CubeMx配置

 (1)时钟树配置

(2)用OLED显示测得的距离,所以打开I2C1
(3)超声波模块的配置

         给PA11配置成OutPut模式,然后给新建一个标签就是Trig

         PA10对应的是TIM1_CH3

         定时器的预分频器设置为72分频。这样计数器的频率也就是1MHz也就是1us计数值+1

        通道3选择上升沿模式,直接模式,不分频,不需要滤波;通道4选择下降沿模式,悬着间接模式,不需要分频

         需要使用定时器的输入捕获中断

 五、Kile5的代码

        

        

//*****************************int main()函数里面的代码*************************************OLED_Init();HAL_TIM_Base_Start(&htim1);
//开启定时器(没有用到定时器更新中断,所以不需要加IT)HAL_TIM_IC_Start(&htim1,TIM_CHANNEL_3);
//启动输入捕获函数,其中IC就是输入捕获的Input CaputureHAL_TIM_IC_Start_IT(&htim1,TIM_CHANNEL_4);
//我们需要获取到两个通道捕获到的值来进行计算,因而我们需要通道4捕获完成后,还要通过中断来通知我们。所以我们在启动通道4输入捕获的函数后添加IT,这样就开启了通道4的输入捕获中断

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com