【STM32Cube】学习笔记(二):超声波传感器

本篇介绍使用STM32F407ZGT6芯片与HC-SR04超声波传感器进行距离测量的技术细节。文章涵盖硬件电路设计、STM32CubeMX配置流程、CubeIDE代码实现及数据处理方法。


摘要

本篇文章用STM32CubeMX和STM32CubeIDE软件编程,主控芯片为STM32F407ZGT6驱动超声波传感器。该传感器用来距离的测量,得到一个较为准确的测量值。通过本文可以初步学会使用定时器输入捕获功能。

所用工具:

1、芯片: STM32F407ZGT6

2、驱动设备:超声波传感器

3、配置软件:STM32CubeMx

4、IDE: STM32CubeIDE

知识概括:

通过本篇文章您将学到:

1、超声波传感器原理

2、定时器输入捕获

3、UART发送数据


一、简介

1.超声波

频率超过20kHz的声波被称为超声波。常见的超声波频率为几十千赫到几十兆赫。它和声波都是由物质振动而产生的,并且只能在介质中传播。同时,它也广泛地存在于自然界,许多动物都能发射和接收超声波,其中以蝙蝠最为突出,它能利用微弱的超声回波在黑暗中飞行并捕捉食物。超声波具有较强的穿透力和能量集中的优点,是一种具有直射性和反射性的传播媒介,常用超声波进行非接触测量。由于超声波不会被电磁波、光线及粉尘等因素干扰,不会对被测物体造成损害,因此可以广泛应用于无损测量、水文液位测量、工业场地等。对于某些具有危险性或运动复杂性等场合,比如危险环境测距、汽车倒车雷达等,也一般都是采用超声波进行非接触测距。由于超声波的波速受到温湿度的影响,所以直接进行计算距离会产生测量误差,对于测量精度要求较高的场合这种测试系统并不合适。

2.超声波测距原理

超声波测距系统的工作原理是超声波发射器的超声波发送,向某一个确定的方向发射的同时进行计时,超声波在碰触到障碍物之后会返回给超声波接收器一个反射波,此时停止计时,将时间纪录为 t。根据速度距离公式,结合超声波的传播速度与时间 t,可以推算出超声波发射点与所测量障碍物之间的距离为S=340t/2。在进行距离障碍物的距离测量时,如果介质传播的温度没有出现较大的变化时,我们可以将超声波的速度近似的认为在传输过程中未发生变化,只要测量出超声波往返障碍物的时间,就可以得到距离障碍物的实际距离。

3.HC-SR04超声波测距模块

HC-SR04超声波测距模块可提供2cm-400cm的非接触式距离感测功能测距精度可达3mm。实物图如图1所示。
在这里插入图片描述

超声波时序图如图2所示,时序图表明只需要在发射端(Trig)提供一个10us以上的脉冲触发信号,该模块内部就会发出8个40kHz的周期电平并检测回波,一旦检测到回波则输出回响信号(Echo),回响信号的脉冲宽度与所测距离成正比。最后由发射信号到收到的回响信号时间间隔可以计算得到距离。
在这里插入图片描述
注:1、测量周期应为60ms以上,以防止发射信号对回响信号的影响。
2、此模块不宜带电连接,若必要带电,则必须先接地。
3、建议被测物体的面积应不少于0.5平方米且尽量要求平整,否则影响结果。

3.输入捕获原理

输入捕获(Input Capture)就是检测输入通道输入方波信号的跳边沿,并将发生跳变时的计数器的值锁存到CCR中。使用输入捕获功能可以检测方波信号周期,从而计算方波信号的频率,也可以检测方波信号的占空比。
图3是一个典型的定时器工作计数图,ARR是自动重载寄存器,这个寄存器存储定时器的计数周期,前文中将其设置为65536。CCR为捕获/比较寄存器也就是存储一个捕获/比较的值。UEV为更新事件,当计数满时触发。 设置捕获极性时上跳沿,定时器周期性计数。
在一个上跳沿时,发生捕获事件,产生事件并且CCxIF置1,计数器自动锁存捕获的值CCR1到CCR寄存器。到了下一个上跳沿时,再发生一次捕获事件,计数器自动锁存捕获的值CCR2到CCR寄存器,若此时CCR1未被及时读出,则会将重复捕获标志位CCxOF会置1(若成功读出,则未捕获)。此时方波的周期为CCR2-CCR1个计数周期。由此可以计算出方波周期和频率。
若捕获值在不同周期内,比如图3中的CCR2和CCR3,则需要将UEV事件考虑进去即可。
在这里插入图片描述


二、硬件电路设计

硬件设计部分只需要从芯片上引出两个引脚连接HC-SR04模块的触发端和回响端即可。HC-SR04模块还需连接Vcc和GND。本次设计选择的是PA6和PA7引脚。实物连接图如图4所示。
在这里插入图片描述


三、软件设计

1.CubeMX配置

