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

简介: 笔记

一. 简介


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

1.png



二. 超声波测距方法


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


VCC: 接3.3V - 5V 供电


GND:接地


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


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

2.png



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


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


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


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


三. 代码实现


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


空闲态 : 没有测距请求时,所处的状态

trig态 : 当测距请求到来时,所处的状态,这个状态中,会将trig信号拉高

echo态: 当trig态结束的时候,转入echo态,这个状态中,将会检测echo信号高电平的持续时间

结束态 :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抓取一下波形图

3.png


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


公众号:FPGA之旅

目录
相关文章
FPGA-超声波测距数码管显示系列(包含进制转换、均值滤波)
FPGA-超声波测距数码管显示系列(包含进制转换、均值滤波)
221 0
FPGA-超声波测距数码管显示系列(包含进制转换、均值滤波)
|
芯片 异构计算
FPGA-基于chipscope的超声波测距调试
FPGA-基于chipscope的超声波测距调试
229 0
FPGA-基于chipscope的超声波测距调试