本帖最后由 三斑家文 于 2021-11-29 14:01 编辑
各位前輩大家好, 有一個疑問, 想了3,4 天, 想不出來...
關於 Arduino, HC-SR04 超聲波感測器, 使用 pulseIn() 的問題, 我的基本理解是: 對 CH-SR04 的 Trig pin 發出 HIGH 10us 的指令, CH-SR04 因此會在發射端在 10us 內發出 8 個 40KHz 脈衝, 並立即執行 pulseIn(pin, HIGH), 超聲波脈衝撞到物體後反彈, CH-SR04 收到後在 Echo pin 輸出 HIGH, 一旦 HIGH 結束, pulseIn 就停止計時, pulseIn 傳回的時間經過計算就能得到距離. 我的問題在 pulseIn() 是何時開始計時? 1. 我的理解是 pulseIn(Trigpin, HIGH) 開始執行時就開始計時, HIGH 結束後停止. 2. 按 arduino.cc 的 DOCUMENTATION 查詢該函式, 寫的是 if value is HIGH, pulseIn() waits for the pin to go from LOW to HIGH, starts timing, then waits for the pin to go LOW and stops timing. 我的翻譯是... 是訊號 LOW 變 HIGH 開始計時, HIGH 結束時停止. *** 我認為是 1. 比較正確, 因該是 Tring 8 pulse 發出後, 收到 8 個 pulse 回波的時間才是正確, 但是官網與大部分書籍都是 2. 的說法. 因為我認為: 回波的 8 個 pulse 也是會在 10us 內, 測回波 8 pulse 長度怎會是正確?
前天做了一個測試,test_2, 物體放在感測器前 10cm 位置, 在 pulseIn(EchoPin, HIGH) 前加了一個 delayMicroseconds(4cm_us_time), 發現程式測距還是 10cm, 可見真的是只測回波 8 pulse 寬度, 心裡想在一個長水槽內做一個波, 回波的波長應該是不變的呀, 如果會變那大部分的星星應該都是紅色的吧~, 再想會不會 pulseIN() 測的是回波的反射再回波,於是在進行下一個測試. test_3, 連續用 3 個變數d1, d2, d3收連續 3 個 pulseIn(), 如果是測回波的回波, 那 d2 估計還有回波, 結果發現 d2, d3 都是 0 cm, 而 pulseIn() , 依翻譯 " 是訊號 LOW 變 HIGH 開始計時, HIGH 結束時停止" , 那在 8 個脈衝的第一個就結束計時了? 除非八個脈衝的輸出都是在 HIGH 的範圍的脈衝! |