超聲波測距原理與製作

超聲波

人們可以聽到的聲音的頻率為20Hz~2KHz,也就是可聽聲波,超出此頻率範圍的聲音,20Hz以下的聲音稱為低頻聲波,20KHz以上的聲音稱為超聲波(Ultrasound),一般說話的頻率範圍是10Hz-8KHz。超聲波方向性好,穿透能力強,易於獲得較集中的聲能,在水中傳播距離遠,超聲波因其頻率下限大約等於人的聽覺上限而得名。

超聲波頻率分布

超聲波可以在氣體、液體及固體中傳播,其傳播速度不同。超聲波在介質中傳播的波形取決於介質可以承受何種作用力以及如何對介質激發超聲波。

通常有如下三種:

(1)縱波波型當介質中質點振動方向與超聲波的傳播方向一致時,此超聲波為縱波波型。任何固體介質當其體積發生交替變化時均能產生縱波。在工業中應用主要採用縱向振蕩。(2)橫波波型當介質中質點的振動方向與超聲波的傳播方向相垂直時,此種超聲波為橫波波型。由於固體介質除了能承受體積變形外,還能承受切變變形,因此,當其有剪切力交替作用於固體介質時均能產生橫波。橫波只能在固體介質中傳播。(3)表面波波型是沿著固體表面傳播的具有縱波和橫波的雙重性質的波。表面波可以看成是由平行於表面的縱波和垂直於表面的橫波合成, 振動質點的軌跡為一橢圓,在距表面1/4波長深處振幅最強,隨著深度的增加很快衰減,實際上離表面一個波長以上的地方,質點振動的振幅已經很微弱了。 另外,超聲波也有折射和反射現象,並且在傳播過程中有衰減。在空氣中傳播超聲波,其頻率較低,,一般為幾十KHz,而在固體、液體中則頻率可用得較高。在空氣中衰減較快,而在液體及固體中傳播,衰減較小,傳播較遠。   利用超聲波的特性,可做成各種超聲感測器,配上不同的電路,製成各種超聲測量儀器及裝置,可用於測距、測速、清洗、焊接、碎石、殺菌消毒等,並在通訊、醫療、家電、軍事、工業、農業等各方面得到廣泛應用。   能夠產生超聲波的方法很多,常用的有壓電效應方法、磁致伸縮效應方法、靜電效應方法和電磁效應方法等。當給壓電晶片兩極施加一個電壓短脈衝時, 由於逆壓電效應,晶片將發生彈性形變而產生彈性振蕩。振蕩頻率與晶片的厚度和聲速有關, 適當選擇晶片的厚度可以得到超聲頻率範圍的彈性波, 即超聲波。此種方式發射出的是一個超聲波波包,通常稱為脈衝波。超聲波測距超聲波測距系統主要應用於汽車的倒車雷達、及機器人自動避障行走、建築施工工地以及一些工業現場例如:液位、井深、管道長度等場合。   目前有兩種常用的超聲波測距方案。一種是基於單片機或者嵌入式設備的超聲波測距系統,一種是基於CPLD(Complex Programmable Logic Device)的超聲波測距系統。

如圖1所示,實驗採用第一種方案,利用嵌入式設備編程產生頻率為40KHz的方波,經過發射驅動電路放大,使超聲波感測器發射端震蕩,發射超聲波。超聲波經發射物反射回來,由感測器接收端接收,再經過接收電路放大、整形。以嵌入式微核心的超聲波測距系統通過嵌入式設備記錄超聲波發射的時間和反射波的時間。當收到超聲波的反射波時,接收電路輸出端產生一個跳變。通過定時器計數,計算時間差,就可以計算出相應的距離。

圖1 超聲波測距原理超聲波測距的原理是利用超聲波在空氣中的傳播速度為已知,測量聲波在發射後遇到障礙物反射回來的時間,根據發射和接收的時間差計算出發射點到障礙物的實際距離。首先,超聲波發射器向某一方向發射超聲波,在發射時刻的同時開始計時,超聲波在空氣中傳播,途中碰到障礙物就立即返回來,超聲波接收器收到反射波就立即停止計時。超聲波在空氣中的傳播速度為C=340m/s,根據計時器記錄的時間T秒,就可以計算出發射點距障礙物的距離L,即:L= C×T /2 。這就是所謂的時間差測距法。

由於超聲波也是一種聲波,其聲速 C 與溫度有關,表1列出了幾種不同溫度下的聲速。在使用時,如果溫度變化不大,則可認為聲速是基本不變的。如果測距精度要求很高,則應通過溫度補償的方法加以校正。

表1 超聲波波速與溫度的關係由於超聲波易於定向發射、方向性好、強度易控制、與被測量物體不需要直接接觸的優點,是作為倒車距離測量的理想選擇。超聲波感測器超聲波為直線傳播,頻率越高,繞射能力越弱,但反射能力越強,為此,利用超聲波的這種性質就可以製成超聲波感測器。另外,超聲波在空氣中的傳播速度較慢,這就使得超聲波感測器的使用變得簡單。   超聲波感測器是利用超聲波的特性研製而成的感測器。超聲波是一種振動頻率高於聲波的機械波,由換能晶片在電壓的激勵下發生振動產生的,它具有頻率高、波長短、繞射現象小,特別是方向性好、能夠成為射線而定向傳播等特點。超聲波對液體、固體的穿透本領很大,尤其是在陽光不透明的固體中,它可穿透幾十米的深度。超聲波碰到雜質或分界面會產生顯著反射形成反射成回波,碰到活動物體能產生多普勒效應。因此超聲波檢測廣泛應用在工業、國防、生物醫學等方面以超聲波作為檢測手段,必須產生超聲波和接收超聲波。完成這種功能的裝置就是超聲波感測器,習慣上稱為超聲換能器,或者超聲探頭。   超聲波感測器主要由雙壓電晶片振子、圓錐共振板和電極等部分構成。兩電極間加上一定的電壓時壓電晶片就會被壓縮產生機械形變,撤去電壓後壓電晶片恢復原狀。若在兩極間按照一定的頻率加上電壓,則壓電晶片也會保持一定的頻率振動。經試驗測得此型號壓電晶片的固有頻率為38.4 KHz,則在兩極外加頻率為40 KHz的方波脈衝信號,此時壓電晶片產生共振,向外發射出超聲波。同理,沒有外加脈衝信號的超聲波感測器在共振板接收到超聲波時也會產生共振,在兩極間產生電信號。   超聲波探頭主要由壓電晶片組成,既可以發射超聲波,也可以接收超聲波。小功率超聲探頭多作探測作用。它有許多不同的結構,可分直探頭(縱波)、斜探頭(橫波)、表面波探頭(表面波)、蘭姆波探頭(蘭姆波)、雙探頭(一個探頭反射、一個探頭接收)等。   超聲探頭的核心是其塑料外套或者金屬外套中的一塊壓電晶片。構成晶片的材料可以有許多種。晶片的大小,如直徑和厚度也各不相同,因此每個探頭的性能是不同的,我們使用前必須預先了解它的性能。超聲波感測器的主要性能指標,包括:(1) 工作頻率。工作頻率就是壓電晶片的共振頻率。當加到它兩端的交流電壓的頻率和晶片的共振頻率相等時,輸出的能量最大,靈敏度也最高。(2) 工作溫度。由於壓電材料的居里點一般比較高,特別時診斷用超聲波探頭使用功率較小,所以工作溫度比較低,可以長時間地工作而不產生失效。醫療用的超聲探頭的溫度比較高,需要單獨的製冷設備。(3) 靈敏度。主要取決於製造晶片本身。機電耦合係數大,靈敏度高;反之,靈敏度低。超聲波測距一體模塊HC-SR04(1)模塊性能

