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