Skocz do zawartości

Generowanie sygnału modulowanego


Wojtek

Pomocna odpowiedź

Proszę o sprawdzenie poniższego programu do Attiny13 (napisany w BASCOMIE). Ma on za zadanie generować przez cały czas sygnał o modulacji 56kHz do diody ir.

Domyślnie częstotliwość taktowania w prockach AVR to 1Mhz.

Ja chcę uzyskać częstotliwość 56Khz.

Policzyłem że jeden cykl trwa więc 1 000 000 us / 56 000 = 17,86 us

Przy każdym wywoływaniu Timera będzie następowało odwrócenie stanu logicznego wyjścia PB4 a więc będzie realizowane pól cyklu.

Odstępy pomiędzy kolejnymi wywołaniami timera powinny być więc równe około 9 taktów oscylatora bo:

17,86 zaokrąglamy do 18 i dzielimy na 2 czyli 9

Timer0 jest jedno bajtowy więc żeby uzyskać wywoływanie go co 9 taktów należy wpisywać do niego wartość 246 bo 255 - 9 = 246

Ktoś mi napisał że może coś się dziać jeśli czujnik otrzyma zbyt długo sygnał - niestety w nocie katalogowej TFMS 5560 nie znalazłem nic na ten temat.

Ten ktoś twierdził że paczka impulsów nie może przekroczyć 30/ 60 cykli co by czasowo wychodziło zaledwie pól mini sekundy. Chyba trochę za krótko? Ponadto czytałem artykuł Edw "najprostsze zdalne sterowanie" i też nic nie wspomniano o domniemanej granicy długości paczki impulsów.

Oto program:

Config Portb = &B11111
Portb = 11111

Config Timer0 = Timer , Prescale = 1
Enable Interrupts
Enable Timer0
On Timer0 Modulacja

Do
Loop
End

Modulacja:
Timer0 = 246
Toggle Portb.4
Return

Czy dobrze to na pisałem i wyliczyłem? Głownie o obliczenia chodzi bo program jest prościutki 😉

__________

Komentarz dodany przez: Nawyk

Do zamieszczania kodu źródłowego służy w edycji posta przycisk "Code" (znaczniki [ code] i [ /code])

Link do komentarza
Share on other sites

W Bascomie nie piszę, więc skorygować by musiał kto inny, ja napiszę teorię. Modulacja to co innego, chcesz generować sygnał o częstotliwości, a nie modulować go, bo modulacja to zmiana jego "wyglądu" tak brzydko mówiąc. 18 cykli dobrze obliczyłeś, dzielenie tak samo, z tym wyjątkiem że Timer0 ma Ci zliczyć do 9, a nie tak jak to tam odjąłeś nie wiadomo dlaczego. Co do długości nadawania sygnału, pierwszy raz coś takiego słyszę, prędkość nadawania owszem (bps) ale nie takie coś.

Link do komentarza
Share on other sites

Gdyby za podstawę przyjąć stale nadawany strumień IR, to ten z nałożoną nośną 56kHz jest już zmodulowany w odróżnieniu od fal radiowych, gdzie podłączenie baterii do anteny nie powoduje ciągłej transmisji sygnału 0Hz 🙂 Z punktu widzenia diody nadawczej IR, te 56kHz to już jest modulacja - nazywanie zależy od punktu widzenia.

Mam zupełnie inną wątpliwość ale najpierw o timerze. Wojtek, teraz zrobiłeś tak, że za każdym przerwaniem muisz przeładowywać timer. Dobrze policzyłeś wartość ale przy takim sposobie pracy całość nie uwzględnia czasu reakcji na przerwanie. Procesor zużywa trochę czasu od momentu zgłoszenia przerwania do wejścia do funkcji je obsługującej. Potem trochę czasu marnuje na zachowanie swojego stanu (tego w kodzie nie widać) a dopiero potem nastąpi wykonanie instrukcji przeładowującej timer. Z tego powodu zawsze będzie istniał stały błąd plus nieokreśloność rzędu 1-2 zegarów związana z samym procesem synchronizacji z cyklem rozkazowym procesora. To trochę tak, jakbyś gotował 3 minutowe jajka odmierzając czas klepsydrą 5 sekundową. Nie zawsze odwrócisz ja tak samo szybko a w dodatku czasem zagapisz się w okno i dodatkowy (nie do nadrobienia) błąd gotowy. Na szczęście zostawiono w attiny13 tryb CTC (Clear Timer on Compare Match) - zajrzyj do odpowiedniego rozdziału w danych katalogowych. Jeżeli przestawisz timer w ten tryb to wystarczy, że załadujesz do OCR0A wartość 8 (czy ile tam potrzebujesz) a timer za każdym razem gdy osiągnie tę wartość zostanie automatycznie wyzerowany i zgłosi przerwanie (inne niż teraz!). Wtedy timer staje się blokiem liczącym czas niezależnie od procesora a przerwanie będzie zawsze zgłaszane co 8+1 taktów wybranego zegara. Nawet jeśli procesor raz czy drugi zmarudzi i opóźni któreś zbocze o takt czy dwa, w sumie częstotliwość będzie jak drut. Możesz pojść dalej: masz tryb Fast PWM a w jednej z jego odmian możesz ustawić nie tylko wypełnienie (to oczywiste) ale także okres. Reszty już się domyślasz. Odpowiednie wyjście będzie zupełnie samo zmieniało swój stan i generowało falę 56kHz a procesor może w tym czasie nie robić nic lub coś ciekawszego niż prostokąt 56kHz.

