[英]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循環
連接時,請確保遵循以下步驟
尋找您的程序,不確定計數器是否會以這種方式工作。 為了獲得更高的精度,請使用帶有捕獲模式的定時器。 在此處找到更多相關信息: PIC控制器定時器捕獲模式 。
使用計時器通過超聲波模塊計算距離,請將此與超聲波傳感器模塊HC-SR04的接口PIC控制器相關聯
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.