8 bit PIC kullanarak bir IR sinyalinin darbe genişliğini nasıl ölçebilirim?


14

Arkadaşım ve ben , öğrenme amacıyla bu gibi evrensel bir uzaktan kumanda tasarlamak istiyoruz . Temel olarak yapmak istediğimiz şey kızılötesi darbeleri depolamak ve tekrar oynatmak.

36kHz, 38kHz ve 40kHz sinyalleri tespit etmek istiyoruz. 40kHz'lik bir sinyal 25 s'lik bir süreye sahip olacaktır .μ

8-bit PIC mikrodenetleyici kullanmak istiyoruz, şimdilik 20MHz yüksek hızlı kristal osilatörde çalışacak PIC16F616'yı seçtik. İki seçeneğimiz var:

  1. Interrupt On ChangeModülü kullanın .
  2. CCP modülünün yakalama modunu kullanın.

İlk seçenek aşağıdaki gibi olacaktır:

Bir kayıt olarak ayarlanır varsayalım: unsigned char _10_us = 0;. Bu kayıt zamanı tutacaktır. Dönem kaydına sahip TMR2 modülü, her 10 s saniyede bir kesinti oluşturacak şekilde ayarlanmıştır . Bir kesinti meydana geldiğinde, kaydı artırır ve çıkar. Bu en fazla 2,55 ms sürecektir. Daha fazla zaman ölçümü gerekiyorsa, gerektiği gibi ek kayıtlar tanımlanabilir ve artırılabilir.μ_10_us_1_ms

Şimdi, her kesme değişikliğiyle (yüksekten düşüğe veya alçaktan yükseğe) her kesinti gerçekleştiğinde, program geçerli saati, yani _10_uskaydın değerini not edecektir . Bir süre sonra, bir sonraki kesme üretildiğinde, program kaydedilen değeri _10_uskayıt defterinden çıkarır ve böylece 10 bir birim ile bu arada alınan süreyi gösterir .μ

Bu seçenek kafamı çizmemi sağlıyor; Her 50 talimat için TMR2 kesilmesi gerçekleşir. Kesme işlemi yaklaşık 20 talimat alacaktır. Süreyi hesaplamak ve bir diziye kaydetmek için 30 komutla kaldım. Bu yöntem işe yarayacak mı?

İkinci seçenek aşağıdaki gibi olacaktır:

CCP modülünün yakalama modunu, CCP1 pininde bir olay (yüksekten düşüğe) meydana geldiğinde bir kesinti oluşturacak şekilde ayarlayın. Kesme yordamında, programdaki bir görevin (gerekirse) hesaplayabilmesi ve CCPR1H (muhtemelen gerekmeyecek) ve CCPR1L değerini kaydedebilmesi için bir bayrak ayarlayacaktır. Ardından, yakalama modunun yapılandırmasını değiştireceğiz, böylece alçaktan yükseğe bir kenar oluştuğunda kesmeyi tetikleyecektir. Ve sonra bir sonraki etkinliği bekleyecek. Daha önce hiç kullanmadığım için bu yöntemin performansını tahmin edemiyorum.

Başka seçenek?

TSOP17xx serisi gibi bir kızılötesi demodülatör IC'yi kullanabiliriz . Bu, sorunumuzu tamamen çözecektir. Ancak bazı sorular akla geliyor.

Okuma mesafesi gereksinimimiz fazla değil; 1 metre (~ 3 fit). 38 kHz'de çalışması gereken bir TSOP1738 seçersek, bu 36 kHz ve 40 kHz sinyallerle ne kadar iyi çalışır?

TSOP17xx serisinin veri sayfasının 4. sayfasında "Duyarlılığın Frekans Bağımlılığı" grafiği gösterilmektedir. Anladığımız kadarıyla;

  • 38kHz'in ~ 1.053'ü olan 40kHz, ~ 0.6'lık nispi bir cevap verecektir.
  • 38kHz ~ 0.95 olan 36kHz, ~ 0.65 nispi bir cevap verecektir.

Bu değerler ne anlama geliyor? TSOP1738 kullanabilir ve iyi olabilir miyiz?


Neden sadece darbeler arasında kaç döngü olduğunu sayan bir yazılım döngüsü yazmıyorsunuz?
Rocketmagnet

@Rocketmagnet Anlamıyorum. Vaktiniz varsa bir cevap yazabilir misiniz? Ayrıca, belirtilen sorun dışında RS232 ve SPI gibi birçok şey yapacağımızı unutmayın.
abdullah kahraman

Yanıtlar:


11

Evet, TSOP1738 bu kısa mesafede yapacak. 0.65 göreceli yanıt , ters kare yasası nedeniyle aynı sinyal gücünü görmek için 36 kHz'de IR = 0.8 kat daha yakın olması gerektiği anlamına gelir . Dolayısıyla, TSOP1738'iniz 1 m'de 38 kHz için belirli bir seviye görürse, 36 kHz'de aynı sinyal gücünü elde etmek için vericiyi 80 cm'de tutmanız gerekir. BTW, taze pilleri olan bir uzaktan kumanda ile 15 m'den fazla mesafede mükemmel alım ölçtüm, bu yüzden hiç sorun değil.0.65

PIC'nin performansı hakkında endişelenmeyin. TSOP1738 38 kHz sinyal vermez. Bu, TSOP1738 tarafından çok daha düşük bir frekansa sahip olan ve 1 ms sırasıyla darbe süreleriyle temel bant sinyalini geri almak için çıkarılan taşıyıcı frekansıdır, bu nedenle kenarlar arasındaki süreyi doğru bir şekilde ölçmek için bolca zaman vardır.

Aşağıdaki kapsam görüntüleri bunu göstermektedir:

resim açıklamasını buraya girin

Bu bir RC5 kodudur. Üst sinyal, 36 kHz modülasyonlu sinyaldir, altta ise gerçek kod ile taban bandı sinyali bulunur.

resim açıklamasını buraya girin

Bu, temel bant sinyalinin bir darbesinde yakınlaştırılır. 36 kHz taşıyıcının tek tek atımlarını görebilirsiniz.

Taşıyıcı frekansı hakkında bir kelime daha. Bu frekansı bilmediğiniz bir uzaktan kumanda kullanıyor olabilirsiniz. TSOP1738 çıkışında vermez, bu yüzden okumak istiyorsanız PIC girişlerinden birine bir IR fotodiyot veya transistör bağlamanız ve aynı iki kenar arasındaki süreyi okumalısınız . Bu mümkün. Farklı taşıyıcı frekansları için dönem süreleri:

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

20 MHz PIC16F616, 200 ns'lik bir komut döngüsüne sahiptir (saati 4'e böler!). Bu yüzden üç frekans için okumalar yaklaşık 125, 131 ve 139 olmalıdır. Onları ayırmak için bu yeterli olmalıdır. Ancak isterseniz, birkaç kenarın geçmesine izin verebilir ve zamanlayıcıyı yalnızca 10. kesintiden sonra okuyabilirsiniz, örneğin: 1250, 1316, 1389. Çok daha uzun değil, çünkü zamanı ana bant sinyalinin bir darbesinden daha kısa tutmanız gerekiyor .

Başarı!


Bu şimdi rahatlatıcı, teşekkürler. Uzun zaman önce TSOP1738'e dayanan bir "IR öğrenen" yarattım, ama bu bir karmaşa oldu.
abdullah kahraman
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.