Jak precyzyjnie mogę uzyskać Arduino za pomocą enkoderów obrotowych?

15

Silniki krokowe są często drogie dla dużego silnika. Jednak dzięki mocnemu, standardowemu silnikowi prądu stałego i enkoderowi obrotowemu można „symulować” silnik krokowy. Jak dokładne są kodery obrotowe z Arduino tylko z podstawową pętlą i niewiele innych kodów? Czy będzie to „brakowało impulsu” i nie będzie często rejestrować wystarczającej rotacji? Jak sobie z tym poradzić, używając znacznie więcej kodu? Czy jest na to lepszy sposób? Czy zakłócenia pomogłyby? Czy istnieje jakiś obwód, który pomógłby w rozwiązaniu tego problemu?

Uwaga: Prawdopodobnie nie przekroczy 4 obrotów na sekundę ... (To może być dużo, ale jeśli wykonujesz mechanizm śruby pociągowej, który wynosiłby 24 cale na minutę, jeśli występuje 10 obrotów na cal ruchu liniowego. )

Anonimowy pingwin
źródło
Użyłem enkoderów obrotowych, które nie działały poprawnie po szybkim wirowaniu. Myślę, że różni się w zależności od ceny.
jippie

Odpowiedzi:

10

Przerwy są tym, czego użyłbyś w tej sytuacji.

Prędkości, o których wspomniałeś, są na tyle wolne, że prawdopodobnie będziesz w stanie policzyć je w pętli, jednak nie jest to zalecane, ponieważ typowa pętla zajmie wiele cykli zegara, w zależności od liczby instancji w pętli , możesz przegapić pewne liczby.

Przerwania są wykonywane w tym celu, ponieważ mogą być wyzwalane w dowolnym momencie, niezależnie od stanu pętli.

Istnieje funkcja o nazwie, attachInterrupt()która pobierze trzy argumenty.

  1. Przerwij PIN
  2. Przerwać procedurę serwisową
  3. Tryb

Poniżej znajduje się przykład liczenia przerwania

volatile int myCounter = 0;

void setup(){
    attachInterrupt(0, count, RISING);
}

void count(){
    myCounter++;
}

Tryby są następujące:

NISKI, ZMIANA, WSTĘP, UPADEK

Więcej informacji na temat używania przerwań można znaleźć tutaj .

W zależności od używanego enkodera konieczne będzie dostosowanie kodu do potrzeb i wykonanie dodatkowych obliczeń w celu ustalenia pozycji, ale powinien to być dobry punkt wyjścia.

Edytuj Oto przykładowy kod z Arduino Sandbox do używania enkodera obrotowego.

Matt Clark
źródło
1
Detektor krawędzi sterowany przerwaniem w Duemilanove z łatwością obsługuje 100 krawędzi na sekundę (6500 obr / min na silniku).
Wayfaring Stranger
@WayfaringStranger Zatem nie ma problemu z Uno. Dzięki!
Anonimowy pingwin
1
@AnnonomusPerson - Ile pracy chcesz włożyć? Jeśli wybierzesz goły ( ISR_NAKED()), możesz pominąć automatyczne zapisywanie kontekstu C i bez problemu pobrać 100-500 Khz częstotliwości przerwań, ale w tym momencie piszesz asembler w C.
Connor Wolf,
1
Jeśli potrzebujesz całkowicie bananowego dokumentu na temat optymalizacji absolutnej bzdury z odpowiedzi na przerwanie, spójrz tutaj . Umieszczanie kodu bezpośrednio w tabeli przerwań, aby jeszcze bardziej zmniejszyć opóźnienie przerwań!
Connor Wolf,
1
Zauważ też, że jeśli wybierasz się do przerwań o niskim opóźnieniu, funkcja arduino attachInterrupt wstrzykuje cały dodatkowy narzut wywołania funkcji w porównaniu do ISR()bezpośredniego użycia przerwania .
Connor Wolf,
3

Dodanie pewnych odniesień do już napisanych bibliotek i przykładów, aby umożliwić porównanie różnych podejść i doświadczeń z szybkością i podatnością na brakujące kroki.

Odczytywanie enkoderów obrotowych: http://playground.arduino.cc/Main/RotaryEncoders

Koder kwadraturowy zbyt szybki dla Arduino (z rozwiązaniem): http://www.hessmer.org/blog/2011/01/30/quadrature-encoder-too-fast-for-arduino/

Biblioteka Teensy Encoder: https://www.pjrc.com/teensy/td_libs_Encoder.html

Odczytywanie enkodera obrotowego na Arduino: http://www.circuitsathome.com/mcu/reading-rotary-encoder-on-arduino/

gwideman
źródło