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

Jak wykorzystując ARM7 wykryć kierunek obrotów silnika ?

08 Paź 2010 21:43 1349 2
  • Poziom 2  
    Proszę o pomoc i informację jak skonfigurować timer w ARM7 aby zliczał impulsy z enkodera silnika i był w stanie określić, w którą stronę silnik w danym momencie się obraca.
    Enkoder posiada dwa wyjścia i sygnały są przesunięte w fazie o pół okresu.
    Enkoder podpięty jest na piny TIOA1 i TIOB1.
    Udało mi się skonfigurować timer tak aby zliczał impulsy z enkodera ale tylko jednego przebiegu, nie wiem jak powinny wyglądać ustawienia w rejestrach aby wykrywał mi kierunek.
    Czy da się wykryć w danym momencie jakie zbocza ma sygnał na TIOA i TIOB?
    Bardzo proszę o wskazówki.
  • Poziom 28  
    Wydaje , mi się, że nie ma sensu zaprzęganie timera do odczytywania stanu wyjść enkodera. Wystarczy za pomocą przerwań zewnętrznych wykrywać kolejność występowania zboczy (opadających lub narastających).

    1. Wykrywasz, że jeden z pinów (np pin A) enkodera zmienia stan, np z 0 na 1
    2. Jak pin A zmieni się to czekasz na zmianę stanu pinu B
    3. Jeśli pin B zmieni się na 1 to będzie np kierunek w prawo, a jeśli zmieni się na 0 to kierunek będzie w lewo.

    Nie napiszę ci jak dokładnie powinien wyglądać kod, ale tą metodę wykrywania wykorzystywałem w procesorach AVR i działa idealnie.
  • Poziom 2  
    Rozwiązałem problem w następujący sposób:
    1. Impulsy z enkodera podawane są na dwa wejścia timera (TIOA i TIOB)
    2. Timer jest ustawiony w trybie CAPTURE
    3. TIOB traktowany jest jako TRIGGER wywołujący przerwanie na zboczu
    narastającym i opadającym.
    4. W obsłudze przerwania rozpatrywane są 4 przypadki:
    if(TIOA == 1)
    {
    if(TIOB == 1)
    {
    licznik--;
    }
    else
    {
    licznik++;
    }
    }
    else
    {
    if(TIOB == 0)
    {
    licznik--;
    }
    else
    {
    licznik++;
    }
    }


    if(TIOB == 1)
    {
    if(TIOA == 0)
    {
    licznik++;
    }
    else
    {
    licznik--;
    }
    }
    else
    {
    if(TIOA == 1)
    {
    licznik++;
    }
    else
    {
    licznik--;
    }
    }

    Dopiero po rozpatrzeniu tych 4 przypadków enkoder zaczął poprawnie zliczać impulsy.