Aplikacja układu enkodera magnetycznego AS5040
Z wyrobami firmy austriamicrosystems AG zetknąłem się po raz pierwszy przy okazji targów ELECTRONICA 2000, a następnie podczas poszukiwań względnie taniego, powtarzalnego sposobu określenia pozycji głowicy w jednym z projektowanych urządzeń. Firma ta produkuje specjalizowane układy scalone zawierające wewnątrz struktury matrycę czujników Hall'a oraz procesor uzbrojony w specjalny algorytm umożliwiający określenie położenia pola magnetycznego wytwarzanego przez umieszczony ponad strukturą magnes stały.
Sam układ był już opisywany na przykład na łamach czasopism, podobnie jak zasada jego działania. Podobne układy produkowane są również przez inne firmy. Tu nie chcę rozważać i porównywać ich cech, a jedynie chciałbym skupić się na przykładzie programu napisanego dla mikrokontrolera ST7FLITE29, umożliwiającego podłączenie układu AS5040 poprzez interfejs SSI i odczyt pozycji magnesu. Jednocześnie zdaję sobie sprawę, że nie wyczerpie on wszystkich aspektów aplikacji układu jak też nie opisze możliwych przyczyn problemów. Z całą pewnością pozwoli jednak uruchomić taki enkoder, ułatwi start czy też wykonanie aplikacji dla dowolnego, innego mikrokontrolera.Program napisany jest w języku Asembler mikrokontrolera ST7, natomiast sam układ zbudowałem z wykorzystaniem zestawu ewaluacyjnego ZL1ST7.
Enkoder
Jak wspomniano we wstępie, wewnątrz struktury układu znajduje się procesor połączony z matrycą czujników pola magnetycznego, czujników Hall'a. Dzięki specjalnemu algorytmowi procesor potrafi określić położenie linii sił pola magnetycznego (biegnących pomiędzy biegunami magnesu) względem tej struktury. Nie wdając się w niuanse działania układu dosyć jest powiedzieć, że uzyskana w ten sposób rozdzielczość z jaką określane jest położenie linii sił pola, to aż 10 bitów! Dla mnie było to dużym zaskoczeniem.
Enkoder umieszczono w niewielkiej, plastykowej obudowie przeznaczonej do montażu powierzchniowego, o 16 wyprowadzeniach (SSOP16). Odstęp pomiędzy nóżkami jest bardzo mały (wynosi zaledwie 0,65 mm), ale mimo tego wykonanie płytki przy użyciu emulsji POSITIV nie było aż tak trudne. Na zewnątrz dostępny jest szereg sygnałów, które predysponują układ do wielu zastosowań. Mimo, iż w niniejszym artykule chcę się skupić na interfejsie szeregowym SSI, to jednak warto wspomnieć, że oprócz niego układ ma wyprowadzenia „typowego“ enkodera inkrementalnego tj. kanały A, B i ZERO INDEX. Posiada również wyjście PWM dostarczającego przebiegu o stałej częstotliwości, ale o zmiennym, zależnym od położenia magnesu względem układu współczynniku wypełnienia.
Rysunek 1. Rozmieszczenie wyprowadzeń układu AS5040.
Tryb pracy enkodera może być programowany eliminując konieczność zastosowania na przykład układów detekcji kierunku obrotów. AS5040 to enkoder o naprawdę bardzo dużych możliwościach. Firma produkuje również inne układy enkoderów wyprowadzające informację o pozycji magnesu w jedzcze innej postaci. Z bogatej oferty każdy może dobrać sobie układ do własnych potrzeb.
AS5040 może być zasilany napięciem 3,3 V lub 5V. Napięcie to – inaczej niż w znanych mi dotychczas układach mikroprocesorowych – podawane jest na dwa odrębne wyprowadzenia: osobne dla 3,3 V (nóżka 15) lub osobne dla 5 V (nóżka 16). Zmierzyłem, że przy zasilaniu napięciem 5 V układ pobierał około 16 mA prądu. Enkoder ma możliwość programowania szeregu różnych trybów pracy. Typowe tryby pracy są jednak predefiniowane przez producenta układu tak, że po podłączeniu zasilania – o ile nie ma się jakiś specjalnych wymagań – układ od razu pracuje poprawnie, o ile tylko natężenie pola magnetycznego ma właściwą wartość a magnes jest spolaryzowany prawidowo. Firma zaleca stosowanie magnesów o średnicy 6 mm, wysokości 3 mm i natężeniu pola magnetycznego ±45... ±75mT. Magnesy można zamówić wraz z układem. Ważne jest, aby magnes był umieszczony w odpowiednim miejscu nad strukturą układu (rysunek 2), w odległości zapewniającej właściwe funkcjonowanie enkodera. Ta niestety zależy od użytego magnesu i musi być dobierana indywidualnie. Producent podaje, że stosując dostarczane przezeń magnesy odległość obudowy od magnesu waha się w granicach od 0,5 do 1,8 mm. O pozycji magnesu informują bity statusu, o których napiszę w dalszej części artykułu, przy okazji opisu ramki transmisji interfejsu SSI.
Rysunek 2. Sposób określenia środka obudowy, nad którym musi być umieszczony magnes
Interfejs SSI
Akronim SSI oznacza synchroniczny interfejs szeregowy to jest taki, w którym dane wyprowadzane są w takt impulsów zegarowych. Ramkę transmisji pokazano na rysunku 3.
Sygnał zegarowy jest podawany na doprowadzenie CLK (10). Dane są odbierane na wyprowadzeniu oznaczonym jako DO (9). Dodatkowo, układ wymaga zasilania sygnałem Csn (11), którego zmiana ze stanu wysokiego na niski inicjuje pomiar położenia. Ramka składa się z 10 bitów kodujących położenie oraz 6 bitów statusu. W sumie daje to słowo o długości 2 bajtów. Pozycja jest liczbą binarną z zakresu od 0 do 1023 w kodzie dwójkowym. Bity wyprowadzane są kolejno od najstarszego do najmłodszego.
tDOactive maksymalny czas pomiędzy opadającym zboczem CSN a załączeniem wyjścia danych, 100ns
tDOvalid maksymalny czas pomiędzy narastającym zboczem sygnału CLK a zmianą stanu linii danych, 375ns
tDOtristate maksymalny czas zmiany stanu wyjścia na wysoką impedancję po przesłaniu danych, 100ns
tCSn minimalna szerokość impulsu CSn, 500ns
tCLK FE minimalny czas na przesłanie danych do interfejsu wyjściowego, 500ns
tCLK/2 minimalny czas pomiędzy opadającym zboczem CSn a początkiem wyprowadzania danych, 500ns
Rysunek 3. Ramka transmisji SSI.
Enkodery można łączyć w łańcuchy, co jest znakomitą cechą, ponieważ oszczędza nie tylko doporwadzenia mikrokontrolera, ale jeszcze umożliwia budowę „oszczędnych“ linii transmisyjnych. Oczywiście w takim przypadku słowo danych będzie wielokrotnością poszczególnych słów wyprowadzanych przez układy enkoderów – ogniw łańcucha. Nie wdając się w szczegółowy opis poszczególnych bitów statusu dosyć jest powiedzieć, że największe znaczenie praktyczne mają bity nazwane: Mag INC, Mag DEC oraz Even PAR. Pierwsze dwa informują o konieczności (odpowiednio) oddalenia lub przybliżenia magnesu. Jeśli magnes jest dobrze dobrany i umieszczony we właściwej odległości, to oba bity mają wartość logiczną 0. Bit PAR to bit parzystości umożliwiający kontrolę poprawności transmisji. Bit jest ustawiany, jeśli liczba 1 w słowie danych jest parzysta. Interfejs SSI zapewnia poprawny odczyt pozycji enkodera, jeśli liczba obrotów jest mniejsza lub równa 600 obrotów na minutę. Po szczegółowy opis układu i jego parametrów należy sięgnąć do dokumentacji udostępnianej przez producenta oraz jego dystrybutorów.
Odczyt pozycji enkodera
Na listingu 1 umieszczono podprogram do odczytu pozycji enkodera AS5040. Jak wspomniałem wcześniej, układ został zmontowany z użyciem płytki ZL1ST7. Mikrokontroler pracował bez zewnętrznego oscylatora, to jest z wykorzystaniem wbudowanego w strukturę generatora RC generującego częstotliwość 1 MHz. Jego uruchomienie wymaga zwarcia do masy doprowadzeń XTAL1 i XTAL2 mikrokontrolera oraz ustawienia bitu opcji „RC Oscillator“ na wartość „ON“. Aplikacja wykorzystuje również wyświetlacz LCD 2 linie x 16 znaków dołączony do portu A mikrokontrolera.
Procedura odczytu enkodera rozpoczyna się od etykiety .read_as5040. Dla uproszczenia w wersji pełnej „wtrącono“ również wyświetlanie „0“ i „1“ liczby binarnej. Enkoder podłączony został w następujący sposób:
- linia danych DO (9) do PB5 mikrokontrolera,
- linia zegarowa CLK (10) do PB1 mikrokontrolera,
- sygnał wyboru CSn (11) do PB0 mikrokontrolera.
Oczywiście nie wolno również zapominać o prawidłowym umieszczeniu i pozycjonowaniu magnesu nad strukturą układu.
Listing 1. Zmodyfikowany fragment procedury odczytu pozycji enkodera (usunięto wyświetlanie)
;-------------------------------------------------------
;odczyt danych z enkodera, pozycja zapisywana w zmiennej
;<positen>, stan enkodera w zmiennej <stateen>
;-------------------------------------------------------
.read_as5040
ld A,PBDR
or A,#$03 ;CSN(PB0)=1, CLK(PB1)=1
ld PBDR,A
clr posen ;zerowanie zmiennych statusu i pozycji
clr {posen+1}
clr stateen
bres CSN ;załączenie układu, inicjowanie pomiaru
;odczyt 10 bitów pozycji
ld Y,#10 ;odbierane będzie 16 bitów, tu licznik
bres CLK ;zerowanie linii zegara
read_as_loop
bset CLK ;ustawienie linii zegara, odczyt danych
rcf ;zerowanie flagi CY
bres CLK ;zerowanie linii zegara
btjf DO,skip ;odczytano "0", nie ustawiamy bitu - tylko przesuniecie
scf ;odczytano "1", ustawiamy C i przesuwamy w lewo zmienną
jra read_shift_1
skip
rlc posen ;przesuniecie w lewo o 1 bit (2 bajtów zmiennej posen),
;flaga C ustawia najmłodszą pozycję bitu
rlc {posen+1} ;teraz uwzględniany stan bitu z młodszego bajtu
dec Y ;sprawdzenie, czy odebrano 10 bitów
jrne read_as_loop
<.... następnie odczyt tą samą metodą 6 bitów statusu i zapamiętanie ich w STATEEN....>
Jak widać na listingu 1 sama procedura odczytu nie jest skomplikowana. Można powiedzieć, że mikrokontroler pracuje jak układ master podczas transmisji szeregowej (np. SPI lub I2C) generując sygnał zegara i odczytując przesyłane do niego dane. Rozpoczynając odbiór danych mikrokontroler zeruje flagę przeniesienia C. Następnie stan linii danych (PB5) jest testowany rozkazem btjf (skok, jeśli bit jest ustawiony). Jeśli ma ona wartość logiczną „0“, to CPU omija polecenie ustawienia flagi C (scf). W odwrotnej sytuacji flaga ta jest ustawiania. Teraz wykonywany jest rozkaz przesunięcia w lewo całej zmiennej z uwzględnieniem flagi przeniesienia. Jej stan wpływa na stan najmłodszego bitu (bit przyjmuje wartość C). I tak 10 razy aż do odbioru całego słowa danych i 6 razy w celu odebrania bitów statusu. Słowo danych w postaci binarnej i dziesiętnej wyświetlane jest w 1-szej linii LCD, natomiast status tylko w postaci binarnej w 2-giej linii. Prawidłowy odczyt enkodera zapewnia następująca wartość bitów statusu = 10000x. Jeśli bity statusu mają inną wartość, to należy albo zmienić pozycję magnesu, albo zmienić sam magnes, który jest najczęstszą przyczyną problemów. Wartość słowa statusu 10011x oznacza, że natężenie pola magnetycznego nie umożliwia pracy enkodera!
Na koniec jeszcze jedna uwaga. Całość operacji odczytu musi być poprzedzona i zakończona zmianą stanu sygnału CSn (z 1 → 0 w celu rozpoczęcia odczytu i w konsekwencji z 0 → 1 po jego zakończeniu).
Listing 2. Program główny
main0
call read_as5040 ;odczyt enkodera
call bin_2_dec ;konwersja wyniku odczytu na liczbę dziesiętną
call dec_2_ascii ;konwersja na ASCII
ld A,#$0A ;ustawienie kursora na pozycji 0,0
call gotoaxy
ld A,#'/' ;
call lcd_data_write
ld Y,#5 ;Y jako licznik, X jako indeks do pamięci
clr X
main2
ld A,(decims,X) ;wyświetlenie znaków
call lcd_data_write
inc X
dec Y ;czy wszystkie 5 znakow
jrne main2
ld A,#$FF ;pauza ok. 0,2 sekundy
ld del,A
call delay
jra main0
Na listingu 2 umieszczono program główny. Rozpoczyna się on od etykiety main0 i a zawarte pomiędzy nią a rozkazem jra main0 instrukcje wykonywane są w nieskończonej pętli. Program główny wywołuje kolejno procedury:
- read_as5040 tj. odczyt enkodera,
- bin_2_dec, tj. zamiana liczby binarnej na dziesiętną (BCD),
- dec_2_ascii, tj. zamiana liczby dziesiętnej na łańcuch znaków do wyświelenia.
Instrukcje umieszczone za etykietą main2 mają na celu wyświetlenie pozycji enkodera w postaci liczby dziesiętnej. Kompletny program odczytu i wyświetlania pozycji enkodera dołączyłem do tego artykułu jako plik-archiwum z materiałami uzupełniającymi.
Jacek Bogusz
j.bogusz@easy-soft.net.pl
Załącznik | Wielkość |
---|---|
Źródło programu z artykułu | 38.1 KB |
Dodaj nowy komentarz