HC-SR04 超声波测距模块介绍:
HC-SR04 超声波测距模块是非接触式距离感测设备,具备2cm至400cm的测距范围。其测距精度高达3mm,使得在各种应用场景中都能实现精确的距离测量。模块由超声波发射器、接收器以及控制电路组成。
超声波传感器工作原理:
- 确保IO 口 TRIG 信号的高电平持续时间至少为 10us
- 模块自动发送 8 个 40khz 的方波,自动检测是否有信号返回
- IO 口 ECHO 输出一个高电平,高电平持续的时间就是超声波从发射到返回的时间。使用计时器或计数器来精确测量 ECHO 信号的高电平时间。测试距离=(高电平时间*声速(340M/S))/2
接线端口:
- Vcc:+5V电源供电
- Trig:输入触发信号(触发测距)
- Echo:传出信号回响(传回时间差)
- Gnd:接地
超声波时序图:
实验目的:设计一个可以用数码管实时显示测得距离大小
模块框图:
hcrs模块代码
module hcrs
(
input wire clk_50Mhz , //系统时钟50Mhz
input wire rst_n , //全局复位
input wire ech , //输入信号回响,待测高电平的时间长短
output reg trg , //产生触发信号,用于触发测距
output reg [31:0] data //输出信号,用于显示测距结果
);
parameter CNT_20US_MAX =10'd999;//20us
parameter CNT_100MS_MAX = 26'd49_999_99;//100ms
reg ech_1;
reg ech_2;
wire ech_flag;
reg [25:0] cnt_ms;
reg [9:0] cnt_20ns_dely;
reg [31:0] cnt_sum;
//每隔100ms的产生一次内部触发信号
always @(posedge clk_50Mhz or negedge rst_n) begin//ms
if(rst_n==1'b0) begin
cnt_ms <= 25'd0;
end
else if(cnt_ms==CNT_100MS_MAX) begin
cnt_ms <= 25'd0;
end
else begin
cnt_ms <= cnt_ms + 25'd1;
end
end
//产生20us的触发信号,用于触发测距
always @(posedge clk_50Mhz or negedge rst_n) begin
if(rst_n==1'b0) begin
trg <= 1'd0;
end
else if(cnt_ms<=CNT_20US_MAX) begin
trg <= 1'd1;
end
else begin
trg <= 1'd0;
end
end
//对输入信号回响进行时钟同步
always @(posedge clk_50Mhz or negedge rst_n) begin//aligning
if(rst_n==1'b0) begin
ech_1 <= 1'd0;
end
else begin
ech_1 <= ech;
end
end
//对ech_1信号进行同步,防止亚稳态现象
always @(posedge clk_50Mhz or negedge rst_n) begin//aligning
if(rst_n==1'b0) begin
ech_2 <= 1'd0;
end
else begin
ech_2 <= ech_1;
end
end
//利用计数器计算回响信号的时间长短
always @(posedge clk_50Mhz or negedge rst_n) begin//count
if(rst_n==1'b0) begin
cnt_sum <= 20'd0;
end
else if(ech_2 ==1'd0) begin
cnt_sum <= 20'd0;
end
else if(ech_2 ==1'd1) begin
cnt_sum <= cnt_sum + 20'd1;
end
else begin
cnt_sum <= cnt_sum;
end
end
//产生计数时间数据提取标志
assign ech_flag = (~ech_1) & ech_2;
//进行距离计算处理 S = [(echo的高电平时间)* 340m/s]/2 这里注意单位
always @(posedge clk_50Mhz or negedge rst_n) begin//count
if(rst_n==1'b0)
data <= 20'd0;
else if(ech_flag ==1'b1)
data <= cnt_sum*34/1_000_0;//mm
else
data <= data;
end
endmodule //hcrs
bcd_8421模块代码,见我的这一篇文章 :用FPGA设计8421BCD编码-优快云博客
smg模块代码,见我的这一篇文章 :用FPGA设计数码管-优快云博客
HC_SR_top模块代码
module HC_SR_top (
input wire clk_50Mhz , //系统时钟50Mhz
input wire rst_n , //全局复位
input wire ech , //输入信号回响,待测高电平的时间长短
output reg trg , //产生触发信号,用于触发测距
output reg [7:0] smg_reg , //输出单个数码管显示的数据信号
output reg [7:0] smg_rel //输出数码管选择信号
);
wire [26:0] data ;
wire [31:0] bcd_data ;
hcrs hcrs_inst
(
.clk_50Mhz (clk_50Mhz) , //系统时钟50Mhz
.rst_n (rst_n ) , //全局复位
.ech (ech ) , //输入信号回响,待测高电平的时间长短
.trg (trg ) , //产生触发信号,用于触发测距
.data (data ) //输出信号,用于显示测距结果
);
bcd_8421 bcd_8421_inst
(
.clk_50mhz (clk_50mhz) , //系统时钟50Mhz
.rst_n (rst_n ) , //全局复位
.data (data ) , //待编码数据
.bcd_data (bcd_data ) //编码后的数据
);
smg smg_inst
(
.clk_50Mhz (clk_50Mhz) , //系统时钟50Mhz
.rst_n (rst_n ) , //全局复位
.data_in (bcd_data ) , //输入信号
.point (8'd0 ) , //小数点显示,高电平有效
.smg_reg (smg_reg ) , //输出单个数码管显示的数据信号
.smg_rel (smg_rel ) //输出数码管选择信号
);
endmodule //HC_SR_top