如圖2所示,HC-SR04模塊性能穩定,測度距離精確,能和國外的SRF05、SRF02等超聲波測距模塊相媲美。模塊高精度,盲區(2cm)超近,最大識別距離為300cm。

圖2 HC-SR04模塊實物圖如圖3所示,系統的工作是由軟體和硬體的配合過程。先由嵌入式微處理器使555使能端置1,繼而555送出40KHz頻率的方波信號,經過壓電換能器(超聲波發射頭)將信號發射出去,即發射超聲波,同時該時刻啟動定時器開時計時。該信號遇到障礙物反射回來在此稱為回波。同時,壓電換能器(超聲波接收頭)將接收的回波及接收超聲波,通過信號處理的檢波放大,通過三級放大後再送到比較器進行比較,輸出比較電壓,輸出電壓經過三極體以後,使之電壓與嵌入式微處理器的I/O口相匹配最後送至處理器處理。

圖3 超聲波測距原理框圖(2)產品應用領域機器人避障、物體測距、液位檢測、公共安防、停車場檢測。(3)主要技術參數

(4)接線方式及工作原理

接線方式:VCC、trig(控制端)、 echo(接收端)、 GND。如圖4所示,超聲波感測器基本工作原理如下: 採用IO口TRIG觸發測距,給大於10us的高電平信號;模塊自動發送8個40KHz的方波,自動檢測是否有信號返回;

有信號返回,通過IO口ECHO輸出一個高電平,高電平持續的時間就是超聲波從發射到返回的時間。測試距離=(高電平時間*聲速(340m/s))/2。

圖4 感測器的方向圖(5)控制方式本模塊使用方法簡單,通過嵌入式微處理器控制口發一個10us以上的高電平,啟動超聲波感測器模塊發出8個40KHz的周期電平。然後開啟定時器,再延時100us左右以避免發射探頭的余振的干擾。接著通過在while循環中查詢外部中斷是不是已經捕獲到回波信號,一旦檢測到有回波信號則輸出迴響信號。迴響信號的脈衝寬度與所測的距離成正比。由此通過發射信號到接收到的迴響信號的時間間隔就可以計算得到距離。

如圖5 所示為超聲測距模塊的時序圖,根據時序圖,可以知道,迴響信號的高電平就是我們用來測量距離的重要指標,通過距離與速度和時間的關係,從而求得相應的距離。

圖5 超聲測距時序圖

一個 10us 以上脈衝觸發信號,該模塊內部將發出 8次40KHz 周期電平並檢測回波。一旦檢測到有回波信號則輸出迴響信號,迴響信號的脈衝寬度與所測的距離成正比。由此通過發射信號到收到的迴響信號的時間間隔可以計算得到距離。建議測量周期為 60ms 以上,以防止發射信號對迴響信號的影響。

圖6 出了超聲測距模塊的發射端電路。

圖7 超聲測距發射端電路圖

壓電式超聲波換能器是利用壓電晶體的諧振來工作的。超聲波換能器內部有兩個壓電晶片和一個換能板。當它的兩極外加脈衝信號,其頻率等於壓電晶片的固有振蕩頻率時,壓電晶片會發生共振,並帶動共振板振動產生超聲波,這時它就是一個超聲波發生器;反之,如果兩電極問未外加電壓,當共振板接收到超聲波時,將壓迫壓電晶片作振動,將機械能轉換為電信號,這時它就成為超聲波接收換能器。超聲波發射換能器與接收換能器在結構上稍有不同,使用時應分清器件上的標誌。

圖8 給出了超聲測距模塊的接收端電路。  集成電路CX20106是一款紅外線檢波接收的專用晶元,常用於電視機紅外遙控接收器。考慮到紅外遙控常用的載波頻率38KHz與測距的超聲波頻率40KHz較為接近,可以利用它製作超聲波檢測接收電路。實驗證明用CX20106接收超聲波(無信號時輸出高電平),具有很好的靈敏度和較強的抗干擾能力。適當更改電容C4的大小,可以改變接收電路的靈敏度和抗干擾能力。

圖8 超聲波接收電路圖9 給出了超聲測距模塊的電路。

圖10 超聲波收發電路超聲波測距模塊的影響因素

超聲波感測器應用起來原理簡單,也很方便,成本也很低。但是目前的超聲波感測器都有一些缺點,比如,反射問題,噪音,交叉問題。

1. 反射問題

如果被探測物體始終在合適的角度,那超聲波感測器將會獲得正確的角度。但是不幸的是,在實際使用中,很少被探測物體是能被正確的檢測的。 其中可能會出現幾種誤差:

1)三角誤差

當被測物體與感測器成一定角度的時候,所探測的距離和實際距離有個三角誤差。

2)鏡面反射

這個問題和高中物理中所學的光的反射是一樣的。在特定的角度下,發出的聲波被光滑的物體鏡面反射出去,因此無法產生回波,也就無法產生距離讀數。這時超聲波感測器會忽視這個物體的存在。

3)多次反射

這種現象在探測牆角或者類似結構的物體時比較常見。聲波經過多次反彈才被感測器接收到,因此實際的探測值並不是真實的距離值。

這些問題可以通過使用多個按照一定角度排列的超聲波圈來解決。通過探測多個超聲波的返回值,用來篩選出正確的讀數。

(2) 噪音

