久久久国产精品视频袁燕,99re久久精品国产,亚洲欧美日韩国产综合v,天天躁夜夜躁狠狠久久,激情五月婷婷激情五月婷婷

HC-SR04超聲波測距原理及實現(xiàn)

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

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

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

工作原理

HC-SR04基本工作原理:

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

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

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

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

代碼實現(xiàn)

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

實現(xiàn)步驟:

  1. 初始化Trig引腳PA2為輸出模式,Echo引腳PA3為浮空輸入模式;初始化TIM4為1ms的定時器,msHcCount變量用于記錄定時器中斷次數(shù)。
//文件"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);     
}

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

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

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

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

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

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

通過定時器4計數(shù)器值計算距離的具體實現(xiàn)代碼如下所示:

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;
}
  • 延時函數(shù)方式計算距離

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

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

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);//防止發(fā)射信號對回響信號的影響
  }

  *p= HCSR04_Temp/5/58.0;     
}

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

距離換算

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

測量距離(cm) = 高電平持續(xù)的us數(shù) / 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供電,測量的數(shù)據(jù)不對,什么也不改變的情況下,將電源引腳供電改為5V供電,返回的數(shù)據(jù)就正常了。

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

實際效果圖

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

測試結果

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

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

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

聲明:本內容為作者獨立觀點,不代表電子星球立場。未經(jīng)允許不得轉載。授權事宜與稿件投訴,請聯(lián)系:editor@netbroad.com
覺得內容不錯的朋友,別忘了一鍵三連哦!
贊 2
收藏 3
關注 69
成為作者 賺取收益
全部留言
0/200
成為第一個和作者交流的人吧