基於stm32最小系統的超聲波測距實現

2021-09-10 01:23:00 字數 1862 閱讀 6972

學習目標

理解超聲波的原理

實現基本測距

通過串列埠在電腦上列印實際距離

通過串列埠設定閾值,當距離太近,報警裝置報警

超聲波測距原理

hc-sr04 超聲波測距模組可提供 2cm-400cm 的非接觸式距離感測功能,測距精度可達高到 3mm;模組包括超聲波發射器、接收器與控制電路。基本原理如下:

(1)採用io口trig觸發測距,給至少10us的高電平訊號;

(2)模組自動傳送8個40khz的方波,自動檢測是否有訊號返回;

(3)有訊號返回,通過io口echo輸出乙個高電平,高電平持續的時間就是超聲波從發射到返回的時間。測試距離=(高電平時間*聲速(340m/s))/2;

操作:初始化時將trig和echo埠都置低,首先向給 trig傳送至少10 us的高電平脈衝(模組自動向外傳送8個40k的方波),然後等待,捕捉 echo 端輸出上公升沿,捕捉到上公升沿的同時,開啟定時器開始計時,再次等待捕捉echo的下降沿,當捕捉到下降沿,讀出計時器的時間,這就是超聲波在空氣中執行的時間(或採用輸入捕獲得出高電平時間),按照 測試距離=(高電平時間*聲速(340m/s))/2 就可以算出超聲波到障礙物的距離。

定時器

通過定時器向上計數到24ms(因為超聲波模組的測距範圍為2cm-400cm,通過400cm計算出時間大約為23.5ms,而對於距離過小時,個人覺得是由於本來就測不到2cm故而模組會一直發出而沒有返回值直到溢位),向上溢位時進入到定時器中斷服務函式,蜂鳴器報警。

串列埠通訊

初始化之後,在主函式裡,直接通過「printf」就可以將測得的資料傳送到串列埠。

初始化部分

void csb_init(void)

void tim3_int_init(u16 arr,u16 psc)

void timeopen()

void timeclose()

void tim3_irqhandler(void) //定時器中斷服務函式

tim_clearitpendingbit(tim3,tim_it_update); //清除中斷標誌位

}

主函式部分

u8 i=0;

u16 s=0;

u16 t=0;

u16 finals=0;

u16 alls=0;

int main()

finals=alls/5;//求出平均距離

printf("\r\n距離為:(單位cm)\r\n");

printf("%d\r\n",finals);

}}

總結1.在初始化埠啊什麼的要仔細。

2.超聲波模組在使用之前要先檢查一下。

3.注意計算時的單位換算問題…

4.在測試時不能在在定時器開啟前後用串列埠列印來驗證是否檢測到的問題,會消耗時間導致時間不準確。

while(gpio_readinputdatabit(gpiof,gpio_pin_1)==0);

//printf("烏拉1:\r\n");

timeopen();

// printf("烏拉2:\r\n");

while(gpio_readinputdatabit(gpiof,gpio_pin_1)==1);

timeclose();

基於51最小系統的超聲波測距

超聲波是一種 頻率高於20000 赫茲的聲波,它的方向性好,穿透能力強,易於獲得較集中的 聲能,在水中傳播距離遠,可用於測距 測速 清洗 焊接 碎石 殺菌消毒等。在醫學 軍事 工業 農業上有很多的應用。超聲波因其 頻率下限大於人的聽覺上限而得名。此次實驗室布置的任務為基於51最小系統 的微控制器測距...

stm32驅動超聲波模組

define hcsr04 port gpiob define hcsr04 clk rcc apb2periph gpiob define hcsr04 trig gpio pin 8 define hcsr04 echo gpio pin 9 define trig send n dowhile...

stm32驅動超聲波模組

下面是關於stm32驅動超聲波模組的一段 有需要的朋友可以複製參考,希望對大家能夠有所幫助和啟發。define hcsr04 port gpiob define hcsr04 clk rcc apb2periph gpiob define hcsr04 trig gpio pin 8 define ...