• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
obsługa Timer1 i przerwań, czyli próby budowy chronografu balistycznego
#1
Witam, na początek muszę się przywitać bo to mój pierwszy post i zarazem projekt mimo tego że młody nie jestem Wink

próbowałem zbudować chronograf czyli urządzanie mierzące prędkość i energię pocisku. O ile przez hardware przebrnąłem w miarę bez problemowo jak na laika to z programowaniem nigdy nie miałem do czynienia i tu pojawia się główny problem  Confused


Mam dwie bramki IR w odległości 10cm i wertując różnie źródła doszedłem do wniosku że aby pomiar był najprecyzyjniejszy to powinno to wyglądać tak:
-Bramka1 od strony lufy aktywuje przerwanie które...
- aktywuje Timer1 z preskalerem 1 dla maksymalnej rozdzielczości
- bramka2 zatrzymuje timer i zwraca wynik w postaci czasu    // znając wzór możemy obliczyć z jaką prędkością poruszał się pocisk 

Tyle teorii ale mimo wielu prób nie umiem ubrać tego w kod  Dodgy
Pojawią się również problemy przepełnienia oraz jak zmusić układ do wyświetlania wyniku aż do zarejestrowania następnego strzału? Smile
Mogę prosić o drobne podpowiedzi, polskich źródeł za bardzo nie znalazłem a mój angielski jest taki że ledwie zrozumiałem ogólną zasadę działania  Tongue

Jeśli uda się mi przez to przebrnąć to będzie już wielki sukces <dla mnie Big Grin >  ale docelowe plany są o wiele ambitniejsze: ciachałbym stworzyć menu w którym będziecie można wprowadzać masę pocisku do wyliczania energii kinetycznej, zapisywać każdy kolejny strzał V i Ek do pamięci eprom a co 10ty wpisywać wartość ciśnienia w kartuszu. To by pozwoliło na bardzo szczegółowa analizę danych i obliczanie tzw. górki i ilości stabilnych strzałów z karabinków PCP. Nie skromnie powiem że nie znalazłem komercyjnego chromo na świecie które by to potrafiło  Tongue

Cytując klasyka: To jak? Pomożecie? Big Grin
 
Odpowiedź
#2
Witam,
Przy takich prędkościach wylotowych to powinno Tobie wystarczyć napisanie programu w oparciu o funkcję micros().
Pozdrawiam.
 
Odpowiedź
#3
Pewnie tak ale chodzi mi o maksymalną dokładność pomiaru pozatym chciałbym też mieć możliwość pomiarów broni palnej. W pierwszej kolejności boczny zapłon <taki ala KBKS> a potem może nawet i sztucery Smile

Podstawą do budowania pozostałych funkcji jest stworzenie maksymalnie dokładnego pomiaru Wink
Docelowo chciałbym udostępnić strzelcom gotowy program i listę części tak aby każdy mógł zbudować własny sprzęt.
 
Odpowiedź
#4
Witam,
A przeliczałeś ile wynosi czas przelotu, przy prędkości kilkuset m/s odcinka 10 cm? Jaka będzie dokładność (błąd względny) pomiaru, przy założeniu, że minimalny czas zmierzony- bez kombinacji- dla UNO wynosi 4 mikrosekundy? Jaką dokładność chcesz uzyskać?
Pozdrawiam.
 
Odpowiedź
#5
Zakładając ze mamy:

Prescale Time per counter tick Max Period
1 0.0625 uS 8.192 mS

odległość bramek 10cm
Najusilniejszy sztucer 1000m/s czas przelotu między bramkami 100uS tyknięć zegara 6,25
boczniaki .22 do 550m/s czas przelotu między bramkami 181.(81)uS tyknięć zegara 11,4
.177 około limitu 250m/s czas przelotu między bramkami 400uS tyknięć zegara 25
.22 około 200m/s czas przelotu między bramkami 500uS tyknięć zegara 31,25
Najsilniejsze pneumatyki FAC mogą dorównywać broni palnej.

Wartości wolniejszych sprzętów nie znam np: jakiś łuków, kusz, markerów, proc i inych asg na kiju Tongue
Ale napewno też można je pomierzyć.

Kurcze do może pierwsze obliczenia tego typy tj od strony procesora, poproszę o podpowiedzenie czy dobrze myślęSmile
Wydaje mi się że też bardzo ważne będzie aby sam w sobie pomiar był maksymalnie szybko wyzwolony bez jakiegoś "laga" na zastanowienie się układu co ma właściwie zrobić.
 
Odpowiedź
#6
Witam,
Hmm, kiedyś potrzebowałem zmierzyć czas impulsu o dość dużej częstotliwości (pojęcie względne) i programowo rozwiązałem to na UNO za pomocą wcześniej wspomnianej funkcji micros(). Pomiarów mogłem dokonywać z dokładnością wynoszącą bodajże 4 mikrosekundy (było to dwa lata temu, dlatego piszę "bodajże").
W przypadku Twojego projektu- tak jak wyżej napisałeś, dwie bramki (dioda emisyjna i fotorezystor), połączone z pinami 2 i 3 (obsługują przerwania), zmiana stanu na pierwszej bramce powoduje przerwanie i w przerwaniu odczyt wartości micros(), zmiana stanu na drugiej analogicznie. To chyba najprostsze rozwiązanie i w Twoim przypadku wystarczająco (najprawdopodobniej) dokładne.
W przypadku łuku radzę skorzystać z funkcji millis() i wziąć poprawkę na przedstrzale śródstrzala strzały ;-)
Pozdrawiam.
 
Odpowiedź
#7
Czujniki podpięte są do d2i3 Smile

Co do sródtrzala-zastrzala strzały to chyba nie ma problemu bo zasłonięcie wyzwala pomiar a kiedy zostanie odsłonięta wiązka to chyba nie ma aż takiego znaczenia? Choć mogę się mylić Wink

Wiem że przerwanie jet szybrze niż "if zmiana stanu" <-- tak bardzo pierwszy kontakt z programowaniem Tongue
Tylko nie daje mi spokoju ten Timer1 i micros() jaka będzie różnica dokładności pomiaru. Generalnie i większa prędkość tym większy błąd.

I tak przy: 1000m/s czas przelotu między bramkami to 100uS, czyli 1mm na 1us
micros() mierzy w pełnych mikrosekundach, Timer ma cykl co 0.0625 mikrosekundy. Co na tym przykładzie daje nam pomiary co 0.0625mm kontra co 1mm - to już dość spora różnica

Kurde humanista z wykształcenia i zawodu, na co ja się porywam Tongue
Btw. czy moje wyliczenia nie mają błędów ?
 
Odpowiedź
#8
Witam,
Cykl timera to czas elementarnej operacji, a nie możliwa do uzyskiwania dokładność pomiaru.
Obliczenia są OK.
Pozdrawiam.
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości