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

Impulsator obrotowy/zakłócenia - jak najlepiej obsłużyć go programowo?

11 Lut 2012 14:12 8573 40
REKLAMA
  • #1 10528710
    Konto nie istnieje
    Konto nie istnieje  
  • REKLAMA
  • #2 10528792
    gaskoin
    Poziom 38  
    Spróbuj wykrywać oba zbocza dla obu sygnałów na każde prawidłowo występujące zbocze dodawać 1 do licznika.

    Jeżeli wystąpiło by zbocze "niezgodne" z oczekiwanym to wtedy odejmij 1 od licznika.

    Przykład:

    Masz sygnały S1 i S2.

    1. Zbocze narastające w S1 - +1
    2. zbocze narastające w S2 - +1
    3. opadające w S1 - +1
    4. opadające w S2 - +1
    5. narastające w S1 - +1
    6. narastające w S2 - +1
    7. opadające w S1 - +1
    8. opadające w S2 - +1
    9. narastające w S1 - +1
    10. opadające w S1 - -1
    11. narastające w S1 - +1
    12. opadające w S1 - -1

    Podobnie w drugą stronę. Tylko oczywiście analogicznie normalnie odejmujesz od licznika a jak coś pójdzie nie tak to dodajesz.

    I jak coś nie idzie to pamiętaj - małymi kroczkami wszystko programuj. Najpierw sobie zaprogramuj liczenie przy kręceniu w jedną stronę, a potem w drugą.

    Takie cuś, tyle, że sprzętowe działało mi na 360 obrotach na sekundę. Na więcej nie sprawdzałem, ale spokojnie by dało radę.
  • #4 10528977
    Konto nie istnieje
    Konto nie istnieje  
  • #6 10529267
    Konto nie istnieje
    Konto nie istnieje  
  • #7 10529284
    dondu
    Moderator na urlopie...
    Saabotaz napisał:
    dondu - co mi to da? Bo teraz po wywołaniu przerwania czekam 15ms i dopiero sprawdzam kierunek. Więc wychodzi na jedno i to samo.

    Nie zupełnie. Ty oczekujesz w pętli przerwania, czego powinieneś unikać jak ognia.

    Musisz się zdecydować - albo sprzętowa eliminacja drgań (ale idealna), albo programowa (musi być opóźnienie w pętli lub na timerze).
  • #8 10529516
    sulfur
    Poziom 24  
    Rezystor i kondensator są w złej kolejności.
    Moim zdaniem najlepiej jest wykrywać jedno zbocze, np opadające. Drugi sygnał daje wtedy informację o kierunku.
  • #9 10529633
    Konto nie istnieje
    Konto nie istnieje  
  • REKLAMA
  • #10 10529675
    gaskoin
    Poziom 38  
    sulfur napisał:
    Rezystor i kondensator są w złej kolejności.
    Moim zdaniem najlepiej jest wykrywać jedno zbocze, np opadające. Drugi sygnał daje wtedy informację o kierunku.


    Z reguły sprzętowe enkodery wykrywają oba zbocza więc tymże też się kierowałem. Poza tym mając oba zbocza lepiej jest kontrolować całą sekwencję obrotu i tak jak pisałem wyżej łatwiej jest wykryć błędy. Sposób ten działał bezbłędnie dla 360 obrotów na sekundę i nie widzę powodów dla których mógłby nie działać przy 2 obrotach na sekundę.
  • #11 10529678
    dondu
    Moderator na urlopie...
    Saabotaz napisał:
    dondu - 15ms czekam w procedurze obsługi przerwania, zaraz na jej początku.

    Napisałem przecież:
    dondu napisał:
    Ty oczekujesz w pętli przerwania, czego powinieneś unikać jak ognia.

    i podałem link gdzie w punkcie 3 jest wyjaśnione dlaczego.

    Dodatkowo przeczytaj jeszcze to: Dlaczego przy szybkim kręceniu impulsator się myli?

    I mając tę wiedzę, przerób swój program.

    A tak na marginesie, czy musisz wykorzystywać przerwania? Bezpiecznie bez dodatkowych elementów RC można to zrobić poprzez skanowanie za pomoca timera i przerwania.
  • #12 10529684
    janbernat
    Poziom 38  
    Najlepszy kawałek programu do impulsatora dał mi tmf
    tu:
    https://www.elektroda.pl/rtvforum/topic1881808.html
    Co prawda w C a nie w asm.
    Też to idealnie nie działa przy szybkich obrotach.
    Bo drgania styków.
    Zrobiłem sobie potem impulsator z silnika krokowego- silnik, LM324 jako komparatory-
    no lepiej.
    Ale dalej kłopot- jak się wolno kręci to napięcie jest zbyt małe.
    Nie ma drgań styków- ale są drgania przy zmianie pozycji.
    To się nie nadaje do odpowiedzialnych działań- tylko optyczny.
    Cena- 2-3 rzędy więcej.
  • #14 10529917
    gaskoin
    Poziom 38  
    dondu napisał:
    gaskoin napisał:
    Sposób ten działał bezbłędnie dla 360 obrotów na sekundę ...

    Ile impulsów na jeden obrót dawał impulsator na jednym z wyjść?
    Możesz podać który to?


    12 na jednym z wyjść, czyli w sumie na dwóch z uwzględnieniem obu zboczy było 48 zliczeń na obrót.

    A enkoder był optyczny na diodzie i fototranzystorze za pare groszy, rozumiem, że tutaj nie da się tego zastosować, ale zasada działania ta sama. Sam debouncing można rozwiązać tak jak proponujecie.
  • #15 10529956
    dondu
    Moderator na urlopie...
    gaskoin napisał:
    12 na jednym z wyjść, czyli w sumie na dwóch z uwzględnieniem obu zboczy było 48 zliczeń na obrót.

    czyli licząc dla jednego wyjścia: 360obr/sek * 12imp/obr = 4320 impulsów/sek.
    to oznacza, że bez uwzględniania drgań styków impulsy pojawiały się co około 0,2ms.
    Śmiem twierdzić, że gubiłeś impulsy ponieważ drgania styków trwają co najmniej kilka milisekund i nie występują w tych samych ilościach lecz losowo.
    Jak to możliwe? :)

    EDIT:
    W trakcie gdy pisałem, dopisałeś:

    gaskoin napisał:
    A enkoder był optyczny na diodzie i fototranzystorze za pare groszy

    co wyjaśnia sprawę, bo nie ma drgań styków.
    Tutaj jednak mamy przypadek impulsatora stykowego, więc niestety Twojego algorytmu nie można zastosować.
  • REKLAMA
  • #16 10530032
    gaskoin
    Poziom 38  
    Mógłby być, w najgorszym przypadku zliczyłby więcej niż potrzeba gdyby stało się tak, że 4 impulsy by się zgodziły z sekwencją obrotu, ale wydaje mi się. że jest to bardzo mało prawdopodobne, lepiej to sprawdzić. Nie można niczego przekreślać :) Panowie, którzy projektowali sprzętowe rozwiązanie chyba nie bez powodu coś takiego wymyślili.

    Myślałem, też, żeby zastosować do tego tylko timer, ale nie wiem jaki w takich impulsatorach jest orientacyjny czas pomiędzy kolejnymi impulsami (między jednym a drugim sygnałem).
  • #17 10530064
    sulfur
    Poziom 24  
    Saabotaz napisał:
    [...]też o tym myślałem żeby zmienić położenie 1 kondensatora dla nóżki INT, tak żeby dawał 1 "strzał" i aktywował przerwanie. Chwilowo zostaję przy aktualnej wersji i sprawdzam co się da z tym zrobić.

    No ale w przytaczanym przeze mnie układzie masz w zasadzie dwa filtry dolnoprzepustowe RC - pierwszy z rezystorem podciągającym w mikrokontrolerze o ile pamiętam coś około 50kOhm i C=100nF, no i drugi, 180 Ohm i 100nF. Stałe RC policz sobie sam. W Twoim przypadku masz tylko jeden filtr, przy ładowaniu.
  • #18 10530075
    dondu
    Moderator na urlopie...
    gaskoin napisał:
    Nie można niczego przekreślać :) Panowie, którzy projektowali sprzętowe rozwiązanie chyba nie bez powodu coś takiego wymyślili.

    Dla optycznego jest ok, ale nie dla stykowego, ponieważ liczba drgań jest losowa, zarówno przy przechodzeniu z 0 do 1 jak i z 1 do 0.
    Oczywiście jeżeli można sobie pozwolić na zgubienie lub rozmnożenie jakiejś części impulsów ... to można próbować.

    Dodano po 1 [minuty]:

    sulfur napisał:
    No ale w przytaczanym przeze mnie układzie masz w zasadzie dwa filtry dolnoprzepustowe RC - pierwszy z rezystorem podciągającym w mikrokontrolerze o ile pamiętam coś około 50kOhm i C=100nF, no i drugi, 180 Ohm i 100nF. Stałe RC policz sobie sam. W Twoim przypadku masz tylko jeden filtr, przy ładowaniu.

    Ale po co się tak męczyć - wystarczy skanowanie za pomocą timera i jego przerwania, bez żadnych elementów RC.
  • #19 10530127
    sulfur
    Poziom 24  
    No ale po co Ci timer, jak masz przerwanie ?
  • #21 10530157
    sulfur
    Poziom 24  
    Zadajesz oczywiste pytania - żeby eliminować drgania styków. Przejdź do wniosków.
  • #22 10530182
    dondu
    Moderator na urlopie...
    sulfur napisał:
    Zadajesz oczywiste pytania - żeby eliminować drgania styków. Przejdź do wniosków.

    Nie bez przyczyny zadałem pytanie.
    I w tym tkwi problem - drgania styków powodują wywołanie niepotrzebnych przerwań.

    Ja pisze o skanowaniu impulsatora, za pomocą timera i przerwania od timera, bez wykorzystania zewnętrznych przerwań oraz elementów RC:
    dondu napisał:
    Bezpiecznie bez dodatkowych elementów RC można to zrobić poprzez skanowanie za pomoca timera i przerwania.

    Dodatkowa zaleta, że można to zrobić na dowolnych pinach mikrokontrolera.
  • REKLAMA
  • #23 10530230
    sulfur
    Poziom 24  
    Aha, masz na myśli nie przerwanie zewnętrzne, tylko przerwanie od np przepełnienia timera.
    Moim zdaniem rozwiązanie to, choć poprawne, jest gorsze. Z INT0 i RC jak nic się nie kręci, to nic się nie wykonuje. Procesor np może spać. U Ciebie będzie się budził i sprawdzał, czy nic się nie stało. Żeby był odpowiednio dokładny musi skanować często. U mnie w zasadzie im krótsze przerwanie i "brak innych" tym więcej impulsów jest w stanie zliczyć (ograniczają nas tutaj też stałe czasowe i związane z nimi drgania styków).
    No ale - co kto lubi.
  • #24 10530250
    dondu
    Moderator na urlopie...
    sulfur napisał:
    Aha, masz na myśli nie przerwanie zewnętrzne, tylko przerwanie od np przepełnienia timera.

    Mogłem dodać słowo przepełnienia, byłoby jaśniej :)

    sulfur napisał:
    Moim zdaniem rozwiązanie to, chodź poprawne, jest gorsze. Z INT0 i RC jak nic się nie kręci, to nic się nie wykonuje. Procesor np może spać. U Ciebie będzie się budził i sprawdzał, czy nic się nie stało. Żeby był odpowiednio dokładny musi skanować często. U mnie w zasadzie im krótsze przerwanie i "brak innych" tym więcej impulsów jest w stanie zliczyć (ograniczają nas tutaj też stałe czasowe i związane z nimi drgania styków).
    No ale - co kto lubi.

    Wkładasz w ten projekt dodatkowe ograniczenia, o których autor nic nie pisze.
    Inaczej realizuje się projekt zasilany bateryjnie, gdzie z zasady musisz usypiać, od projektu, gdzie uC chodzi non stop w pętli głównej czekając na zadania, lub wykonując jakieś drobne algorytmy.

    Innymi słowy nie narzucaj ograniczeń, o których autor tematu nic nie pisał.

    A tak przy okazji to projekty zasilane bateryjnie realizuję o wiele bardziej skomplikowanie (przerwania, przerwania i jeszcze raz przerwania), dodatkowo zmieniając prędkości rdzenia w miarę potrzeb w danej chwili no i najgłębszy sen jaki się da w danej chwili :)
  • #25 10530278
    sulfur
    Poziom 24  
    No ale dondu, przecież Ty musisz dodatkowo sprawdzać stan dwóch portów i zrobić mu debounce, a w INT0_vect trzeba jedynie zrobić
    if (pinjestzerem) przekrecilosiewlewo;
    else przekrecilosiewprawo;
    Po za tym, to Ty jesteś (byłeś?) miłośnikiem energooszczędności.
  • #26 10530437
    dondu
    Moderator na urlopie...
    sulfur napisał:
    Po za tym, to Ty jesteś (byłeś?) miłośnikiem energooszczędności.

    Jestem nadal, ale w tym temacie autor na razie nie postawił takiego wymogu :)

    sulfur napisał:
    No ale dondu, przecież Ty musisz dodatkowo sprawdzać stan dwóch portów i zrobić mu debounce, a w INT0_vect trzeba jedynie zrobić ...

    Na razie autor nie podał czy "ma nóż na gardle" i nie ma wolnej mocy obliczeniowej.
    Dlatego uważam, że nie trzeba dawać dodatkowych zewnętrznych pojedynczych (jak autora), a tym bardziej podwójnych (Twoja propozycja) filtrów RC.

    Każde rozwiązanie ma wady i zalety. Autor sam oczywiście wybierze rozwiązanie.
  • #27 10530498
    Konto nie istnieje
    Konto nie istnieje  
  • #28 10530566
    dondu
    Moderator na urlopie...
    Saabotaz napisał:
    Ale to nadal nie rozwiązuje problemu szybszego kręcenia.

    Bo tutaj występuje problem o którym napisałem na początku podając Ci link w tym poście, gdzie to jest dokładnie wyjaśnione, łącznie z rysunkiem nachodzących na siebie drgań styków. Ten problem może rozwiązać tylko i wyłącznie enkoder optyczny, choć i dla niego są ograniczenia, ale dla Ciebie pewnie nieistotne.

    Innymi słowy - dopuść do siebie myśl że drgania styków ograniczają Ci maksymalną prędkość enkodera, niezależnie czy eliminację drgań zrobisz programowo, czy sprzętowo.


    Saabotaz napisał:
    Jest ostatnie rozwiązanie awaryjne - inny typ enkodera. Taki że gdy kręcę w lewo to są impulsy tylko na wyjściu A, kręcąc w prawo są tylko na wyjściu B. Mam je, lecz zawsze trudno je kupić bo to prawie rarytas. Dlatego najpierw próbuję coś zrobić na zwykłym enkoderze z przesunięciem impulsów.

    Jeżeli ten enkoder także jest stykowym, to nic Ci nie da, bo nadal drgania będą zachodzić na siebie. Ratuje Ciebie tylko optyczny.

    Saabotaz napisał:
    Procesor nie będzie usypiany, a całe urządzenie będzie żarło dużo prądu więc tutaj problemu nie ma.

    Tak właśnie założyłem.


    Saabotaz napisał:
    Natomiast jak widzę nie ma sensownego rozwiązania jak to obsłużyć w przerwaniu i zgasić drgania. Pozostaje tylko zrobić lepsze odkłócenie.

    :D filtr RC na pinie mikrokontrolera, ogranicza pasmo tak samo jak filtr programowy. Nic to nie zmieni, a będziesz miał niepotrzebne elementy dodatkowe.

    Ten temat wyjaśniałem już kol. janbernat tutaj:
    https://www.elektroda.pl/rtvforum/topic1897657.html

    który także Tobie podpowiedział:
    janbernat napisał:
    Też to idealnie nie działa przy szybkich obrotach.
    Bo drgania styków.
    Zrobiłem sobie potem impulsator z silnika krokowego- silnik, LM324 jako komparatory-
    no lepiej.
    Ale dalej kłopot- jak się wolno kręci to napięcie jest zbyt małe.
    Nie ma drgań styków- ale są drgania przy zmianie pozycji.
    To się nie nadaje do odpowiedzialnych działań- tylko optyczny.


    EDIT:
    A do czego stosujesz ten impulsator?
  • #29 10530639
    gaskoin
    Poziom 38  
    dondu napisał:

    drgania styków trwają co najmniej kilka milisekund i nie występują w tych samych ilościach lecz losowo.


    dondu czy w ciągu tych kilku milisekund jest szansa, że pojawi się impuls z drugiego wyjścia impulsatora ? Bo jeżeli nie, to przecież mój pomysł jest w porządku. Nie był on wcale projektowany do zastosowań optycznych i będzie działał też na stykach. Jedyny minus to wykonywanie niepotrzebnych obliczeń w przypadku implementacji softwarowej, ale zawsze jest to coś kosztem czegoś :) nie ma nic za darmo.

    Btw, jeżeli jest szansa na wystąpienie drugiego impulsu, to sam impulsator nie nadaje się do zastosowań autora. Nikt przecież nie będzie kręcił potencjometrem podłączając go do sokowirówki. W takim przypadku trzeba dać optykę albo magnet i nie ma zmiłuj.
  • #30 10530701
    dondu
    Moderator na urlopie...
    gaskoin napisał:
    dondu czy w ciągu tych kilku milisekund jest szansa, że pojawi się impuls z drugiego wyjścia impulsatora ?

    Właśnie z tym ma problem autor:

    Saabotaz napisał:
    Problem mam w tym że program działa dobrze gdy kręcę gałka powoli. Gdy pokręcę szybciej to już jest źle wykrywany kierunek lewo/prawo.


    Poza tym, przy pewnej prędkości enkodera, nawet na 1 wyjściu drgania się na siebie nałożą.


    gaskoin napisał:
    Btw, jeżeli jest szansa na wystąpienie drugiego impulsu, to sam impulsator nie nadaje się do zastosowań autora.

    Dlatego zapytałem autora i czekam na odpowiedź:

    dondu napisał:
    A do czego stosujesz ten impulsator?
REKLAMA