FPGA学习笔记——超声波测距模块
周末终于闲下来有时间做一些有意思的模块,今天就使用FPGA来实现超声波测距模块的使用。
超声波测距模块
超声波测距模块选的是HC-SR04,测量范围是2cm-4M,由于担心FPGA输出电压不能稳定达到5V,所以我选的是有更宽工作电压的新版本(工作电压在3.3-5V之间)。
可以看到该模块仅有4个引脚:电源Vcc、地GND、触发信号Trig和回响信号Echo。输入电压范围在3.3-5v,至于触发信号trig和回响信号echo上个时序图就明白了。
时序图与距离计算
触发信号就是FPGA输出给超声波测距模块的trig信号,每60ms发送一个触发信号,并且每个触发信号都维持10us的时间即可,使用一个计数器就可以搞定。模块在收到这个触发信号之后,内部会产生八个40KHz的脉冲,这个其实不用关心,只是在这8个脉冲过后,模块就会输出一个拉高的echo信号,而我们需要做的就是在echo信号的上升沿开始计数,计到下降沿为止,得到counter的值在乘以时钟的周期就可以得到一个时间了。
这个时间就是下图中的t,它是一来一回整个路程的时间,再乘以声速v,最后除以2就得到了实际的距离了。这里算的时候要注意一下单位,最好直接换算成厘米,并且提取出整数部分和小数部分。我是提取了整数部分3位,小数部分4位,然后将这两部分的数据送给下一个数码管显示模块即可。
模块框图
上图是设计思路,下图是综合完成后的rtl图。
再将整数部分和小数部分传给smg_disp模块后,在smg_disp模块内要对这两个数分别按位进行拆分,再显示到数码管上。
上图是我的处理过程,大家如果有好的方法欢迎指正。
仿真
这是echo模块的仿真波形,可以看到和上面给的时序图是符合的。
放大波形看看数据处理有没有问题,30.2118cm,拆解正确。
上板验证
结果如图,应该是成功了。
后记
1、对于超声波模块的输入电压3.3-5V,由于没有现成的杜邦线,我是直接使用板子上的IO口输出高电平去驱动的,但需要在管脚分配时将用作Vcc的接口的电平设置设置为3.3V-LVCMOS,这样输出高电平的电压值会>=3.2V。
2、贴一张七段数码管的segment[6:0]对应阿拉伯数字的图(有共阴共阳之分),省的用的时候一直去翻了。