No a teraz moja wątpliwość. Zmuszanie prcesora do obsługi przerwania co kilkanaście taktów zegara jest mocno ryzykowne. Przecież instrukcje nie wykonują się w czasach zerowych a do tego dochodzą jeszcze opóźnienia o których już pisałem: wejście do funkcji przerwania i wyjście z niej. Nie wiem, czy BASCOM generuje listing asemblerowy kodu ale gdybyś mógł zobaczyć kod wynikowy np. w AVR Studio to wtedy może się okazać, że po prostu całość kodu (funkcja obsługi przerwania + powrót + przynajmniej jeden skok do samego siebie w pętli "do loop") zabierają więcej czasu niż procesor ma i tak dużej częstotoliwości przy zegarze 1MHz nie wygenerujesz programowo. Pomyśl o tych bardziej zaawansowanych (tylko z nazwy) trybach timera - nie daj im się marnować, skoro już za nie zapłaciłeś kupując procesor 🙂

  • Lubię! 1
Link do komentarza
Share on other sites

Zajrzałem parę rozdziałów dalej do mojej książki "Mikrokontrolery dla początkujących" i mam takie coś:

Config Pinb.0 = Output

Pwm0a =  85        
Config Timer0 = Timer , Prescale = 1 , Compare0A = Toggle , Clear Timer = 1

Do
Loop
End

Początkowo chciałem przełączyć Attiny13A na wewnętrzne taktowanie 8Mhz ,ale podobno nie ma taktowania 8Mhz dla tego procka, więc musiałem użyć wewnętrznego oscylatora 9,6 Mhz ( i z takim taktowaniem jest kompatybilny powyższy program).

1) Proszę o sprawdzenie i obliczenie - czy będzie ten program generować sygnał na nóżce PB0 z częstotliwością 56khz?

2) Czy przy taktowaniu 9,6 Mhz procesorowi wystarczy napięcie 2,7 v (bo zasilam z baterii pastylkowej - teoretycznie mającej 3v ale praktycznie 2,7 v) ?

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

Wojtek, z całym szacunkiem ale jaja sobie robisz? Mając książkę plus cały internet piszesz "podobno nie ma taktowania 8Mhz dla tego procka"? Naprawdę łatwiej Ci napisać tak żałosne zdanie niż samodzielnie tę wiedzę uzyskać? Podstawowym źródłem informacji o elementach elektronicznych są dane katalogowe wydawane przez ich producentów. Nie forum, nie jego użytkownicy i nie "podobno", tylko dane katalogowe. Dopiero gdy tam się nie doczytasz (a są to naprawdę rzadkie przypadki), masz kłopot. Ty nie masz na razie żadnego. Odpowiedzi na wszystkie Twoje problemy zawiera poniższy dokument (pierwsze trafienie googla na zapytanie "attiny13a"):

http://www.atmel.com/Images/doc8126.pdf

