Công việc của PulseIn là gì?


9

Tôi có mã cho một cảm biến siêu âm mà tôi tìm thấy từ một trang web. Đây là mã:

#define trigPin 12
#define echoPin 13

void setup() {
  Serial.begin (9600);
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
}

void loop() {
  int duration, distance;
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(1000);
  digitalWrite(trigPin, LOW);
  duration = pulseIn(echoPin, HIGH);
  distance = (duration/2) / 29.1;
  if (distance >= 200 || distance <= 0){
    Serial.println("Out of range");
  }
  else {
    Serial.print(distance);
    Serial.println(" cm");
  }
  delay(500);
}

Tuy nhiên, tôi không hiểu công việc của pulseIn()chức năng. Ý tôi là, tôi muốn biết khi nào thời gian bắt đầu và khi nào nó kết thúc. Ví dụ, trong mã này, thời gian bắt đầu tại digitalWrite(trigPin, HIGH);hoặc thời gian bắt đầu tại pulseIn()hàm?

Nếu đó là lần thứ hai, khi nó dừng lại, thì thời gian cho chúng ta khoảng cách của một chướng ngại vật như thế nào khi tôi đã trì hoãn 1000 micro giây sau khi tôi gửi ping trong không khí?


Độ trễ 100us cho pin kích hoạt có vẻ hơi dài đối với tôi. Nó phụ thuộc vào nhãn hiệu cảm biến của bạn, nhưng giá trị điển hình (tôi sử dụng nó với HC-SR04) là khoảng 10us .
jfpoilpret

Làm thế nào tôi có thể làm mã này trong lắp ráp languaje ???? Xin vui lòng giúp đỡ.


1
How can i do this code in assembly languaje- điều đó có liên quan gì đến câu hỏi này?
Nick Gammon

Câu trả lời:


8

Từ các tài liệu:

Đọc một xung (CAO hoặc THẤP) trên pin. Ví dụ: nếu giá trị là CAO, pulseIn()đợi cho pin đi CAO, bắt đầu thời gian, sau đó đợi pin ở mức THẤP và dừng thời gian. Trả về độ dài của xung tính bằng micrô giây. xung

Vì vậy, trong trường hợp này, pulseIn(echoPin, HIGH)bắt đầu đếm số micro giây cho đến khi echoPinCAO và lưu trữ trong đó duration.

Nó bắt đầu và kết thúc trên dòng đó, đó là chức năng chặn. Nó sẽ thực sự ngồi đó cho đến khi lên echoPincao và cho bạn biết mất bao lâu (trừ khi bạn chỉ định thời gian chờ).

Điều đó cũng có nghĩa là bất kỳ sự chậm trễ nào bạn có trước hoặc sau pulseIncuộc gọi sẽ không ảnh hưởng đến nó theo bất kỳ cách nào.

Cách bạn có được khoảng cách từ thời điểm này là theo phương trình sau:

distance = (duration/2) / 29.1;

Bạn chia cho hai vì nó đi ra ngoài và quay lại nên thời gian sẽ gấp đôi so với du lịch một chiều. 29.1 là tốc độ âm thanh (là 343,5 m / s => 1 / 0,03435 = 29,1). Vì vậy, lưu ý kết quả là bằng CM, không phải inch. Bạn có thể có thể tìm ra nó bằng cách nhìn vào bảng dữ liệu của cảm biến hoặc chỉ lấy rất nhiều mẫu liên quan đến khoảng cách (bạn sẽ đo khoảng cách bằng tay) và có được một phương trình rất giống nhau.


1
Tôi đã bị nghiền nát! Trên thực tế, 29.1 là tốc độ của âm thanh. Ngoài ra, chỉ cần bổ sung nhanh: IIRC lý do có một xung để đọc là mô-đun siêu âm tạo ra tín hiệu CAO cho đến khi âm thanh quay trở lại mô-đun.
Chim cánh cụt vô danh

