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

ATMega 32 nie wykrywa szybkiego impulsu z czujnika szczelinowego przy 120m/s

abdelpl 12 Lip 2017 15:48 3264 32
  • #1 16583357
    abdelpl
    Poziom 7  
    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
  • #2 16583420
    dzidav8
    Poziom 9  
    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.
  • #3 16583434
    abdelpl
    Poziom 7  
    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 / C++
    Zaloguj się, aby zobaczyć kod

    ATMega 32 nie wykrywa szybkiego impulsu z czujnika szczelinowego przy 120m/s
  • #4 16583462
    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.
  • Pomocny post
    #5 16583463
    dzidav8
    Poziom 9  
    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.
  • #6 16583597
    dondu
    Moderator na urlopie...
    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 :)
  • #7 16583865
    krzysiek_krm
    Poziom 40  
    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
  • #9 16584210
    excray
    Poziom 41  
    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.
  • #10 16584416
    krzysiek_krm
    Poziom 40  
    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.
  • #11 16594374
    abdelpl
    Poziom 7  
    To jak byście polecili zrobić czujnik, fototranzystor+ dioda, transoptor odbiciowy?
  • #12 16594549
    kamyczek
    Poziom 38  
    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 ....
  • #13 16619811
    abdelpl
    Poziom 7  
    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.
  • #14 16619968
    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
  • #15 16620583
    abdelpl
    Poziom 7  
    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.
  • #16 16620977
    tronics
    Poziom 38  
    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.
  • #17 16621023
    abdelpl
    Poziom 7  
    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
  • Pomocny post
    #18 16621078
    dondu
    Moderator na urlopie...
    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).
  • #19 16621091
    abdelpl
    Poziom 7  
    Wielkie dzięki o to mi chodziło :))
  • #22 16621284
    abdelpl
    Poziom 7  
    Mam teraz dość nietypowy problem z przerwaniem. Miał ktoś kiedy tak, że wystarczy jak dotyka przewodu (do INT0) i się wywołuje przerwanie?
  • #25 16741747
    abdelpl
    Poziom 7  
    Pozwólcie, że odświeżę i zapytam jak przekonwertować volatile uint8_t na char array[]?
  • Pomocny post
    #26 16741926
    Konto nie istnieje
    Konto nie istnieje  
  • #27 16742341
    abdelpl
    Poziom 7  
    To jest na avr tak dla pewności. Korzystam z biblioteki do HD44780 Radosława Kwiecienia. W funkcji
    Kod: C / 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 / C++
    Zaloguj się, aby zobaczyć kod
    była wyświetlona :))
  • Pomocny post
    #28 16742398
    Konto nie istnieje
    Konto nie istnieje  
  • Pomocny post
    #29 16742423
    tronics
    Poziom 38  
    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.
  • #30 16742450
    Konto nie istnieje
    Konto nie istnieje  
REKLAMA