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

Kod w C do obsługi enkodera impulsowego - przykładowa procedura

mototest 06 Wrz 2006 16:48 2977 11
REKLAMA
  • #1 2993330
    mototest
    Poziom 19  
    Posty: 440
    Ocena: 4
    Witam kolegów

    możecie podesłać jakąś sprawdzoną procedurkę do obsługi w/w ?
    ilość impulsów na obrót jest nieistotna ,to sobie dopracuję, chciałbym zobaczyć jak to sie obsługuje.

    dzięki
    Bogdan
  • REKLAMA
  • #2 2993658
    Granat :)
    Poziom 34  
    Posty: 3043
    Pomógł: 202
    Ocena: 667
    witam
    w prawdzie nie programuję w C ale mogę przybliżyć ogólną zasadę popularnych encoderów :)
    są dwie nóżki, które zwierają do masy
    najpierw sprawdzasz nóżke wyzwalającą (warunkiem, że jeśli odpowiedni pin jest w stanie niskim to...)
    potem w tym warunku sprawdzasz w którą stronę kręci się gałką (to będzie kolejny warunek, że jeśli przykładowo kręcisz w lewo to nóżka wskazująca kierunek nie zwiera do masy, a jak w prawo to zwiera)
    i to tyle :)
    a takie warunki zależne od pinów procka napewno umiesz sobie napisać :D
    pozdrawiam

    Dodano po 3 [minuty]:

    przykładowo (zakładamy, że nóżka wyzwalająca encodera jest podłączona do pinu który nazwiemy X a nózka kierunku do Y, oporniki podciągające są potrzebne... i przydałby się kondednsator nie za duzy i nie za mały, żeby układ był odporny na drgania styków):

    
    jeśli X jest w stanie niskim to
    jeśli y jest w stanie wysokim to
    kręcę w lewo
    jak y w niskim to
    kręcę w prawo
    

    :D
  • #3 2993865
    mototest
    Poziom 19  
    Posty: 440
    Ocena: 4
    niby proste ,cekawe czy tak proste będzie w praktyce...:)

    z twojego opisu wynika że jeśli Y=0 to X może być 0 lub 1 ?
    czyli jest możliwa sytuacja że Y=0 i X=0 ?
  • REKLAMA
  • #4 2994142
    adamusx
    Poziom 27  
    Posty: 977
    Pomógł: 94
    Ocena: 28
    Przykład z BASCOMa

    Do
    If Enk_A <> Temp_enk Then
    If Enk_A <> Enk_B Then
    Incr Poz
    Else
    Decr Poz
    End If
    Temp_enk = Enk_A
    End If
    Loop

    gdzie Poz to zmienna przechowywujaca liczbe impulsow, a Enk_A i Enk_B to sygnalyz enkodera
  • REKLAMA
  • #5 2994234
    Granat :)
    Poziom 34  
    Posty: 3043
    Pomógł: 202
    Ocena: 667
    odwrotnie
    jeśli X = 0 to sprawdzasz czy Y = 1 czy 0
    1 oznacza w lewo (przykładowo) a 0 w prawo
  • #6 3000304
    mototest
    Poziom 19  
    Posty: 440
    Ocena: 4
    po pomiarach widze że jest z tym problem bo, enkoder zostając na jakiejś pozycji na stałe zmiera X do masy i wtedy program ciągle będzie dodawał lub odejmował ... to sie dzieje losowo ,czasem X zwiera na stałe czasem zostaje na przerwie, więc jak zrobić żeby dodawał czy odejmował tylko jak kręcę ?
  • #7 3000352
    Granat :)
    Poziom 34  
    Posty: 3043
    Pomógł: 202
    Ocena: 667
    hmm zaraz
    bo ja jakoś to zrobiłem tak, że działa normalnie nawet jak zostanie w pozyji przejściowej czyli ze zwartym X'em

    Dodano po 3 [minuty]:

    dałem zmienną BIT która jest ustawiana gdy oba (można zrobić warunek tylko dla X) piny enkodera X i Y są w stanie wysokim (nie zwierają do masy)
    i potem warunek, że jeśli ta zmienna bit = 1 to wtedy dopiero sprawdzam stan X a potem Y i resetuję zmienną BIT
  • #8 3000486
    mototest
    Poziom 19  
    Posty: 440
    Ocena: 4
    no, to już lepiej, sprawdzę w programie, powinno zadziałać, ale nie jest to pewne czy nie wystąpią jakieś problemy :)
  • #9 3000697
    adamusx
    Poziom 27  
    Posty: 977
    Pomógł: 94
    Ocena: 28
    Uzyj funkcji która podałem wczesniej. Na pewno dziala i jest powrzechnie używana !
  • REKLAMA
  • #10 3001185
    mototest
    Poziom 19  
    Posty: 440
    Ocena: 4
    sposób wygląda na dobry ,nie analizowałem go wcześniej szczegółowo, tylko na razie nie mam koncepcji jak to przerobić na C, muszę nad tym popracować...
  • #11 3001395
    mrq80
    Poziom 15  
    Posty: 57
    Pomógł: 15
    Witam,

    1. Kiedyś pisałem obsługę enkoderan na AVR w C.
    Oto fragment kodu:

    prog_char EncTab[] = 	{
    						 0, 1, -1, 0,
    						 -1, 0, 0, 1,
    						 1, 0, 0, -1,
    						 0, -1, 1, 0
    						};
    
    
    	while(1)
    	{
    		//enc_state - stan enkodera to bajt zawierający informacje o alkualnym
    		//i poprzenim stanie enkodera pownien miec postaj jak ponizej
    
    		//enc_state zawiera (MSB..LSB): 0, 0, 0, 0, new_A, new_B, old_A, old_B
    
    		//u mnie wejścia z enkodera podłączone są do PORT_ENC.0 i PORT ENC.1
    		//poniższa komenda powoduje ustawienie bajtu enc_state zgodnie z zadanym formatem
    		
    		enc_state	=	(enc_state >> 2) | ( (PORT_ENC & 0x03) << 2);
    	
    		// (enc_state >> 2) przenosi new_A na old_A oraz new_B na old_B
    		// ( (PORT_ENC & 0x03) << 2) wpisuje aktualna wartość portów do new_A i new_B
    
    		// z tabeli EncTab pobierana jest informacja ile należy dodac 
    		// q zawiera -1 gdy obrót w jedną stronę, +1 gdy w drugą, lub 0 gdy brak obrotu
    		q	=	PRG_RDB(&EncTab[(int)enc_state]);
    	}
    


    2. W załacznikach inny przykład. Gotowa biblioteka na AVRa.
    Niestety nie wiem jak dziala bo jej nie uzywalem.


    Pozdrawiam
    Marek
    Załączniki:
    • encoder.h (5.07 KB) Musisz być zalogowany, aby pobrać ten załącznik.
    • encoder.c (6.36 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • #12 3002230
    mototest
    Poziom 19  
    Posty: 440
    Ocena: 4
    bardzo ciekawe rozwiązanie, sprawdzę to w praktyce, ale dopero po niedzieli, na razie dzięki

    B.

Podsumowanie tematu

LABEL_AI_GENERATED
Dyskusja dotyczy implementacji obsługi enkodera impulsowego w języku C. Przedstawiono ogólną zasadę działania enkodera z dwoma pinami: wyzwalającym (X) i kierunku (Y), gdzie stan niskiego napięcia na pinie X oraz stan pinu Y określają kierunek obrotu. Zwrócono uwagę na problem drgań styków i sytuacji, gdy pin X pozostaje trwale zwarty do masy, co powoduje niepożądane ciągłe inkrementacje lub dekrementacje. Zaproponowano rozwiązanie z użyciem zmiennej BIT, która jest ustawiana tylko wtedy, gdy oba piny X i Y są w stanie wysokim, co pozwala na wykrywanie faktycznego ruchu enkodera. Podano również przykład fragmentu kodu w BASCOMie oraz bardziej rozbudowany przykład w C dla mikrokontrolerów AVR, wykorzystujący tablicę stanów (EncTab) do określania zmiany pozycji na podstawie aktualnych i poprzednich stanów pinów enkodera. Dyskusja podkreśla konieczność stosowania rezystorów podciągających i kondensatorów filtrujących w układzie sprzętowym, aby zminimalizować zakłócenia i drgania styków.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA