本文记录了利用FPGA实现倒车雷达的基本思路以及具体实现。
硬件描述语言选择VHDL,该工程在Cyclone II型芯片上进行验证。
12.12 更新模块的设计框图,更容易理解。
12.14 Important 扬声器模块设计修改!
12.16 扬声器模块设计完善 原理完善完毕
12.16 部分原理更新完毕
1.17 公开源代码
=============================================
无论是设计什么东西,最先要思考的问题就是:要实现什么功能,如何去实现。
倒车雷达的功能
倒车雷达的功能其实很直白,测量出当前位置到障碍物的距离,根据这个距离,在LED上显现距离,同时根据这个距离,让扬声音器发出不同的声音。
实现原理
测量距离–>利用超声波测距模块HC-SR04模块测距
HC-SR04的工作原理很容易理解,HC-SR04一共有四个管脚,如下图所示
最左边的为Vcc,最右边为 GND。这两个管脚是为该超声波模块供电,在单片机上分别接上Vcc和GND即可。中间的两个管脚为触发管脚trig和回馈信号管脚echo,这两个管教分别控制超声波模块是否工作(trig)和输出时间信息(echo)。
超声波测距,就是发射一个声波信号,然后接收其回声信号,再利用其间的时间间隔,计算出与障碍物之间的距离。- TRIG管脚:
触发管脚就像一个开关,若为底电平,该超声波模块不会工作,若给他一个大于10us的高电平(最好提供高电平的时间更长一些),该模块开始工作。 - ECHO管脚:
没有工作时,echo端一直为低电平,当开始工作/发射声波信号的同时,echo端会变为高电平,直到接收到反射回来的声波信号。也就是说,echo端变为高电平的时间就是发射到接收到回声信号的时间。
- TRIG管脚:
利用超声波测距模块HC-SR04模块测距–>如何提供让其工作的TRIG信号
提供TRIG信号有两个问题。- 首先是单片机所提供的都是高频信号,如何降低其频率使其能够让超声波模块能够认为其为有效信号(>10us)。
- 其次是如何控制刷新频率,我们不需要这个超声波测距模块时时刻刻工作。很长的一个周期提供一个高电平即可。
利用超声波测距模块HC-SR04模块测距–>如何接受ECHO信号让其工作
如之前的分析,echo端变为高电平的时间就是发射到接收到回声信号的时间。如何记录这个高电平持续的时间呢?
既然和时间有关,很自然的想到了计数器,计数器可以记录一段时间内,引入时钟信号的上升沿次数。无论是定制的计数器还是自己写的计数器,都应该提供这几个端口,一个是控制该计数器是否工作的enable端,一个是异步清零(所谓同步还是异步,就是看这个功能是否更具时钟信号上升沿而触发),一个是引入时钟信号,还有数据输出的端口,以及是否溢出的端口。
如果想获知其持续时间,只需要在echo端高电平的时段,计数一共有多少个时钟信号上升沿即可。乍一听,这个功能和enable很像,那么把echo端接在enable端就可以达成这个功能了。但是echo隔一段时间,又会来,也就是说,计数不是一个一次性行为,那么就要将异步清零信号和之前的刷新周期联系一下,或者和trig信号,或者和echo联系一下就可以解决了。解决方法很多,选一条喜欢的方式即可,但是会不会受到噪声信号的影响也是要考虑的因素之一。接收到了ECHO信号–>如何将其转化为距离
我们刚刚利用了计数器接收了时钟信号,但是获得的只是ECHO为高电平时,一共有多少个时钟上升沿,这和我们想要的距离数据还差一道转换呢。
假设我们之前的那个计数器的频率为100K,那么其周期为0.01ms。假设收到的数据为N,即在ECHO为高电平时,有N个时钟信号上升沿,那么代表着其时间长度为N*0.01ms。在这段时间内,声音从我们所在的位置,跑到了障碍物,撞了墙,又跑了回来。奔跑的距离为N*0.01ms*340m/s。(注意单位换算)将其除以二就是距离咯。
这个地方就体现出VHDL的优越性了,提供了conv_to_interger()(将二进制转换为十进制)等函数。
计算部分的语言规范网上资料很多,就是要注意整数库里面不会提供整数和小数相乘这种东西的,可以通过先乘后除的方法曲线救国(0.113=113/1000)
已经知道了距离–>如何在LED显示
如果单纯是LED显示,相信每一个单片机入门的教材/课程都会大讲特讲。
但是我们现在收到的是数据,而不是具体到每一个LED上面要显示什么数。那么接收到距离信息还需要通过一定的处理,再给多路选择器。这个处理就是分位,比如把216分成2、1、6,然后再传递给多路选择器。利用其他语言的分位的函数大多采用除法后转换为整型(216/100=2)以及取余(216%10=6)等来实现,VHDL里面也可以用类似的方法,取余计算符为rem。
简单说一下LED显示的原理,通过模计数器获取位选信号,位选信号一边给多路选择器,选择要显示的数,一边给单片机(如果没有自带38译码器的话,还要通过一个38译码器)。要显示的数通过译码器翻译成abcdefgh要显示信息后,分配到相应管脚即可。
已经知道了距离–>如何用扬声器播放相应的声音
扬声器的工作原理很简单,根据输入的频率高低发出不同音色的声音。根据输入波形的占空比不同而产生不同的音量。
那么我们大可根据这个需求写一个专门对应的模块,判断距离的远近,然后通过分频器,调整以上参数。
最开始思路是这样的:(这个思路已经被否决了,可以跳过这里!)
=