Elektroda.pl
Elektroda.pl
X
Elektroda.pl
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Szybki impuls nie wychwytywany przez ATMega 32

abdelpl 12 Lip 2017 15:48 2205 32
  • #1 12 Lip 2017 15:48
    abdelpl
    Poziom 5  

    Witam, konstruuje obecnie w ramach hobby chronograf, który ma mi posłużyć w asg. Sprawa wygląda tak: Kupiłem czujniki szczelinowe, podłączyłem do kontrolera i gdy wkładam coś w szczelinę to zapala się dioda sygnalizująca sygnał na tym pinie. Kiedy puszczam kulka w ten sposób by zakryła szczelinę dzieje się to samo. Natomiast jeśli już strzelam 6mm kulką z predkością około 120m/s to średnio to działa. Dioda się po żadym strzale nie zapala. Czego to może być wina, kontroler jest taktowany na 4MHz
    Model czujnika: https:[nie moge dawać linków]//botland.com.pl/transoptory-odbiciowe/7562-czujnik-szczelinowy-10mm-z-komparatorem-lm393.html
    Kontroler: Atmega 32

    0 29
  • #2 12 Lip 2017 16:07
    dzidav8
    Poziom 6  

    Jak masz połączony układ? Sprawdzasz stan pinu w pętli programu czy podłączyłeś go na wejście wyzwalające przerwanie?
    Przy tak krótkich impulsach sprawdzanie stanu w pętli może tracic impulsy, ale wywoływanie przerwania powinno zawsze zadziałać.
    Jeśli kulka zasłoni wiązkę całą średnicą to impuls będzie trwał ok 50us , czyli ok 200 cykli - nie powinno być żadnych problemów z wykrywaniem.

    0
  • #3 12 Lip 2017 16:14
    abdelpl
    Poziom 5  

    Kodzik jest w pętli, pierwotnie były dwie diody w układzie i dwa czujniki, ale w końcu pozostał jeden :v

    Kod: c
    Zaloguj się, aby zobaczyć kod

    Szybki impuls nie wychwytywany przez ATMega 32

    0
  • #4 12 Lip 2017 16:28
    deksta84
    Poziom 24  

    Wykorzystać przerwanie zewnętrzne INT0 (portd.2). W pętli głównej jeden warunek sprawdzający flagę zmienianą pod wpływem zewnętrznego przerwania.

    0
  • Pomocny post
    #5 12 Lip 2017 16:28
    dzidav8
    Poziom 6  

    Podłącz wejście pod pin INT0 i przenieś ten kawąłek kodu do przerwania. Pownno działać. W tym momencie sprawdzasz stan pinu co czas wykonywania pętli, dlatego krótkie impulsy mogą nie być zauważone. Przerwanie zostanie ustawione zawsze, niezależnie od tego w którym momencie głównej pętli program się znajduje.

    0
  • #6 12 Lip 2017 17:32
    dondu
    Moderator Mikrokontrolery Projektowanie

    Kulka przelatuje przez czujnik w czasie 6mm : 120m/s = 500us.
    W tym czasie mikrokontroler wykona 0,0005s * 4MHz = 2000 cykli zegara.
    Aby pin INTx prawidłowo wykrył kulkę potrzebne są z tego co pamiętam 4 impulsy zegara: http://mikrokontrolery.blogspot.com/2011/04/jak-mikrokontroler-widzi-sygnal-cyfrowy.html

    Wniosek, czy da radę, czy też nie pozostawiam Tobie :)

    0
  • #7 12 Lip 2017 19:48
    krzysiek_krm
    Poziom 36  

    Witam,

    dondu napisał:
    Kulka przelatuje przez czujnik w czasie 6mm : 120m/s = 500us.

    chyba jednak 50 µs, faktycznie nieco mniej z powodu niezerowej szerokości przesłony.
    Nie widać żadnej dokumentacji do tego czujnika, ale na zdjęciach widać dość duże wartości rezystancji, co sugeruje pracę transoptora w głębokim nasyceniu, impulsy o tak krótkim czasie mogą być "zjedzone" w samym czujniku, niestety.
    Musisz obejrzeć sygnał z czujnika na oscyloskopie.

    Pozdrawiam

    2
  • #9 12 Lip 2017 21:56
    excray
    Poziom 39  

    Przez 50uS to ten kod sprawdzający PB1 i PB3 wykona się "naście", albo i nawet "dziesiąt" razy. Skoro mimo wszystko uC nie widzi przelotu to coś innego jest na rzeczy. Zapewne sam moduł który użyłeś, jest za wolny na tak szybkie impulsy.

    0
  • #10 12 Lip 2017 23:02
    krzysiek_krm
    Poziom 36  

    excray napisał:
    Przez 50uS to ten kod sprawdzający PB1 i PB3 wykona się "naście", albo i nawet "dziesiąt" razy. Skoro mimo wszystko uC nie widzi przelotu to coś innego jest na rzeczy. Zapewne sam moduł który użyłeś, jest za wolny na tak szybkie impulsy.

    W rzeczy samej.
    Nie wiadomo gdzie znaleźć schemat tej płytki, ale dla innych transoptorów z wyjściem tranzystorowym charakterystyki pokazują, że przy głębokim nasyceniu (duża rezystancja na wyjściu) tranzystor wyjściowy potrafi przeciągać prąd nawet ponad 100 µs.

    0
  • #11 18 Lip 2017 12:43
    abdelpl
    Poziom 5  

    To jak byście polecili zrobić czujnik, fototranzystor+ dioda, transoptor odbiciowy?

    0
  • #12 18 Lip 2017 14:07
    kamyczek
    Poziom 34  

    Trzeba zacząć od przeczytania parametrów czujnika zbudować układ dopasowujący np ze wzmacniaczem operacyjnym i komparatorem analogowym wtakich układach ważne są pojemności złączy przewodów i prawidłowe formowanie impulsów sterujących nie jest pewne że czujnik bedzie poprawnie reagował na tak krótkie zakłócenie ....

    0
  • #13 01 Sie 2017 15:14
    abdelpl
    Poziom 5  

    Witam ponownie, teraz mam pytanko na temat timera. Nie mam pojęcia jak go wywołać i zakończyć za pomocą dwóch pinów (kiedy się włączy stan wysoki). Szukałem w googlu jednak nie znalazłem dobrego kursu i wytłumaczenia dla tego. Timer ma liczyć czas przebycia drogi między dwoma czujnikami więc musi być w miarę dokładny.

    0
  • #14 01 Sie 2017 16:30
    squelch
    Poziom 11  

    Użyj przerwania od przechwytywania kiedy uc wykryje zmianę stanu na pinie ICP1 z niskiego na wysoki to jak będziesz miał odblokowane to przerwanie oraz będziesz miał odpowiednią reakcję(w tym przypadku to ma być zbocze narastające bo z 0 do 1) to wywoła si się przerwanie i w tym przerwaniu możesz zobaczyć ile timer1 zliczy ci impulsów

    0
  • #15 02 Sie 2017 01:02
    abdelpl
    Poziom 5  

    Czekaj, czekaj. Jeden czujnik odpali przerwanie INT0 a w tym przerwaniu sie uruchomi timer. Drugi czujnik po INT1 ma go wyłączyć. Raczej o tym myślałem.

    Dodano po 2 [godziny] 35 [minuty]:

    Lepiej tak: czy ktoś by mi dokładnie wytłumaczył jak wywoływać timery, zbierać z nich czas, do czego służą poszczególne rejestry. Noty katalogowej tego procka po polsku nie znalazłem, a dobrego poradnika na YT także nie.

    0
  • #16 02 Sie 2017 09:28
    tronics
    Poziom 37  

    Cytat:
    Lepiej tak: czy ktoś by mi dokładnie wytłumaczył jak wywoływać timery, zbierać z nich czas, do czego służą poszczególne rejestry

    W stopce kol. dondu jest link...
    Co do układów to typowo pary led ir, fototranzystor albo led ir fotodioda działają nieco wolno gdy chodzi o b. szybkie impulsy, problemem jest przeładowanie pojemności przy niewystarczającej wydajności prądowej. Częstotliwość graniczną można łatwo wybadać przy użyciu generatora i oscyloskopu - podajesz 50% PWM i zwiększasz częstotliwość - gdy zaczyna się odbierany sygnał z prostokąta w trójkąt zmieniać to jest właśnie moment kiedy układ przestaje działać jak się spodziewamy.

    0
  • #17 02 Sie 2017 09:49
    abdelpl
    Poziom 5  

    Znaczy no wlasnie obliczylem ze w przeciągu 1us zegar zrobi 4 cykle, a to chyba wystarczy żeby mieć jakąś dobrą dokładność. Dodam, że kulka będzie wychwytywana czujnikiem przez około 6us

    0
  • Pomocny post
    #18 02 Sie 2017 10:22
    dondu
    Moderator Mikrokontrolery Projektowanie

    abdelpl napisał:
    Czekaj, czekaj. Jeden czujnik odpali przerwanie INT0 a w tym przerwaniu sie uruchomi timer. Drugi czujnik po INT1 ma go wyłączyć. Raczej o tym myślałem.

    Lepiej tak: czy ktoś by mi dokładnie wytłumaczył jak wywoływać timery, zbierać z nich czas, do czego służą poszczególne rejestry. Noty katalogowej tego procka po polsku nie znalazłem, a dobrego poradnika na YT także nie.

    Koncepcja prawidłowa.

    Przygotowując mikrokontroler do pracy:
    - ustawiasz przerwania INT0 i INT1 od zbocza np. narastającego,
    - włączasz przerwania od przepełnienia timera (jeśli z wyliczeń teoretycznych wychodzi, że może się przepełnić) i przygotowujesz funkcję jego obsługi zliczającą fakt wystąpienia przepełnienia w liczniku przepełnień (jakaś zmienna),
    - włączasz przerwanie INT0.

    W przerwaniu przepełnienia:
    - zwiększasz licznik przepełnień (zmienną) o jeden.

    W przerwaniu INT0:
    - włączasz timer (ustawiając wybrany preskaler).
    - włączasz przerwanie od INT1, a wyłączasz przerwanie od INT0

    W przerwaniu INT1:
    - zatrzymujesz timer (zerując jego preskaler),
    - odczytujesz stan timera i licznik przepełnień (jeśli jest to konieczne) i obliczasz co zechcesz,
    - zerujesz licznik przepełnień (jeśli go używasz).
    - zerujesz preskaler timera oraz licznik timera,
    - włączasz przerwanie INT0, a wyłączasz INT1,
    - zerujesz flagi przerwań INT0 oraz INT1 (na wszelki wypadek).

    0
  • #19 02 Sie 2017 10:28
    abdelpl
    Poziom 5  

    Wielkie dzięki o to mi chodziło :))

    0
  • #22 02 Sie 2017 12:19
    abdelpl
    Poziom 5  

    Mam teraz dość nietypowy problem z przerwaniem. Miał ktoś kiedy tak, że wystarczy jak dotyka przewodu (do INT0) i się wywołuje przerwanie?

    0
  • #24 02 Sie 2017 15:01
    squelch
    Poziom 11  

    zależy czy czujnik jest open drain, kolektor czy może sam wymusza oba stany. Jeżeli wymusza oba stany wydaje mi się że nie musi podciągać wejście rezystorem. Możliwe że to twój ładunek na palcu wywołuje przerwanie.

    0
  • #25 06 Paź 2017 19:53
    abdelpl
    Poziom 5  

    Pozwólcie, że odświeżę i zapytam jak przekonwertować volatile uint8_t na char array[]?

    0
  • Pomocny post
    #26 06 Paź 2017 21:17
    2675900
    Użytkownik usunął konto  
  • #27 07 Paź 2017 07:41
    abdelpl
    Poziom 5  

    To jest na avr tak dla pewności. Korzystam z biblioteki do HD44780 Radosława Kwiecienia. W funkcji

    Kod: c
    Zaloguj się, aby zobaczyć kod

    Potrzebuje dać char* i nie wiem jak do tego przekonwertować w najprostszy i najszybszy sposób. Jeszcze raz przypomne, chce by zmienna
    Kod: c
    Zaloguj się, aby zobaczyć kod
    była wyświetlona :))

    0
  • Pomocny post
    #28 07 Paź 2017 09:29
    22053
    Użytkownik usunął konto  
  • Pomocny post
    #29 07 Paź 2017 09:49
    tronics
    Poziom 37  

    sprintf to dość potężna funkcja co jest okupione i szybkością, i rozmiarem zajmowanego miejsca, jak kolega Piotrus_999 zdążył napisać "taniej" będzie użyć utoa() i w zasadzie w tym przypadku wcale nie mniej wygodnie. A bufor c[] można wykorzystać dla różnych wielkości wielokrotnie.

    0
  • #30 07 Paź 2017 10:05
    22053
    Użytkownik usunął konto