FPGA之旅设计99例之第十五例-----超声波测距

本文介绍了如何使用FPGA控制超声波模块进行测距,详细阐述了超声波测距原理及模块四个引脚的功能。通过状态机实现测距过程,包括空闲态、trig态、echo态和结束态。代码中展示了关键的计数器实现,用于测量超声波回波时间并计算距离。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一. 简介

本例为FPGA之旅设计99例中的第十五例,本例将介绍如何使用超声波模块,进行测距。这个模块在智能小车中使用的比较多,使用起来比较方便,仅需四个引脚即可驱动。模块细节如下图,来源于淘宝。

请添加图片描述

二. 超声波测距方法

先来了解一下模块的四个引脚

VCC: 接3.3V - 5V 供电

GND:接地

Trig:控制超声波进行测距引脚,默认为高电平,当其拉高后,模块启动超声波测距。

Echo:用于表示超声波发送到接收到的时间,默认为低电平,高电平表示超声波在空气中传播的时间。

请添加图片描述

从图中,可以很清楚的看到模块的工作原理。

首先,FPGA先将Trig引脚拉高10us,通知模块启动超声波测距。然后模块内部发出8个40khz的脉冲,即发送超声波,这个FPGA是不需要管的。发送完成之后,Echo就拉高,直到接收到返回到的超声波,拉高时间表示离物体的距离。通过下面格式可以转换到CM。

D =(拉高时间 * 声速(340M/S)) /2

除以二是以为从发送到接收,一个来回。

三. 代码实现

通过上面的工作原理图可以看出,状态机一共可以分为以下几个状态

  1. 空闲态 : 没有测距请求时,所处的状态
  2. trig态 : 当测距请求到来时,所处的状态,这个状态中,会将trig信号拉高
  3. echo态: 当trig态结束的时候,转入echo态,这个状态中,将会检测echo信号高电平的持续时间
  4. 结束态 :echo信号变为低电平的时候,进入结束态,并且根据echo高电平的持续时间,计算距离
localparam		S_IDLE				=	'd0;
localparam		S_SEND_Trig			=	'd1;
localparam		S_WATI_Echo			=	'd2;
localparam		S_END				=	'd3;

主要代码是状态的转移以及trig态的计数和echo高电平计数,代码如下。

always@(posedge sys_clk or negedge rst_n)
begin
	if( rst_n == 1'b0)
		trig_cnt <= 'd0;
	else if (state == S_SEND_Trig)
		trig_cnt <= trig_cnt + 1'b1;
	else
		trig_cnt <= 'd0;
end

always@(posedge sys_clk or negedge rst_n)
begin
	if( rst_n == 1'b0)
		echo_cnt <= 'd0;
	else if(state == S_WATI_Echo && echo == 1'b1)
		echo_cnt <= echo_cnt + 1'b1;
	else if(state == S_END)
		echo_cnt <= echo_cnt;
	else
		echo_cnt <= 'd0;
end

这基本上完成了全部驱动代码的编写,模块比较简单,下面通过signal tap抓取一下波形图
请添加图片描述

回复 FPGA之旅设计99例之第十五例 获取完整代码

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FPGA之旅

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值