Bagaimana mengukur lebar pulsa sinyal IR menggunakan PIC 8-bit?

14

Teman saya dan saya ingin merancang pengendali jarak jauh pembelajaran universal, seperti ini , untuk tujuan pembelajaran. Apa yang ingin kita lakukan pada dasarnya adalah menyimpan dan memutar ulang pulsa inframerah.

Kami ingin mendeteksi sinyal 36kHz, 38kHz, dan 40kHz. Sinyal 40kHz akan memiliki periode 25 s.μ

Kami ingin menggunakan mikrokontroler PIC 8-bit, untuk saat ini kami telah memilih PIC16F616, yang akan berjalan pada osilator kristal berkecepatan tinggi 20MHz. Kami memiliki dua opsi yang tersedia:

  1. Gunakan Interrupt On Changemodul.
  2. Gunakan mode tangkap modul CCP.

Opsi pertama adalah sebagai berikut:

Asumsikan register diatur sebagai: unsigned char _10_us = 0;. Daftar ini akan menahan waktu. Modul TMR2 dengan register periode diatur untuk membuat interupsi setiap 10 detik. Ketika interupsi terjadi, itu akan menambah register dan keluar. Ini akan memberikan waktu maksimum 2,55 msec. Jika pengukuran waktu lebih banyak diperlukan, register tambahan seperti dapat didefinisikan dan ditambahkan sesuai kebutuhan.μ_10_us_1_ms

Sekarang, setiap kali interupsi dihasilkan oleh segala jenis perubahan (tinggi ke rendah atau rendah ke tinggi), program akan mencatat waktu saat ini, yaitu nilai _10_usregister. Setelah beberapa saat, ketika interupsi berikutnya dihasilkan, program akan mengurangi nilai yang disimpan dari _10_usregister, dan dengan demikian sekarang akan waktu yang diambil untuk sementara, dengan unit 10 detik.μ

Opsi ini membuat saya menggaruk kepala; Gangguan TMR2 akan muncul setiap 50 instruksi. Penanganan interupsi akan membutuhkan sekitar 20 instruksi. Saya memiliki 30 instruksi untuk menghitung dan menyimpan periode ke array. Akankah metode ini berhasil?

Opsi kedua adalah sebagai berikut:

Atur mode tangkap modul CCP sehingga akan menghasilkan interupsi ketika suatu peristiwa (tinggi ke rendah) terjadi pada pin CCP1. Dalam rutin interupsi, itu akan menetapkan bendera sehingga tugas dalam program dapat menghitung (jika perlu) dan menyimpan nilai CCPR1H (mungkin tidak akan diperlukan) dan CCPR1L. Kemudian kita akan mengubah konfigurasi mode pengambilan sehingga akan memicu interupsi ketika tepi rendah ke tinggi terjadi. Dan kemudian akan menunggu acara berikutnya. Saya tidak dapat memperkirakan kinerja metode ini karena saya belum pernah menggunakannya.

Pilihan lain?

Kita dapat menggunakan IC demodulator inframerah seperti seri TSOP17xx . Itu akan menyelesaikan masalah kita sepenuhnya. Namun beberapa pertanyaan muncul di benak saya.

Persyaratan jarak baca kami tidak banyak; 1 meter (~ 3 kaki). Jika kita memilih TSOP1738 yang dimaksudkan untuk bekerja dalam 38kHz, seberapa baik ini akan bekerja dengan sinyal 36kHz dan 40kHz?

Halaman 4 dari lembar data seri TSOP17xx menunjukkan grafik "Frekuensi Ketergantungan Tanggung Jawab". Sejauh yang kami mengerti;

  • 40kHz, yaitu ~ 1,053 dari 38kHz, akan memberikan respons relatif ~ ~ 0,6.
  • 36kHz, yaitu ~ 0,95 dari 38kHz, akan memberikan respons relatif relatif ~ 0,65.

Apa arti nilai-nilai ini? Bisakah kita menggunakan TSOP1738 dan baik-baik saja?

abdullah kahraman
sumber
Mengapa tidak menulis loop perangkat lunak yang menghitung berapa banyak loop antara pulsa?
Rocketmagnet
@ Roket saya tidak mengerti. Bisakah Anda menulis jawaban jika Anda punya waktu? Juga, ingatlah bahwa kami akan melakukan banyak hal lain seperti RS232 dan SPI selain dari masalah yang disebutkan.
abdullah kahraman

Jawaban:

11

0,65

Jangan khawatir tentang kinerja PIC. TSOP1738 tidak akan menghasilkan sinyal 38 kHz. Itu adalah frekuensi pembawa, yang dihapus oleh TSOP1738 untuk mendapatkan kembali sinyal pita dasar, yang memiliki frekuensi jauh lebih rendah, dengan durasi pulsa dalam urutan 1 ms, jadi ada banyak waktu untuk mengukur waktu di antara tepian secara akurat.

Gambar cakupan berikut menggambarkan ini:

masukkan deskripsi gambar di sini

Ini adalah satu kode RC5. Sinyal teratas adalah sinyal termodulasi 36 kHz, bagian bawah sinyal baseband dengan kode aktual.

masukkan deskripsi gambar di sini

Ini diperbesar pada satu pulsa sinyal baseband. Anda dapat melihat pulsa individual dari operator 36 kHz.

Satu kata lagi tentang frekuensi operator. Anda mungkin menggunakan remote control yang tidak Anda ketahui frekuensinya. TSOP1738 tidak memberikan outputnya, jadi jika Anda ingin membacanya Anda harus menghubungkan fotodioda IR atau transistor ke salah satu input PIC dan membaca waktu antara dua sisi yang sama . Itu layak. Periode periode untuk frekuensi operator yang berbeda:

40 kHz: 25 µs
38 kHz: 26.3 µs
36 kHz: 27.8 µs

PIC16F616 20 MHz memiliki siklus instruksi 200 ns (ini membagi jam dengan 4!). Jadi bacaan untuk tiga frekuensi harus sekitar 125, 131 dan 139. Itu harus cukup untuk membedakan mereka. Tetapi jika mau, Anda dapat membiarkan sejumlah sisi lewat dan hanya membaca timer setelah interupsi ke-10, misalnya: 1250, 1316, 1389. Tidak terlalu lama karena Anda harus menjaga waktu lebih pendek dari satu pulsa sinyal baseband .

Keberhasilan!

stevenvh
sumber
Itu sekarang santai, terima kasih. Saya telah membuat "pelajar IR" berdasarkan TSOP1738 dulu, tapi itu berantakan.
abdullah kahraman