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:
- Użyj
Interrupt On Change
modułu. - 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_us
rejestru. Po chwili, gdy zostanie wygenerowane następne przerwanie, program odejmie zapisaną wartość z _10_us
rejestru, 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?
źródło
Odpowiedzi:
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:
To jest jeden kod RC5. Górny sygnał to sygnał modulowany 36 kHz, dolny sygnał pasma podstawowego z rzeczywistym kodem.
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!
źródło