雖然多數超聲波感測器的工作頻率為40-45KHz,遠遠高於人類能夠聽到的頻率。但是周圍環境也會產生類似頻率的噪音。比如,電機在轉動過程會產生一定的高頻,輪子在比較硬的地面上的摩擦所產生的高頻噪音,機器人本身的抖動,甚至當有多個機器人的時候,其它機器人超聲波感測器發出的聲波,這些都會引起感測器接收到錯誤的信號。

這個問題可以通過對發射的超聲波進行編碼來解決,比如發射一組長短不同的音波,只有當探測頭檢測到相同組合的音波的時候,才進行距離計算。這樣可以有效的避免由於環境噪音所引起的誤讀。

(3)交叉問題交叉問題是當多個超聲波感測器按照一定角度被安裝在機器人上的時候所引起的。超聲波X發出的聲波,經過鏡面反射,被感測器Z和Y獲得,這時Z和Y會根據這個信號來計算距離值,從而無法獲得正確的測量。

解決的方法可以通過對每個感測器發出的信號進行編碼。讓每個超聲波感測器只聽自己的聲音。

實驗原理超聲測距感測器實驗環境由PC機(安裝有Windows XP操作系統、ADS1.2集成開發環境和J-Link-ARM-V410i模擬器)、J-Link-ARM模擬器、NXP LPC2378實驗節點板、超聲測距感測器、實驗模塊和LCD顯示實驗模塊組成,如圖11所示。

圖11 感測器實驗環境本實驗所使用實物規格圖如圖12所示,實物圖如圖13所示。

圖12超聲測距模塊實物規格圖

圖 13

將超聲波感測模塊安裝到開發板上,然後用JLINK模擬器的一端用USB介面與電腦相連,一端的20Pin的JTAG引腳與NXP LPC2378節點板的J2相連,並給NXP LPC2378節點板上電,如圖14 所示。

圖14 超聲測距開發板連接圖距離測量本實驗,通過測距程序完成超聲波發射的控制、超聲波回波信號的檢測和距離的計算、左右距離的比較,並顯示。   

首先由發射程序發射10us的高電平觸發信號,控制超聲波發射器發射8個40KHz的方波。發射器發射完信號,接收器回波電平將拉高。然後開啟定時器,例如在定時器輸入頻率為f=12MHz,進行N=8分頻後每個計數周期為 。再延時100us左右以避免發射探頭的余振的干擾,然後通過在while循環中查詢外部中斷是不是已經捕獲到回波信號,然後獲得計時器計數值count,計算距離值。去掉多餘的計數誤差後 。打開工程Distance,修改Main.c中的內容如下。/*********************頭文件及定義*************************/#include "LPC23xx.h"#include "Lcd.h"#include "config.h"void delay(uint32 dly){uint32 i;for(; dly>0; dly--)for(i=0; i<1000; i++); // 約為100us}void delay10us(uint32 dly){uint32 i;for(; dly>0; dly--)for(i=0; i<160; i++); // 約為10us}void ClearRect(int index){switch(index){case 1:drawrect(0,12,128,16,0x2345);break;case 2:drawrect(0,40,128,48,0x2345);break;case 3:drawrect(0,100,128,48,0x2345);break;default:break;}}void LCD_Frame()

