实验内容

上图为 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、开启定时器、发送启动脉冲、等待、关闭定时器