Sposób odczytu wartości enkodera zależy od jego typu. Poniżej opisano metody odczytu dla enkoderów inkrementalnych i absolutnych.
Enkoder inkrementalny
Enkodery inkrementalne udostępniają dwa kanały sygnału wyjściowego: kanał A i kanał B. Są to sygnały impulsowe przesunięte względem siebie o 90 stopni elektrycznych. Wykrywając zmiany stanu na kanale A i kanale B, można określić zarówno kierunek, jak i kąt obrotu. Poniżej przedstawiono podstawowe kroki odczytu enkodera inkrementalnego za pomocą Arduino.
- Podłącz kanał A i kanał B enkodera do pinów Arduino obsługujących przerwania (na przykład piny 2 i 3).
- Zdefiniuj zmienną globalną w kodzie Arduino do przechowywania zliczeń enkodera.
- Napisz procedurę obsługi przerwania (ISR) do obsługi zmian stanu na kanale A i kanale B. W tej procedurze określ kierunek obrotu, porównując bieżący stan jednego kanału z poprzednim stanem drugiego, a następnie odpowiednio zaktualizuj licznik enkodera.
volatile long encoderCount = 0;
int lastB = 0;
void encoderInterrupt() {
int A = digitalRead(2);
int B = digitalRead(3);
// Proste dekodowanie kwadraturowe: porównaj bieżący A z poprzednim B
if (A == lastB) {
encoderCount++;
} else {
encoderCount--;
}
lastB = B;
}
- W funkcji
setup()skonfiguruj tryby pinów i dołącz przerwania, tak aby procedura ISR była wywoływana przy każdej zmianie stanu kanału A lub kanału B.
void setup() {
pinMode(2, INPUT);
pinMode(3, INPUT);
lastB = digitalRead(3);
attachInterrupt(digitalPinToInterrupt(2), encoderInterrupt, CHANGE);
attachInterrupt(digitalPinToInterrupt(3), encoderInterrupt, CHANGE);
}
- W głównej pętli
loop()odczytuj zmiennąencoderCount, aby uzyskać pozycję względną i kierunek obrotu wału silnika.
Uwaga: Powyższy przykład wykorzystuje uproszczone dekodowanie kwadraturowe. W przypadku enkoderów szybkoobrotowych lub o wysokiej rozdzielczości rozważ zastosowanie pełnego automatu stanów kwadraturowych lub dedykowanej biblioteki interfejsu enkodera, aby uniknąć pominiętych zliczeń spowodowanych drganiami sygnału lub odbiciami styków.
Enkoder absolutny
Enkodery absolutne generują sygnał cyfrowy reprezentujący pozycję absolutną wału silnika. Poniższy przykład dotyczy wyłącznie enkoderów absolutnych z wyjściem równoległym, w których każdy bit wartości pozycji jest prezentowany na osobnym przewodzie danych.
Uwaga: Większość przemysłowych enkoderów absolutnych korzysta z szeregowych interfejsów komunikacyjnych, takich jak SSI, SPI lub RS-485, zamiast wyjść równoległych. Te interfejsy wymagają innych metod odczytu, a w niektórych przypadkach dedykowanych bibliotek protokołów. Zawsze zapoznaj się z kartą katalogową enkodera, aby uzyskać prawidłowe informacje o interfejsie i podłączeniu.
- Podłącz każdy pin danych enkodera do cyfrowego pinu wejściowego Arduino.
- W funkcji
setup()ustaw każdy pin danych w tryb wejścia.
void setup() {
pinMode(dataPin1, INPUT);
pinMode(dataPin2, INPUT);
// ... Dodatkowe piny danych, w zależności od liczby bitów enkodera
}
- Napisz funkcję do odczytu wartości enkodera. W tej funkcji odczytaj stan każdego pinu danych za pomocą
digitalRead()i połącz wyniki w jedną wartość całkowitą.
int readEncoder() {
int value = 0;
value |= digitalRead(dataPin1) << 0;
value |= digitalRead(dataPin2) << 1;
// ... Dodatkowe piny danych, w zależności od liczby bitów enkodera
return value;
}
- W głównej pętli
loop()wywołuj funkcjęreadEncoder(), aby uzyskać pozycję absolutną wału silnika.
Uwaga: Powyższe przykłady obejmują podstawowe typy enkoderów. Enkodery w rzeczywistych zastosowaniach mogą wymagać bardziej zaawansowanego przetwarzania, takiego jak implementacja eliminacji drgań styków lub użycie dedykowanego układu scalonego interfejsu enkodera. Zawsze zapoznaj się z kartą katalogową enkodera, aby zapewnić prawidłowe podłączenie i obsługę sygnałów.