9.6 [定时器]超声波测距实验-嵌入式铁头山羊STM32笔记

实验内容

上图为 HC-SR04,超声波测距传感器

传感器测得与障碍物的距离后,通过串口和 USB 转 TTL 模块给上位机突发上报距离数据。移动障碍物,测量值会随着测量距离而变化。

目录

了解测距传感器,搭建电路,梳理编码思路,编写代码

1.HCSR-04模块的使用方法

https://www.bilibili.com/video/BV11X4y1j7si?t=129.1&p=45

左眼发送声波,右眼接收声波,计算可得距离

HC-SR04 有四个引脚,如上图左所示,图右为实际工作波形。

Trig 引脚:启动测量,MCU 给 Trig 引脚发送大于 10us 的脉冲信号即可启动传感器。

左眼:传感器接收启动信号后,左眼发送声波,发送完后 Echo 引脚拉高,产生高电平脉冲。

右眼:过一段时间传感器接收到回声信号后 Echo 引脚立刻拉低,产生低电平脉冲。

通过计算从声波发送结束 到回声传回结束这段时间,根据图上公式可以计算出实际的距离。

我们控制单片机做两件事:

启动信号:给 Trig 发送大于 10us 的脉冲启动

计算脉宽:通过 Echo 引脚接收脉冲信号,去测量脉冲脉宽,从而得出和障碍物之间的距离。

2.搭建电路

https://www.bilibili.com/video/BV11X4y1j7si?t=404.2&p=45

上图为电路引脚及接线图。

传感器:

普通引脚 PA0 接 Trig 脚,

定时器 1 引脚 PA8 接 Echo 脚。

串口:

串口 1 的 RX 引脚 PA10 接 TXD,

串口 1 的 TX 引脚 PA9 接 RXD,T 和 R 是交叉连接的。

上图为超声波测距实验接线示意图。主要接传感器和串口引脚。

初始化串口引脚和本身。

上图为初始化串口引脚具体代码:

Tx:PA9,AF_PP,复用推挽输出

Rx:PA10,IPU,输入上拉

初始化串口本身三步骤:1 开启时钟、2 设置参数、3 闭合总开关

上图为初始化串口本身代码。

上图为串口测试代码。调用 usart.h,发送字符串测试。

上图为串口测试正常示意图,串口调试助手正常接收发送来的字符串。

3.梳理思路

https://www.bilibili.com/video/BV11X4y1j7si?t=1061.1&p=45

Q:如何测量脉宽?

A:使用输入捕获。一个通道捕获上升沿,另一个通道捕获下降沿,通过时间差计算脉宽。

t=(CCR2-CCR1)*分辨率

上图为测量的整个过程。

Trig:启动引脚,发送脉冲

声波:传感器发声和回声

Echo:脉宽为声音在空气中传播的时间。

CNT:递增。

如上图,测量流程分为六步。

1、清零 CNT

2、清零 CCR

3、开启定时器

4、发送脉冲启动

5、等待 CC1/2

6、关闭定时器

4.初始化时基单元

https://www.bilibili.com/video/BV11X4y1j7si?t=1460.7&p=45

上图上部分为时基单元基本结构框图。

上图下部分为计数器 CNT 随时间递增溢出的示意图。

设置参数:分辨率(台阶宽度),周期(溢出一次的时间)。

Q:分辨率如何取?

A:HC-SR04 测距精度最大 3mm(d=vt/2)。转化成时间:2 * 3mm/340(m/s)=17.65us 左右。所以分辨率 要小于等于目标精度对应的时间,才能精准捕捉这个时间间隔。所以我们取 1us 可满足要求。

Q:周期如何取?

A:周期越长越好。如果短了,cc1 获取,溢出,到不了 cc2 的。因为 PSC、CNT、RCR、ARR 为 16 位寄存器,所以要周期最长,ARR 取 65535 即可。

计算时基单元参数:

TIM1,挂载于 APB2,为 72MHZ,1 分频。TIM1 为 1 倍频,所以时钟为 72MHZ。

要分辨率 1us,所以 PSC 为 71。

RCR 设置为 0。

上图为时基单元初始化具体代码。

配置时基单元参数,先不开启时钟。

Q:为什么现在不使用 TIM_Cmd 开启时钟呢?

A:因为后续还要配置输入捕获,需要在定时器停止状态下完成。等全部配完参数后,再使能外设

5.初始化输入捕获

https://www.bilibili.com/video/BV11X4y1j7si?t=1922.4&p=45

定时器直接 CH1 测量上升沿,间接 CH2 输入捕获测量下降沿。

引脚配置:虽然表中建议 TIM1 的 CHx 引脚在输入捕获下配置成浮空输入,但是这个传感器的 Echo 引脚,在空闲状态为低电压,所以这里配置成**下拉输入(IPD)**更合理。

当 Echo 意外断开后,输入下拉可以提供一个默认低电压,来模拟脉冲信号的空闲状态

上图为初始化通道 1 的输入捕获引脚 PA8 的具体代码。

初始化输入捕获通道示意图。

上图为初始化通道 1 的输入捕获本身的具体代码。

CH1 输入滤波:0;边沿检测: 上升沿;信号选择:直接;分频器: 1 分频。

上图为初始化通道 2 的输入捕获本身的具体代码。

CH2 输入滤波:0;边沿检测: 下降沿;信号选择:间接;分频器: 1 分频。

6.编程

https://www.bilibili.com/video/BV11X4y1j7si?t=2372.8&p=45

六步骤

1、清零 CNT:编程接口:TIM_SetCounter

2、清零 CCR:编程接口:TIM_ClearFlag

3、开启定时器:编程接口:TIM_Cmd

4、发送脉冲启动:PA0 初始化,PP,然后发脉冲

5、等待 CC1/2:编程接口:TIM_GetFlagStatus

6、关闭定时器:编程接口:TIM_Cmd

上图为距离计算示意图

上图为计算距离实际代码。

总结

初始化串口:配置引脚(PA9,PA10),配置本身(开启时钟、设置参数、打开总开关);

初始化时基单元:开启时钟,配置参数( PSC、ARR、RCR);

初始化输入捕获:初始化引脚(PA8),配置参数(输入滤波、边沿检测、信号选择、分频);

然后六步骤获取 CCR 计算距离:清零 CNT、清零 CCR、开启定时器、发送启动脉冲、等待、关闭定时器

相关推荐
chushiyunen2 小时前
快慢双指针算法笔记
数据结构·笔记·算法
临风小红楼2 小时前
别了2025,你好2026
笔记
一路往蓝-Anbo3 小时前
C语言从句柄到对象 (六) —— 继承与 HAL:父类指针访问子类数据
c语言·开发语言·stm32·嵌入式硬件·物联网
laplace01234 小时前
Part 3:模型调用、记忆管理与工具调用流程(LangChain 1.0)笔记(Markdown)
开发语言·人工智能·笔记·python·langchain·prompt
wdfk_prog4 小时前
[Linux]学习笔记系列 -- [fs]open
linux·笔记·学习
wdfk_prog4 小时前
[Linux]学习笔记系列 -- [fs]nsfs
linux·笔记·学习
手揽回忆怎么睡4 小时前
Streamlit学习笔记2
笔记·学习
阿豪只会阿巴5 小时前
【多喝热水系列】从零开始的ROS2之旅——Day4
c++·笔记·python·ros2
charlie1145141915 小时前
FreeRTOS:软件定时器(Software Timers)与时间管理
开发语言·笔记·学习·freertos·实时操作系统·工程