亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

蟲蟲首頁| 資源下載| 資源專輯| 精品軟件
登錄| 注冊

您現在的位置是:首頁 > 技術閱讀 >  HC-SR04超聲波測距原理及實現

HC-SR04超聲波測距原理及實現

時間:2024-02-08

HC-SR04超聲波測距模塊可提供2cm-400cm的非接觸式距離感測功能,測距精度可達3mm;

模塊包括超聲波發射器、接收器與控制電路。

在智能小車的測距、避障,盲人拐杖,視力保護器(坐姿矯正),倒車雷達等應用中時常使用。

工作原理

HC-SR04基本工作原理:

  1. 使用單片機的一個引腳發送一個至少10us高電平的TTL脈沖信號到模塊的Trig引腳,用于觸發模塊工作。

  2. 模塊檢測到觸發信號之后,會自動發送8個40khz的方波,然后自動切換至監測模式,監測是否有信號返回(超聲波信號遇障礙物會返回)。

  3. 如果有信號返回,通過模塊的Echo引腳會輸出一個高電平, 高電平持續的時間就是超聲波從發射到返回的時間。

  4. 因為聲音在空氣中的速度為340米/秒,即可計算出所測的距離。

代碼實現

通過上面的分析,我們知道,獲得超聲波模塊測得的距離的難點就是求得Echo引腳輸出脈沖的高電平持續時間。

實現步驟:

  1. 初始化Trig引腳PA2為輸出模式,Echo引腳PA3為浮空輸入模式;
    初始化TIM4為1ms的定時器,msHcCount變量用于記錄定時器中斷次數。
//文件"sr04.h"中添加定義extern u32 msHcCount;
//超聲波硬件接口定義#define HCSR04_PORT GPIOA#define HCSR04_CLK RCC_APB2Periph_GPIOA#define HCSR04_TRIG GPIO_Pin_2#define HCSR04_ECHO GPIO_Pin_3
#define TRIG_Send PAout(2)#define ECHO_Reci GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_3)
//文件"sr04.c"中void Hcsr04Init(){ TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(HCSR04_CLK, ENABLE); GPIO_InitStructure.GPIO_Pin =HCSR04_TRIG; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(HCSR04_PORT, &GPIO_InitStructure); GPIO_ResetBits(HCSR04_PORT,HCSR04_TRIG); GPIO_InitStructure.GPIO_Pin = HCSR04_ECHO; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(HCSR04_PORT, &GPIO_InitStructure); GPIO_ResetBits(HCSR04_PORT,HCSR04_ECHO); RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE); TIM_DeInit(TIM4); TIM_TimeBaseStructure.TIM_Period = (1000-1); TIM_TimeBaseStructure.TIM_Prescaler =(72-1); TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure); TIM_ClearFlag(TIM4, TIM_FLAG_Update); TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE); Hcsr04_NVIC(); TIM_Cmd(TIM4,DISABLE); }


  1. 測量距離,下面代碼實現的是五次測量取平均值作為最終的結果。
    單次距離測量的方法采用了兩種實現方式:定時器方式和延時函數的方式。

  • 定時器方式,通過定時器4計數器值計算距離

當ECHO_Reci引腳的輸入電平由低變高時:即while(ECHO_Reci == 0); 循環為假時開始計時:OpenTimerForHc();

當ECHO_Reci引腳的輸入電平由高變低時,即while(ECHO_Reci == 1); 循環為假時結束計時:CloseTimerForHc();

計時結束,調用GetEchoTimer(void)函數計算總耗時,單位us。

u32 GetEchoTimer(void){   u32 t = 0;   t = msHcCount*1000;   t += TIM_GetCounter(TIM4);   TIM4->CNT = 0;     delay_ms(50);   return t;}

通過定時器4計數器值計算距離的具體實現代碼如下所示:

