1. 智能小車超聲波避障問題 在if(判斷1) else(判斷2)在這個判斷中 判斷1是距離 明明沒有到那個距離 到會自動
這是因為你程序里距離變數沒改變,也就是說你上次進入if時距離變數一直保存著,所以程序自動一直進入if語句,改下程序,以前做小車也遇到過,就是只要進入設定距離,小車就一直停在那裡沒有動作,距離顯示一直定格在當前距離,這個程序你用keil調試不了,因為你的超聲波回波信號模擬不出來,那個一直停留在while(!echo)或者while(echo)裡面,所以只有實踐,調試,再實踐
2. hc-sr04超聲波測距模塊中,他默認最遠探測距離為4米,這個4米事有什麼決定的,可以通過軟體更改這個距離
HC-SR04這種模塊,用來組裝超聲波測距板,可以省去好多事,這種模塊的最遠距離應該是4.5米,我在電子樂屋上看到過用這種模塊製作的超聲波測距板,顯示有用LED的,也有用LCD1602的,最遠測量距離可達5.5米,還配有模擬。
3. 超聲波探頭如何控制測量距離
看你測量的距離的大小,然後調節吧,保證精度就行
4. 怎樣用超聲波 在固定的距離中 測到障礙物,然後避開
我分為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;
5. 用超聲波檢測車輛周圍的障礙物距離車體的距離,需要在車體後面和左右側布置多個超聲波感測器,請教下如何
可以,這個沒有問題。類似於倒車雷達。只是一個主要針對車動障礙物不動。另一個是車動障礙物也在動。估計你要布置更多的感測器,或者直接放置感測器陣列。這都不是問題,測量也不是問題。難題在於,如何分析採集到的數據。比如多個感測器數據如何分析能得到相對速度,或者計算障礙物接近速度,推算相撞時間等待。
6. 基於單片機的超聲波測距怎麼改距離
用超聲波的。 超聲波發出後,等待A時間收到回聲,要據超聲波的速度為340米每秒,從而計算出距離。
7. 怎樣改超聲波測距系統的模擬距離
測距模擬,還真有人做出來了,電子樂屋上就有相關的文章,還有實例。
8. 如何調節超聲波感測器測試距離
超聲波感測器測試距離採用超聲波回波測距原理,運用精確的時差測量技術,檢測感測器與目標物之間的距離,採用小角度,小盲區超聲波感測器,具有測量准確,無接觸,防水,防腐蝕, 低成本等優點,可應於液位,物位檢測,特有的液位,料位檢測方式,可保證在液面有泡沫或大的晃動,不易檢測到回波的情況下有穩定的輸出,應用行業:液位,物位,料位檢測,工業過程式控制制等
9. 超聲波避障小車可以不用測距壁障么就是直接壁障。壁障距離是多少呢
不行的,要避障就得首先知道障礙物有什麼地方,距離多少,才能由單片機控制進行障礙。
10. 如何提高超聲波測距距離
假如這套系統是個木桶,你閑它裝的水不夠多,實際上它的每一塊木板都短,而不是一塊兩塊。
從你描述的情況看,目前最大的瓶頸是驅動電壓和探頭。發射電壓提高到50-150Vp-p,採用開放式探頭,應該能測到5米左右。
如果要測到11米,我還不知道您希望測距的周期是多少,1秒一次?1秒10次?10秒1次?
1、如果測距的周期較長,可以進一步提高發射電壓,應達到200~800Vp-p(視探頭而定),建議用脈沖變壓器,驅動不能用74HC04了,換成開關管吧,瞬間電流估計應在1A-30A之間。周期長的好處是「不怕檢測失敗」,您可以在一個檢測周期內進行多次檢測,而最終的檢測結果,僅是你檢測成功的那一次。
2、如果測距的周期較短,一般要求每次檢測都要有較高的成功率,面對不同的環境和被測物體,測距系統對接收電路要求較高。在滿足1的前提下,還要改進接收電路,在放大1萬-100萬倍的情況下,噪音峰值電平應低於1Vp-p,20106恐怕難以勝任;
3、如果需要在室外使用,在滿足前兩條的前提下,還要採用防水型探頭,11米的檢測距離需要直徑50mm以上的超聲波探頭;
4、如果還需要全天候的高可靠運行,或者要較高靈敏度時,還要犧牲一些測距精度,把超聲波發射頻率從40KHz降低到25KHz~32KHz,以減少空氣損耗。