• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Encoder na przerwaniach - czy tak może być?
#1
Cześć,

Przerwania to dla mnie jeszcze pewne wyzwanie Wink

Mam enkoder (wybierak) i chcę odczytać jego ruch.

Przeszukałem internet i znalazłem kilka rozwiązań
Na początku chciałem klasycznie wykrywać "wzrost" na pinie i odczyt drugiego pinu - i na zasadzie czy ten drugi jest wysoki czy niski ustalam kierunek obrotu, ale okazało się że dane są pomieszane (pewnie drgania styków) 
Kombinowałem z ograniczeniem częstotliwości ale to i tak czasem powodowało błędny odczyt.


Ostatecznie mam taką funkcje która każdy obrót odczytuje poprawnie Smile ale i tak chciałbym podpytać jak można przyspieszyć funkcję (mam dużo ifów podejrzewam że to daje spore opóźnienie...)
NA początku szukania trafiłem na informacje że funkcje z przerwań można wymusić żeby były w ramie (szybciej się powinny wykonywać) ale teraz nie pamiętam jak to wymusić Sad

Kod:
byte InputKola1A = 33;
byte InputKola1B = 36;



volatile int count1 = 0;
volatile byte stan_kola=0;

int last_count1 = 9999;





void setup() {
  Serial.begin(115200);
  pinMode(InputKola1A, INPUT);
  pinMode(InputKola1B, INPUT);
  Serial.println("start");

  //CHANGE, LOW,RISING,FALLING
 
// attachInterrupt(digitalPinToInterrupt(interruptPin), blink, );

attachInterrupt(InputKola1A, Kolo1A, CHANGE); 
attachInterrupt(InputKola1B, Kolo1B, CHANGE);

}


void Kolo1A() {//funkcja odpowiadająca za reakcję na zmianę stanu na PINie A

  if (digitalRead(InputKola1A)){
  if(stan_kola==0)//pierwszy "wzrost"
    {
      stan_kola=B10000000;
    }
  if(stan_kola==B01000000)//drugi "wzrost" 
  {
    stan_kola=B01100000;
   
  }
  }
  else
  {
    if((stan_kola==B10010000)||(stan_kola==B01100000))//pierwszy "spadek"
    {
      stan_kola=stan_kola | B00001000;
    }
  if((stan_kola==B10010100)||(stan_kola==B01100100))//drugi "spadek" 
  {
    stan_kola=stan_kola | B00000010;
  
    if(stan_kola==B01100110){count1--;}
    stan_kola=0;
    

  }
  }


}


 
void Kolo1B() {//funkcja odpowiadająca za reakcję na zmianę stanu na PINie B

  if (digitalRead(InputKola1B)){
  if(stan_kola==0)//pierwszy "wzrost"
    {
      stan_kola=B01000000;
    }
  if(stan_kola==B10000000)//drugi "wzrost" 
  {
    stan_kola=B10010000;
  }
  }
  else
  {
  if((stan_kola==B10010000)||(stan_kola==B01100000))//pierwszy "spadek"
    {
      stan_kola=stan_kola | B00000100;
     
    }
  if((stan_kola==B10011000)||(stan_kola==B01101000))//drugi "spadek" 
  {
    stan_kola=stan_kola | B00000001;
   
     if(stan_kola==B10011001){count1++;}
    stan_kola=0;
  }
  }


}



void loop() {

  if(last_count1!=count1){
       Serial.println(count1);
       last_count1=count1;
  }
  

}


W "stan_kola" zapisuje bitowo kolejność stanów na koniec sprawdzam czy "przebieg" jest zgodny z oczekiwanym i na tej zasadzie zmieniam licznik count1.
 
Odpowiedź
  


Wiadomości w tym wątku
Encoder na przerwaniach - czy tak może być? - przez Z_kos - 13-06-2020, 01:20

Skocz do:


Przeglądający: 1 gości