Seberapa tepat waktu dari pulseIn ()?

8

Saya telah menggunakan pulseIn()fungsi untuk memproses pengkodean data biner berbasis PWM. Ini bekerja dengan baik untuk membedakan pulsa yang panjangnya berbeda secara signifikan, misalnya 500us vs 1500us. Itu membuatnya lebih dari cukup untuk menangani remote IR yang umum.

Namun, saya ingin membuat sistem IR saya sendiri yang dapat menggunakan lebih dari 2 panjang pulsa, sehingga transfer data dapat terjadi lebih cepat. Idealnya, saya ingin menggunakan 8 panjang pulsa yang berbeda untuk pengkodean oktal (mis. 200us, 400us, 600us, dll.).

Saya perhatikan variasi yang cukup signifikan dalam nilai yang dikembalikan oleh pulseIn()(+/- 10%). Saya berharap setidaknya beberapa di antaranya diperkenalkan oleh modul pemancar dan penerima IR, tetapi saya tidak memiliki peralatan yang cukup untuk memverifikasi itu.

Dengan asumsi saya dapat mengurangi kesalahan eksternal itu, apakah pulseIn()mungkin cukup tepat untuk membedakan pulsa serupa?

Peter Bloomfield
sumber

Jawaban:

11

Fungsi pulsein () sangat lossy, karena merupakan loop keras dan mengembalikan angka * asumsi clock cycle yang dibutuhkan untuk per loop

...
// wait for the pulse to stop
while ((*portInputRegister(port) & bit) == stateMask) {
  if (numloops++ == maxloops)
    return 0;
  width++;
}

// convert the reading to microseconds. The loop has been determined
// to be 20 clock cycles long and have about 16 clocks between the edge
// and the start of the loop. There will be some error introduced by
// the interrupt handlers.
return clockCyclesToMicroseconds(width * 21 + 16); 

Metode yang paling akurat untuk mengabadikan waktu PIN adalah menggunakan INPUT CAPTURE FEATURE. Lihatlah contoh ini . Ini memungkinkan pengambilan input pada 1x CPU untuk resolusi maksimal dan setiap tepi pin input menangkap nilai clock timer untuk membaca dari layanan Interrupt yang dihasilkan. Ini juga memungkinkan pengatur waktu meluap untuk menjaga waktu absolut yang besar, untuk ditangkap. Karena 1x akan bergulir agak cepat. Capture menyimpan waktu menjadi array untuk dibaca oleh loop utama.


Di mana untuk sinyal melalui IR perpustakaan umum untuk digunakan adalah perpustakaan shirriff / Arduino-IRremote . Di mana ada beberapa demo yang akan membaca dan mengirim IR dari sinyal yang didemodulasi. Untuk memungkinkan seseorang membangun sketsa desain mereka sendiri. Kode ini awalnya membuat penghenti waktu yang memilih pin input pada tingkat yang ditentukan oleh

#define USECPERTICK 50  // microseconds per clock interrupt tick

dalam file IRremote.h. Demi tujuan saya, saya harus mengubahnya menjadi 25 kami. Di mana saya menemukan ini masih bisa hilang aliran nadi.

Perhatikan demodulasi paling baik dilakukan dalam penerima IR, yang pada gilirannya mengeluarkan sinyal yang menarik ini. Di mana menambahkan beberapa latar belakang. Menggunakan modulasi 38KHz khas, sama dengan resolusi minimum 26.3uS per siklus pulsa. Pustaka sherriff menunjukkan biasanya sebagian besar baud atau bit berada dalam urutan 10+ pulsa. Yang muncul untuk memenuhi timing yang Anda inginkan.

microtherion / Arduino-IRremote fork dari karya shirriff meningkatkan penerimaan dengan mengganti timer polling interupsi pin dengan menggunakan PinChangeInterrupts. Yang saya gabungkan menjadi garpu mpflaga / Arduino-IRremote saya sendiri , yang menambahkan beberapa fitur lainnya.

Jadi Anda bisa menggunakan salah satu perpustakaan di atas. Atau buat aplikasi Anda sendiri yang menggunakan salah satu di bawah ini untuk menangkap tepian.

  1. jajak pendapat pada acara Timer (misalnya 50uS)
  2. menangkap micros () pada PinChangeInterrupt
  3. menggunakan Input Capture Interrupts untuk mengambil waktu yang tepat
mpflaga
sumber
1
Jawaban yang brilian. Arduino-IRremote adalah perpustakaan berkualitas sangat tinggi. Mudah dibaca, dan memiliki banyak desain yang dipikirkan dengan baik yang berarti sangat andal.
Cybergibbons
2

Berikut adalah beberapa data pulseInuji suatu tes. Satu Arduino mengirimkan apa yang seharusnya menjadi pulsa kami, dan yang lainnya meludahkan data ini:

18,18,18,12,18,18,18,18,18,18,18,18,18,18,18,18,18,24,19,18,18,18,18,18,18,24, 18,18,18,19,18,18,12,18,18,19,18,18,18,18,18,18,18,18,18,18,18,19,18,19,24, 18,18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,18,18,18,18,18,18,19,18,18,18,11,18

Seperti yang Anda lihat, nadi tidak berarti akurat. Waktu akan lebih akurat jika tujuan pengiriman dan penerimaan ditulis dalam pertemuan, atau bahkan diturunkan ke prosesor mereka sendiri.

Dokter
sumber