{

//屏幕初始顯示drawrect(0,0,128,12,0x0000);drawrect(0,12,128,16,0x2345);drawrect(0,28,128,12,0x0000);drawrect(0,40,128,48,0x2345);drawrect(0,88,128,12,0x0000);drawrect(0,100,128,48,0x2345);drawrect(0,148,128,12,0x0000);}int main(){int idx;int xpos,ypos;long count,distance;char sndBuf[20];//通訊板IO控制引腳設置IO1DIR &=~(1<<16); //IOZ/A 輸入--接收開關狀態信號delay(10);//P3.0~P3.7定義為IO引腳PINSEL6 &= 0x0000;//定義P3.1為輸入,P3.3為輸出FIO3DIR0 = 0;FIO3DIR0 |= 1<<3;//設置LCD屏幕引腳PINSEL3=PINSEL3 & 0x00000000;IO1DIR=IO1DIR|0x05700000;//屏幕初始化RESET0;//複位delay(50);RESET1;delay(100);lcd_init();delay(20);LCD_Frame();DispAscStr(0,12," ",2,&xpos,&ypos);DispChnStr(xpos,ypos,"超聲模塊測試",6,&xpos,&ypos);

ClearRect(2);

/*******************超聲波測距************************/idx=0;while(1){delay10us(100);//發送10us啟動電平FIO3PIN0 |= 1<<3;delay10us(1);FIO3PIN0 &= ~(1<<3);//等待高電平出現while(!(FIO3PIN0&(1<<1)));//配置定時器0T0TC=0; //清除定時器值T0PR=0x10; //預分頻寄存器T0CTCR=0; //定時器模式,檢測PCLK邊沿T0TCR=0x01; //計數器使能、計數器複位delay(1);//等待降為低電平while(FIO3PIN0&(1<<1));//顯示距離值,大概80為1cmcount=T0TC;distance =count/80;sndBuf[0]=d;sndBuf[1]==;sndBuf[2]= distance /10000+0; //萬sndBuf[3]= distance %10000/1000+0; //千sndBuf[4]= distance %1000/100+0; //百sndBuf[5]= distance %100/10+0; //十sndBuf[6]= distance %10+0; //個sndBuf[7]=c;sndBuf[8]=m;DispAscStr(0,40,sndBuf,9,&xpos,&ypos);delay10us(3000);}/*****************************************************/return 0;}倒車實驗本實驗模仿倒車,當距離小於20cm時,提示司機注意安全倒車距離,大於安全距離時顯示距離障礙物的距離。修改Main.c中的代碼如下:

//模仿倒車,當距離小於20cm時發出警告,並顯示當前距離值

聲速測量

利用聲速、傳播時間、傳播距離的關係,模仿實驗條件,簡單的測出實驗環境下的聲速的大概值。

例如在NXP實驗節點板定時器輸入頻率為f=12MHz,進行N=8分頻後每個計數周期為 ,假設超聲波聲速為c,則由 ,可知 。

自動門實驗

本實驗模仿自動門的功能。初始時,門關閉。當有人到達門前,原有的距離被改變,當人與測距器的距離達到臨界值時(例如距離小於50cm),打開自動門。否則,認為沒有人員的到來,關閉自動門。

idx=0;//初始狀態,門處於關閉狀態if((distance<50)&&(idx==1)){drawrect(0,40,128,48,0x2345);DispAscStr(0,40,"status:open",11,&xpos,&ypos);idx=0;//關閉門}else if((distance>50)&&(idx==0)){drawrect(0,40,128,48,0x2345);DispAscStr(0,40,"status:close",12,&xpos,&ypos);idx=1;//打開門}本超聲波測距儀通過測量超聲波發射到反射回來的時間差來測量與被測物體的距離。可以測量0.35-10m的距離。本款是國外不使用單片機的超聲波測距儀。實物圖如下:

原理圖如下:

超聲波模塊HC-SR04簡介以及編程

1、本模塊性能穩定,測度距離精確,模塊高精度,盲區小。 產品應用領域: 機器人避障 物體測距 液位檢測 公共安防 停車場檢測 。

2、 主要技術參數:

1:使用電壓:DC---5V

2:靜態電流:小於2mA

3:電平輸出:高5V

4:電平輸出:底0V

5:感應角度:不大於15度

6:探測距離:2cm-450cm

7:高精度 可達0.2cm

實物圖

接線方式:VCC、trig(控制端)、 echo(接收端)、 GND

基本工作原理: (1)採用IO口TRIG觸發測距,給至少10us的高電平信號; (2)模塊自動發送8個40khz的方波,自動檢測是否有信號返回; (3)有信號返回,通過IO口ECHO輸出一個高電平,高電平持續的時間就是超聲波從發射到返回的時間。測試距離=(高電平時間*聲速(340M/S))/2; 本模塊使用方法簡單,一個控制口發一個10US以上的高電平,就可以在接收口等待高電平輸出.一有輸出就可以開定時器計時,當此口變為低電平時就可以讀定時器的值,此時就為此次測距的時間,方可算出距離.如此不斷的周期測,即可以達到你移動測量的值

5、 操作:初始化時將trig和echo埠都置低,首先向給 trig 發送至少10 us的高電平脈衝(模塊自動向外發送8個40K的方波),然後等待,捕捉 echo 端輸出上升沿,捕捉到上升沿的同時,打開定時器開始計時,再次等待捕捉echo的下降沿,當捕捉到下降沿,讀出計時器的時間,這就是超聲波在空氣中運行的時間,按照 測試距離=(高電平時間*聲速(340M/S))/2 就可以算出超聲波到障礙物的距離。

6、 下面是飛思卡爾XS128單片機測距的程序:

while(1)

{

PT1AD0_PT1AD00 = 1;//給超聲波模塊輸入高脈衝

PITINTE_PINTE1=1; //打開PIT1定時器

while(!(counter0>=4)); //等待20us

PITINTE_PINTE1=0;counter0 = 0;//關閉定時器,計數清零

PT1AD0_PT1AD00 = 0; //trig管腳拉低

PORTB_PB0 = 0; //指示燈0

while(!(PT1AD0_PT1AD01 == 1)); //等待echo輸出上升沿

PORTB_PB1 = 0; //指示燈1

PITINTE_PINTE0=1; //打開PIT0定時器

while(!(PT1AD0_PT1AD01 == 0)); //等待下降沿

distance = counter*17/20; //計算距離,單位CM

PITINTE_PINTE0=0; //關閉定時器

PORTB_PB2 = 0; //指示燈2

PITINTE_PINTE0=1; //打開定時器定時500ms,數碼管顯示

while(!(counter>=10000))

{

Showing(distance); //顯示距離,精確1cm

}

PITINTE_PINTE0=0;counter=0; //關閉定時器,清零

}

一、電路原理

1 超聲波發射電路

由兩塊555集成電路組成。IC1(555)組成超聲波脈衝信號發生器,工作周期計算公式如下,實際電路中由於元器件等誤差,會有一些差別。

條件: RA =9.1MΩ、 RB=150KΩ、 C=0.01μF

TL = 0.69 x RB x C

= 0.69 x 150 x 103 x 0.01 x 10-6 = 1 msec

TH = 0.69 x (RA + RB) x C

= 0.69 x 9250 x 103 x 0.01 x 10-6 = 64 msec

IC2組成超聲波載波信號發生器。由IC1輸出的脈衝信號控制,輸出1ms頻率40kHz,占空比50%的脈衝,停止64ms。計算公式如下:

條件: RA =1.5KΩ、 RB=15KΩ、 C=1000pF

TL = 0.69 x RB x C

= 0.69 x 15 x 103 x 1000 x 10-12 = 10μsec

TH = 0.69 x (RA + RB) x C

= 0.69 x 16.5 x 103 x 1000 x 10-12 = 11μsec

f = 1/(TL + TH)

= 1/((10.35 + 11.39) x 10-6) = 46.0 KHz

IC3(CD4069)組成超聲波發射頭驅動電路。

2 超聲波接收電路

超聲波接收頭和IC4組成超聲波信號的檢測和放大。反射回來的超聲波信號經IC4的2級放大1000倍(60dB),第1級放大100倍(40dB),第2級放大10倍(20dB)。 由於一般的運算放大器需要正、負對稱電源,而該裝置電源用的是單電源(9V)供電,為保證其可靠工作,這裡用R10和R11進行分壓,這時在IC4的同相端有4.5V的中點電壓,這樣可以保證放大的交流信號的質量,不至於產生信號失真。

C9、D1、D2、C10組成的倍壓檢波電路取出反射回來的檢測脈衝信號送至IC5進行處理。

IC5、IC6、IC7、IC8、IC9組成信號比較、測量、計數和顯示電路,即比較和測量從發出的檢測脈衝和該脈衝被反射回來的時間差。它是超聲波測距電路的核心,下面分析其工作原理。

由Ra、Rb、IC5組成信號比較器。

其中Vrf = (Rb x Vcc)/(Ra + Rb) = (47KΩ x 9V)/(1MΩ + 47KΩ) = 0.4V

所以當A點(IC5的反相端)過來的脈衝信號電壓高於0.4V時,B點電壓將由高電平"1"到低電平"0"。同時注意到在IC5的同相端接有電容C11和二極體D3,這是用來防止誤檢測而設置的。在實際測量時,在測距儀的周圍會有部分發出的超聲波直接進入接收頭而形成誤檢測。為避免這種情況發生,這裡用D3直接引入檢測脈衝來適當提高IC5比較器的門限轉換電壓,並且這個電壓由C11保持一段時間,這樣在超聲波發射器發出檢測脈衝時,由於D3的作用使IC5的門限轉換電壓也隨之被提高,並且由於C11的放電保持作用,可防止這時由於檢測脈衝自身的干擾而形成的誤檢測。由以上可知,當測量距離小到一定程度時,由於D3及C11的防誤檢測作用,其近距離測量會受到影響。圖示參數的最小測量距離在40cm左右。減小C11的容量,在環境溫度為20 時可做到30cm測量最短距離。此時其放電時間為1.75ms。

IC6組成R-S觸發器構成時間測量電路。可以看出,在發出檢測脈衝時(A端為高電平),D端輸出高電平,當收到反射回來的檢測脈衝時,C端由高變低,此時D端變為低電平,故輸出端D的高電平時間即為測試脈衝往返時間。

計數和顯示電路由IC6、IC7、IC8、IC9組成,IC7組成計數電路脈衝發生器,原理圖如下。

其工作頻率f = 1/(2.2 x C x R)。電路頻率設計在17.2kHz左右。這個頻率是根據聲波在環境溫度為20℃ 時的傳播速度為343.5m/s確定的。我們知道在不同的環境溫度下,聲波的傳播速度會有所改變,其關係為v=331.5+0.6&TImes;t,其中v的單位為m/s,t為環境溫度,單位為℃。

Temperature (℃)Speed of sound (m/sec)-10325.50331.510337.520343.530349.540355.550361.5

有關計算如下:

測量距離為1m的物體時,聲波的往返時間為:2m/343.5(m/s)=5.82ms。這時計數器顯示應為100,即1m,此時計數電路脈衝發生器的頻率f=100/(5.82&TImes;10-3)=17.18(kHz)。如電容C(即C14)為2200pF,此時電阻

R = 1/(2.2 x C x f)

= 1/(2.2 x 2200 x 10-12 x 17.18 x 103) = 12KΩ

由於在不同的環境溫度下,聲波的傳播速度會不同,為適應不同環境溫度下測量的需要,我們要求電阻R具有一定的調節範圍,這裡用VR2,VR3進行調節,其中VR2為粗調電阻,VR3為精調電阻。同樣我們可以算出在不同溫度下的計數脈衝頻率值,如:溫度為46.5℃ 時,

f = 1/(2.2 x C x R)

= 1/(2.2 x 2200 x 10-12 x 11.5 x 103) =17.97KHz

環境溫度為1.5 ℃時f = 1/(2.2 x C x R) )

= 1/(2.2 x 2200 x 10-12 x 12.5 x 103) = 16.53KHz

實際上,在不同環境溫度下時,我們只要測試標準距離1m,調節計數電路脈衝發生器的頻率(VR2和VR3),使其顯示為100即可。

這裡簡單介紹一下計數器的清零及數據鎖存過程。A點波形即表現測試脈衝往返的時間,當A點電位由低變高時,由於C1電壓不能突變,故B點會產生一個複位脈衝信號使計數器清零,同時IC6內與非門被打開,IC8開始通過CLOCK腳計數;同樣當A點電位由高變低時,由於C2電壓不能突變,故C點會產生一個鎖存脈衝信號使計數器數據被鎖存,同時IC6的有關與非門被關閉,IC8開始停止計數,完成計數過程。

C15用於控制顯示部分的刷新頻率,當C15為1000pF時,刷新頻率為1100Hz,由IC9、LED1-LED3、TR1-TR3組成顯示電路。

二、元件選擇

這裡採用的超聲波發射頭為T40-16,接收頭為R40-16.參數和外形如下:

ItemSpecificaTIonsCenter frequency (KHz)40Overpressure value (dB)115 <SensiTIvity (dB)-64 <Major diameter size

(mm)Diameter16.2Height12.2[rito] ? interval10.0

三、印刷電路板

四、調試

1 調整發射接收電路

把IC1從插座上拔下,並短接IC1插座的1和3腳,這時IC2的4腳應為高電平,並會持續發出高頻載波信號,頻率約為40KHz,此時可用示波器監測IC4的1腳信號。讓超聲波探頭朝向一面牆,使發出的超聲波返回而被接受器檢測到,同時用示波器檢測IC4的1腳信號,慢慢調節VR1,使IC4的1腳輸出信號最大。 斷開IC1插座的1和3腳短接線並插上IC1,此時再用示波器監視IC4的1腳信號,應能看到超聲波脈衝串。

2 調整誤檢測電路

通常該部分電路不需要調整,但如果發現測量幾米外的物體,電路始終顯示為0.40,這表明該儀器受到自身發出的檢測脈衝干擾。這時我們需檢查或稍許增多C11的容量,說明第1條線測得於IC6的第1腳,第2條線測得於IC5的3腳,第3條線測得於IC4的1腳,第4條線測得於IC6的10腳。

3 調節計數電路脈衝頻率

讓電路板垂直於牆面1m處,調節VR3在中間位置,再調節VR2使顯示1.00,但在環境溫度改變時,一般需再次調節VR2,校準測距儀。

4 關於短距離的測量

當我們將測距儀逐漸靠近被測物體,最終讀數顯示在34cm左右。因為這個電路C11取值為0.1uF,由於防誤檢測電路的保護作用,所以最小測試距離限制為34cm左右,如要進一步縮短測試距離,由前面分析可知,我們必須讓發出的測試脈衝寬度更窄,同時減小防誤檢測電路C11的容量。但由於超聲波發射器的輸出功率有限,如果縮短測試脈衝時間,意味著減小了測試脈衝的輸出功率,在測試距離增加時,會使反射回來的信號很弱,造成儀器在長距離測量時受到影響。

5 關於長距離測量

長距離測量由於各種因素的影響會困難一些。有幾點測量時我們必須注意:

1)被測目標必須垂直於超聲波測距儀。

