Apa pekerjaan dari pulseIn?

9

Saya memiliki kode untuk sensor ultrasonik yang saya temukan dari sebuah situs. Ini kodenya:

#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);
}

Namun, saya tidak mengerti pekerjaan pulseIn()fungsi. Maksud saya, saya ingin tahu kapan penghitungan waktu dimulai dan kapan berakhir. Misalnya, dalam kode ini, apakah waktu mulai digitalWrite(trigPin, HIGH);atau apakah waktu mulai pada pulseIn()fungsi?

Jika yang kedua, ketika berhenti, lalu bagaimana waktu memberi kita jarak dari hambatan ketika saya sudah menunda 1000 mikrodetik setelah saya mengirim ping di udara?

shajib0o
sumber
Penundaan 100us untuk pin pemicu tampaknya agak lama bagi saya. Hal ini tergantung pada merek sensor Anda, tetapi nilai khas (saya menggunakannya dengan HC-SR04) sekitar 10us .
jfpoilpret
Bagaimana saya bisa melakukan kode ini di assembly languaje ???? Tolong bantu.
1
How can i do this code in assembly languaje- apa hubungannya dengan pertanyaan ini?
Nick Gammon

Jawaban:

8

Dari dokumen:

Membaca pulsa (TINGGI atau RENDAH) pada pin. Misalnya, jika nilainya TINGGI, pulseIn()menunggu pin menjadi TINGGI, memulai penghitungan waktu, lalu menunggu pin menjadi RENDAH dan berhenti menghitung waktu. Mengembalikan panjang pulsa dalam mikrodetik. nadi

Jadi, dalam hal ini, pulseIn(echoPin, HIGH)mulai menghitung jumlah mikrodetik hingga echoPinmenjadi TINGGI dan menyimpannya dalam duration.

Itu dimulai dan berakhir pada baris itu, itulah yang dikenal sebagai fungsi pemblokiran. Ini akan benar-benar duduk di sana sampai echoPinmenjadi tinggi dan memberi tahu Anda berapa lama (kecuali Anda menentukan batas waktu).

Itu juga berarti bahwa setiap penundaan yang Anda miliki sebelum atau sesudah pulseInpanggilan tidak memengaruhi dengan cara apa pun.

Cara Anda mendapatkan jarak dari waktu ini adalah dengan persamaan berikut:

distance = (duration/2) / 29.1;

Anda membaginya dengan dua karena itu keluar dan kembali sehingga waktu akan dua kali lipat dari perjalanan satu arah. 29.1 adalah kecepatan suara (yaitu 343.5 m / s => 1 / 0.03435 = 29.1). Jadi perhatikan hasilnya di CM, bukan inci. Anda mungkin bisa mengetahuinya dengan melihat lembar data sensor atau hanya mendapatkan banyak sampel yang berkaitan dengan durasi jarak (Anda akan mengukur jarak secara manual) dan mendapatkan persamaan yang sangat mirip.

sachleen
sumber
1
Saya telah di-Skeet! Sebenarnya, 29.1 adalah kecepatan suara. Selain itu, tambahan cepat: IIRC alasan ada denyut nadi untuk dibaca adalah modul ultrasonik menghasilkan sinyal TINGGI sampai suara membuat jalan kembali ke modul.
Penguin Anonim
1
Saya tidak mengerti paragraf keempat. Karena jika saya mengirim pulsa suara di udara dan menunggu 2 detik itu akan menempuh jarak yang jauh. Jadi, ketika saya mulai menghitung, saya akan terlambat 2 detik. Jadi mengapa tidak ada masalah jika saya menunda sebelum pulsa? @ sachleen. Dan terima kasih Annonomus Penguin dan sachlee
shajib0o
@ shajib0o "pulseIn () menunggu pin menjadi TINGGI, memulai penghitungan waktu, lalu menunggu pin menjadi RENDAH dan menghentikan penghitungan waktu."
sachleen
3
@ shajib0o Sejauh yang saya tahu, itu adalah sensor ultrasonik membuat pin menjadi TINGGI ketika sinyal dikirim dan kemudian RENDAH ketika sinyal kembali.
Penguin Anonim
1
Sebenarnya ini salah. pulseIn(echoPin, HIGH)mengukur waktu sampai pin ECHO menjadi RENDAH.
Dmitry Grigoryev
2

Memang itu akan menjadi masalah jika Anda mulai mengukur panjang pulsa 1000 mikrodetik setelah dimulai. Namun, ini bukan cara kerja sensor HC-SR04:

masukkan deskripsi gambar di sini

  • sensor dipicu oleh tepi jatuh dari TRIG, didigitalWrite(trigPin, LOW);

  • pulsa ECHO mulai sekitar 0,3 ms setelah pemicu

Itu sebabnya penundaan 1 ms tidak memengaruhi hasil pengukuran. pulseIn(echoPin, HIGH)akan benar-benar menunggu pin ECHO menjadi TINGGI, lalu mulai mengukur panjang pulsa hingga RENDAH lagi. Dengan demikian, durasi pulsa TRIG dapat dikurangi menjadi 10 mikrodetik (durasi TRIG minimum untuk HC-SR04), untuk membuat pengukuran lebih cepat.

Dmitry Grigoryev
sumber
0

Penting untuk diketahui bahwa Anda tidak mengukur waktu mulai dari pemicu - dengan mengatur pin Pemicu TINGGI - hingga sinyal Echo.

Sensor HC-SR04 memulai pengukuran dengan menerima TINGGI pada input Pemicu dan kemudian mengirimkan, tidak lama kemudian, waktu dikodekan sebagai panjang tingkat TINGGI pada pin Echo.

Jika Anda menggunakan pulseIn()2 ms, yaitu 2000μs, setelah dipicu, itu akan berfungsi dengan baik.

ANK55
sumber
1
Saya tidak yakin seberapa banyak ini menambah, atau berbeda dari, jawaban yang diterima.
Greenonline
0

Jangan bingung, karena modul ultrasonik memiliki cara kerja tertentu. Pertama, Anda mengatur pulsa di trigpin. Ketika itu berakhir, modul mengirimkan 8 semburan pulsa 40 kHz (dan itulah sebenarnya yang digunakan untuk mengukur jarak, bukan denyut nadi Anda di trigpin, yang tidak ke mana-mana). Tepat saat ledakan pertama dikirim, pin gema mengatur dirinya sendiri di TINGGI. Ketika ini terjadi, program berada di garis pulseIn, dan karena echopin berada di HIGH, ia memulai pengaturan waktu (karena pulseIN (echopin, HIGH) menunggu echopin menjadi HIGH untuk memulai pengaturan waktu). Ketika pulsa pertama dari 40 kHz memantul di objek dan kembali ke penerima, echopin menempatkan dirinya dalam RENDAH. Kemudian fungsi pulseIn menghentikan waktu dan mengembalikannya. Kemudian program terus berjalan. Modul ini sedikit rumit untuk mempelajari cara kerja pulsa.

JoshFMX
sumber