Skocz do zawartości

Sprawdzenie schematu dołączenia enkodera do arduino


atm320

Pomocna odpowiedź

A czy mógłbyś, zamiast słabo czytelnego schematu opowiedzieć w pięciu zdaniach jak to ma działać? Mam wrażenie, że nie zrozumiałeś jak działa ten enkoder. On potrzebuje impulsów na linii CLK aby wysłać aktualny stan przez linię DATA. Użycie scalaka zawierającego tylko odbiorniki różnicowe (jak rozumiem po stronie Arduino, bo na tych bazgrołach niewiele widać), tylko potwierdza tę tezę. Pomijając fakt, że nie wiemy którędy będzie płynął strumień danych - na rysunku mamy tylko zegar i to w złą stronę.

BTW: Zacząłeś słabo. Szanuj ludzi, którym pokazujesz swoje "projekty" a oni odpłacą się tym samym.

Link do komentarza
Share on other sites

Na wstępie chciałbym zaznaczyć że to jest mój pierwszy taki projekt.

Chciałem, żeby arduino odczytywało aktualne położenia kątowe z enkodera ,który określa je poprzez sygnał DATA. Sam sygnał CLK interpretowałem jako jedną z danych która służy do odczytania tego położenia. Natomiast AM26LS32 miał przekształcić sygnał CLK i DATA na taki, który można podać na konwerter, zaś konwerter miał przekształcić te sygnały na takie które można odczytać przy pomocy arduino.

Jeżeli jest jakikolwiek inny sposób na zrealizowanie tego układu to prosiłbym o podpowiedź.

Link do komentarza
Share on other sites

Nie wiem czy jest inny, bo nie wiem jakie są założenia. Napisz wszystko od początku: co to za urządzenie, w jakich warunkach ma pracować (przemysł, biuro, na zewnątrz itp), co tak naprawdę chcesz znać (prędkośc, położenie? - w jakim zakresie, jak szybko zmieniające się, z jaką rozdzielczością), czy rzeczywiście potrzebujesz enkoder absolutny (może wystarczy przyrostowy), jak daleko będzie Arduino (czy co tam w końcu stanie) od czujnika, z czego będzie zasilane jedno i drugie itp itd..

Wtedy dopiero można coś poradzić. Mogę Ci opisać jak zrobić poprawny pomiar kąta z tych gratów jakie wybrałeś, ale nie wiem czy to ma sens. Skoro jesteś początkujący to być może w czymś przestrzeliłeś albo czegoś niedoszacowałeś. Inaczej podchodzi się do gałki regulującej np. prędkość zabawki a inaczej do enkodera w maszynie na hali, gdzie pomyłka może kosztować np. utratę lasera za 5 milionów.

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

To nie jest projekt do jakiegoś konkretnego zastosowania, po prostu posiadam taki enkoder i po skończonym kursie arduino na forbocie nasunął mi się pomysł, żeby go wykorzystać, początkowo spróbować odczytać z tego enkodera położenie kątowe przy pomocy arduino, a następnie rozbudować ten układ także do zadawania położenia kątowego. Po przeczytaniu noty katalogowej tego enkodera zauważyłem, że pomiędzy tym enkoderem a arduino należy wstawić także elementy które pomogą w przekonwertowaniu danych do takiego stanu by można je odczytać przy pomocy arduino, wybór padł na AM26LS32 oraz wymieniony wyżej konwerter po to by pośredniczyły w transmisji sygnałów do arduino. Chciałbym jeżeli jest taka możliwość poprosić o pomoc bądź podpowiedź w dobraniu odpowiednich układów do tego by odczytać położenie kątowe z tego enkodera.

Link do komentarza
Share on other sites

OK, czyli hobbystyczna zabawa na biurku, rozumiem.

No to jest tak: enkoder oczekuje, że dostanie od Ciebie sygnał zegarowy w takt którego odeśle aktualną pozycję swojego wału. Ponieważ nie napisałeś jaki konkretnie model posiadasz, nie wiemy jaki zakres obrotów ogarnia ta sztuka ani jaka jest jej rozdzielczość kątowa. Na szczęście do zrobienia poprawnego interfejsu nie ma to zupełnie znaczenia. Jedyną rzeczą jaką musisz rozumieć to sposób przesyłania danych. Masz to narysowane na wykresach czasowych w karcie katalogowej - rysunek pt. "Single Shift". Istotne jest, że enkoder rozpoznaje początek sekwencji (bo w żaden sposób jeden impuls zegara nie różni się od drugiego) jedynie po czasie. Aby enkoder zaczął nadawać pozycję od najstarszego bitu liczby, od ostatniego impulsu zegara musi upłynąć więcej niż 20us. Każdy impuls będący "bliżej" poprzednika niż katalogowy czas "tm" będzie uznany za kontynuację poprzedniej sekwencji. Z tego od razu widać, że:

  • między odczytem jednej wartości i kolejnej musi upłynąć więcejniż 20us,
  • impulsy zegara nie mogą po sobie następować rzadziej niż co 20us a więc minimalna częstotliwość zegara to 50kHz.

