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

Dlaczego dany kod niewłaściwie zlicza impulsy enkodera optycznego?

krzysiek_kutno 14 Sty 2021 00:55 681 12
REKLAMA
  • #1 19182051
    krzysiek_kutno
    Poziom 9  
    Posty: 46
    Ocena: 8
    Witam serdecznie.
    Niestety po wielu bataliach poległem z tematem jakże prostym.
    Posiadam enkoder optyczny o dokładności 2000 impulsów na obrót. postanowiłem podpiąć go do mikokontrolera aby zacząć liczyć jego impulsy (kierunek obrotu tutaj jest nieistotny)

    impulsy liczy jednakże liczy je bardzo niedokładnie - szukając nie bardzo mogłem natrafić na szybki licznik który będzie pracował na przerwaniach.

    Oto mój kod:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Jestem pewien iż impulsy są pomijane - bądź niepotrzebnie inkrementowane dodatkowo.
    proszę o pomoc.
  • REKLAMA
  • #2 19182056
    excray
    Poziom 41  
    Posty: 5498
    Pomógł: 739
    Ocena: 655
    Enkoder podpinasz pod jedno z wejść opisanych jako Tn (T1, T2, T3), konfigurujesz odpowiedni licznik do pracy z zewnętrznym sygnałem:
    Dlaczego dany kod niewłaściwie zlicza impulsy enkodera optycznego?
    i gotowe.
  • REKLAMA
  • #3 19182059
    krzysiek_kutno
    Poziom 9  
    Posty: 46
    Ocena: 8
    I tak za dobrze nie rozumiem. Jednakże chciałbym mieć możliwość zrealizowania tego na dowolnym pinie uC. I na takim algorytmie mi najbardziej zależy.
  • #4 19182061
    excray
    Poziom 41  
    Posty: 5498
    Pomógł: 739
    Ocena: 655
    Możesz wybrać albo "zrobić to dobrze", albo "zrobić to na dowolnym pinie". Efekty tego drugiego wyboru już znasz z autopsji. Od biedy, jeśli podepniesz sygnał pod pin z opcją INT, to możesz próbować zrealizować to poprzez przerwanie od zmiany stanu/zbocza.
  • #5 19182067
    krzysiek_kutno
    Poziom 9  
    Posty: 46
    Ocena: 8
    ok - a podał być przykład na kodzie proszę ?
  • #6 19182069
    excray
    Poziom 41  
    Posty: 5498
    Pomógł: 739
    Ocena: 655
    Sygnał podpinasz pod PD6, inicjalizujesz licznik:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    a w programie jako wartość enkodera czytasz TCNT1.
  • REKLAMA
  • #7 19182074
    krzysiek_kutno
    Poziom 9  
    Posty: 46
    Ocena: 8
    Ok - lecz w tym wypadku mam 2 kanały. A i B z enkodera.
    1) Analizując sposób nr1 czyli T1 lub T2 lub T3 - to które były by to piny i jak by wyglądał kod - niestety nie mam tyle wiedzy aby sama tabelka mi wystarczyła
    2) a jesli bym uparł się przy obojetnie jakim pinie to jak lepiej można zrealizować kod ?
    Przepraszam że Cię męczę.
  • #8 19182267
    excray
    Poziom 41  
    Posty: 5498
    Pomógł: 739
    Ocena: 655
    krzysiek_kutno napisał:
    Ok - lecz w tym wypadku mam 2 kanały. A i B z enkodera.
    1) Analizując sposób nr1 czyli T1 lub T2 lub T3 - to które były by to piny i jak by wyglądał kod - niestety nie mam tyle wiedzy aby sama tabelka mi wystarczyła

    Skoro
    krzysiek_kutno napisał:
    kierunek obrotu tutaj jest nieistotny
    , to nigdzie nie podpinasz drugiego kanału z enkodera.

    krzysiek_kutno napisał:
    2) a jesli bym uparł się przy obojetnie jakim pinie to jak lepiej można zrealizować kod ?

    To ja Ci życzę powodzenia i będę mocno trzymać kciuki. Jak już napiszesz ten kod to podziel się nim tutaj. Tylko pamiętaj, że w realnym życiu mikroprocesor poza poolingiem pinów robi jeszcze mnóstwo innych rzeczy. I nie można poświęcić 90% jego mocy obliczeniowej na sprawdzanie, czy na jakimś pinie nastąpiła zmiana stanu.
  • REKLAMA
  • #9 19182346
    simw
    Poziom 27  
    Posty: 754
    Pomógł: 94
    Ocena: 286
    Sprawdź kod w załączniku. Warunkiem użycia jest wykonanie kodu w przerwaniu od timera.
    Im szybsze będzie przerwanie tym szybsze impulsy będą wychwytywane.
    Testowałem kod z enkoderem optycznym 360 imp. oraz przerwanie było ustawiane na poziomie 0.1 ms - 1 ms kręcąc nim "jak szalony". Przy Twoim enkoderze pewnie szaleństwo będzie bardziej ograniczone, niemniej jednak warto sprawdzić
    Załączniki:
    • encoder_SK.h (1.29 KB) Musisz być zalogowany, aby pobrać ten załącznik.
    • encoder_SK.c (2.25 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • #10 19182457
    mpier
    Poziom 29  
    Posty: 817
    Pomógł: 153
    Ocena: 141
    Witam,
    pomijając całą resztę, to skąd wiesz, że liczy źle? Z czym porównujesz?
    krzysiek_kutno napisał:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
    Twój kod nie zlicza impulsów z enkodera, tylko zmiany stanów na pinach podłączonych do kanału A i B, co raczej nie przekłada się ani na kierunek, ani zmianę pozycji enkodera (tylko zbiegiem okoliczności). Może Twój enkoder produkuje kod Graya?
  • #11 19184458
    krzysiek_kutno
    Poziom 9  
    Posty: 46
    Ocena: 8
    mpier napisał:
    Witam,
    pomijając całą resztę, to skąd wiesz, że liczy źle? Z czym porównujesz?
    krzysiek_kutno napisał:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
    Twój kod nie zlicza impulsów z enkodera, tylko zmiany stanów na pinach podłączonych do kanału A i B, co raczej nie przekłada się ani na kierunek, ani zmianę pozycji enkodera (tylko zbiegiem okoliczności). Może Twój enkoder produkuje kod Graya?


    Porównuję z daną pozycją mechaniczną jaką winien osiągnąć - nadmienię iż minimalnie się różni. Enkoder zaprzęgnięty jest do zaworu.
  • #12 19193903
    krzysiek_kutno
    Poziom 9  
    Posty: 46
    Ocena: 8
    Nie miał bym tyle szczęścia aby utworzył się tutaj kod Greya.
    Pomijając wszystkie dywagacje - Nie mogę sobie poradzić z konfiguracją licznika - Piny A oraz B podpięte są PD6 i PD7. czyli nasze T1 i T2.
    Jak skonfigurować preskaler oraz jak skonfigurować odczyt ?
  • #13 19196797
    mpier
    Poziom 29  
    Posty: 817
    Pomógł: 153
    Ocena: 141
    Czego oczekujesz od konfiguracji licznika, jeśli nie wiesz co daje na wyjściu Twój enkoder i zakładasz że nie jest to kod Graya? Ja bym jednak na próbę przyjął że jest. W twoim kodzie, który cytowałem przenieś pierwszy "}" na koniec i usuń pierwsze "licznik ++".

    Dodano po 27 [minuty]:

    Oczywiście ważny jest kierunek. Licznik powinien liczyć w obie strony, zależnie czy pozycjaA równa się pozycjaB.
    Jeśli enkoder liczy 0, 1, 2 ,3, 0, 1, 2, ..., określenie kierunku i pozycji nie będzie trudne.

Podsumowanie tematu

✨ Użytkownik zmaga się z problemem niewłaściwego zliczania impulsów z enkodera optycznego o dokładności 2000 impulsów na obrót, podłączonego do mikrokontrolera. Wskazówki dotyczące konfiguracji licznika i przerwań sugerują użycie pinów z funkcją INT lub podłączenie do odpowiednich pinów T1, T2, T3. Użytkownik chce zrealizować zliczanie impulsów na dowolnym pinie, co prowadzi do problemów z dokładnością. Wskazano, że kod nie zlicza impulsów, a jedynie zmiany stanów na pinach, co może nie odzwierciedlać rzeczywistej pozycji enkodera. Użytkownik prosi o pomoc w konfiguracji licznika oraz odczycie impulsów z dwóch kanałów enkodera.
Wygenerowane przez model językowy.
REKLAMA