Nawiasem mówiąc w jaki sposób wybrałeś ten procesor do swoich zabaw, że dopiero teraz pytasz o takie rzeczy? Czy był pierwszy na jakiejś liście w kolejności alfabetycznej? A może najtańszy? Kolega Ci podpowiedział? Pierwsze co robisz (zanim kupisz) to szukasz danych swojego kandydata. Patrzysz na pierwszą stronę i od razu masz spis wszystkich najważniejszych cech i zasobów. Jest timer (jeden - szkoda), przetwornik A/D, komparator, EEPROM itd. Przeglądasz spis treści, znajdujesz rozdział o taktowaniu (6 System Clock and Clock Options -> 6.2 Clock Sources -> 6.2.2 Calibrated internal 4.8/9.6MHz Oscillator) i już wiesz nie tylko, jakie są możliwości taktowania ale też jak je ustawić i jakie mają specyficzne cechy stosowania. W razie wątpliwości związanych z szybkością przy zasilaniu z baterii otwierasz rozdział 18.3 "Speed" i patrzysz na wykres. Timer? Proszę bardzo: ponad 20 stron o wszystkim, co go dotyczy...

Nie piszę w BASCOMie więc niech się wypowiedzą eksperci ale jeśli intencją Twoją była zmiana stanu wyjścia OC0A po każdej komparacji i wyzerowaniu timera, to dobrze myślisz a wartość wpisana do rejestru okresu jest OK. Przy jej obliczaniu pamiętaj (jest to dokładnie narysowane w danych katalogowych), że timer będzie się zerował po stanie w którym komparacja zaszła, czyli wpisując liczbę 85 timer będzie przechodził przez 86 stanów (0...85) i co tyle cyknięć zegara będzie coś się działo. Obliczając 9.8MHz/56kHz/2 dostajemy dokładnie 85.7 okresów zegara co jest bliższe 86, więc podział przez tyle będzie bliższy 56kHz. Inna sprawa, że stałość częstotliwości oscylatora w zależności od temperatury jest słabiutka (wykresy na stronie 154) więc wszelkie mega-dokładne obliczenia i tak biorą w łeb przy zmianie z lata na zimę 🙂

Czy z tej baterii o której pisałeś chcesz także napędzać diodę nadawczą IR? Jeśli tak, to jeszcze raz się zastanów. Skoro przy zasilaniu samego procesora (kilka mA) spada z ponad 3V do 2.8 to co będzie, gdy dioda IR pociągnie (średnio) 50mA ?

Link do komentarza
Share on other sites

Nie chodzi o to że spada o te 0,3 v pod wpływem obciążenia mirkokontrolera. Po prostu bateria fabrycznie nowa powinna mieć 3v a ma tak naprawdę 2,7 v.

Co do wykresu taktowania od napięcia zasilania to podziałka na tym wykresie jest tak narysowana że nie da się precyzyjnie ustalić czy będzie działać bo to 3v jest na granicy.

Niestety moja książka nie zawiera informacji na temat wszystkich procków AVR - bliżej omówiony jest jedynie Attiny2313 i to na nim właśnie opiera się kurs.

Jak wybieram procka?

Przychodzę do sklepu elektronicznego i proszę dowolnego Attiny (8-nóżkowego). Gdybym sobie upatrzył jakiś konkretny model, poszedł do elektronicznego - na 90 % bym go nie dostał. Nie mam też możliwości dokładnego przeanalizowania parametrów proponowanych mi uC ponieważ za ladą sklepu nie mam dostępu do danych katalogowych.

Myślę że zmienianie stanu logicznego na wyjściu 112 000 razy na sekundę nie jest aż tak skomplikowane żebym potrzebował jakiegoś wykwintnego procka. Mógłbym to zrobić na NE555 ale myślałem (i nadal myślę) ,że na uC będzie łatwiej.

Złożyłem już płytkę pilota i wgrałem do uC testowy program który miał za zadanie migać co sekundę diodą ir - działa. Dzisiaj zajmę się przestawieniem fusebitów. Co do dokładności modulacji to odchył może wynosić nawet kilkadziesiąt procent ponieważ mój czujnik reaguje na szerokie pasmo częstotliwości (w praktyce , nie w teorii więc masz swój dataszid który tylko co najwyżej w by mnie mógł w błąd wprowadzić).

Niestety, jeśli nie wie się gdzie dokładnie szukać (a ciekawe skąd ma wiedzieć to początkujący) trudno znaleźć konkretne informacje w datasheetcie (pomijając już to że jest w obcym języku).

Link do komentarza
Share on other sites

Nie wiem o jakiej baterii dokładnie piszesz ale pastylkowe baterie 3V mają ok. 3.2V gdy są nowe i nieobciążone. Są też bardzo delikatne. Jedno przypadkowe zwarcie lub próba pociągnięcia więcej niż prąd katalogowy zmniejszają bezpowrotnie napięcie a i pojemność takiej baterii spada drastycznie. To pewnie Twój przypadek. Jak się domyślam, nie sprawdzałeś (w danych katalogowych, a gdzież by indziej) ile prądu możesz z niej pobrać by móc tak kategorycznie wyrokować o napięciach.