Jedynym interfejsem w Arduino mogącym spełnić te warunki jest SPI. W trybie MASTER generuje on zegar SCK i synchronicznie z nim (i jednocześnie) nadaje i odbiera dane. Ty nie wykorzystasz nadawania (po linii MOSI), ale potrzebujesz koniecznie odbioru (linia MISO). Zatem robisz tak:

  • Zasilasz enkoder z jakiegoś zasilacza dającego min 10-30V. Ja bym celował w stabilizowanego malucha wtyczkowego 12V, min. kilkaset mA.
  • Kupujesz scalak umiejący zamieniać transmisję różnicową na asymetryczną i odwrotnie, koniecznie w tzw. fullduplexie (czyli jednocześnie w obie strony) - to typowy transceiver RS422. Jest tego dziesiątki rodzajów, np. taki:

https://www.tme.eu/pl/details/isl8490eibz/uklady-scalone-interfejs-rs232-422-485/renesas-intersil/

https://www.tme.eu/Document/0b40da4654a4edd67b8a4d97401e409a/isl8488e-89e-90e-91e.pdf

  • Zasilacz go z Vcc (5V) Arduino. Jego wejście nadajnika (DI) podłączasz do pinu SCK Arduino a wyjście odbiornika (RO) do MISO Arduino. Linie różnicowe prowadzisz do enkodera wg opisu jego złącza.
  • Piszesz prosty program ustawiający prędkość SPI na jakieś 100kHz i ustawiający tryb pracy zegara na odwrotny. Oczywiście odwrócenie fazy zegara możesz dokonać zamieniając przewody jego linii różnicowej 🙂 Dalej już tylko wysłasz 3 bajty samych zer (które idą w powierze ale uruchamiają cały interfejs), jednocześnie odbierając 24 bity danych i voila. Zrobione. Do SPI w Arduino na pewno jest jakaś biblioteka.

Z opisu nie dokładnie rozumiem czy enkoder wysyła 24 czy 25 bitów danych więc jeśli wyda Ci się, że dostajesz 2 razy za mało kroków na obrót, dodajesz do programu transmisję 4 bajtu i odpowiednio przesuwasz odpowiedź (bo masz tylko 1 bit więcej, pozostałe 7 musisz odrzucić).

To co, nie wydaje się trudne, prawda?

BTW: Gdybyś miał oscyloskop, trochę elementów w szufladzie i doświadczenia w głowie, w przypadku odległości <1m pewnie obyłoby sie bez scalaka/transceivera RS422, ale wolę nie wpuszczać Cię w takie maliny.

  • Lubię! 1
  • Pomogłeś! 1
Link do komentarza
Share on other sites

Dziękuję bardzo za pomoc, nie spodziewałem się, że ktoś tak rzetelnie pomoże mi z tym problemem.

Jeszcze tylko w celu upewnienia się odnośnie podłączenia pinów z enkodera do tego scalaka. Jeżeli dobrze zrozumiałem podłączenie tych pinów powinno wyglądać w następujący sposób?

DATA +   ---> A

DATA -    ---> B

CLK +     ---> Z

CLK-        ---> Y

 

 

Link do komentarza
Share on other sites

Tak, pod warunkiem, że odwrócenie zegara zrobiłeś świadomie i nie będziesz grzebał przy jego ustawieniach domyślnych w SPI (CPOL=0, CPHA=0, DORD=0). Ustaw podzielnik tak, by szybkość SCK była w granicach 100kHz..200kHz. Wyżej lepiej nie, bo choć enkoder by sobie z tym poradził (do 1MHz), to nie wiadomo jak zadziała transceiver który kupisz. Wiele z nich ma ograniczenia szybkości ze względu na poziom generowanych do kabla zakłóceń.

Mimo że interfejs jest różnicowy, koniecznie połącz także masę zasilania enkodera z masą transceivera RS422 i GND Arduino.

Teraz tak się przyglądam, że ten wykres w datasheet enkodera jest trochę dziwny (ale też nie mógł być innny). Zauważ, że SPI procesora mega328 wczytuje najstarszy bit na pierwszym zboczu pierwszego zegara. Natomiast enkoder zaczyna wystawiać MSB dopiero na drugim zboczu tego impulsu a więc za późno (tam, gdzie jest strzałka w górę). To oznacza, że pierwszy wczytany bit będzie nieważny i całość wczytanych danych trzeba będzie przesunąć o 1 bit w lewo. W takim razie, chyba tak czy tak musisz zrobić transmisję 4 bajtów i wg mnie informacja o pozycji będzie umieszczona w nich jakoś tak: 

7 6 5 4 3 2 1 0   7 6 5 4 3 2 1 0   7 6 5 4 3 2 1 0   7 6 5 4 3 2 1 0
. p p p p p p p   p p p p p p p p   p p p p p p p p   p p . . . . . .

gdzie "p" to kolejne bity pozycji enkodera licząc od najstarszego. 32-bitowe przesunięcie o 6 pozycji w prawo powinno zatem załatwić sprawę, ale to wyjdzie jak już wszystko odpalisz i zaczniesz wysyłać odczyty przez port szeregowy do PCta.

EDIT: No i pozycję dostaniesz w kodzie Gray'a. Doczytaj jak się robi konwersję na postać binarną, bo z tej pierwotnej raczej nic nie wyczytasz.

Edytowano przez marek1707
  • Lubię! 1
Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.