2)被測目標表面必須平坦。

3)測量時在超聲波測距儀周圍沒有其他可反射超聲波的物體。

由於發射功率有限,測距儀無法測量10m外的物體。

關於HC04超聲波模塊測距的進一步思考(51版)

之前寫過一篇HC04的使用文章,當時是使用stm32來實現的,原文鏈接。

後來又多次使用51來驅動這個模塊,有時候有測距需要,使用了幾次,總是感覺我上次那個程序不是很好,所以這次對它進行了改進。雖然上一次也使用了多次測量取平均值,但是內有排除中間會有錯誤數據的情況。

之前的程序是這樣的(測距部分) :

  1. u32 t = 0;
  2. int i = 0;
  3. float lengthTemp = 0;
  4. float sum = 0;
  5. while(i!=5)
  6. {
  7. TRIG_Send = 1; //發送口高電平輸出
  8. Delay_Us(20);
  9. TRIG_Send = 0;
  10. while(ECHO_Reci == 0); //等待接收口高電平輸出
  11. OpenTimerForHc(); //打開定時器
  12. i = i + 1;
  13. while(ECHO_Reci == 1);
  14. CloseTimerForHc(); //關閉定時器
  15. t = GetEchoTimer(); //獲取時間,解析度為1US
  16. lengthTemp = ((float)t/58.0);//cm
  17. sum = lengthTemp + sum ;
  18. }
  19. lengthTemp = sum/5.0;
  20. return lengthTemp;

