連接單片機引腳:VCC(5V)、IO口、IO口、GND 步驟: (1)給脈衝觸發IO口引腳(trig)輸入一個持續時間>10us的高電平; (2)輸入方波,模塊自動發送8個40Khz的聲波; (3)同時,回波引腳(Ecoh)引腳電平由0變為1(輸出高電平),此時應該啟動定時器; (4)當超聲波返回並... ...
- 連接單片機引腳:VCC(5V)、IO口、IO口、GND
- 步驟:
(1)給脈衝觸發IO口引腳(trig)輸入一個持續時間>10us的高電平;
(2)輸入方波,模塊自動發送8個40Khz的聲波;
(3)同時,回波引腳(Ecoh)引腳電平由0變為1(輸出高電平),此時應該啟動定時器;
(4)當超聲波返回並被接收模塊(ecoh)接收到時,接收端電平由1變為0(變為低電平),此時關閉定時器;
(5)定時器的持續時間即為超聲波往返的時間;
*測公式:距離=(高電平時間*聲速)/2;
- 調試經驗
1.註意超聲波要接的是5V,不是3.3V,使用下載器時一般都是3.3V供電,這就導致線上調試沒有數據,應該給板子供上電,下載器不供電,超聲波接到5V電源口,並且檢測下是不是5V;
2.測距時不要距離太近,會導致數據不准確;
3.超聲波代碼要儘量精簡,不要繁瑣,假設你代碼過於繁瑣,因為超聲波測距時間非常短(us單位)可能這次電平已經發生變化,但是你的MCU在經行其他代碼運行,可能就檢測不到這次信號;
4.要考慮各種因素影響測距穩定,比如高電平檢測是否準確,溫度原因等,超聲波測距的性能與被測物錶面材料有很大關係,如毛料、布料對超聲波 的反射率很小,會嚴重影響測量結果;
5.io口任意兩個即可,主要是不要占用到之前本來使用的,否則會出問題,還有PIT1如果使用,就初始化PIT2進行計時,一個PIT做一種工作;
#代碼:
#include "MK60_PIT.h" #define TRIG D9 //超聲波發送端 #define ECHG E12 //超聲波接收端 gpio_init(TRIG,GPO,0); //初始化發送端 gpio_init(ECHG,GPI,0); //初始化接收端 /* * @file distance * @brief 超聲波測距 * @author ZZX * @version v1.0 * @date 2019-1-17 */ void distance(void) { gpio_set(TRIG,1); //產生觸發脈衝 pit_delay_us(pit1,20); gpio_set(TRIG,0); //產生一個20us的高電平脈衝 while(gpio_get (ECHG) == 0); //等待電平變高,低電平一直等待 pit_time_start (pit1); //開始計時 while(gpio_get(ECHG) == 1) //等待電平變低,高電平一直等待 { }; timevar = pit_time_get(pit1); //停止計時,獲取計時時間 //timevar = timevar * 340 /2/10; timevar = timevar*(331.4+0.607*10)/2000; //加上溫度補償 // DELAY_MS(60); //延時60MS,測距更精確,可以不用,2.27號:有反映說加上之後測距不精確,註釋之後就好了,自行測試 }
#外部觸發中斷:見鏈接: https://pan.baidu.com/s/17pVMz7xWrQEoVVIUXb4rGQ 提取碼: 8pe8
摘自:https://blog.csdn.net/as480133937/article/details/87899873 byZ小旋