Jeśli nie da się z wykresu ustalić załóż, że nie możesz tego zrobić. To na pewno bezpieczniejsze niż liczenie, że jakoś to będzie.

Książka nie zawiera? To słabe wytłumaczenie. Książka wydana po polsku jest źródłem wtórnym, opartym na ogólnodostępnych danych katalogowych i doświadczeniach programistycznych autora.

Jak nie krytykuję tego procesora. Jest dobry do pewnych zastosowań i do tego pewnie akurat pasuje bardzo dobrze. Dziwię się tylko temu, że nie wiesz rzeczy, które powinineś był sprawdzić zanim go kupiłeś.

Wystarczy porównać odchyłki częstotliwości oscylatora przy przewidywanych przez Ciebie zmianach warunków pracy (temperatury i zasilania) z tym, co pisze producent czujnika. Dane katalogowe zawierają parametry do których utrzymania producent się zobowiązuje. Wszystko inne, co jest poza tym zakładasz/robisz na własną odpowiedzialność. Czujnik ma w praktyce szersze pasmo? Nie sądzę, jeśli jest odpowiedni wykres w katalogu to podawany jest raczej najgorszy przypadek, bo gorsza selektywność filtra pogarsza stosunek sygnału do szumu i tym samym pogarsza czułość. Moim zdaniem promieniujesz tak dużo mocy, że nawet daleko od częstotliwości środkowej przechodzisz sygnałem przez filtr, który przecież ma jakąś skończoną dobroć. Gdybyś tę samą częstotliwością pobudzał czujnik na granicy minimalnej mocy promieniowania, nic by nie wykrył. A częstotliwość do której był przeznaczony - i owszem, bo do tego właśnie producent się zobowiązał.

Zdziwiłbyś się jak bardzo może być skomplikowane zmienianie stanu logicznego na wyjściu 112000 razy na sekundę. Wszystko zależy od przyjętych kryteriów. Wystarczy, że ktoś zażąda stabilności rzędu 10ppm albo szybkości narastania np. 5kV/us. Nie jest tak u Ciebie? To masz szczęście.

Teraz już wiesz gdzie szukać - to chyba największy pożytek z tej dyskusji 🙂

Link do komentarza
Share on other sites

Nic już nie muszę szukać bo wszystko mi już działa wyśmienicie 😉 .

Co do książki to nie podaje informacji na temat obsługi procesorów AVR (jedynie jeden rozdział dotyczy budowy Attiny2313 i to wszystko ,czyli nic co mi aktualnie potrzebne).

Ten program co podąłem a ty go podobno sprawdziłeś nie działał - nie wiem czemu ale nie znam się jeszcze na pwm. Zrobiłem więc to na bazie polecenia waitus ( nie znoszę tego polecenia, już wolałem to w oparciu o jakąś inkrementującą zmienną zrobić ale mi się ta zmienna nie mieściła w tym procku ) uwzględniłem że np. powrót do początku pętli, ustawianie jakiegoś tam stanu na wyjściu zajmuje tych parę cykli. Ważne okazało się być również to że lepiej ustailić jak najwyższe wypełnienie czyli u mnie ok. 90%. Użyłem taktowania 4,8 Mhz żeby bardziej "nasycić" diodę ir aby wysyłała silniejszy sygnał.

Udało mi się upchać parę linijek programu ,które pozwoliły mi zbierać dane z czujnika przez odrębne wejście niż to do którego podłączony jest przycisk. Zrozumiałem ,że tranzystor i tak mi nie jest potrzebny (nawet gdyby i czujnik i przycisk były podłączone do jednego pinu) ,ale nie omieszkałem sprawdzić że tranzystor podłączony tak jak podałem na schemacie w innym temacie działał (wbrew temu że mówiłeś marek że działać nie będzie).

Jeśli twierdzisz że czujnik 56 khz nie będzie odbierał innych częstotliwości to znaczy że nigdy takowego nie miałeś w ręce. Reaguje tak samo dobrze na sygnał z pilota philips (36 khz) jak i sony (40khz) - i nie ma mowy tu o żadnej przesadzie z mocą bo to oryginalne piloty.

Zacytuje tutaj klasyka:

" Wyjaśnię to dosyć prosto. Jak podłączysz to sam zobaczysz 😉 .... Nie będę się o tym znowu rozpisywał. Podpowiem ci tylko że czułość spada, ale czułość względem jakiegoś tam wzorcowego sygnału biorąc pod uwagę jego natężenie że tak powiem w uproszczeniu.

Owszem filtr na 56kHz pewnie mocniej ograniczy taki zasięg gdy pilot będzie nadawał z nośną np 32kHz niż taki, który będzie nadawał z 36kHz albo 40kHz ale to chyba zrozumiałe.

Zresztą - podoba mi się to - rozważania czysto teoretyczne przez 5 miesięcy a potem w pół godziny, ba 5 minut wszystkie twoje założenia wezmą w łeb 😉 bo czujnik zareaguje na każdego pilota."

"Dlatego praktycznie na dowolnym odbiorniku TFMS czy to będzie 32kHz czy 40kHz czy 56kHz to i tak np można zrobić odbiornik pilota, który będzie działał np z pilotem RC5, który z kolei standardowo pracuje na nośnej 36kHz. Jedynym ujemnym efektem zastosowania odbiornika 56kHz będzie tylko nieznaczne zmniejszenie zasięgu np z 10m do 8m i to wszystko."

Mirekk36 z elektrody

Link do komentarza
Share on other sites

Programu nie sprawdziłem, napisałem tylko, że idea zmiany stanu pinu co każde przepełnienie i sprzętowe wyzerowanie timera jest słuszna. Realizacja BASCOMowa może nie działać, nie znam się na tym i nie wiem jak kompilator tego języka przełoży zaprezentowaną linijkę kodu na rzeczywiste wartości rejestrów procesora. W każdym razie sprzęt w tiny umożliwia taką implementację generatora fali prostokątnej. Przykro mi, jeśli ten kompilator ma ograniczenia lub tak dobrze "przykrywa" sprzęt, że nie możesz tego w ten sposób zrobić lub ma tak marną dokumentację lub nie chce Ci się do niej zajrzeć - niepotrzebne skreślić.

Nasycanie diody IR to oczywiście bzdura. Jeśli musisz zwiększyć wypełnienie przebiegu sterującego powyżej 10-20% to znaczy, że zrobiłeś zły driver. Dioda załącza się w czasie rzędu ns i przy poprawnym sterowaniu nie potrzebuje tak długich impulsów prądu. Moc wysyłana przez tę diodę nie zależy od długości załaczenia tylko od wartości chwilowej prądu diody. Zrób poprawny driver a zaoszczędzisz dużo cennej energii. W tej chwili prawdopodobnie wolno załączający się driver (jakkolwiek wygląda) lub spadające zasilanie powoduje, że na elemencie szeregowym (gdziekolwiek on jest) niepotrzebnie zamieniasz prąd na ciepło. Przyłóż się do tego i zastanów, bo działanie czysto "objawowe" jakie prezentujesz obecnie powoduje jedynie zwiększenie samozadowolenia a nie poprawę jakości działania Twoich projektów.

Napisałem, że będzie działać marnie. Zaproponowane przez Ciebie podłączenie tranzystora jest głupie a sam element robi za diodę B-E. Sam fakt testowania takiego połączenia świadczy o niezrozumieniu idei stosowania tranzystorów bipolarnych - nie wiem o czym tu jeszcze pisać. Nie rozumiem co tym eksperymentem chciałeś udowodnić - uwaga j.w.

Nie pisałem, że nie czujnik 56kHz nie będzie odbierał innych częstotliwości tylko, że będzie je odbierał gorzej, zgodnie z charakterystyką wbudowanego filtru. O co tu się spierać? Jego tłumienie poza pasmem przepustowym spowoduje utratę zasięgu, zgadzam się z "klasykiem" - to żadne odkrycie, po to są filtry.. Zakres dynamiki całego toru odbiorczego czujnika plus wbudowane ARW plus duże moce nadawane powodują, że przez wbudowane filtry przejdzie i zostanie zdetekowany sygnał IR z praktycznie każdego pilota - ale czego to dowodzi? Że stosowanie filtrów nie ma sensu? Że "złapałeś" producenta na oszustwie (bo jest filtr a jakby go nie było, bo inny pilot działa)? A może to, że niezbyt dobrze czujesz się w dziedzinie filtrów, że jest Ci obce pojęcie dobroci, stromości ch-ki częstotliwościowej, rzędu filtra itp? Filtr w takim czujniku wcale nie jest po to, by odróżnić "swojego" pilota od "obcego" tylko po to, by odciąć się od zakłoceń które leżą o wiele dalej. Od lamp wyładowczych, świetlówek i żarówek 50Hz itp Byłoby naprawdę bardzo trudno zbudować tak ostro tnący filtr analogowy, by wyciął np. z tłumieniem 30-40dB (bo taki pewnie jest zakres dynamiki detektora w czujniku) częstotliwość tylko 2 razy (nie mówiąc o mniejszych stosunkach) wyższą lub niższą od zadanej. Takie rzeczy można robić z odpowiednio długimi filtrami cyfrowymi ale nikt rozsądny nie wbuduje czegoś takiego w czujnik za 3 złote bo po co?