就是當超出測量範圍的時候(3.4米),數據肯定是不準確的。還有就是當因為某些原因模塊沒有接收到返回的超聲波,也會導致錯誤的數據,就算是取平均值,如果中間有一個很大的數據的話,計算的結果也是不精確的。

利用51再次使用這個模塊的程序如下:

[cpp] view plain copy

  1. /*
  2. 獲取當前距離
  3. 2018.3.5 誤差在1cm以內
  4. */
  5. float get_distence()
  6. {
  7. unsigned long int time_buf = 0; //總耗時
  8. float distence = 0; //計算一次距離
  9. float sum = 0; //多次計算的總距離
  10. uchar i = 0;
  11. while(i < NUM)
  12. {
  13. time_flag = 0; //先清除標誌
  14. sr04_start(); //開始測距
  15. while(!ECHO); //等待發出40khz脈衝,觸發信號之後,echo會變成高電平
  16. time_0_start(); //當把trig拉高10us之後,模塊即開始發出8個40khz的脈衝,與此同時,echo變為高電平時,打開定時器。
  17. while(ECHO); //等待迴響信號,收到迴響信號,echo會變低電平
  18. TR0 = 0; //關閉定時器
  19. if(time_flag != 0) //超出測量範圍
  20. continue; //不進行計算,放棄這次測量,從新測量
  21. else //time_flag = 0,沒有超出測量範圍
  22. {
  23. time_buf = (TH0 * 256) + TL0;
  24. distence = time_buf * 0.0168;//(單位:cm)雖然聲速340m/s,發現使用0.0168更精確,可能和溫度有關
  25. sum+= distence;
  26. i++;
  27. }
  28. }
  29. return (sum/NUM) ; //取NUM次平均值
  30. }

其實就是在進行計算前先判斷一下定時器是否產生中斷,如果產生中斷,就放棄本次數據,再次測量。這樣測出的數據算是很精確了,唯一的誤差就是聲速的計算上面,導致會有1-2cm的誤差。

16位的定時器,12M的晶振,定時器模式1,從0開始計數,最大到65535,一次溢出需要的時間是0.065s,聲速為340m/s。那麼溢出時的距離為22.1m,已經遠遠超過了超聲波模塊的測量範圍(0-5m),所以只要產生一次溢出,就可以認為是超出測量範圍.。

所以在定時器中斷函數中 :

[html] view plain copy

  1. void TIME0() interrupt 1
  2. {
  3. // TF0 = 0; //模式1硬體自動清零
  4. TH0 = 0;
  5. TL0 = 0;
  6. time_flag++;
  7. }

其中對一些操作進行了簡單的封裝。開始測距函數,就是按照要求拉高TRIG引腳

[cpp] view plain copy

  1. /*start*/
  2. void sr04_start()
  3. {
  4. TRIG = 1;
  5. delay_10us(5); //拉高50us
  6. TRIG = 0;
  7. }

還有就是定時器開始函數,在這個函數裡面需要把計數清零:

[cpp] view plain copy

  1. /*開啟定時器0,打開之前先清除之前的計數,不然會累計計數*/
  2. void time_0_start()
  3. {
  4. TH0 = 0; //打開前計數清零
  5. TL0 = 0;
  6. TR0 = 1; //打開定時器
  7. }

然後就是模塊的 初始化函數了,在初始化的時候其實就是對定時器的初始化,順便把TRIG和ECHO引腳置0;

[cpp] view plain copy

  1. void sr04_init()
  2. {
  3. TRIG = 0;
  4. ECHO = 0;
  5. TMOD |= 0X01; //定時器0模式設置1
  6. TH0 = 0; //從0開始計數
  7. TL0 = 0;
  8. TR0 = 0; //關閉定時器
  9. EA = 1; //開總中斷
  10. ET0 = 1; //允許定時器0中斷
  11. }

版權聲明:雖為原創,歡迎轉載。 blog.csdn.net/m0_376553

首先,先來看一下這個模塊的基本功能和原理。

HC-SR04超聲波測距模塊可提供2cm-400cm的非接觸式距離感測功能,測距精度可達高到3mm;模塊包括超聲波發射器、接收器與控制電路。像智能小車的測距以及轉向,或是一些項目中,常常會用到。智能小車測距可以及時發現前方的障礙物,使智能小車可以及時轉向,避開障礙物。

注意是5v輸入,但是我用stm32 的3.3v輸入也是沒有問題的。

二.工作原理

1.給超聲波模塊接入電源和地。

2.給脈衝觸發引腳(trig)輸入一個長為20us的高電平方波

3.輸入方波後,模塊會自動發射8個40KHz的聲波,與此同時回波引腳(echo)端的電平會由0變為1;(此時應該啟動定時器計時)

4.當超聲波返回被模塊接收到時,回波引 腳端的電平會由1變為0;(此時應該停止定時器計數),定時器記下的這個時間即為超聲波由發射到返回的總時長。

5.根據聲音在空氣中的速度為344米/秒,即可計算出所測的距離。

要學習和應用感測器,學會看懂感測器的時序圖是很關鍵的,所以我們來看一下HC-SR04的時序觸發圖。

我們來分析一下這個時序圖,先由觸發信號啟動HC-RS04測距模塊,也就是說,主機要先發送至少10us的高電平,觸發HC-RS04,模塊內部發出信號是感測器自動回應的,我們不用去管它。輸出迴響信號是我們需要關注的。信號輸出的高電平就是超聲波發出到重新返回接收所用的時間。用定時器,可以把這段時間記錄下來,算出距離,別忘了結果要除於2,因為總時間是發送和接收的時間總和。

下面是親測可用的驅動程序。

晶元型號為stm32f103zet6,超聲波測距後通過串口列印到電腦上面。

驅動和測距;

