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

2021-08-16 08:20:28 字數 1279 閱讀 6169

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

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

u32 t = 0;  

inti = 0;  

float

lengthtemp = 0;  

float

sum = 0;  

while

(i!=5)  

lengthtemp = sum/5.0;  

return

lengthtemp;  

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

利用51再次使用這個模組的程式如下:

/*

獲取當前距離

2018.3.5 誤差在1cm以內

*/float get_distence()

} return (sum/num) ; //取num次平均值

}

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

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

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

void time0() interrupt 1

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

/*start*/

void sr04_start()

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

/*開啟定時器0,開啟之前先清除之前的計數,不然會累計計數*/

void time_0_start()

然後就是模組的 初始化函式了,在初始化的時候其實就是對定時器的初始化,順便把trig和echo引腳置0;

void sr04_init()

關於HC04超聲波模組測距的思考(51版)

後來又多次使用51來驅動這個模組,有時候有測距需要,使用了幾次,總是感覺我上次那個程式不是很好,所以這次對它進行了改進。雖然上一次也使用了多次測量取平均值,但是內有排除中間會有錯誤資料的情況。之前的程式是這樣的 測距部分 u32 t 0 int i 0 float lengthtemp 0 floa...

超聲波模組的使用

c sr04超聲波測距模組可提供約2cm400厘公尺的非接觸式距離感測功能,測距精度可達高到3公釐 模組包括超聲波發射器,接收器與控制電路像智慧型小車的測距以及轉向,或是一些專案中,常常會用到。智慧型小車測距可以及時發現前方的障礙物,使智慧型小車可以及時轉向,避開障礙物。注意是5v輸入,但是我用st...

詳解超聲波測距模組HC SR04的使用

1.模組簡介 hc sr04超聲波模組常用於機械人避障 物體測距 液位檢測 公共安防 停車場檢測等場所。hc sr04超聲波模組主要是由兩個通用的壓電陶瓷超聲感測器,並加外圍訊號處理電路構成的。如圖 兩個壓電陶瓷超聲感測器,乙個用於發出超聲波訊號,乙個用於接收反射回來的超聲波訊號。由於發出訊號和接收...