Jak zmierzyć szerokość impulsu sygnału IR za pomocą 8-bitowego PIC?

14

Mój przyjaciel i ja chcemy zaprojektować uniwersalny pilot zdalnego sterowania do nauki, taki jak ten , do celów edukacyjnych. Chcemy zasadniczo przechowywać i odtwarzać impulsy podczerwieni.

Chcemy wykryć sygnały 36 kHz, 38 kHz i 40 kHz. Sygnał 40 kHz będzie miał okres 25 .μ

Chcemy użyć 8-bitowego mikrokontrolera PIC, na razie wybraliśmy PIC16F616, który będzie działał przy wysokiej prędkości kryształowego oscylatora 20 MHz. Dostępne są dwie opcje:

  1. Użyj Interrupt On Changemodułu.
  2. Użyj trybu przechwytywania modułu CCP.

Pierwsza opcja będzie następująca:

Załóżmy, że rejestr jest ustawiony jako: unsigned char _10_us = 0;. Ten rejestr będzie zawierał czas. Moduł TMR2 z rejestrem okresu jest ustawiony tak, aby tworzył przerwanie co 10 . Kiedy wystąpi przerwanie, zwiększy rejestr i zakończy działanie. To da maksymalny czas 2,55 ms. Jeśli potrzebny jest dłuższy pomiar czasu, dodatkowe rejestry, takie jak, można zdefiniować i zwiększyć w razie potrzeby.μ_10_us_1_ms

Teraz za każdym razem, gdy generowane jest przerwanie w wyniku jakiejkolwiek zmiany (z wysokiej na niską lub z niskiej na wysoką), program zanotuje bieżący czas, czyli wartość _10_usrejestru. Po chwili, gdy zostanie wygenerowane następne przerwanie, program odejmie zapisaną wartość z _10_usrejestru, a tym samym odmierzy czas w międzyczasie, z jednostką 10 sekund.μ

Ta opcja zmusza mnie do drapania się po głowie; Przerwanie TMR2 będzie się pojawiać co około 50 instrukcji. Obsługa przerwań zajmie około 20 instrukcji. Pozostało mi 30 instrukcji do obliczenia i zapisania okresu w tablicy. Czy ta metoda zadziała?

Druga opcja będzie następująca:

Skonfiguruj tryb przechwytywania modułu CCP, aby generował on przerwanie, gdy zdarzenie (wysokie do niskiego) wystąpi na pinie CCP1. W procedurze przerwania ustawi flagę, aby zadanie w programie mogło obliczyć (w razie potrzeby) i zapisać wartość CCPR1H (prawdopodobnie nie będzie potrzebna) i CCPR1L. Następnie zmienimy konfigurację trybu przechwytywania, tak aby wyzwalał przerwanie, gdy wystąpi zbocze od niskiego do wysokiego. A potem będzie czekać na następne wydarzenie. Nie mogę oszacować wydajności tej metody, ponieważ nigdy jej nie używałem.

Inna opcja?

Możemy użyć demodulatora na podczerwień, takiego jak seria TSOP17xx . To całkowicie rozwiązałoby nasz problem. Jednak przychodzą mi na myśl niektóre pytania.

Nasze wymagania dotyczące odległości odczytu nie są duże; 1 metr (~ 3 stopy). Jeśli wybierzemy TSOP1738, który ma pracować w częstotliwości 38 kHz, to jak dobrze będzie działać z sygnałami 36 kHz i 40 kHz?

Strona 4 arkusza danych serii TSOP17xx pokazuje wykres „Zależność częstotliwości od odpowiedzi”. O ile rozumieliśmy;

  • 40 kHz, czyli ~ 1,053 z 38 kHz, da względną odpowiedź ~ 0,6.
  • 36 kHz, czyli ~ 0,95 z 38 kHz, da względną odpowiedź ~ 0,65.

Co oznaczają te wartości? Czy możemy korzystać z TSOP1738 i być w porządku?

abdullah kahraman
źródło
Dlaczego nie napisać po prostu pętli programowej, która liczy ile pętli między impulsami?
Rocketmagnet
@Rocketmagnet Nie rozumiem. Czy możesz napisać odpowiedź, jeśli masz czas? Pamiętaj też, że oprócz wspomnianego problemu zrobimy wiele innych rzeczy, takich jak RS232 i SPI.
abdullah kahraman

Odpowiedzi:

11

0,65

Nie martw się o wydajność PIC. TSOP1738 nie wysyła sygnału 38 kHz. Jest to częstotliwość nośna, która jest usuwana przez TSOP1738 w celu odzyskania sygnału pasma podstawowego, który ma znacznie niższą częstotliwość, z czasem trwania impulsu rzędu 1 ms, więc jest mnóstwo czasu na dokładne zmierzenie czasu między zboczami.

Ilustrują to następujące obrazy zakresu:

wprowadź opis zdjęcia tutaj

To jest jeden kod RC5. Górny sygnał to sygnał modulowany 36 kHz, dolny sygnał pasma podstawowego z rzeczywistym kodem.

wprowadź opis zdjęcia tutaj

Jest to powiększane na jeden impuls sygnału pasma podstawowego. Możesz zobaczyć pojedyncze impulsy nośnika 36 kHz.

Jeszcze jedno słowo o częstotliwości nośnej. Być może używasz pilota, którego częstotliwości nie znasz. TSOP1738 nie daje to na jego wyjściu, więc jeśli chcesz ją przeczytać musisz podłączyć fotodiodę IR lub tranzystor do jednego z wejść pic i odczytać czas pomiędzy dwoma samych krawędziach. To wykonalne. Okresy dla różnych częstotliwości nośnych:

40 kHz: 25 µs
38 kHz: 26,3 µs
36 kHz: 27,8 µs

PIC16F616 20 MHz ma cykl instrukcji 200 ns (dzieli zegar przez 4!). Odczyty dla trzech częstotliwości powinny wynosić około 125, 131 i 139. To powinno wystarczyć, aby je rozróżnić. Ale jeśli chcesz, możesz przepuścić kilka krawędzi i odczytać zegar tylko po 10 przerwaniu, na przykład: 1250, 1316, 1389. Nie za długo, ponieważ musisz skrócić czas niż jeden impuls sygnału pasma podstawowego .

Sukces!

stevenvh
źródło
To jest teraz relaksujące, dzięki. Dawno temu stworzyłem „ucznia IR” na podstawie TSOP1738, ale to był bałagan.
abdullah kahraman