Elektroda.pl
Elektroda.pl
X
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

12 Lip 2017 15:48 2331 32
  • 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
    Darmowe szkolenie: Ethernet w przemyśle dziś i jutro. Zarejestruj się za darmo.
  • Poziom 7  
    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.
  • 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
  • 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
    Poziom 7  
    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.
  • 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 :)
  • Poziom 38  
    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
  • Poziom 40  
    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.
  • Poziom 38  
    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.
  • Poziom 5  
    To jak byście polecili zrobić czujnik, fototranzystor+ dioda, transoptor odbiciowy?
  • Poziom 35  
    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 ....
  • 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.
  • 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
  • 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.
  • 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.
  • 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
  • Pomocny post
    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).
  • Poziom 5  
    Wielkie dzięki o to mi chodziło :))
  • 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?
  • 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.
  • Poziom 5  
    Pozwólcie, że odświeżę i zapytam jak przekonwertować volatile uint8_t na char array[]?
  • Pomocny post
    Użytkownik usunął konto  
  • 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 :))
  • Pomocny post
    Użytkownik usunął konto  
  • Pomocny post
    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.
  • Użytkownik usunął konto