1
Tôi không hiểu đoạn thứ tư. Bởi vì nếu tôi gửi một xung âm thanh trong không khí và đợi 2 giây thì nó sẽ di chuyển rất xa. Vì vậy, khi tôi bắt đầu đếm tôi sẽ trễ 2 giây. Vậy tại sao không có vấn đề gì nếu tôi trì hoãn trước khi bắt đầu? @ sachleen. Và cảm ơn Annonomus Penguin và sachlee
shajib0o

@ shajib0o "PulseIn () đợi pin ở mức CAO, bắt đầu thời gian, sau đó đợi pin ở mức THẤP và dừng thời gian."
sachleen

3
@ shajib0o Theo như tôi có thể nói, đó là cảm biến siêu âm làm cho pin trở nên CAO khi tín hiệu được gửi và sau đó THẤP khi tín hiệu trở lại.
Chim cánh cụt vô danh

1
Thật ra, điều này là sai. pulseIn(echoPin, HIGH)đo thời gian cho đến khi chân ECHO xuống THẤP.
Dmitry Grigoryev

2

Quả thực sẽ là một vấn đề nếu bạn bắt đầu đo độ dài xung 1000 micro giây sau khi nó bắt đầu. Tuy nhiên, đây không phải là cách cảm biến HC-SR04 hoạt động:

nhập mô tả hình ảnh ở đây

  • cảm biến được kích hoạt bởi cạnh rơi của TRIG, tạidigitalWrite(trigPin, LOW);

  • xung ECHO bắt đầu khoảng 0,3 ms sau khi kích hoạt

Đó là lý do tại sao độ trễ 1 ms không ảnh hưởng đến kết quả đo. pulseIn(echoPin, HIGH)thực sự sẽ đợi chân ECHO ở mức CAO, sau đó bắt đầu đo độ dài xung cho đến khi nó trở lại THẤP. Do đó, thời lượng của xung TRIG có thể giảm xuống 10 micro giây (thời lượng TRIG tối thiểu cho HC-SR04), để làm cho các phép đo nhanh hơn.


0

Điều quan trọng cần biết là bạn không đo thời gian từ khi bắt đầu kích hoạt - bằng cách đặt chân Kích hoạt CAO - lên đến tín hiệu Echo.

Cảm biến HC-SR04 bắt đầu đo bằng cách nhận mức CAO trên đầu vào Kích hoạt và sau đó gửi, một lát sau, thời gian được mã hóa là độ dài của mức CAO trên chân Echo.

Nếu bạn sử dụng pulseIn()2 ms, tức là 2000 giây, sau khi kích hoạt, nó sẽ hoạt động tốt.


1
Tôi không chắc câu hỏi này bổ sung bao nhiêu, hoặc khác với câu trả lời được chấp nhận.
Greenonline

0

Đừng nhầm lẫn, vì mô-đun siêu âm có một cách làm việc đặc biệt. Đầu tiên bạn đặt một xung trong trigpin. Khi nó kết thúc, mô-đun sẽ gửi 8 xung 40 kHz (và đó thực sự là những gì được sử dụng để đo khoảng cách, chứ không phải xung của bạn trong trigpin, không đi đến đâu). Tại thời điểm chính xác của vụ nổ đầu tiên được gửi, pin echo sẽ tự đặt ở mức CAO. Khi điều này xảy ra, chương trình nằm trong dòng của PulseIn và vì echopin ở mức CAO nên nó bắt đầu thời gian (vì xungIN (echopin, CAO) chờ echopin ở mức CAO để bắt đầu thời gian). Khi xung đầu tiên của 40 kHz dội vào vật thể và quay trở lại máy thu, echopin sẽ tự đặt ở mức THẤP. Sau đó, hàm PulseIn dừng thời gian và trả về nó. Sau đó chương trình tiếp tục chạy. Mô-đun này là một chút khó khăn để tìm hiểu cách làm việc của PulseIn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.