[cpp] view plain copy

  1. //超聲波測距
  2. #include "hcsr04.h"
  3. #define HCSR04_PORT GPIOB
  4. #define HCSR04_CLK RCC_APB2Periph_GPIOB
  5. #define HCSR04_TRIG GPIO_Pin_5
  6. #define HCSR04_ECHO GPIO_Pin_6
  7. #define TRIG_Send PBout(5)
  8. #define ECHO_Reci PBin(6)
  9. u16 msHcCount = 0;//ms計數
  10. void Hcsr04Init()
  11. {
  12. TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; //生成用於定時器設置的結構體
  13. GPIO_InitTypeDef GPIO_InitStructure;
  14. RCC_APB2PeriphClockCmd(HCSR04_CLK, ENABLE);
  15. //IO初始化
  16. GPIO_InitStructure.GPIO_Pin =HCSR04_TRIG; //發送電平引腳
  17. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  18. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//推挽輸出
  19. GPIO_Init(HCSR04_PORT, &GPIO_InitStructure);
  20. GPIO_ResetBits(HCSR04_PORT,HCSR04_TRIG);
  21. GPIO_InitStructure.GPIO_Pin = HCSR04_ECHO; //返回電平引腳
  22. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空輸入
  23. GPIO_Init(HCSR04_PORT, &GPIO_InitStructure);
  24. GPIO_ResetBits(HCSR04_PORT,HCSR04_ECHO);
  25. //定時器初始化 使用基本定時器TIM6
  26. RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6, ENABLE); //使能對應RCC時鐘
  27. //配置定時器基礎結構體
  28. TIM_DeInit(TIM2);
  29. TIM_TimeBaseStructure.TIM_Period = (1000-1); //設置在下一個更新事件裝入活動的自動重裝載寄存器周期的值 計數到1000為1ms
  30. TIM_TimeBaseStructure.TIM_Prescaler =(72-1); //設置用來作為TIMx時鐘頻率除數的預分頻值 1M的計數頻率 1US計數
  31. TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;//不分頻
  32. TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上計數模式
  33. TIM_TimeBaseInit(TIM6, &TIM_TimeBaseStructure); //根據TIM_TimeBaseInitStruct中指定的參數初始化TIMx的時間基數單位
  34. TIM_ClearFlag(TIM6, TIM_FLAG_Update); //清除更新中斷,免得一打開中斷立即產生中斷
  35. TIM_ITConfig(TIM6,TIM_IT_Update,ENABLE); //打開定時器更新中斷
  36. hcsr04_NVIC();
  37. TIM_Cmd(TIM6,DISABLE);
  38. }
  39. //tips:static函數的作用域僅限於定義它的源文件內,所以不需要在頭文件里聲明
  40. static void OpenTimerForHc() //打開定時器
  41. {
  42. TIM_SetCounter(TIM6,0);//清除計數
  43. msHcCount = 0;
  44. TIM_Cmd(TIM6, ENABLE); //使能TIMx外設
  45. }
  46. static void CloseTimerForHc() //關閉定時器
  47. {
  48. TIM_Cmd(TIM6, DISABLE); //使能TIMx外設
  49. }
  50. //NVIC配置
  51. void hcsr04_NVIC()
  52. {
  53. NVIC_InitTypeDef NVIC_InitStructure;
  54. NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
  55. NVIC_InitStructure.NVIC_IRQChannel = TIM6_IRQn; //選擇串口1中斷
  56. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //搶佔式中斷優先順序設置為1
  57. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //響應式中斷優先順序設置為1
  58. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能中斷
  59. NVIC_Init(&NVIC_InitStructure);
  60. }
  61. //定時器6中斷服務程序
  62. void TIM6_IRQHandler(void) //TIM3中斷
  63. {
  64. if (TIM_GetITStatus(TIM6, TIM_IT_Update) != RESET) //檢查TIM3更新中斷髮生與否
  65. {
  66. TIM_ClearITPendingBit(TIM6, TIM_IT_Update ); //清除TIMx更新中斷標誌
  67. msHcCount++;
  68. }
  69. }
  70. //獲取定時器時間
  71. u32 GetEchoTimer(void)
  72. {
  73. u32 t = 0;
  74. t = msHcCount*1000;//得到MS
  75. t += TIM_GetCounter(TIM6);//得到US
  76. TIM6->CNT = 0; //將TIM2計數寄存器的計數值清零
  77. Delay_Ms(50);
  78. return t;
  79. }
  80. //一次獲取超聲波測距數據 兩次測距之間需要相隔一段時間,隔斷迴響信號
  81. //為了消除餘震的影響,取五次數據的平均值進行加權濾波。
  82. float Hcsr04GetLength(void )
  83. {
  84. u32 t = 0;
  85. int i = 0;
  86. float lengthTemp = 0;
  87. float sum = 0;
  88. while(i!=5)
  89. {
  90. TRIG_Send = 1; //發送口高電平輸出
  91. Delay_Us(20);
  92. TRIG_Send = 0;
  93. while(ECHO_Reci == 0); //等待接收口高電平輸出
  94. OpenTimerForHc(); //打開定時器
  95. i = i + 1;
  96. while(ECHO_Reci == 1);
  97. CloseTimerForHc(); //關閉定時器
  98. t = GetEchoTimer(); //獲取時間,解析度為1US
  99. lengthTemp = ((float)t/58.0);//cm
  100. sum = lengthTemp + sum ;
  101. }
  102. lengthTemp = sum/5.0;
  103. return lengthTemp;
  104. }
  105. /*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  106. ** 函數名稱: Delay_Ms_Ms
  107. ** 功能描述: 延時1MS (可通過模擬來判斷他的準確度)
  108. ** 參數描述:time (ms) 注意time<65535
  109. :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
  110. void Delay_Ms(uint16_t time) //延時函數
  111. {
  112. uint16_t i,j;
  113. for(i=0;i<time;i++)
  114. for(j=0;j<10260;j++);
  115. }
  116. /*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  117. ** 函數名稱: Delay_Ms_Us
  118. ** 功能描述: 延時1us (可通過模擬來判斷他的準確度)
  119. ** 參數描述:time (us) 注意time<65535
  120. :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
  121. void Delay_Us(uint16_t time) //延時函數
  122. {
  123. uint16_t i,j;
  124. for(i=0;i<time;i++)
  125. for(j=0;j<9;j++);
  126. }

但是關於USART的函數我就不往上寫了,這個簡單的串口列印大家應該都會寫。下面簡單貼一下我的主函數吧。

[cpp] view plain copy

  1. /*
  2. 教訓:實驗前一定要檢查引腳連接是否正確,萬不可搞錯,不然又要燒壞晶元!!!!
  3. 2017.6.8
  4. */
  5. #include "hcsr04.h"
  6. #include "chao_usart.h"
  7. int main()
  8. {
  9. float length;
  10. GPIO_cfg();
  11. NVIC_cfg();
  12. USART_cfg();
  13. printf("串口初始化成功!
    ");
  14. Hcsr04Init();
  15. printf("超聲波初始化成功!
    ");//測試程序是否卡在下面兩句上面
  16. length = Hcsr04GetLength();
  17. printf("距離為:%.3f
    ",length);
  18. }

實驗結果:

好了,其實這個模塊很簡單,但是要是把他用的很好的話還是比較困難的,比如用超聲波做一個四軸定高的程序,還是有一定的挑戰性的。

寫這篇博客的目的不僅僅是介紹這個模塊的使用,其實這種使用介紹網上一搜一大把,我只是想紀錄一下,我在做這個模塊的時候遇到的一些其他的問題。

其中有一個小插曲,就是當吧寫好的程序燒進去之後,運行時總是出現每次返回一個同樣的比正常值小的多的數據,比如說0.034cm,這明顯是一個錯誤的數據,但是剛開始的時候,不知道為什麼

總是這樣,多次複位從新上電總是這一個數據。讓我很是苦惱。但是幸運的是,在這樣的情況中間,他又會有時出現一兩個正常的的數據,讓你有點摸不著頭腦。

上網查了一下才慢慢明白,這種現象叫做「餘震」,網上關於餘震的解釋大致有三種:

1、探頭的餘震。即使是分體式的,發射頭工作完後還會繼續震一會,這是物理效應,也就是餘震。這個餘震信號也會向外傳播。如果你的設計是發射完畢後立刻切換為接收狀態(無盲區),那麼這個餘震波會通過殼體和周圍的空氣,直接到達接收頭、干擾了檢測(註:通常的測距設計里,發射頭和接收頭的距離很近,在這麼短的距離里超聲波的檢測角度是很大的,可達180度)。

2、殼體的餘震。就像敲鐘一樣,能量仍來自發射頭。發射結束後,殼體的餘震會直接傳導到接收頭,當然這個時間很短,但已形成了干擾。另外,在不同的環境溫度下,殼體的硬度和外形會有所變化,其餘震有時長、有時短、有時干擾大、有時干擾小,這是設計工業級產品時必須要考慮的問題。

3、電路串擾。超聲波發射時的瞬間電流很大,例如某種工業級連續測距產品瞬間電流會有15A,通常的產品也能達到1A,瞬間這麼大的電流會對電源有一定影響,並干擾接收電路。通過改善電源設計可以緩解這種情況,但在低成本設計中很難根除。所以每次發射完畢,接收電路還需要一段時間穩定工作狀態。在此期間,其輸出的信號很難使用。

消除上述現象的方法之一就是在檢測的時候多次循環檢測,取平均值,也就是加權平均濾波,一個簡單的濾波處理。就是下面這一段:

[cpp] view plain copy

  1. u32 t = 0;
  2. int i = 0;
  3. float lengthTemp = 0;
  4. float sum = 0;
  5. while(i!=5)
  6. {
  7. TRIG_Send = 1; //發送口高電平輸出
  8. Delay_Us(20);
  9. TRIG_Send = 0;
  10. while(ECHO_Reci == 0); //等待接收口高電平輸出
  11. OpenTimerForHc(); //打開定時器
  12. i = i + 1;
  13. while(ECHO_Reci == 1);
  14. CloseTimerForHc(); //關閉定時器
  15. t = GetEchoTimer(); //獲取時間,解析度為1US
  16. lengthTemp = ((float)t/58.0);//cm
  17. sum = lengthTemp + sum ;
  18. lengthTemp = sum/5.0;
  19. return lengthTemp;

加了這個之後,基本上就沒有出現餘震現象了。

還有一點就是測試程序前一定要檢查引腳有沒有接錯,不管多有把握,也要看一遍,不然很容易出大事的,一個晶元也許就因為你的大意給GG了。切記,這個應該也算我們這個行業的基本素養吧。

?超聲波模塊HC-SR04簡介以及編程

1、本模塊性能穩定,測度距離精確,模塊高精度,盲區小。 產品應用領域: 機器人避障 物體測距 液位檢測 公共安防 停車場檢測 。

2、 主要技術參數:

1:使用電壓:DC---5V

2:靜態電流:小於2mA

3:電平輸出:高5V

4:電平輸出:底0V

5:感應角度:不大於15度

6:探測距離:2cm-450cm

7:高精度 可達0.2cm

實物圖

接線方式:VCC、trig(控制端)、 echo(接收端)、 GND

基本工作原理: (1)採用IO口TRIG觸發測距,給至少10us的高電平信號; (2)模塊自動發送8個40khz的方波,自動檢測是否有信號返回; (3)有信號返回,通過IO口ECHO輸出一個高電平,高電平持續的時間就是超聲波從發射到返回的時間。測試距離=(高電平時間*聲速(340M/S))/2; 本模塊使用方法簡單,一個控制口發一個10US以上的高電平,就可以在接收口等待高電平輸出.一有輸出就可以開定時器計時,當此口變為低電平時就可以讀定時器的值,此時就為此次測距的時間,方可算出距離.如此不斷的周期測,即可以達到你移動測量的值

5、 操作:初始化時將trig和echo埠都置低,首先向給 trig 發送至少10 us的高電平脈衝(模塊自動向外發送8個40K的方波),然後等待,捕捉 echo 端輸出上升沿,捕捉到上升沿的同時,打開定時器開始計時,再次等待捕捉echo的下降沿,當捕捉到下降沿,讀出計時器的時間,這就是超聲波在空氣中運行的時間,按照 測試距離=(高電平時間*聲速(340M/S))/2 就可以算出超聲波到障礙物的距離。

6、 下面是飛思卡爾XS128單片機測距的程序:

while(1)

{

PT1AD0_PT1AD00 = 1;//給超聲波模塊輸入高脈衝

PITINTE_PINTE1=1; //打開PIT1定時器

while(!(counter0>=4)); //等待20us

PITINTE_PINTE1=0;counter0 = 0;//關閉定時器,計數清零

PT1AD0_PT1AD00 = 0; //trig管腳拉低

PORTB_PB0 = 0; //指示燈0

while(!(PT1AD0_PT1AD01 == 1)); //等待echo輸出上升沿

PORTB_PB1 = 0; //指示燈1

PITINTE_PINTE0=1; //打開PIT0定時器

while(!(PT1AD0_PT1AD01 == 0)); //等待下降沿

distance = counter*17/20; //計算距離,單位CM

PITINTE_PINTE0=0; //關閉定時器

PORTB_PB2 = 0; //指示燈2

PITINTE_PINTE0=1; //打開定時器定時500ms,數碼管顯示

while(!(counter>=10000))

{

Showing(distance); //顯示距離,精確1cm

}

PITINTE_PINTE0=0;counter=0; //關閉定時器,清零

}


推薦閱讀:

TAG:自然科學 | 超聲波 | 物理學 | 單片機 | 超聲波感測器 | 雷達 |