【 FPGA 】超声波测距小实验(一)

举报
李锐博恩 发表于 2021/07/15 05:19:53 2021/07/15
【摘要】 超声波测距原理: 超声波测距原理是在超声波发射装置发出超声波,它的根据是接收器接到超声波时的时间差,与雷达测距原理相似。 超声波发射器向某一方向发射超声波,在发射时刻的同时开始计时,超声波在空气中传播,途中碰到障碍物就立即返回来,超声波接收器收到反射波就立即停止计时。 (超声波在空气中的传播速度为340m/s,根据计时器记录的时间t(秒),就可以计算出发射点距障碍物的距离...

超声波测距原理:

超声波测距原理是在超声波发射装置发出超声波,它的根据是接收器接到超声波时的时间差,与雷达测距原理相似。 超声波发射器向某一方向发射超声波,在发射时刻的同时开始计时,超声波在空气中传播,途中碰到障碍物就立即返回来,超声波接收器收到反射波就立即停止计时。

(超声波在空气中的传播速度为340m/s,根据计时器记录的时间t(秒),就可以计算出发射点距障碍物的距离(s),即:s=340t/2)

è¿éåå¾çæè¿°

计算公式可近似为:s=340t/2(精确的情况稍微不同)

实验所用超声波测距实物为:

è¶å£°æ³¢æµè·æ¨¡å

超声波测距时序图:

触发信号是一个持续10us的高电平脉冲,检测到触发信号后,超声波测距模块将发出8个40KHz的脉冲并检测回波信号,一旦检测到回波信号则此模块输出回响信号,回响信号的脉冲长度与测试距离成正比。

计算公式近似为:s=340t/2

下面是FPGA实现的功能框图:

如上图,回波信号echo作为输入信号输入到FPGA的Chipscope进行采集,来查看echo信号的长度,由此来得出测量距离。

引用特权的程序吧,虽然有的部分不太喜欢,但总体还是能提供一个思路:


  
  1. /
  2. //工程硬件平台: Xilinx Spartan 6 FPGA
  3. //每10us产生一个持续时间为40ns的高脉冲
  4. /
  5. module clkdiv_generation(
  6. input clk, //外部输入25MHz时钟信号
  7. input rst_n, //外部输入复位信号,低电平有效
  8. output clk_100khz_en //100KHz频率的一个时钟使能信号,即每10us产生一个时钟脉冲
  9. );
  10. //-------------------------------------------------
  11. //时钟分频产生
  12. reg[7:0] cnt; //时钟分频计数器,0-249
  13. //1s定时计数
  14. always @(posedge clk or negedge rst_n)
  15. if(!rst_n) cnt <= 8'd0;
  16. else if(cnt < 8'd249) cnt <= cnt+1'b1;
  17. else cnt <= 8'd0;
  18. assign clk_100khz_en = (cnt == 8'd249) ? 1'b1:1'b0; //每10us产生一个40ns的高脉冲
  19. endmodule

  
  1. /
  2. //工程硬件平台: Xilinx Spartan 6 FPGA
  3. /
  4. module ultrasound_controller(
  5. input clk, //外部输入25MHz时钟信号
  6. input rst_n, //外部输入复位信号,低电平有效
  7. input clk_100khz_en, //100KHz频率的一个时钟使能信号,即每10us产生一个时钟脉冲
  8. output ultrasound_trig, //超声波测距模块脉冲激励信号,10us的高脉冲
  9. input ultrasound_echo //超声波测距模块回响信号
  10. );
  11. //-------------------------------------------------
  12. //1s定时产生逻辑
  13. reg[16:0] timer_cnt; //1s计数器,以100KHz(10us)为单位进行计数,计数1s需要的计数范围是0~99999
  14. //1s定时计数
  15. always @(posedge clk or negedge rst_n)
  16. if(!rst_n) timer_cnt <= 17'd0;
  17. else if(clk_100khz_en) begin
  18. if(timer_cnt < 17'd99_999) timer_cnt <= timer_cnt+1'b1;
  19. else timer_cnt <= 17'd0;
  20. end
  21. else ;
  22. assign ultrasound_trig = (timer_cnt == 17'd1) ? 1'b1:1'b0; //10us高脉冲生成
  23. endmodule

下面是主模块,调用上面的两个模块:


  
  1. /
  2. //工程硬件平台: Xilinx Spartan 6 FPGA
  3. /
  4. //每秒产生1个超声波测距模块所需的10us高脉冲激励,并用chipscope pro查看回响信号
  5. module sp6(
  6. input ext_clk_25m, //外部输入25MHz时钟信号
  7. input ext_rst_n, //外部输入复位信号,低电平有效
  8. output ultrasound_trig, //超声波测距模块脉冲激励信号,10us的高脉冲
  9. input ultrasound_echo, //超声波测距模块回响信号
  10. output[0:0] led //D2指示灯
  11. );
  12. //-------------------------------------
  13. //PLL例化
  14. wire clk_12m5; //PLL输出12.5MHz时钟
  15. wire clk_25m; //PLL输出25MHz时钟
  16. wire clk_50m; //PLL输出50MHz时钟
  17. wire clk_100m; //PLL输出100MHz时钟
  18. wire sys_rst_n; //PLL输出的locked信号,作为FPGA内部的复位信号,低电平复位,高电平正常工作
  19. pll_controller uut_pll_controller
  20. (// Clock in ports
  21. .CLK_IN1(ext_clk_25m), // IN
  22. // Clock out ports
  23. .CLK_OUT1(clk_12m5), // OUT
  24. .CLK_OUT2(clk_25m), // OUT
  25. .CLK_OUT3(clk_50m), // OUT
  26. .CLK_OUT4(clk_100m), // OUT
  27. // Status and control signals
  28. .RESET(~ext_rst_n),// IN
  29. .LOCKED(sys_rst_n)); // OUT
  30. //-------------------------------------
  31. //25MHz时钟进行分频,产生一个100KHz频率的时钟使能信号
  32. wire clk_100khz_en; //100KHz频率的一个时钟使能信号,即每10us产生一个时钟脉冲
  33. clkdiv_generation uut_clkdiv_generation(
  34. .clk(clk_25m), //时钟信号
  35. .rst_n(sys_rst_n), //复位信号,低电平有效
  36. .clk_100khz_en(clk_100khz_en) //100KHz频率的一个时钟使能信号,即每10us产生一个时钟脉冲
  37. );
  38. //-------------------------------------
  39. //每秒产生一个10us的高脉冲作为超声波测距模块的激励
  40. ultrasound_controller uut_ultrasound_controller(
  41. .clk(clk_25m), //时钟信号
  42. .rst_n(sys_rst_n), //复位信号,低电平有效
  43. .clk_100khz_en(clk_100khz_en), //100KHz频率的一个时钟使能信号,即每10us产生一个时钟脉冲
  44. .ultrasound_trig(ultrasound_trig), //超声波测距模块脉冲激励信号,10us的高脉冲
  45. .ultrasound_echo(ultrasound_echo) //超声波测距模块回响信号
  46. );
  47. //-------------------------------------
  48. //input信号必须经过IBUF后,才能作为chipscope中查看
  49. wire ultrasound_echo_r;
  50. IBUF #(
  51. .IOSTANDARD("DEFAULT") // Specify the input I/O standard
  52. )IBUF_inst (
  53. .O(ultrasound_echo_r), // Buffer output
  54. .I(ultrasound_echo) // Buffer input (connect directly to top-level port)
  55. );
  56. assign led[0] = ultrasound_echo_r;
  57. endmodule

可以用Chipscope来查看回响信号的长度,这里省略,下篇博文,添加一个数码管动态扫描显示模块,将回响信号在数码管上显示出来。

超声波测距小实验(二):数码管显示回响信号脉冲宽度

文章来源: reborn.blog.csdn.net,作者:李锐博恩,版权归原作者所有,如需转载,请联系作者。

原文链接:reborn.blog.csdn.net/article/details/86546143

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。