float Hcsr04GetLength(void ){   u32 t = 0;   int i = 0;   float lengthTemp = 0;   float sum = 0;   while(i<5)   {      TRIG_Send = 1;            delay_us(20);      TRIG_Send = 0;      while(ECHO_Reci == 0);            OpenTimerForHc();              i = i + 1;      while(ECHO_Reci == 1);      CloseTimerForHc();              t = GetEchoTimer();                 lengthTemp = ((float)t/58.0);           sum = lengthTemp + sum ;            }       lengthTemp = sum/5.0;    return lengthTemp;}
  • 延時函數方式計算距離

也是取五次測量值的平均值作為結果,在計算Echo引腳輸出高電平時間的時候,只要while(ECHO_Reci)為真,計時即+10us,直至高電平結束,即可獲得高電平持續的總時間。

測試結果部分可以看出此方法誤差較大,大家可以想想,問題出在哪里?

void HCSR04_Ranging(float *p){  u8 i=0;  u32 j=0;  float HCSR04_Temp = 0.0;    for(i=0;i<5;i++)  {    TRIG_Send=1;    delay_us(40);    TRIG_Send=0;    while(!ECHO_Reci);    while(ECHO_Reci)    {      delay_us(10);      j++;    }    HCSR04_Temp+=j*10;  //模塊最大可測距4m     j=0;    delay_ms(60);//防止發射信號對回響信號的影響  }
*p= HCSR04_Temp/5/58.0; }

注意:文中多次使用類似while循環:while(ECHO_Reci),其實這樣做容易讓單片機陷入死循環,各位可以試著想想有沒有好的方式避免。

距離換算

查看手冊,我們會看到,手冊上說:

測量距離(cm) = 高電平持續的us數 / 58

為什么us值/58即是以cm為單位的距離值呢?

正常的換算公式為:

測試距離 = (高電平時間*聲速(340m/s))/2

除以2的原因是,超聲波的信號是往返的耗時等于高電平時間,我們求距離,需要除以2。

上面的測量距離單位為m,高電平時間為s, 如果我們把測量距離的單位換為cm,高電平時間改為us, 則上面的公式就修改為:

測量距離cm = (高電平時間us/1000000) * 340 / 2 * 100

即測量距離cm = 高電平時間us * 17 / 1000;

即測量距離cm = 高電平時間us / (1000/17);而1000/17 ≈ 58.82

所以一般為了方便計算,距離換算就是將求得的高電平時間除以58,即得距離值,單位cm。

硬件連接


目前HC-SR04這個模塊有很多版本,最好選用3.3V和5V兼容的版本。


我也拿了一個5V的老版本做了一下測試,使用3.3V供電,測量的數據不對,什么也不改變的情況下,將電源引腳供電改為5V供電,返回的數據就正常了。

如果使用5V老版本的HC-SR04模塊,為了使系統能夠穩定,最好選用5V耐受的IO引腳,諸如帶有下面FT標識的引腳。


實際效果圖

下面硬件使用的STM32核心板為我們“2020.06每月一練的核心板,需要資料的可以后臺回復“每月一練”獲取。

測試結果

分別將HC-SR04放置于障礙物前30cm、20cm、10cm處各測量兩次,具體數據如下所示:

通過上面我們可以看出,定時器的方式的準確度明顯高于延時函數的實現方式,自己分析一下,為什么延時函數的方式誤差會差這么多呢?

當然這里面的誤差還包括我擺放的原因導致的誤差。

資料獲取

微信公眾號后臺回復“SR04”,可以下載超聲波測距原理及實現網文對應的工程源碼。

主站蜘蛛池模板: 西丰县| 林芝县| 平邑县| 津南区| 晋江市| 肥城市| 晋江市| 鹤庆县| 玛曲县| 牡丹江市| 西华县| 吴桥县| 涟水县| 彰武县| 淳化县| 临夏县| 团风县| 沾益县| 赤水市| 沈丘县| 永顺县| 西平县| 安乡县| 郴州市| 黔西| 松阳县| 九龙县| 临武县| 遵义市| 六枝特区| 云南省| 井研县| 奉节县| 壶关县| 喀什市| 诏安县| 鹤庆县| 和静县| 图们市| 资阳市| 车致|