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?