本次综合设计是要设计一个倒车雷达的装置,倒车雷达的主要作用是在汽车倒车时,利用车尾的超声波模块向四周发送超声波,超声波在接触到障碍物时反射信号,被超声波模块所接收,模块根据超声波发送和返回之间的时间差以及超声波传输的速度,就能计算出车体和障碍物之间的实际距离。对于不同的距离,产生不同的声音来提醒驾驶员,使停车更加容易,更加安全。
本次实验要求能够根据当前位置到障碍物的距离让实验箱上的喇叭发出不同的声音,同时将距离显示在实验箱的数码管上。
实验在DDA系列数字系统实验平台上外接超声波测距模块(HC-SR04)来完成。
①HC-SR04超声波测距模块(如下图)工作原理:
a.该模块有四个引脚,其中Vcc接+5V,GND接地,trig为触发信号引脚,echo为回响信号接收引脚
b.在trig引脚上产生一个大于10μs的高电平信号,模块开始工作,模块自动发送8个40kHz的方波,并检测是否有信号返回,一旦接收到返回信号,echo引脚自动变为高电平
c.超声波模块接收到信号返回,echo引脚上由高电平自动变成低电平,高电平持续的时候则为超声波传输的时间,根据超声波在空气中传输的速度(340m/s)就能计算出实际的测量距离,测试距离=(高电平时间×声速(340m/s))/2,测量周期为60ms以上,用来防止发射信号对回响信号的影响
②距离的测量:要测量距离首先需要获取时间。那么如何获取时间呢?我们知道,echo端变为高电平的时间就是发射到接收到回声信号的时间。那么可以很自然的想到使用一个计数器。计数器可以记录一段时间内,引入时钟信号的上升沿次数。考虑到使用这个计数器的功能是计数在echo高电平的时间段内产生了多少个时钟上升沿。显然,这里echo充当的就是时钟信号的使能信号。如果想要获取持续时间,只需要在echo端高电平的时段,计数一共有多少个时钟信号上升沿即可。那么把echo端接在enable端就可以达成这个功能。但是echo隔一段时间便会上升一段时间。也就是说,计数不是一个一次性行为。那么就要将异步清零信号和之前更新trig的计数器数据输出端通过一个比较器相连接。每当提供一个工作信号给trig之前都输出一个更新信号,使echo端相连接的计数器更新。这样使用比较器也可以减少因为噪声信号而产生的误差。
得到了时间,接下来就要把时间转换成距离。
假设引入的时钟信号为f,那么其周期为1/f。假设收到计数器的数据为N,即在echo为高电平时,有N个时钟信号上升沿,那么代表着其时间长度为N/f。超声波模块距离障碍物为(N/f*340)/2
③数码管的显示:
位选信号:由于实验箱的数码管的位选信号是通过3-8译码器实现的,这里可以使用一个模三计数器产生信号000,001,010作为3-8译码器的输入信号,输出信号为000,001,010即让数码管的第0位、第1位、第2位显示
段选信号:根据数码管显示的原理,将输出的数据经过译码器转换为a、b、c、d、e、f数码管显示八位信号,然后再分配到不同的管脚即可在数码管上显示不同的数据。
整个项目一共有两个输入信号,分别是clk时钟信号和echo声波信号。通过发射声波信号然后接收其间的时间间隔从而计算出与障碍物的距离。这里的时间间隔可通过计数器得到。而输出信号为trig信号,若为低电平,该超声波模块不会工作,若给它一个大于10us的高电平(最好提供高电平的时间更长一些),该模块开始工作。产生的距离通过M7选择器,产生5组选择信号,控制不同的音频信号让喇叭发出声音。同时,距离还将通过一个分位器,将距离拆分为百位、十位、个位,经过数码管的位选和段选信号,显示在数码管上。
这是整个模块的流程图:
自循环计数器:
实验要求:超声波模块单次测距周期应大于60ms;Trig信号高电平脉宽大于10us;单个测距周期以一个Trig信号启动,以 一个清零信号对echo回响信号计数器清零。能用示波器测量到FPGA正确输出Trig信号和清零信号。
计数器是数字系统中的基本逻辑部件,其功能是记录输入脉冲的个数。它所能记忆的最大脉冲个数成为该计数器的模。而本实验要求设计的是自循环计数器。通过超声波雷达的超声波模块(测距周期大于60ms)所输入的时钟信号,而产生一个Trig触发信号,以启动单个测距周期,而要求产生的Trig信号高电平脉宽大于10us;以及产生一个Clr清零信号对下一个计数器的echo回响信号进行清零。所以在设计该计数器的时候,应该设置Input为Clk时钟信号,而Output为Clr清零信号和Trig触发信号。而计数器的实体结构也应该根据要求进行设计。
回响计数器:
回响计数器,需要用一个高频率的计数器,用echo信号作为计数器的使能端,该计数器测量echo信号高电平持续的时钟周期个数,并对每次测量结果准确清零。
M3距离计算:
原理:我们用计数器接收了时钟信号,获得了ECHO为高电平时,一共有多少个时钟上升沿。要根据这个数据,计算障碍物与倒车雷达之间的距离。
我们的计数器的频率是1Mhz,所以周期是0.000001s,假设收到的数据为N,即在ECHO为高电平时,有N个时钟信号上升沿。所以用时为N*0.000001s。在这段时间内,声音从倒车雷达处出发到障碍物,又返回雷达处。所以距离为:N*0.000001*340/2(m),由于显示的单位是厘米,所以最终距离的表达式为:N*17/1000(cm)。
具体的vhdl代码如下:
M4:分位
原理:
得到了距离的数据后,我们要进一步得到具体到每一个LED上面要显示的数字。
接收到距离信息需要进行分位,再给多路选择器。做除法得到这个数的百位十位和个位。
具体的vhdl代码如下:
距离显示:
原理:
LED显示时,通过模计数器获取位选信号,位选信号一边给多路选择器,选择要显示的数,一边给单片机(如果没有自带38译码器的话,还要通过一个38译码器)。要显示的数通过译码器翻译成abcdefgh要显示信息后,分配到相应管脚即可(段选)。
其中,counter4:
mux4_3_1:
第一个模块为分频模块,不过这个模块分出来的信号为占空比为50%的标准信号。而且是目标频率的十倍。(为第二个模块服务,第二个模块计数10才是一个输出周期)
第二个模块为调整占空比模块。这个模块其本质也为计数器,引入的时钟信号为模块二的输出信号。其根据时钟信号上升沿计数,并用一个临时变量来保存。设定占空比参数,当变量小于该参数时,输出为1,当大于该参数小于设定上限时,输出为0,并将临时变量清零。
初步分频:
音频控制:
声音控制:
M7部分是一个警报音选择器,它要实现的是根据不同的倒车距离选择相应的5组控制信号,从而产生5组不同的声音。
以下是实现代码:在距离为0到20厘米时,产生控制信号“100”;
在距离为20到60厘米时,产生控制信号“011”;
在距离为60到100厘米时,产生控制信号“010”;
在距离为100到150厘米时,产生控制信号“001”;
在其他距离范围内产生控制信号“000”。
输出的这5组控制信号将作为音量控制的选择信号。
下面是具体的实现代码: