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

[ATTiny13A] Jakie wypełnienie sygnału dla czujnika TFMS 5560 przy 56 kHz?

Wojtek001 24 Cze 2012 21:41 2193 16
  • #1 11038207
    Wojtek001
    Poziom 15  
    Posty: 217
    Pomógł: 5
    Ocena: 74
    Zajmuje się pisaniem programu (procek to Attiny13A) do diody ir współpracującej z czujnikiem TFMS 5560.Zaznaczam że jest to po prostu układ typu załącz / wyłącz. Nie żadne kodowanie itp.

    Tutaj link do noty katalogowej tego czujnika (w tabelce drugi pdf od góry) :
    http://www.datasheetarchive.com/tfm%205560-datasheet.html

    Z tego co udało mi się rozszyfrować wiem że czujnik ten reaguje na sygnał o modulacji 56 kHz ii cechuje go "aktywny stan niski" czyli gdy widzi modulowany sygnał ir podaje masę na wyjściu. Ale mam parę pytań:

    1) Czy sygnał modulowany musi mieć jakieś specjalne wypełnienie czy może być przez 50% czasu stan niski i 50% czasu stan wysoki?
    2) Czy jeśli przez jakiś dłuższy czas będę działał na czujnik sygnałem modulowanym to czy on zacznie się jakoś dziwnie zachowywać czy będzie cały czas dawać tą masę na wyjściu. Ktoś mi pisał jednak że tego typu czujniki po określonej ilości odebranych impulsów oczekują odpoczynku. Jak jest w wypadku mojego czujnika i ile to impulsów?
    3) Napisałem prościutki programik na Attiny13A i wewnętrznym oscylatorze 1Mhz do pilota (W BASCOMIE). Ma on modulować sygnał o częstotliwości ok. 56Khz przez cały czas działania programu na nóżce PB4 która będzie podłączona do diody nadawczej ir. Czy zadziała on poprawnie? Szczególnie chodzi mi o poprawność wyliczenie ,że aby uzyskać modulacje 56Khz należy dokonywać odwrócenia stanu logicznego na wyjściu PB4 co 9 mikro sekund.

    Program:
    Kod: text
    Zaloguj się, aby zobaczyć kod



    4) Powyższy program jest tak napisany że sygnał modulowany będzie działać przez cały czas pracy procesora. Tak więc przycisk w pilocie będzie po prostu podłączał vcc do procesora i go uruchamiał. Reakcja procka to ok. 64ms (?) . Do tego dochodzi powiedzmy te kilka ms dla bezpieczeństwa czyli minimalna długość przytrzymania przycisku to 70ms. Ile trwa standardowo normalna długość wciśnięcia przycisku? Czy procesor Attiny13A zdąży uaktywnić się po tych 64ms?
  • #2 11039046
    Krauser
    Poziom 26  
    Posty: 508
    Pomógł: 124
    Ocena: 12
    Masz błędne obliczenia. Przerwanie następuje gdy licznik się "przekręci" i do obliczeń należy brać wartość o 1 większą, ale to i tak nie będzie dokładnie ponieważ skok do procedury przerwania też zajmuje minimum 4 cykle zegara. Lepiej przejdź na PWM na PB0 lub PB1.
  • #3 11040609
    Wojtek001
    Poziom 15  
    Posty: 217
    Pomógł: 5
    Ocena: 74
    A mógłbym prosić o jakiś gotowy fragment kodu - po PWM'em jeszcze się nie zajmowałem.
    Uczę się BASCOMA z książki "mikrokontrolery dla początkujących" i jestem dopiero przy szynie I2C. Tak więc zadowolił by nie jakiś króciutki gotowy programik generujący sygnał o częstotliwości 56 khz na nóżkę PB0 w oparciu o PWM.
  • Pomocny post
    #4 11041071
    Krauser
    Poziom 26  
    Posty: 508
    Pomógł: 124
    Ocena: 12
    Dla taktowania 8MHz, ale możliwe że trzeba zmodyfikować nazwy Pwm i Compare
    Kod: text
    Zaloguj się, aby zobaczyć kod

    a na rejestrach timera
    Kod: text
    Zaloguj się, aby zobaczyć kod


    fOCnx = fclk/(2*N*[1+OCRnx]) = 8MHz/(2*1*[1+70])=56,34kHz
  • #5 11041302
    Wojtek001
    Poziom 15  
    Posty: 217
    Pomógł: 5
    Ocena: 74
    Wielkie dzięki ,ale trochę mnie nie pokoi to 8Mhz bo układ zasilany będzie zasilany z jednej baterii pastylkowej - niby 3v. ale wiadomo jak to jest w praktyce ,pewnie z 2,7 v będzie miała a dochodzi jeszcze obciążenie diody.

    I nie będzie problemu jeśli ustawię wewnętrzny oscylator 8Mhz bo Attiny13 nie ma możliwości bezpośredniego podłączenia kwarcu?

    Poza tym twój program generuje sygnał o jakim wypełnieniu? 50% ?
  • #6 11042670
    Krauser
    Poziom 26  
    Posty: 508
    Pomógł: 124
    Ocena: 12
    1. A właściwie skąd to 8MHz skoro w specyfikacji pisze że jest domyślnie 9,6MHz/8 = 1,2MHz.
    2. Jeśli chcesz do końca wykorzystać baterię CR to lepiej obniżyć częstotliwość do 4MHz, wtedy masz zakres napięcia zasilania od 1,8V.
    3. Jeśli chcesz kwarc to jeszcze potrzebny by był generator na bramkach, ale szkoda na to pieniędzy
    4. Tak w trybie CTC jest wypełnienie 50%
  • #7 11042819
    Wojtek001
    Poziom 15  
    Posty: 217
    Pomógł: 5
    Ocena: 74
    Ja mam wersję Attiny13A i z wykresu (taktowanie od napięcia) w datasheet'cie wynika że przy 8Mhz 3v powinny starczyć na styk ale zobaczymy jak to będzie w praktyce.

    A co do taktowania 8Mhz to właśnie chcę przestawić uC na wewnętrzny oscylator 8Mhz (chyba jest taka możliwość?) żeby był zgodny z twoim programem.
  • #8 11042930
    Krauser
    Poziom 26  
    Posty: 508
    Pomógł: 124
    Ocena: 12
    Do 10 MHz pracuje przy napięciu 2,7 – 5,5V.
    Lepiej doczytaj o tej częstotliwości. Jest inna niż w większości AVRów. Dla 9,6MHz OCR0A powinien wynosić 85
  • #9 11043747
    Wojtek001
    Poziom 15  
    Posty: 217
    Pomógł: 5
    Ocena: 74
    Czyli dla Attiny13A jest dostępna częstotliwość taktowania 9,6 Mhz zamiast 8 Mhz?
    Czyli jedyna zmiana w programie to wpisać Pwm0a = 85 zamiast Pwm0a = 70 ?
  • #10 11043791
    Krauser
    Poziom 26  
    Posty: 508
    Pomógł: 124
    Ocena: 12
    Tak, ale trzeba przeprogramować fusebity (dokładniej CKDIV8)
  • #11 11044154
    LordBlick
    VIP Zasłużony dla elektroda
    Posty: 5438
    Pomógł: 549
    Ocena: 69
    Krauser napisał:
    Tak, ale trzeba przeprogramować fusebity (dokładniej CKDIV8)
    Nie jest to konieczne, CKDIV8 powoduje tylko wpisanie odpowiedniej wartości po reset do rejestru preskalera CLKPR, który można zmieniać programowo.
  • #12 11045028
    Wojtek001
    Poziom 15  
    Posty: 217
    Pomógł: 5
    Ocena: 74
    Ja sobie zmieniam fusebity w AVR studio i nie przejmuje się żadnymi rejestrami.
  • #13 11045083
    Krauser
    Poziom 26  
    Posty: 508
    Pomógł: 124
    Ocena: 12
    Tak, ale w rejestrze możesz wybierać kilka stopni podziału, a fusem tylko 2. No i podczas pracy możesz sobie zmieniać taktowanie.
  • #14 11047930
    Wojtek001
    Poziom 15  
    Posty: 217
    Pomógł: 5
    Ocena: 74
    Zrobiłem sobie program testowy oparty o instrukcje wait który mi gasi i zapala diodę co sekundę. Program ten działa na moim procku nie tylko przy częstotliwości 4,8 Mhz ale także 9,6 Mhz. Następnie wgrałem twój program jednak nie działa. Dioda ir (sprawdzam przez aparat) nie świeci się. Co jest źle? Możliwe żeby przyczyną tego było to że raz przez pomyłkę podłączyłem 3v odwrotnie - ale przecież procek daje się zaprogramować i przy innym programie działa.

    Tak to jest jak się wklepuje coś czego kompletnie się nie rozumie. Jeszcze mi się nie zdarzyło żebym zbudował coś wedle czyjegoś projektu - zawsze projektuje wszystko od początku. Dlatego też napisałem prymitywny program po swojemu:
    Config Pinb.0 = Output
    
    Do
    Waitus 25
    Portb.0 = 1   'dioda nie świeci 
    Waitus 3
    Portb.0 = 0   'dioda świeci
    Loop
    End

    Powyższy kod działa przy taktowaniu 4,8 Mhz (z uwagi na to żeby nie zabierać zbytnio napięcia na diodzie ir). Kompilator czyi BASCOM-AVR "myśli" jednak że będzie działał na 1Mhz. Dlatego też np. waitus 25 nie trwa w rzeczywistości 25 us ale 4,8 raza szybciej czyli ok. 5,2 us.
    Zauważyłem też że lepsze rezultaty przynosi wypełnienie równe ok. 90 % (tak jak w powyższym programie)

    Ale działa! Zasięg wynosi już parę metrów jednak chciałbym to zrobic jeszcze precyzyjniej dlatego może ktoś orientuje się ile mniej więcej cykli zegara trwa w powyższym kodzie :
    1) Przejście z końca pętli na początek ?
    2) Instrukcja Portb.0 = 1 ?
    3) Instrukcja Portb.0 = 0 ?
  • #16 11049568
    Wojtek001
    Poziom 15  
    Posty: 217
    Pomógł: 5
    Ocena: 74
    Z timerem napisałem program --> jest w pierwszym poście (dostosowany do 1Mhz ale łatwo przerobić na 4,8 Mhz) ale ktoś pisał że się procek nie będzie wyrabiał i że na skok do przerwania też jest potrzebny czas. Poza tym nie jestem pewny czy dał bym radę zrobić wypełnienie odpowiednie (ok.90 %) - raczej tak ale pewny nie jestem.

    Dla 4,8 Mhz :
    Config Pinb.0 = Output
     
    Config Timer0 = Timer , Prescale = 1
    Enable Interrupts
    Enable Timer0
    On Timer0 Modulacja
    Timer0 = 170
     
    Do
    If Timer0 = 247 Then Portb.0 = 1 ' Wygaś diodę tuż przed przepełnieniem timera
    Loop                                           'wypełnienie ok. 90%
    End
     
    Modulacja:
    Timer0 = 170
    Portb.0 = 0      'zapal diodę
    Return


    4 800 000 Hz / 255 + 1 - X = 56 000
    X = ok. 170

    Krauser napisał:
    ale to i tak nie będzie dokładnie ponieważ skok do procedury przerwania też zajmuje minimum 4 cykle zegara


    1) Dobrze to jest ? Szczególnie czy można taki warunek wstawić "If Timer0 = 247 Then... " ?

    2) A tak wogóle to czemu mi ten program z pwm nie działał? I co dopisać żebym miał wypełnienie np. ok. 90% w programie z pwm.
  • #17 11050187
    Krauser
    Poziom 26  
    Posty: 508
    Pomógł: 124
    Ocena: 12
    Wojtek001 napisał:
    Kompilator czyi BASCOM-AVR "myśli" jednak że będzie działał na 1Mhz.

    Kod: text
    Zaloguj się, aby zobaczyć kod

    lub opcje kompilatora sprawią, że waitus będzie takie jak sobie wpiszesz w kodzie.

    ATtiny13A.pdf mówi, że skok zajmuje 2 cykle zegara.

Podsumowanie tematu

✨ Użytkownik pracuje nad programem dla mikrokontrolera ATtiny13A, który ma współpracować z czujnikiem TFMS 5560, wymagającym sygnału modulowanego o częstotliwości 56 kHz. Pojawiają się pytania dotyczące wypełnienia sygnału oraz zachowania czujnika przy długotrwałym działaniu. Uczestnicy dyskusji sugerują użycie PWM do generowania sygnału, omawiając różne ustawienia rejestrów oraz częstotliwości taktowania. Wskazują na możliwość użycia wewnętrznego oscylatora 8 MHz oraz modyfikacji fusebitów. Pojawiają się również wątpliwości dotyczące zasilania z baterii oraz wpływu na działanie diody IR. Użytkownik testuje różne programy, w tym prosty kod do migania diodą, oraz próbuje dostosować program PWM do uzyskania odpowiedniego wypełnienia.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA