一. 簡介
本例為FPGA之旅設(shè)計(jì)99例中的第十五例,本例將介紹如何使用超聲波模塊,進(jìn)行測距。這個(gè)模塊在智能小車中使用的比較多,使用起來比較方便,僅需四個(gè)引腳即可驅(qū)動(dòng)。
二. 超聲波測距方法
先來了解一下模塊的四個(gè)引腳
VCC:接3.3V - 5V 供電
GND:接地
Trig:控制超聲波進(jìn)行測距引腳,默認(rèn)為高電平,當(dāng)其拉高后,模塊啟動(dòng)超聲波測距。
Echo:用于表示超聲波發(fā)送到接收到的時(shí)間,默認(rèn)為低電平,高電平表示超聲波在空氣中傳播的時(shí)間。
從圖中,可以很清
楚地看到模塊的工作原理。
首先,F(xiàn)PGA先將Trig引腳拉高10us,通知模塊啟動(dòng)超聲波測距。然后模塊內(nèi)部發(fā)出8個(gè)40khz的脈沖,即發(fā)送超聲波,這個(gè)FPGA是不需要管的。發(fā)送完成之后,Echo就拉高,直到接收到返回到的超聲波,拉高時(shí)間表示離物體的距離。通過下面格式可以轉(zhuǎn)換到CM。
D =(拉高時(shí)間 * 聲速(340M/S)) /2
除以二是以為從發(fā)送到接收,一個(gè)來回。
三. 代碼實(shí)現(xiàn)
通過上面的工作原理圖可以看出,狀態(tài)機(jī)一共可以分為以下幾個(gè)狀態(tài)
空閑態(tài) : 沒有測距請求時(shí),所處的狀態(tài)
trig態(tài) : 當(dāng)測距請求到來時(shí),所處的狀態(tài),這個(gè)狀態(tài)中,會將trig信號拉高
echo態(tài): 當(dāng)trig態(tài)結(jié)束的時(shí)候,轉(zhuǎn)入echo態(tài),這個(gè)狀態(tài)中,將會檢測echo信號高電平的持續(xù)時(shí)間
結(jié)束態(tài) :echo信號變?yōu)榈碗娖降臅r(shí)候,進(jìn)入結(jié)束態(tài),并且根據(jù)echo高電平的持續(xù)時(shí)間,計(jì)算距離
localparam S_IDLE = 'd0;localparamS_SEND_Trig='d1;localparam S_WATI_Echo = 'd2;localparamS_END='d3;
主要代碼是狀態(tài)的轉(zhuǎn)移以及trig態(tài)的計(jì)數(shù)和echo高電平計(jì)數(shù),代碼如下。
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
這基本上完成了全部驅(qū)動(dòng)代碼的編寫,模塊比較簡單,下面通過signal tap抓取一下波形圖
-
引腳
+關(guān)注
關(guān)注
16文章
1569瀏覽量
52358 -
高電平
+關(guān)注
關(guān)注
6文章
198瀏覽量
21900 -
超聲波模塊
+關(guān)注
關(guān)注
1文章
21瀏覽量
13721
原文標(biāo)題:FPGA實(shí)現(xiàn)超聲波測距
文章出處:【微信號:FPGA之旅,微信公眾號:FPGA之旅】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
評論