❶ 老師,關於多超聲波測距,有什麼樣的方法才能同時測得數據。如果採用循環來測距應該怎麼做
對於多超聲波測距來說,如果你要同時做,你就得讓這些超聲波的頻率互相間隔開,否則互相會產生干擾。
如果你覺得這種間隔不容易做到,也可以採用循環掃描法來做,也就是先確定比如4個點,每個點上都有一套超聲波測距裝置(一個發射探頭,一個接收探頭),按一定的規律循環掃描。比如先啟動1號探頭,發射,接收,測量好數據後。啟動第2個,發射,接收,測量好數據。然後第3,第4個。全部測量完成後,把數據集中,按照中學幾何(平面幾何或者立體幾何,具體跟你的探測點放置有關系,物體的位置就相當於以你的探測頭為圓心,以探測出的距離為半徑的一個圓弧上,由於目標只有一個,因此理論上,4個點測出的圓弧最終會相交於1點,也就是物體位置,利用平面或者立體坐標,以及圓的數學函數方程,可以輕易算出來),算出坐標。然後再啟動一次循環,第二次測量出坐標。多測幾次後,把坐標(可能是平面,也可能是立體坐標)進行統計測算(比如求平均值),就可以求出比較准確的物體的坐標了。
從現在的情況看,你要做這么幾步:
1、首先確保你會使用一個超聲波探頭測量距離。
2、你要溫習一下中學幾何的知識。
3、我建議你不要玩模塊,這種東西雖然看似比較簡單,其實你真正能學會的東西不多。而且如果它的軟硬體設計有缺陷(比如你現在遇到的問題),你查也沒法查出來。
❷ 超聲波測距模塊使用
一、超聲波測距模塊的類型
四、超聲波測距的應用
超聲波測距,可應用於汽車倒車、建築施工工地以及一些工業現場的位置監控,也可用於如液位、井深、管道長度的測量等場合。
測量時與被測物體無直接接觸,能夠清晰穩定地顯示測量結果。
❸ 超聲波感測器如何測距
超聲波感測器測距工作原理:超聲波感測器是將超聲波信號轉換成其他能量信號(通常是電信號)的感測器。超聲波是指頻率大於20 kHz的在彈性介質中產生的機械震盪波,其具有指向性強、能量消耗緩慢、傳播距離相對較遠等特點,因此常被用於非接觸測距。由於超聲波對液體、固體的穿透本領很大,尤其是在陽光不透明的固體中。超聲波碰到雜質或分界面會產生顯著反射形成反射成回波,碰到活動物體能產生多普勒效應。,因此超聲波測距對環境有較好的適應能力,此外超聲波測量在實時、精度、價格也能得到很好的折中。
目前超聲波測距的方法有多種:如往返時間檢測法、相位檢測法、聲波幅值檢測法。其原理是超聲波感測器發射一定頻率的超聲波,藉助空氣媒質傳播,到達測量目標或障礙物後反射回來,經反射後由超聲波接收器接收脈沖,其所經歷的時間即往返時間,往返時間與超聲波傳播的路程的遠近有關。
❹ 超聲波模塊的原理應該怎麼理解
超聲波測距原理是通過超聲波發射器向某一方向發射超聲波,在發射時刻的同時開始計時
超聲波在空氣中傳播時碰到障礙物就立即返回來,超聲波接收器收到反射波就立即停止計時。
超聲波在空氣中的傳播速度為v ,而根據計時器記錄的測出發射和接收回波的時間差△t ,就可以計算出發射點距障礙物的距離S
❺ 怎樣用超聲波 在固定的距離中 測到障礙物,然後避開
我分為2個.c文件和2個.h文件,3輔1主
1.文件名:chaoshengbo.c
// 注 :需要用杜邦線把 超聲波模塊的 VCC----VCC TRIG---P1.0 ECHO---P1.1 GND----GND 相連
/**********************************包含頭文件**********************************/
#include <reg52.h>
/************************************宏定義************************************/
#define VELOCITY_30C 3495 //30攝氏度時的聲速,聲速V= 331.5 + 0.6*溫度;
#define VELOCITY_23C 3453 //23攝氏度時的聲速,聲速V= 331.5 + 0.6*溫度;
#define uchar unsigned char
#define uint unsigned int
/************************************位定義************************************/
sbit INPUT = P3^2; //RX P3^2是外部中斷口,用來計算時間用的
sbit OUTPUT = P1^7; //TX output可以在P0、P1、P2的24個口
//sbit INPUT = P2^1; //回聲接收埠
//sbit OUTPUT = P2^0; //超聲觸發埠
/********************************定義變數和數組********************************/
long int distance=0; //距離變數
uchar count;
/******************************************************************************/
/* 函數名稱 : Init_MCU */
/* 函數描述 : 初始化單片機函數 */
/* 輸入參數 : 無 */
/* 參數描述 : 無 */
/* 返回值 : 無 */
/******************************************************************************/
void Init_MCU(void)
{
TMOD = 0x01; //定時器2初始化,設置為16位自動重裝模式
TL0 = 0x66;
TH0 = 0xfc; //1ms
ET0 = 1; //開定時器2
EA = 1; //總中斷使能
}
/******************************************************************************/
/* 函數名稱 : Init_Parameter */
/* 函數描述 : 初始化參數和IO口函數 */
/* 輸入參數 : 無 */
/* 參數描述 : 無 */
/* 返回值 : 無 */
/******************************************************************************/
void Init_Parameter(void)
{
OUTPUT =1;
INPUT = 1;
count = 0;
distance = 0;
}
/******************************************************************************/
/* 函數名稱 : Trig_SuperSonic */
/* 函數描述 : 發出聲波函數 */
/* 輸入參數 : 無 */
/* 參數描述 : 無 */
/* 返回值 : 無 */
/******************************************************************************/
void Trig_SuperSonic(void)//出發聲波
{
OUTPUT = 1;
delayms(1);
OUTPUT = 0;
}
/******************************************************************************/
/* 函數名稱 : Measure_Distance */
/* 函數描述 : 計算距離函數 */
/* 輸入參數 : 無 */
/* 參數描述 : 無 */
/* 返回值 : 無 */
/******************************************************************************/
void Measure_Distance(void)
{
uchar l;
uint h,y;
TR0 = 1;
while(INPUT)
{
;
}
TR0 = 0;
l = TL0;
h = TH0;
y = (h << 8) + l;
y = y - 0xfc66;//us部分
distance = y + 1000 * count;//計算總時間
TL0 = 0x66;
TH0 = 0xfc;
delayms(30);
distance = VELOCITY_30C * distance / 20000;//4位數:xxxx毫米
}
/******************************************************************************/
/* 函數名稱 : main */
/* 函數描述 : 主函數 */
/* 輸入參數 : 無 */
/* 參數描述 : 無 */
/* 返回值 : 無 */
/******************************************************************************/
long int Ceju(void)
{
while(1)
{
Init_Parameter(); // 參數重新初始化
Trig_SuperSonic(); //觸發超聲波發射
while(INPUT == 0) //等待回聲
{
;
}
Measure_Distance(); //計算脈寬並轉換為距離
if(distance != 0)
return distance;
}
}
/******************************************************************************/
/* 函數名稱 : timer0 */
/* 函數描述 : T0中斷處理函數 */
/* 輸入參數 : 無 */
/* 參數描述 : 無 */
/* 返回值 : 無 */
/******************************************************************************/
void timer0 (void) interrupt 1
{
TF0 = 0;
TL0 = 0x66;
TH0 = 0xfc;
count++;
if(count == 18)//超聲波回聲脈寬最多18ms
{
TR0 =0;
TL0 = 0x66;
TH0 = 0xfc;
count = 0;
}
}
/******************************************************************************/
2.文件名:delay.h
#ifndef __DELAY_H_
#define __DELAY_H_
/**********************************
包含頭文件
**********************************/
//#include<reg51.h>
#define FOSC 11059200L //晶振設置,默認使用11.0592M Hz
/**********************************
定義延時函數
**********************************/
/*延時函數1,用於PWM高電平的時長,即用於定位*/
void delay10us(unsigned char us) //us增量為0.01193ms,范圍為:43~208
{
unsigned char a, b;
for(b=us;b>0;b--)
for(a=1;a>0;a--);
}
/*延時函數2,用於PWM低電平的時長*/
void delay17ms489us(void) //誤差 -0.935763888893us
{
unsigned char a,b,c;
for(c=14;c>0;c--)
for(b=164;b>0;b--)
for(a=2;a>0;a--);
}
/*延時函數3,用於ms級的延時*/
void delayms(unsigned int ms)
{
unsigned int i,j;
for(i=0;i<ms;i++)
#if FOSC == 11059200L
for(j=0;j<114;j++);
#elif FOSC == 12000000L
for(j=0;j<123;j++);
#elif FOSC == 24000000L
for(j=0;j<249;j++);
#else
for(j=0;j<114;j++);
#endif
}
#endif
3.文件名:IOdefine.h
#ifndef __IODEFINE_H_
#define __IODEFINE_H_
/**********************************
包含頭文件
**********************************/
//#include<reg51.h>
/**********************************
定義IO口
**********************************/
/*反饋信號燈串口,用於檢測故障*/
sbit Return_LED = P0^3;
sbit Left_LED = P0^0;
sbit Right_LED = P0^1;
sbit Front_LED = P0^2;
//sbit Left_Front_LED = P0^3;
//sbit Right_Front_LED = P0^4;
//sbit Slow_LED = P0^5;
//sbit Fast_LED = P0^6;
sbit Power_LED = P0^7;
/*紅外感應器串口*/
sbit Left_IR = P1^1;
sbit Right_IR = P1^2;
sbit Front_IR = P1^3;
//sbit Left_Front_IR = P1^3;
//sbit Right_Front_IR = P1^4;
/*舵機MG90s串口*/
sbit Duoji = P1^5;
#endif
4.文件名:main.c
#include <reg52.h>
#include <IOdefine.h>
#include <Delay.h>
#include "Chaoshengbo.c"
/*位置數值宏定義*/
#define Limit_Left 34 //左極限
#define Limit_Right 199 //右極限
#define Half_Left 79 //左45度
#define Half_Right 159 //右45度
#define Mid 119 //中位
void Run(unsigned char time)
{
unsigned char i = 5;
Duoji = 0;
while(i--)
{
Duoji = 1;
delay10us(time);
Duoji = 0;
delay10us(199-time);
delay17ms489us();
}
}
void main(void)
{
long int S = 0;//距離
unsigned char i = Mid;
Init_MCU(); //超聲波模塊初始化
Run(i);
while(1)
{
S = Ceju();//超聲波測到的距離
/*可修改代碼段 *///用上之前設定的工具,按照邏輯
if(Left_IR == 0) //左障
{
// delayms(5);
if(Left_IR == 0)
{
while(1)
{
if(S > 320)
{
Run(Half_Right);
}
// if(i > Half_Right)
// i = Half_Right;
if(Left_IR == 1)
break;
}
}
}
else if(Right_IR == 0) //右障
{
// delayms(5);
if(Right_IR == 0)
{
while(1)
{
if(S > 320)
{
Run(Half_Left);
}
// if(i < Half_Left)
// i = Half_Left;
❻ 超聲波測距儀是怎麼定時的
利用單片機定時器的TMOD中的Gate,和外部中斷一起使用。
❼ 怎樣用超聲波感測器來檢測前方一定距離內有無障礙,求高手指教!!!
嚴格的說「前方一定距離有無障礙」太籠統。
什麼是前方障礙,從大范圍來說,一個釘子、一個坑,一根橫著的繩子,它們都是障礙,但這些超聲波的識別率很低。實際上微波、視頻也很難勝任,激光就更不用提了。
所以,我不得不明確一下,如果前方有一面牆,超聲波是能檢測到的,如果是一根電線或者水坑什麼的,超聲波是無法識別的。在這一點能接受的情況下,我們才可以繼續把這個想法深入下去:
用超聲波來判斷前方障礙,用一個測距模塊就可以了,MCU反復讀取前方測距的數值,如果連續幾次測距,返回的距離信息都在『障礙』定義的距離范圍之內,就判斷為前方有障礙,程序則控制轉向或停車,或者報警。
❽ 超聲波測距模塊
對於第一個問題:
超聲波測距,通常在10米以內,但也有個別廠家做到幾十米甚至百米的。超聲波測距有以下幾個特點:1、頻率越高,精度也越高,但檢測距離越近(空氣衰減增大);2、輸出功率越高、靈敏度越高,檢測距離也越遠(雖然是廢話,但我必須寫上);3、通常檢測角度小的,測距范圍略遠;4、以上因素所造成的影響加起來,可能沒有被測物體帶來的影響更大:例如一個剛性表面(例如鋼板)和一根鐵絲、或者在鋼板表面鋪滿吸音綿、或者把鋼板與探頭法線夾角從垂直改為傾斜45度等等,這些因素所帶來的影響最大的。這也許不太容易理解,如果把超聲波比作可見光,那麼剛性表面可以理解成鏡子,要想讓你發現距離很遠的人,對方用鏡子『晃』你是最好不過的了。但如果把鏡子罩上黑紙,或者把鏡子傾斜45度所帶來的影響,你我可想而知,超聲波也一樣。
第二個問題:
一個單片機上同時使用幾個不同頻率的超聲波模塊,這就是軟體程序的問題,沒有什麼難度,大學生就可以做,我想你一定也沒問題。關於測距模塊,從20KHz~400KHz,測距范圍從0.1m~30m這些都不難購到,技術也不是很難。問題是,你能找到這么多頻率的探頭么?雖然超聲波探頭的各種頻率都有,但它是針對量程來劃分的,同一個量程里,頻率都很接近(例如3-10米測距基本都是40KHz)。你要在同一個量程里找出4種不同頻率來,恐怕是有難度的。當然你也可以用4種不同的頻率來驅動同一種探頭。可是,若4個頻率中的某個頻率與探頭的中心頻率差別大了(例如超過5%),會導致效率大幅減低,如果頻率差別小了,識別、區分他們又有困難,例如對於一個40KHz的探頭,一般廠家規定的下限和上限也就是38KHz~42KHz,我們就算冒險用到37KHz~43KHz(從可靠性和穩定性考慮,我不贊成這么用),你需要區分37KHz、39KHz、41KHz、43KHz四種頻率的反饋信號,如此以來,常規的測距電路是不能用了,你需要研究一種全新的測距方案來識別他們,而且不能影響正常的計時精度,我建議你參考一些微波雷達的技術。