Podziwiam Cię za tak zdecydowane poglądy na temat elektroniki ale - skoro już cytujemy klasyków, jeden z nich powiedział "wiem, że nic nie wiem". Wygląda, iż zaczynasz wierzyć w swoją wiedzę opartą na godzinnej praktyce z lutownicą przy kleceniu trywialnego układziku, którego działania do końca chyba jednak nie rozumiesz:

"Nic już nie muszę szukać bo wszystko mi już działa wyśmienicie "

Twoja pogarda dla rzeczywistej wiedzy do której wyraźnie chcesz dojść na skróty jest przykra. Więcej pokory a dalej zajdziesz. Powodzenia. Szczerze.

Link do komentarza
Share on other sites

I tak rozwiązałem już swoje problemy (cel osiągnąłem jaki zamierzałem - nie ważne jakim sposobem) ale jak chcesz na rejestrach to masz (dla taktowania 4,8 Mhz z wypełnieniem 50%) :

DDRB = 0B00000001 'DDRB.0 = 1 (wyjście)
OCR0A = 42
TCCR0A = 0B01000010 'COM0A1 COM0A0 = 01 (Toggle) WGM01 WGM00 = 10 (CTC)
TCCR0B = 0B00000001 'CS02 CS01 CS00 = 001 (Preskaler = 1)

Do
Loop
End

4 800 000 / (2 * 1 * [ 1 + x ]) = 56 000

x = 41,857142 = ok 42

Proszę bardzo - użyj swojej asemblerowskiej wiedzy i wskaż błąd.

Co do tego tranzystora to nie użyłem go tylko dlatego ,że znalazłem nieco miejsca w programie aby doprowadzić czujnik na odrębne wejście niż przycisk. W przeciwnym razie musiał bym go użyć żeby uzyskać sensowny zasięg, bowiem wejście do którego był podłączony przycisk było chronione przed efektem drgania styków - wobec tego sygnał na tym wejściu musiał być równy co najmniej 20ms. Po obserwacji działania czujnika stwierdziłem jednak że nie jest on wstanie utrzymywać na swoim wyjściu zbyt długo sygnału dlatego musiał bym użyć tranzystor (z obserwacji wynikało że dzięki niemu sygnał utrzymywał się dłużej).

Co do diody to może być też wina długości fali jakie wysyła. Z noty wynika że czujnik najlepiej reaguje na długości równo 950nm. Niestety jak już wspomniałem stojąc za ladą sklepu nie jestem w stanie ocenić wszystkich parametrów danego elementu.

2 posty temu napisałeś:

"Czujnik ma w praktyce szersze pasmo? Nie sądzę, jeśli jest odpowiedni wykres w katalogu to podawany jest raczej najgorszy przypadek, bo gorsza selektywność filtra pogarsza stosunek sygnału do szumu i tym samym pogarsza czułość."

Już zmieniłeś zdanie?

Tu masz link do noty katalogowej (drugi pdf od góry)

http://www.datasheetarchive.com/tfm%205560-datasheet.html

Na 3 stronie(tytuł : Typical Characteristics)masz pierwszy wykres zatytuowany "relative Frequency".

Wykres ten pokazuje Względną czułość w odniesieniu do odniesienia częstotliwości nośnej od standardowej. Czyli np. dla odchylenia o 20% czułość spada o 80%. Z twojej wypowiedzi w ostatnim poście oraz z moich doświadczeń praktycznych wynika że jest to nieprawdą. Czyli sam sobie zaprzeczyłeś.

Link do komentarza
Share on other sites

O, nie wiedziałem, że BASCOM umożliwia takie bezpośrednie zapisy do rejestrów. To bardzo fajnie, większość przykładów pokazywanych na Forum korzysta z jakichś magicznych zapisów jak Twój z książki:

