簡體   English   中英

閱讀超聲波HC-SR04

[英]read from Ultrasonic HC-SR04

我想在一個PIC16F877A上運行兩個HC-SR04,並將由兩個超聲波測量的值發送到串行端口。

這是我使用PIC C編譯器的代碼:

 #use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8) #define e1 PIN_B6 #define t1 pin_B7 #define e2 pin_B4 #define t2 pin_B5 int a; int distanse(int,int); void main() { while(1){ int u1,u2; u1=distanse(e1,t1);u2=distanse(e2,t2); printf("%3u", u1); printf("%3u", u2); delay_ms(1000); } } int distanse(int e,int t){ long long counter=0; output_bit(t,1);delay_us(10);output_bit(t,0); a=input(e); while(a==0){a=input(e);} while(a==1){counter=counter+1;a=input(e);} return counter/3.333333; } 

但是計算機收到了隨機值! 問題是什么 ?

根據設備文檔,

“您只需向觸發輸入提供一個短的10uS脈沖即可開始測距,然后,模塊將以40 kHz的頻率發出8個周期的超聲波脈沖並提高其回波。回波是一個距離目標,即脈沖寬度和范圍成比例。 您可以通過發送觸發信號和接收回波信號之間的時間間隔來計算范圍 :公式:uS / 58 =厘米或uS / 148 =英寸;或者:范圍=高電平時間*速度(340M / S)/ 2; 我們建議使用60ms以上的測量周期,以防止觸發信號對回波信號

測量的不是信號保持高電平的時間,而是“啟動”脈沖結束和輸入信號的開始之間的時間為高電平。

因此,代碼正在測量錯誤的時間間隔。

應該測量的是“低”間隔,而不是“高”間隔。

該文檔位於: http : //www.micropik.com/PDF/HCSR04.pdf

值得注意的是,由於您同時運行兩個設備,因此根據文檔,(任何設備)兩次測量之間的時間需要超過60毫秒。

我沒有看到觸發不同設備之間所需的時間間隔。

我建議使用delay_us()函數進行時間間隔測量,而不是自由運行的while循環

連接時,請確保遵循以下步驟

  1. PIC微控制器需要向HC-SR04觸發引腳發送至少10 us觸發脈沖。
  2. 收到觸發脈沖后,HC-SR04自動發送八個40 kHz聲波,並等待Echo引腳上的上升沿輸出。
  3. 當在連接到PIC輸入的Echo引腳上發生上升沿捕獲時,啟動PIC18F4550的Timer,然后再次等待Echo引腳上的下降沿。
  4. 在Echo引腳上捕獲到下降沿后,微控制器立即讀取定時器的計數。 該時間計數用於計算到物體的距離。

尋找您的程序,不確定計數器是否會以這種方式工作。 為了獲得更高的精度,請使用帶有捕獲模式的定時器。 在此處找到更多相關信息: PIC控制器定時器捕獲模式

使用計時器通過超聲波模塊計算距離,請將此與超聲波傳感器模塊HC-SR04的接口PIC控制器相關聯

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM