红外超声波雷达测距

一、 内容概要

Ⅰ 采用stm32F103和HC-SR04超声波模块, 使用标准库或HAL库+ 定时器中断,完成1或2路的超声波障碍物测距功能。

Ⅱ 当前智能汽车上一般配置有12路超声波雷达,这些专用超声波雷达内置了MCU,直接输出数字化的测距结果,一般硬件接口采用串口RS485,通信协议采用modbus。

① 了解 RS485与RS232(UART),Modbus协议

② 如果让你设计一款 12路车载超声波雷达,采用 stm32F103+HC-SR04超声波模块,对外提供RS485和Modbus协议,你的设计方案是什么?

二、 stm32超声波测距实现

2.1 准备工作

CubeMx32
keil
stm32c8t6
HC-SR04超声波模块

2.2 器件介绍

HC-SR04:
HC-SR04超声波测距模块提供2cm~400cm的测距功能,精度达3mm。

STM32F103的 HC-SR04超声波测距
功能需求
数据采集与滤波处理 - 测试数据包含噪声,程序需要进行滤波处理; - 将测距数值通过串口上传到上位机串口助手。
控制蜂鸣器或LED - 根据障碍物距离远近,控制一个蜂鸣器(可以用LED灯代替)发出频率不同的声音(或LED不同闪烁),即输出占空比变化的PWM波形。
仿真测试 - 在没有超声波模块硬件的场景下,使用Keil中的仿真逻辑分析仪,观察分析对应管脚上的时序波形,判读是否符合协议规范。

以下图片截取自深圳市捷深科技有限公司的《HC-SR04超声波测距模块说明书》
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
通过时序图我们可以知道,我们给HC-SR04发送长达10us的TTL脉冲,然后模块就会进行测距,测距的结果通过回响信号传达,回响的TTL电平信号时间即是超声波从HC-SR04模块发出,触碰到障碍物后返回到HC-SR04模块的时间总和。

TTL是逻辑电平标准,当电压达到2.4V5V之间,那么为逻辑1(高电平),电压在0V0.4V之间,那么为逻辑0(低电平)。所以我们可以直接通过GPIO口来输出以及输入时序所需的电平信号。

总所周知,声音的速度为340m/s,因此我们将回响电平的时间除340再除2之后得到的就是单位为米的测距结果。

编写思路:

结合说明书我们可以知道,我们仅需提供10us的高电平给Trig口即可。然后HC-SR04在测量完毕之后会将结果通过Echo回响回来。

所以我们只需要将Trig口拉高,等待10us(最好再延长一些,代码中用的是15us)后再拉低即可。

接着就只需要等待Echo将数据传输回来,通过时序图我们可以得知回响信号是拉高Echo口,再拉低,中间持续的时间就是测距的结果。

所以我们给Echo口配置一个中断事件,设置为上跳变下跳变都触发,另外再用一个变量记录Echo口到底是拉高还是拉低即可。

如果是拉高,那么我们需要记录下持续的时间,这时候我们需要用定时器计时,所以需要在一开始的时候就配置好定时器的初始化。唯一的问题就是该如何配置定时器的预分频器和自动重装器了。

根据说明书我们可以知道HC-SR04的精度为3mm,而测距的公式为 us/58-cm,稍加计算可知,如果我们需要测量3mm,那么得到的时间为17.4us,以此为一个刻度,那么定时器的频率应该为57471Hz。然而这样太麻烦了,而且也不好用,因此我们可以随意一些,我在代码中使用的是预分频器为72,自动重装器为100,那么得到的频率为72MHz/72/100=1000Hz,也就是一次定时器中断的时间为100us,而自动重装器里的每一个值就是1us,所以每次外部中断的下降沿触发之后只需要将定时器触发的次数*100再加上自动重装器里的值就可以得到回响信号的持续时间了,单位是us。

2.3 搭建编程环境

打开CubeMx,新建一个项目
管脚配置大致如图所示
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
距离传感器模块获取数据
在这里插入图片描述
TRIG管脚,和蜂鸣器管脚
在这里插入图片描述
RTOS多任务程序设计
按照教程导入项目

2.4代码编写

实现


TIM_ICInitTypeDef  tim_ic_init;
//g_cap_state:捕获状态标志(bit7:完成捕获; bit6:捕获高电平;bit5-bit0:捕获高电平溢出次数)
u16 g_cap_state, g_cap_val;
u32 g_cap_distance;	//超声波测量距离

//---------------------------------------------------------------------------------------------------------------------------------------------
//	函 数 名: timer4_cap_init
//	功能说明: TIM4初始化
//	形    参: timer_arr:自动重装值; timer_psc:时钟分频系数
//	返 回 值: 无
//	日    期: 
//	作    者: 
//  备    注: 
//---------------------------------------------------------------------------------------------------------------------------------------------
void timer4_cap_init(u16 timer_arr, u16 timer_psc)
{
   
   
	GPIO_InitTypeDef gp_init;
	TIM_TimeBaseInitTypeDef  tim_base_init;
	NVIC_InitTypeDef nvic_init_config;

	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);	//使能TIM2时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值