Config Timer0 = Timer , Prescale = 1 , Compare0A = Toggle , Clear Timer = 1

Można się z tego domyślić idei (jak ja próbowałem) ale szczegóły implementacji są jednak ukryte. Nowy zapis który pokazałeś nie pozostawia wątpliwości co do operacji na sprzęcie i to jest jego zaleta, moim zdaniem. Z drugiej strony na pewno jest mniej komunikatywny. Co kto lubi, prawda? Wiesz, raczej nie biorę udziału w konkursach. Wiedza "asemblerowa" rozumiana jako pisanie programów w kodzie asemblera raczej tu się nie przyda. A "grzebanie w rejestrach" jest takim samym chlebem powszednim zarówno w języku asemblera jak i w C chyba, że napiszesz sobie lub wykorzystasz odpowiednie bilbioteki. I tu i tu można wtedy o rejestrach i bitach zapomnieć. Z przedstawionego kodu wychodzi mi, że powinno działać i na wyjściu OC1A powinna pokazać się fala prostokątna. Pin jest wyjściem, tryb ustawiony na toggle a timer na CTC z odpowiednim okresem. Pomijając częstotliwość taktowania procesora, to coś tam na wyjściu powinno mrugać 🙂 Nie mam tiny13 ale mam 44. Ze struktury i rejestrów timer 0 wygląda identycznie więc może uda mi się dzisiaj puścić jakiś test.

Stosowanie tranzystora na wyjściu czujnika z wyjściem dwustanowym po to by zwiększyć zasięg jest bez sensu. Spokojnie, wiem co chciałeś zrobić. Rozumiem, że czujnik dawał za krótkie impulsy i układ/funkcja odkłócająca sygnał z przycisku wycinała je na wejściu ale do przedłużania służy kondensator. Mając wyjście typu open-collector wystarczyło podłączyć kondensator bezpośrednio do wyjścia czujnika (i do masy). Wtedy tranzystor (ten wewnątrz czujnika) by go szybko rozładowywał a opornik podciągający powoli ładował i miałbyś przedłużanie impulsów bez żadnych dziwnych sztuczek. Nadal twierdzę, że Twój tranzystor tak podłączony robił za diodę a to ona dopiero w połączeniu z jakimiś pojemnościami na wejściu tego czegoś co odbiera sygnał dawała zauważone przez Ciebie wydłużanie. Efekt uzyskałeś przypadkowo a z takiego wyniku nie ma się co cieszyć. Wciąż uważam, że nie wiesz jak działa to co zrobiłeś i mam cichą nadzieję, że nie jest to urządzenie od którego funkcjonowania zależy coś więcej niż Twoje zadowolenie (i w takim przypadku ważne jest - wbrew temu co piszesz, jakim sposobem to zrobiłeś).

Moc promieniowana nie zależy od długości impulsu ani od długości fali. Jeżeli zauważasz zwiększenie zasięgu przy wydłużaniu impulsów sterujących to oznacza, że Twój driver nie włącza diody IR "od razu" tylko powolutku. Wtedy dłuższy impuls pozwala na dojechanie do sensownego prądu ale zauważ, że w tym czasie jest elementem liniowo ograniczającym prąd (czyli grzejącym się) - wszystko jedno czy to czujesz palcem czy nie. Dlatego dobry i szybki driver diody IR jest ważny, szczególnie w takim nadajniku, gdzie źródłem zasilania jest bateria. Jeżeli faktycznie nie trafiłeś pasmem IR w ch-kę czułości detektora, przysiądzie wszystko ale opisane wyżej zjawisko nadal będzie miało miejsce i takie samo będzie jego wytłumaczenie. Potwierdzeniem faktu, że czujnik naprawdę nie potrzebuje długich impulsów (jeśli już je nadajesz) a wręcz są one szkodliwe niech będzie wykres nr 9, "Sensitivity vs. Duty Cycle" czyli czułość w zależności od wypełnienia. Wszystko działa dobrze do 35% a potem minimalne "oświetlenie" czujnika gwałtownie rośnie. Wniosek: trzeba nadawać krótko, być może nawet pojedyńcze procenty (5-10) wypełnienia. Wszystko co powyżej jest stratą energii w nadajniku a co gorsza "zatykasz" czujnik i zamiast lepiej robi się gorzej. Aby takie impulsy wysłać w powietrze, trzeba mieć jednak dobrze sterowany driver.

