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

[ATmega][c]Bardzo dokładny pomiar czasu

PietrekDer 25 Gru 2010 12:03 4530 12
REKLAMA
  • #1 8910379
    PietrekDer
    Poziom 13  
    Witam
    Otóż mój problem polega na wykonaniu dokładnego pomiaru czasu, powiedzmy z dokładnością do 1ms, albo nawet 0.1ms. Oczywiście nie ulega wątpliwości że do tego będą potrzebne timery itd itp. Ale nie w tym problem. Problemem przy pomiarze tak krótkich czasów zaczynają stwarzać np drgania styków (coś musi uruchamiać ten licznik), jak też ew opóźnienia przy zastosowaniu jakichś obwodów RC odkłócających drgania. Przykładowo, jeśli zastosuje się rezystor 10k i kondensator 100nF, napięcie osiągnie (teoretycznie) wartość ok 3V po 1ms. (Ze wzoru U = Uzas*(1-e^(-t/RC)), Uzas=5V). Oczywiście to jest czysto teoretyczne podejście do sprawy. Nie wiem w jakich granicach można dobierać R i C, ale np 1k i 100nF dałyby już bardzo małe opóźnienia, rzędu 10uS do 3V. A może wykorzystać zbocze narastające czy opadające na jakimś INTx? Z tym że też należałoby się zastanowić, czy drgania nie wywołają dwóch przejść przez stan załączenia w odstępie dziesiątych czy setnych części milisekundy.

    Chociaż też się zastanawiam, czy to w ogóle ma sens, pomiar z dokładnością np 0.1ms, z racji że licznik odpalany by był jakimiś zewnętrznymi stykami, (nie wiadomo jakimi, co kto by podłączył), wchodzi też w grę czas zadziałania styku (np dla przekaźników są do wartości ~10ms). Ale może w pewnych warunkach, można by to pominąć.

    W każdym bądź razie, myślę że w miarę naświetliłem problematykę zagadnienia, i o co mi mniej więcej się rozchodzi :)
  • REKLAMA
  • #2 8910442
    _Robak_
    Poziom 33  
    Najpierw sam się zastanów czy rzeczywiście chcesz zliczać czas z tak dużą dokładnością i postaw problem. Zliczanie czasu z Twoją dokładnością na atmedze nie jest żadnym problemem, Problemem może być tak jak wspomniałeś wyeliminowanie drgań styków. Jeśli wiesz że czas pomiędze dwoma kliknięciami nie będzie krótszy niż np. sekunda, to możesz wykorzystać, tak jak pisałeś, zewnętrzne przerwania. Pierwszy opadający włącza dwa zegary jeden zlicza czas, drugi np. tę sekundę. Dopiero gdy drugi zliczy sekundę to kolejnym zboczem opadającym można zatrzymać zegar. W przypadku przycisku DPST byłoby trochę inaczej, ale zasada ta sama.
  • REKLAMA
  • #3 8910651
    krzemowy
    Poziom 19  
    Na potrzeby takiego jednego nieciekawego projektu opracowałem metodę pomiaru czasu z rozdzielczością 4µs(można ją zmienić na interesujące Cię 0.1ms) i pewną możliwością redukcji zakłóceń, tyle że jest to dość rozbudowane(trzeba dołożyć kilka scalaków do Atmegi i pogimnastykować się w programie) i nie wiem czy nie byłoby to wytaczanie armaty na muchę ;) Niemniej jakbyś był zainteresowany to Ci to przedstawię.
  • #4 8910887
    PietrekDer
    Poziom 13  
    Dziękuję za odpowiedzi, każda informacja się przyda :)
    Hmm, szczerze mówiąc, Krzemowy, chętnie bym luknął na takie rozwiązanie. Wiem że przy tak dokładnych pomiarach czasu może zaistnieć dołożenia czegoś naokoło, ale to nie problem, dokładność kosztuje :] Może i przy dokładności 0.1ms to by było wytaczanie armaty na muchę, ale wiedza na ten temat też się przyda :)
  • #5 8910950
    tmf
    VIP Zasłużony dla elektroda
    Zwykły przerzutnik RS by wystarczył. Ale nawet on nie jest potrzebny. Wyzwalasz pomiar np. ujemnym zboczem generowanym przez przycisk. Jedyne co musisz zrobić to, żeby kolejne ujemne zbocza z ew. drgań nie miały wpływu, więc po prostu np. przez kolejne 10-20ms je ignorujesz. Z przycisku kolejne pomiary i tak nie będziesz przecież wyzwalał w tak krótkich odcinkach czasu, bo przecież człowiek nie jest w stanie tak często naciskać przycisk. Swoją drogą to dla mnie jest ciekawostką wyzwalanie pomiaru tak krótkich odcinków czasu przez przycisk - możesz zaspokoić moją ciekawość i powiedzieć co kombinujesz?
  • REKLAMA
  • Pomocny post
    #6 8911022
    krzemowy
    Poziom 19  
    [ATmega][c]Bardzo dokładny pomiar czasu

    74HC74 bramkuje sygnał wejściowy tak aby jego impulsy nie były krótsze niż impulsy taktowania licznika 74HC590(już samo to wyfiltrowuje część krótkich szpilek) - blokuje to możliwość wyzwalania przerwania ICR1 z nadmierną częstotliwością. W układzie jak na rysunku 74HC590 zlicza gdy sygnał PULSE ma stan wysoki. Sygnał taktujący licznik jest generowany przez timer 0 (z częstotliwością 250kHz w moim przypadku). Gdy nastąpi przepełnienie 74HC590 jest generowane przerwanie, program wtedy inkrementuje sobie odpowiednią zmienną rozszerzając w ten sposób pojemność licznika. W momencie wystąpienia zbocza opadającego układ ICR timera 1 przechwytuje czas wystąpienia tegoż zbocza, jednocześnie program odczytuje stan 74HC590. Porównując zawartość ICR1 z jego zawartością gdy wystąpiło poprzednie zbocze można precyzyjnie określić czas między impulsami, znamy też długość impulsu. Można dzięki temu określić czy dany impuls jest impulsem użytecznym czy zakłóceniem, tak samo można określić czy przerwa między impulsami jest zakłóceniem czy nie - to już zależy od specyfiki sygnału i wizji programisty. A tak w ogóle to ja się nie znam więc proszę mi nie mieć za złe jak coś pomieszałem i/lub coś nie będzie działać ;)
  • REKLAMA
  • #7 8911133
    PietrekDer
    Poziom 13  
    :) bardzo ciekawe rozwiązanie, i zapewne coś w tym stylu pozwoli bez problemu uzyskać dokładność 0.1ms :) Teraz muszę to sobie jeszcze na spokojnie przeanalizować, ale zasada działania, jak i koncepcja są bardzo pomysłowe :D

    A co do zastosowania samego przerzutnika RS i blokowania na 10-20ms przerwania od zbocza, to jest to jakieś rozwiązanie, jednak ja biorę pod uwagę że timery nie będą wyzwalane tylko przyciskiem "na palec", ale może ktoś będzie chciał do tego coś podłączyć. Może to trochę głupi przykład, ale tak mi wpadł do głowy: w starych samochodach na wale silnika są styczniki, które włączają odpowiednie cewki, i tu może zajść potrzeba zbadania, na ile to się włącza (choć podejrzewam że dokładność 1ms by wystarczyła), ale zapewne znajdzie się wiele innych zjawisk, które wymagają dokładnego badania czasu.
  • #8 8911251
    tmf
    VIP Zasłużony dla elektroda
    Czyli jak widzę nawet nie wiesz co chcesz osiągnąć :) Weź pod uwagę, że każdy układ debouncingu, niezależnie jak go zbudujesz wprowadza pewien czas martwy. Możesz to robić w magicznie skomplikowany sposób, jak pokazał ci kolega krzemowy, albo prosty. Niemniej efekt zawsze będzie ten sam - eliminujesz możliwość reakcji na impulsy w określonym czasie, w efekcie w tym czasie układ nie będzie mógł być ponownie wyzwalany. I tu zbliżamy się do sedna - co chcesz mierzyć i jak często. Nie da się zbudowaćukładu uniwersalnego, który może wszystko.
  • #9 8911531
    PietrekDer
    Poziom 13  
    Tak, właśnie dlatego z problemem trafiłem tutaj, bo jak widać jest to dość kłopotliwe, i jak słusznie zauważyłeś, jeśli obwód eliminujący zakłócenia ma dezaktywować wejście (INTx czy jakieś inne) przez określony czas, nie da się w tym czasie nic zmierzyć. Najprostsze sposoby z kondensatorem i rezystorem, potrafią wygenerować łagodne zbocze narastające o czasie np 20ms, a mnie właśnie chodziło o sposoby, by maksymalnie skrócić ten czas, ale aby nie złapać się jeszcze w drgania przycisku. Jak widać da się to zrobić, jednak uzyskanie rozdzielczości lepszej niż 0.1ms może być trudne, jeśli w ogóle możliwe. Z tą uniwersalnością może też być taki problem, iż nie wiadomo jaki układ zwierający ktoś podłączy, mogą to być styki tak wyświechtane i "szumiące", że 20ms nawet nie pomoże :]
  • #10 8912103
    mirekk36
    Poziom 42  
    PietrekDer --> tak w ogóle to wygląda na to, że przyjąłęś z góry złe założenie. Super dokłady pomiar czasu pomiędzy impulsami wyzwalanymi "ręcznie" jakimiś klawiszami/stykami/stycznikami

    Niestety twoja super dokładność w tym momencie musi zostać ograniczona (tzn jej rozdzielczość) do właśnie czo najmniej czasu dla debouncingu czyli eliminacji drgań styków.

    W efekcie próba pomiaru 0.1ms a nawet co do 1ms wydaje się być wręcz absurdem, bo zwykle same drgania trwają dużo dużo dłużej.

    Nie wspomnę już, że nawet pomiar takich dcinków czasu jak 0.1ms to dla byle procka żadne tam mecyje. Toż to prawie wieczność. A 1ms to już jakby się czas zatrzymał ;)

    Kolega krzemowy pisał ci o odcinkach czasu 4us zatem ten jego układ będzie do twoich celów hmmmm delikatnie mówiąc mało użyteczny.

    Chyba że zejdziesz z pomiarami czasu ale nie dla odcinków pomiędzy naciskaniem klawiszy czy tam styczników, które generują spore ilości drgań, do rzędu mikrosekund to wtedy jest sens tworzenia takich zewnętrznych układów wspomagających.
  • #11 8912341
    tmf
    VIP Zasłużony dla elektroda
    PietrekDer napisał:
    Najprostsze sposoby z kondensatorem i rezystorem, potrafią wygenerować łagodne zbocze narastające o czasie np 20ms, a mnie właśnie chodziło o sposoby, by maksymalnie skrócić ten czas, ale aby nie złapać się jeszcze w drgania przycisku. Jak widać da się to zrobić, jednak uzyskanie rozdzielczości lepszej niż 0.1ms może być trudne, jeśli w ogóle możliwe.


    I tu właśnie leży problem - nie da się tego zrobić, a układ pokazany przez kolegę krzemowy bynajmniej ci w tym nie pomoże. Skoro styki drgają np. przez 20ms, to nie ma lewara, jedyna możliwość eliminacji to uczynienie układu nieczułym na kolejne pobudzenia w tym czasie. Bez tego w jakiś magiczny sposób układ musiałby wiedzieć, że kolejne drganie wynika z drgań zestyków a nie celowego działania użytkownika. Bez telepatii się nie obejdzie :)
    No i jak słusznie koleg mirek zauważył, wydaje się, że mierzenie czasu rzędu 0,1ms z wyzwalaniem przyciskiem jest jakimś nonsensem. Więc jeszcze raz zapytam - co chcesz dokładnie zrobić?
  • #12 8913670
    _Robak_
    Poziom 33  
    tmf napisał:
    Bez tego w jakiś magiczny sposób układ musiałby wiedzieć, że kolejne drganie wynika z drgań zestyków a nie celowego działania użytkownika. Bez telepatii się nie obejdzie :)

    Może magii bym tu nie zaprzęgał, ale na pewno wymagałoby to wiele pracy;) Można by sygnał dać na ADC i sprawdzać z jakimś wzorcem i inne tego typu historie, ale tutaj akurat byłoby to bezsensem:).
  • #13 8913697
    PietrekDer
    Poziom 13  
    Hmm, w sumie to tak, może nie do końca przemyślałem sprawę, chociaż wiedziałem że z tymi stykami będą problemy :/. Ew pomiar tak dokładnych odcinków czasu, może być wykorzystany przy jakichś czujnikach elektronicznych (bariery optoelektroniczne itp), które na wyjściu dają czysty sygnał cyfrowy. A styki można sobie zostawić na dużo mniejszą dokładność.
    Ale i tak dziękuję za pomoc w dyskusji nad wspomnianym problemem :) Każda informacja i uwaga jest bardzo przydatna :)
REKLAMA