(1) 时钟配置
如图5,6分别为设置HSE(高速外部时钟)以及时钟树的配置。选定HSE之后芯片会自动选定两个引脚用来连接外部晶振,如图5所示。设置LSE之后配置时钟树,查数据手册可知本次使用的TIM3定时器是挂载在APB1总线上的,为保证其最终结果输出为整数,将APB1总线定时器时钟信号频率为50MHz,因此设置HCLK为100MHz,其配置图如图6所示。在这里插入图片描述
在这里插入图片描述
(2) 调试接口配置
如图7所示,将调试接口设置的设置为SW模式,占用芯片两个引脚。

在这里插入图片描述
(3) 定时器配置(Echo端口
为方便计算定时器的分频系数和定时周期,已将APB1设置为50MHz。先设置TIM3的通道1位直接模式输入捕获,在图8的参数设置中设置预分频为49,通过计算分频器输出的时钟信号频率为1000kHz,通过换算得到1us。极性为上升沿触发。设置完成后自动引出PA6引脚,即为接收端引脚Echo。
在这里插入图片描述

(4) GPIO配置(Trig端口
设置PA7为触发端。左键单击芯片的PA7引脚会跳出选择项,选择GPIO_Output,即为GPIO输出。此时在软件中的GPIO选项中会自动添加这个引脚的相关设置,设置如图9所示。亦可以修改User Label(用户标签),可以方便查看引脚定义,在生成的代码中自动做了宏定义,所以也比较方便实用。
在这里插入图片描述
User Label的修改如图10所示,触发端在GPIO选项卡中,回响端在TIM选项卡中。
在这里插入图片描述

(5) UART配置
为显示结果,用串口将转换结果传到电脑上,设置为异步模式,波特率为115200Bits/s,其UART配置如下图11所示。设置完成之后会自动引出两个引脚用于串口通信。
在这里插入图片描述
(6)中断设置
中断配置如图12所示,设置优先级分组为2位抢占2位次级,设置TIM3优先级低于基础时钟。
在这里插入图片描述
(7) 芯片引脚使用情况
如图13所示,本次设计一共用到了一组外部时钟源,一组调试接口,一组串口和超声波模块的触发端和回响端。通过超声波模块的两个端口收发数据,有串口打印到上位机上显示。实验比较简单,也适用于其他芯片,学者也可以加更多的功能。
在这里插入图片描述
(8) 保存
在ProjectManager中设置如如图14,15所示,设置集成开发环境为STM32CubeIDE。运用其他平台比如IAR,Keil也可以对应选择。
在这里插入图片描述
在这里插入图片描述
以上即为CubeMX的所有设置,下面在CubeIDE开发环境下编写代码。

2.CubeIDE代码

相关配置文件不做过多解释,以下只展示添加的代码段以及相应的用法,其他代码均不用动。
(1) 头文件
作用:使用打印函数sprintf。
位置:位于/* USER CODE BEGIN Includes */沙箱内。

/* USER CODE BEGIN Includes */
#include <stdio.h>
#include "stdlib.h"
/* USER CODE END Includes */

(2) 声明变量
作用:如代码注释
位置:位于/* USER CODE BEGIN 0 */沙箱内。

/* USER CODE BEGIN 0 */
uint32_t val= 0;          //计算的值
float Length = 0;         //测量最终距离

uint32_t aTxBuffer[30];     //声明sprintf的存储数组
uint8_t  TIM3_IC_STA;		//输入捕获状态
uint16_t TIM3_IC_VAL;		//输入捕获值
/* USER CODE END 0 */

(3) 开启TIM定时器
作用:开启TIM3定时器。
位置:位于/* USER CODE BEGIN 2 */沙箱内。

  /* USER CODE BEGIN 2 */
  HAL_TIM_IC_Start_IT(&htim3,TIM_CHANNEL_1);   //开启TIM3的捕获通道1,并且开启捕获中断
  __HAL_TIM_ENABLE_IT(&htim3,TIM_IT_UPDATE);   //使能更新中断
  /* USER CODE END 2 */

(4) Trig触发端函数编写
作用:由于HAL库中没有us级延时,所以参考其他大神的方法,利用指令耗时实现延时。
位置:位于/* USER CODE BEGIN 4 */沙箱内。

void Trig_Capture(void)
{
   
   
	uint32_t i;
	
	HAL_GPIO_WritePin(Trig_GPIO_Port, Trig_Pin, GPIO_PIN_SET);
	for(i=0;i<72*40;i++)
		__NOP();                      //利用指令耗时计算延时
	HAL_GPIO_WritePin(Trig_GPIO_Port, Trig_Pin, GPIO_PIN_RESET);
}

(4) 定时器计数溢出回调函数
作用:计数值达到65535时发生的事件。
位置:位于/* USER CODE BEGIN 4 */沙箱内。

void HAL_TIM_PeriodElapse
评论 28
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值