一. 簡介
本例為FPGA之旅設計99例中的第十五例,本例將介紹如何使用超聲波模塊,進行測距。這個模塊在智能小車中使用的比較多,使用起來比較方便,僅需四個引腳即可驅動。
二. 超聲波測距方法
先來了解一下模塊的四個引腳
VCC:接3.3V - 5V 供電
GND:接地
Trig:控制超聲波進行測距引腳,默認為高電平,當其拉高后,模塊啟動超聲波測距。
Echo:用于表示超聲波發送到接收到的時間,默認為低電平,高電平表示超聲波在空氣中傳播的時間。
從圖中,可以很清
楚地看到模塊的工作原理。
首先,FPGA先將Trig引腳拉高10us,通知模塊啟動超聲波測距。然后模塊內部發出8個40khz的脈沖,即發送超聲波,這個FPGA是不需要管的。發送完成之后,Echo就拉高,直到接收到返回到的超聲波,拉高時間表示離物體的距離。通過下面格式可以轉換到CM。
D =(拉高時間 * 聲速(340M/S)) /2
除以二是以為從發送到接收,一個來回。
三. 代碼實現
通過上面的工作原理圖可以看出,狀態機一共可以分為以下幾個狀態
空閑態 : 沒有測距請求時,所處的狀態
trig態 : 當測距請求到來時,所處的狀態,這個狀態中,會將trig信號拉高
echo態: 當trig態結束的時候,轉入echo態,這個狀態中,將會檢測echo信號高電平的持續時間
結束態 :echo信號變為低電平的時候,進入結束態,并且根據echo高電平的持續時間,計算距離
localparam S_IDLE = 'd0;localparamS_SEND_Trig='d1;localparam S_WATI_Echo = 'd2;localparamS_END='d3;
主要代碼是狀態的轉移以及trig態的計數和echo高電平計數,代碼如下。
always@(posedge sys_clk or negedge rst_n)begin if( rst_n == 1'b0) trig_cnt <= 'd0; ?else if (state == S_SEND_Trig) ? ?trig_cnt <= trig_cnt + 1'b1; ?else ? ?trig_cnt <= 'd0;end always@(posedge sys_clk or negedge rst_n)begin ?if( rst_n == 1'b0) ? ?echo_cnt <= 'd0; ?else if(state == S_WATI_Echo && echo == 1'b1) ? ?echo_cnt <= echo_cnt + 1'b1; ?else if(state == S_END) ? ?echo_cnt <= echo_cnt; ?else ? ?echo_cnt <= 'd0;end
這基本上完成了全部驅動代碼的編寫,模塊比較簡單,下面通過signal tap抓取一下波形圖
-
引腳
+關注
關注
16文章
1720瀏覽量
52863 -
高電平
+關注
關注
6文章
203瀏覽量
22043 -
超聲波模塊
+關注
關注
1文章
21瀏覽量
13777
原文標題:FPGA實現超聲波測距
文章出處:【微信號:FPGA之旅,微信公眾號:FPGA之旅】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
評論