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

Licznik impulsów z enkodera

Chivo 13 Mar 2019 19:09 396 24
  • #1 13 Mar 2019 19:09
    Chivo
    Poziom 22  

    Witam,

    Buduje licznik impulsów generowanych przez enkoder https://abc-rc.pl/product-pol-7652-Modul-czuj...transoptor-5mm-detektor-komparator-LM393.html. Mój problem polega na tym, że otrzymuję niedokładne wyniki. Układ ma zliczyć ile razy zostanie zakryta szczelina w enkoderze. Jako można wysterować port szeregowy aby wysyłać tylko wartość końcową a nie pojedyncze impulsy.

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0 24
  • #2 13 Mar 2019 19:23
    khoam
    Poziom 27  

    Chivo napisał:
    Jako można wysterować port szeregowy aby wysyłać tylko wartość końcową a nie pojedyncze impulsy.

    Musisz wiedzieć, kiedy takie liczenie impulsów ma się zakończyć np. kiedy przerwa pomiędzy impulsami jest większa niż jakaś ustalona wartość. Dopiero po spełnieniu takiego warunku, wysyłasz wartość końcową i zerujesz licznik "ileRazy" w celu ponownego zliczania.

    0
  • #3 13 Mar 2019 19:26
    Chivo
    Poziom 22  

    Układ chcę wykorzystać do liczenia dziurek w taśmach z elementami smd np.: rezystory 0805 dlatego muszę liczyć bardzo dokładnie.

    0
  • #4 13 Mar 2019 19:29
    khoam
    Poziom 27  

    Chivo napisał:
    Układ chcę wykorzystać do liczenia dziurek w taśmach z elementami smd np.: rezystory 0805 dlatego muszę liczyć bardzo dokładnie.

    Nie zmienia ta faktu, że musisz znać/określić warunek, przy którym należy podsumować zliczanie impulsów, a następnie wznowić liczenie od nowa. Przykład, który podałem z "przerwą czasową" jest tylko jednym z wielu możliwych rozwiązań.

    0
  • #5 13 Mar 2019 19:41
    Chivo
    Poziom 22  

    Rozumiem. Dzięki. Możesz podać jakiś przykład?

    0
  • #6 13 Mar 2019 19:49
    khoam
    Poziom 27  

    W jakich odstępach czasowych pojawiają się kolejne przerwania przy zliczaniu impulsów?

    0
  • #7 13 Mar 2019 19:57
    Chivo
    Poziom 22  

    Zależy jak szybko będzie się przesuwać taśmę z elementami. Szacuje że około 1 sekunda. Co z błędnym liczeniem?

    0
  • Pomocny post
    #8 13 Mar 2019 20:19
    khoam
    Poziom 27  

    No to niech program policzy, przynajmniej z grubsza:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    Chivo napisał:
    Co z błędnym liczeniem?

    A kiedy taki błąd może nastąpić. Nie chodzi mi o program, ale to co przesuwa taśmę.

    0
  • #9 13 Mar 2019 20:26
    Chivo
    Poziom 22  

    Dziękuję. Właśnie szukam informacji o funkcji millis. Taśma ma grubość około 1mm a szczelina jest na 5mm. Taśma przesuwa się ręcznie. Zobacz moduł w linku.

    0
  • #11 13 Mar 2019 20:46
    Chivo
    Poziom 22  

    Dziękuję. Jutro to zobaczę. Masz jakiś pomysł o mechanizmie

    0
  • #12 13 Mar 2019 21:11
    khoam
    Poziom 27  

    Chivo napisał:
    Masz jakiś pomysł o mechanizmie

    To raczej nie ten dział :)

    0
  • #13 13 Mar 2019 21:36
    krzysiek_krm
    Poziom 35  

    Chivo napisał:
    otrzymuję niedokładne wyniki.

    Na czym polegają te niedokładne wyniki ?
    Chivo napisał:
    Co z błędnym liczeniem?

    Chivo napisał:
    Taśma przesuwa się ręcznie

    Może po prostu trzęsą Ci się ręce i generujesz fałszywe impulsy.
    Chivo napisał:
    Szacuje że około 1 sekunda

    Można zastosować jakąś "bramkę czasową", po zliczeniu impulsu, przez (powiedzmy) 0.7 s funkcja liczenia jest blokowana żeby nie było fałszywych impulsów.
    Chivo napisał:
    Masz jakiś pomysł o mechanizmie

    Poszukaj jakiegoś silniczka modelarskiego z przekładnią albo może silnika krokowego.

    0
  • #14 14 Mar 2019 06:24
    Chivo
    Poziom 22  

    Nad silnikami pomyślę później. Problemem jest błędne liczenie. Impulsy generuję tak, że trasnoptor zakrywam i odkrywam kartką a Arduino liczy zbyt wiele impulsów.
    06:18:34.011 -> 4
    06:18:40.151 -> ILOSC:
    06:18:40.151 -> 6
    06:18:42.776 -> ILOSC:
    06:18:42.776 -> 9

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • Pomocny post
    #15 14 Mar 2019 06:47
    Slawek K.
    Poziom 29  

    Masz zjawisko bouncingu, o czym piszą koledzy wyżej, zakrywanie/odkrywanie nie jest jednoznaczne, w krótkim czasie są drgania, czyli występują na przemian stany wysokie i niskie, stąd w praktyce licznik zwiększa sie o wiecej niż 1. Trzeba to wyeliminować poprzez ignorowanie zmiany licznika gdy odstępy pomiedzy zmianami stanów są krótkie, i o tym piszą koledzy wyżej proponując użycie millis().

    Pozdr

    0
  • #17 14 Mar 2019 11:37
    khoam
    Poziom 27  

    Chivo napisał:
    Znalazłem przykład z którego będę korzystać: http://blog.nettigo.pl/2014/licznik-na-przerwaniach/

    Kod z tego przykładu też nie zabezpiecza przed zakłóceniami.

    Chivo napisał:

    Z którego wyjścia w tym module pobierasz sygnał do zliczania?

    0
  • #18 14 Mar 2019 12:11
    Chivo
    Poziom 22  

    Używam wyjścia D0 z modułu. Jak powinien działać kod bez zakłóceń?

    0
  • Pomocny post
    #19 14 Mar 2019 13:09
    krzysiek_krm
    Poziom 35  

    Moim zdaniem powinieneś zacząć testy ostatecznej wersji układu, bo na razie

    Chivo napisał:
    Impulsy generuję tak, że trasnoptor zakrywam i odkrywam kartką a Arduino liczy zbyt wiele impulsów

    robisz jakieś przypadkowe testy i być może walczysz ze zjawiskami, które w docelowym układzie nigdy nie wystąpią albo będą miały zupełnie inny charakter.

    0
  • Pomocny post
    #20 14 Mar 2019 13:26
    khoam
    Poziom 27  

    Chivo napisał:
    Używam wyjścia D0 z modułu. Jak powinien działać kod bez zakłóceń?


    Tak, powinieneś używać wyjścia D0. Schemat samego modułu zamieszczam poniżej - trochę niewyraźny, bo od Chińczyków ;)
    Nie sądzę, aby ewentualne zakłócenia na wyjściu D0 miały jakieś istotne znaczenie w docelowym układzie - wszystko zależy od jakości i długości połączenia pomiędzy czujnikiem a resztą układu.
    Tak, jak napisał kolega @krzysiek_krm, lepiej przełóż tę ewentualną walkę z zakłóceniami, kiedy będziesz miał docelowy mechanizm przesuwający taśmę.

    Licznik impulsów z enkodera

    0
  • #21 14 Mar 2019 18:35
    Chivo
    Poziom 22  

    Zacząłem od pisania programu bo było łatwiej. Jeśli chodzi o mechanikę to myślę nad jakimś kołem zębatym i prowadnicami (rurkami). Kolega zaproponował poszukanie na złomie starego magnetofonu bo może się wykorzysta jego mechanizmy.

    Dodano po 4 [godziny] 26 [minuty]:

    Testuję program na ścinku taśmy 0603. Kod w załączniku. Z powodu debauncingu w serial monitorze są podwójne linie?

    18:32:17.742 -> Zliczona ilosc elementow wynosi:1
    18:32:17.882 -> Zliczona ilosc elementow wynosi:1
    18:32:18.023 -> Zliczona ilosc elementow wynosi:2
    18:32:18.117 -> Zliczona ilosc elementow wynosi:2
    18:32:18.304 -> Zliczona ilosc elementow wynosi:3
    18:32:18.398 -> Zliczona ilosc elementow wynosi:3
    18:32:18.492 -> Zliczona ilosc elementow wynosi:4
    18:32:18.539 -> Zliczona ilosc elementow wynosi:4
    18:32:18.679 -> Zliczona ilosc elementow wynosi:5
    18:32:18.773 -> Zliczona ilosc elementow wynosi:5

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • Pomocny post
    #22 14 Mar 2019 18:57
    krzysiek_krm
    Poziom 35  

    Chivo napisał:
    Z powodu debauncingu w serial monitorze są podwójne linie?

    Raczej dlatego, że masz tam "dzielnik przez dwa" dla "ilość".
    Tak z innej beczki, wołanie funkcji serial z przerwania to w ogólnym przypadku nie jest dobry pomysł.

    0
  • #23 14 Mar 2019 20:00
    Chivo
    Poziom 22  

    Naprawiłem.

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Dodano po 7 [minuty]:

    Poczytam jak przenieś Serial z przerwania do loop.

    0
  • Pomocny post
    #24 14 Mar 2019 20:10
    Slawek K.
    Poziom 29  

    Nie wnikając w resztę kodu - w przerwaniu ustawiaj flagę (w zmiennej) na podstawie której zostanie wykonana procedura w funkcji, a na koniec, następuje zmiana flagi na przeciwną. Zatem w przerwaniu nie wykonujesz obsługi serial'a, ustawiasz tylko wartość zmiennej.

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Pozdr

    0
  • #25 15 Mar 2019 03:10
    emarcus
    Poziom 35  

    Chivo napisał:
    Impulsy generuję tak, że trasnoptor zakrywam i odkrywam kartką a Arduino liczy zbyt wiele impulsów.

    Czym ty generujesz te imulsy?
    Kartką?!!!
    Zwykła kartka papierowa nie blokuje dostatecznie/ (albo w ogóle) IR światła tych interrupterów szczelinowych.
    Praktycznie zliczasz tylko różne zakócenia.
    Jako przesłonę zastosuj raczej coś bardziej 'solid' (grubsza ciemna/laminowana karta, tektura , metalowa przesłona etc.).

    Sa dostępne podobne moduły transoptorów szczelinowych z regulacją czułości .
    \
    albo dokup oryginalne koło (płytkę encodera ) od tego samego dostawcy, uwzględniając/korygując ilośc szczelin ze swoim projektem.
    Ponadto dodaj mały capacitor ok. 100nF (104) pomiędzy GND i pin D0 z którego bierzesz sygnał.
    Eliminowanie w programie zbędnych i błędnych impulsów będzie bardziej kłopotliwe niż zastosowanie kondensatora.

    e marcus

    0