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.
- jajak pendapat pada acara Timer (misalnya 50uS)
- menangkap micros () pada PinChangeInterrupt
- menggunakan Input Capture Interrupts untuk mengambil waktu yang tepat
Berikut adalah beberapa data
pulseIn
uji suatu tes. Satu Arduino mengirimkan apa yang seharusnya menjadi pulsa kami, dan yang lainnya meludahkan data ini: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.
sumber