A teraz o filtrze. Wskazany wykres pokazuje, że jest to typowy, niewyczynowy filtr o dobroci 10. Takie coś możesz sobie zrobić z pierwszej lepszej cewki i kondensatora a i tak dobroć pewnie będzie dwa razy lepsza. W scalaku to osiągnięcie, bo tam na cewki nie ma miejsca ale nie o to chodzi. Nie mam powodu nie wierzyć, że czułość nie spada tak jak narysowali tylko co to oznacza? Jeśli wchodzimy w takie szczegóły, to trzeba też szczegółowo czytać. Minimalne oświetlenie (Eemin) zdefiniowane jest w tabelce Basic Characteristics jako 0.4mW/m2 ale dla sygnału testowego opisanego na rysunku 7. I co tam jeszcze jest napisane? Że dla takiego właśnie sygnału warunkiem zaliczenia testu było przedłużenie lub skrócenie impulsu wyjściowego względem paczki wejściowej o ±160us. Dlaczego mieliby nas tu oszukiwać? Zwykle nasze eksperymenty nie uwzględniają takich warunków pracy. Coś nadajesz, nie wiesz z jaką mocą więc nie wiesz co dociera do detektora i patrzysz, czy cokolwiek dostałeś (w przypadku udawania przycisku) lub czy procesor (lub inny dekoder) wykrył jakiś kod czyli sekwencję bitów jakoś zakodowanych. Ponieważ tolerancje wbudowane w funkcje dekodowania są szerokie, może naprawdę dużo złego po drodze się zdarzyć a i tak wynik będzie pozytywny. Co z tego, że filtr zmniejszy czułość, skoro i tak jesteśmy np. 10 czy 100 razy razy powyżej minimalnego progu czułości samego czujnika a jeszcze dodatkowo mamy zapas "w algorytmie"? Zobacz, maksymalne oświetlenie czujnika to 20W/m2 - stosunek max/min wynosi 50000, czyli ponad 90dB. Nie sądzę, żeby aż tak głębokie ARW stosowali - to byłoby naprawdę bardzo trudne do zrobienia więc pewnie głębokość automatyki wzmocnienia to max. 40dB. Dla sygnału testowego ma ona wręcz komfortowe warunki pracy i będzie robiła naprawdę wiele, by zachować jakość sygnału. O innych sygnałach producent praktycznie się nie wypowiada. Stosujemy je na własną odpwowiedzialność ale nadal twierdzę, że nie mamy podstaw nie wierzyć w te wykresy. Tak działający układ chroni raczej przed wpływem odległych (częstotliwościowo) zakłóceń niż od pilota "obcej" firmy a wpływ filtra przy dużych sygnałach jest maskowany przez ARW. W normalnych warunkach pracy to co obetnie filtr "podciągnie" ARW i wciąż będzie "dobrze", a w skrajnych.. no cóż, trzeba je najpierw uzyskać czyli zbudować układ nadajnika z kontrolowaną mocą promieniowaną, wzorcowym sygnałem testowym itd.. Mi się nie chce.

  • Lubię! 1
Link do komentarza
Share on other sites

Raz mi się zdarzyło ,że przez pomyłkę podłączyłem odwrotnie zasilanie (właśnie z takiej pastylkowej baterii - 3 v) do Attiny13 . Może uszkodziło to sprzętowy pwm? Ale wydaje mi się to mało prawdopodobne żeby pwm się uszkodził a reszta procka działała (bo komputer łączy się z mikro kontrolerem bez problemu).

Z drugiej strony kiedys odwrotnie podłączyłem Atmege8A i wszystko jest dobrze (przynajmniej na to wygląda 🤣

Co do ekstremalnych warunków to zauważyłem że jak włączę swój spory ekran LCD w TV i postawię blisko niego mój czujnik to zasięg spada o połowę , więc jakbym chciał coś badać to nie muszę nic budować 😅 .

W moim przypadku nie było to priorytetem aby wykluczyć zakłócenia z innych pilotów. Przede wszystkim chodziło mi o ir docierające do nas zewsząd wraz ze światłem widzialnym.

"Wiedza "asemblerowa" rozumiana jako pisanie programów w kodzie asemblera raczej tu się nie przyda. "

No nie wiem ,ale mi się assembler kojarzy przede wszystkim z bezpośrednim dzianiem na rejestrach. Co do BASCOMA-AVR to można tam nawet bez problemu rozbić wstawki assemblerowe - wszystkie polecenia assemblera są rozumiane przez ten kompilator.

Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.