logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Jak poprawić odbiór sygnału 38kHz z odbiornikiem TSSP4038?

m.biruta 17 Mar 2014 13:13 1068 2
REKLAMA
  • #1 13413382
    m.biruta
    Poziom 16  
    Dzień dobry,
    Mam odbiornik podczerwieni TSSP4038 (http://www.vishay.com/docs/82458/tssp4038.pdf) który ma zastosowanie w barierach podczerwieni. Sygnał 38kHz nadaję diodą IR za pomocą wyjścia cyfrowego w taki sposób:
    1 000 000 (sekunda w mikrosekundach) / 38 000 (kHz) = ~26 mikrosekund / 2 = ~13 mikrosekund pojedynczy stan.

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Powiedzmy, że przy tym kodzie całość w pętli wykonuje się co 1-2 mikrosekundę. W przypadku nadawania sygnału 38kHz na wyjściu układu TSSP powinien pojawić się stan niski. Po przecięciu bariery pojawia się stan wysoki.

    Na teście działania wychodzi mi przeplataniec tzn. raz otrzymuję wartość 1-5, przy następnym wykonaniu pętli dostaję już stan wysoki, później znów wysoki, później niski itd. Przykładowo przy kolejnych odczytach wejścia analogowego wygląda to następująco:

    
    3
    5
    1
    1021
    1019
    4
    4
    1
    2
    1023
    1023
    1023
    1021
    1021
    


    Wygląda to tak jakby kod nie generował ładnej częstotliwości 38kHz i układ TSSP "przerywał" barierę. Przy bardziej skomplikowanym kodzie ~1000 linii, pętla generująca 38kHz nie wykonuje się już co mikrosekundę, więc odczyt z TSSP jest jeszcze gorszy i zawiera więcej stanów wysokich. Moje pytanie w jaki sposób to obejść, ewentualnie gdzie leży problem, bo w sumie układ ma tolerancję pewnie z 10% jeśli chodzi o nadawany sygnał, więc powinien ładnie działać.
  • REKLAMA
  • #2 13413554
    mi14chal
    Poziom 28  
    Nie wiem jak tam na arduino jest, ale wysyłanie przez UART trochę to trwa. Normalnie na AVR to trza użyć timera do generowania 38kHz i nie ma problemu.
  • Pomocny post
    #3 13413598
    BlueDraco
    Specjalista - Mikrokontrolery
    Takie rzeczy to tylko sprzętowo na timerze w trybie PWM. Twoje założenie o tym, że pętla wykona się w 1..2 us jest niezbyt realistyczne - przyjmując w uproszczeniu, że ATmega wykonuje jedną 8-bitową operację na cykl, Twoja pętla wymaga przynajmniej kilkudziesięciu takich operacji, więc jej czas wykonania wyniesie min. kilkanaście us.

    A poza tym - nie znam Arduino, ale bardzo bym się zdziwił, gdyby funkcja millis() zwracała czas w mikrosekundach, a nie w milisekundach.
REKLAMA