Enkoder Obrotowy


Nazwa tego urządzenia może wydawać się myląca ale jest to poprostu konwerter zamieniający sygnał z impulsatora na dwa sygnały (impulsy w lewo i w prawo). Dwa przebiegi przesunięte w fazie o połowe okresu, generowane przez impulsator są zamieniane na impulsy na dwóch wyjściach. Na jednym pojawiają się przy obrocie w prawo a na drugim przy obrocie w lewo. Całe urządzenie zostało zaprojektowane na niewielkiej płytce drukowanej, w którą bezpośrednio wlutowany jest impulsator. Nad sterowaniem całością czuwa mikrokontroler ATTiny13, który jako element SMD znakomicie zmieścił się między nóżkami impulsatora. Układ wymaga zasilania 5V i generuje impulsy których stanem aktywnym jest zero logiczne. Ze względu na niewielkie wymiary całej płytki nie będzie ona przeszkodą w zamontowaniu impulsatorów nawet 6mm od siebie. Układ przeznaczony jest do współpracy z potencjometrami cyfrowymi, wyposażonymi w sygnały "góra" i "dół", pozwala zastąpić przyciski impulsatorem. Może się także nadawać do współpracy z innymi mikrokontrolerami, tam gdzie program sterujący jest już bardzo skomplikowany i nie chcemy obciążać go dodatkowo obsługą impulsatora.

Działanie:


Schemat ideowy układu znajduje się na rysunku poniżej:

Sercem układu i jedyną jego aktywną częścią jest mikrokontroler U1 (ATTiny13). Kondensator C1 (100nF) filtruje zasilanie, a kondensatory C2 (100nF) i C3 (100nF). poprawiają pracę impulsatora, zmniejszając wrażliwość całego układu na fałszywe impulsy. Złącze Prog (Goldpin) jest złączem programującym ale po zaprogramowaniu procesora, wyprowadzenia MOSI i MISO tego złącza stanowia wyjście całego Enkodera. Złącze Sw(goldpin) stanowi wyprowadzenie przycisku impulsatora, jeśli jest on w niego wyposażony. Układ powinien być zasilany stabilizowanym napięciem 5V (plus podłączamy do +5V) za pomocą złącza Zas (goldpin)

Budowa:

Układ z powodzeniem można zbudować w oparciu o płytkę drukowaną dostępną tutaj. Rysunek w odbiciu lustrzanym dostępny jest tutaj. Lutowanie należy rozpocząć od procesora U1, w drugiej kolejności montujemy kondensatory, a na końcu impulsator i goldpiny. Goldpiny muszą być wlutowane od strony druku (patrz na zdjęcia) aby umożliwić łatwe dołączenie przewodów. W przeciwnym wypadku będzie problem z przykręceniem impulsatora do obudowy. W przypadku kłopotów z lutowaniem ich w takiej pozycji można przewody przylutować bezpośrednio do płytki. Przy montażu należy zwrócić uwagę z której strony montujemy elementy i zastosować odpowiedni schemat montażowy (szczególnie dotyczy to mikrokontrolera). Pomocą w konstrukcji może okazać się schemat montażowy dostępny tutaj. Dla montażu SMD pomocny będzie także rysunek montażowy w odbiciu lustrzanym, dostępny tutaj

Układ Enkodera jest tylko dodatkiem do juz istniejącego sprzętu a zatem należy go odpowiednio podłączyć do współpracy z innymi urządzeniami. Pomocą będzie rysunek niżej:

Wykaz Elementów:

1x Impulsator z przyciskiem
2x Listwa Goldpin 1x2
1x Listwa Goldpin 1x5
3x 100nF
1x Mikrokontroler ATTINY13 (SMD)

Programowanie:

Kod Źródłowy do enkodera został napisany w BASCOM AVR firmy MCS Electronics (http://www.mcselec.com/). Program przedstawiony jest poniżej:

'************* Konfiguracja uC *****************
'***********************************************
$regfile = "attiny13.dat"
$crystal = 9600000
 
Config Portb = &B11100111 : Portb = &B11111111
 
$hwstack = 20
$swstack = 10
$framesize = 40
 
I1 Alias Pinb.3
I2 Alias Pinb.4
O1 Alias Portb.0
O2 Alias Portb.1
 
Config Timer0 = Timer , Prescale = 256
Enable Timer0 : On Timer0 Prztimer0
Enable Interrupts
'********** Konfiguracja uC Koniec  ************
'******************  Zmienne *******************
'***********************************************
Dim In1 As Bit , In2 As Bit
Dim Tryb As Byte , Rezultat As Integer
Dim Licz_sw As Byte
Dim Impuls As Byte , Stan_wyjsc As Byte
Dim F_6ms As Bit
Dim Port As Byte
'*************  Zmienne Koniec  ****************
'**************  Petla glowna ******************
'***********************************************
Do
 
In1 = I1
In2 = I2
 Rezultat = 0
 Select Case Tryb
  Case 0:
   If In1 = 1 And In2 = 1 Then Incr Tryb                    'jezeli dwa rozwarte
  Case 1:
   If In1 = 1 And In2 = 0 Then Tryb = 2
   If In1 = 0 And In2 = 1 Then Tryb = 3
  Case 2:
   If In1 = 0 And In2 = 1 Then
     Rezultat = 1
     Tryb = 0
   End If
  Case 3:
   If In1 = 1 And In2 = 0 Then
     Rezultat = -1
     Tryb = 0
   End If
 End Select
 Waitus 100
 
If Rezultat <> 0 Then
  If Rezultat = 1 Then
    Set O1
    Reset O2
  Else
    Set O2
    Reset O1
  End If
End If
 
If F_6ms = 1 Then
  F_6ms = 0
 
  If O1 = 0 Or O2 = 0 Then
    Incr Impuls
    If Impuls = 15 Then
      Impuls = 0
      O1 = 1
      O2 = 1
    End If
  Else
    Impuls = 0
  End If
 
End If
 
Loop
End
'************ Petla glowna Koniec **************
'************ Przerwanie timer 0 ***************
'***********************************************
Prztimer0:
  Timer0 = 5
  Set F_6ms
Return
'******** Przerwanie timer 0 Koniec ************

Poniższy rysunek przedstawia ustawienia Fusebitów dla ATTiny13 (zrzut z programu Burn-O-Mat):

Zdjęcia Projektu:

AttachmentSize
Schemat21.13 KB
Płytka4.96 KB
Płytka (odbicie lustrzane)4.97 KB
Płytka (18 na stronie)41.93 KB
Montowanie6.18 KB
Montowanie (odbicie lustrzane)6.2 KB
Kod Źródłowy1.92 KB
Program po Kompilacji (BIN) 824 bytes
Program po Kompilacji (Hex) 2.28 KB
Kod Źródłowy (impulsy +5V)1.92 KB
Kod Źródłowy (impulsy +5V, dodatkowy sygnał wykrycia obrotu na PB.2)1.96 KB



Hubert's picture

Jak tego dokonałeś ???

Quote:
Dim In1 As Bit , In2 As Bit
Dim Tryb As Byte , Rezultat As Integer
Dim Licz_sw As Byte
Dim Impuls As Byte , Stan_wyjsc As Byte
Dim F_6ms As Bit

Jak jest możliwe dodać tyle zmiennych na ATTiny13 ???

Ja nie mogę dodać jednej Byte. A ty 5 typu Byte , 1 INTEGER! i kilka BIT !!!

Pozdrawiam.
PS: Telephone 792834647

-

http://www.youtube.com/user/Hubert7323

Ciekawe filmy z urządzeniami mojej konstrukcji.

mirley's picture

Re: Tiny2313

Zmniejszyłem rozmiar stosu i uwolniłem kilka bajtów ramu:

$hwstack = 20
$swstack = 10
$framesize = 40

nie można przez to robić wielu skoków do podprogramów ani etkiet gosub. Przez co wszystko jest włożone bezpośrednio w do loop

Hubert's picture

?

Witam.

Quote:
Re: Tiny2313
Temat jest trochę nie na miejscu. :P

Dzięki za odpowiedź. To bardzo pomogło rozwojowi mojej wiedzy na temat Bascoma.

-

http://www.youtube.com/user/Hubert7323

Ciekawe filmy z urządzeniami mojej konstrukcji.

gosc's picture

Prosze o pomoc!

Witam.

Zastosowałem ten enkoder z attiny13 do potencjometru cyfrowego DS1802 i mam problem, mianowicie aby zgłosic lub z ciszyć muszę sporo sie nakręcić impulsatorem; DS1802 ma 65 posyzji; czy da rade zmienić program w taki sposób aby przekręcając impulsator o 360 stopni, zwiększyło amplitude na maksymalny poziom.
Nie znam Bascoma dlatego proszę o pomoc.
Z góry dziękuję

mirley's picture

Re: Impulsator

Można zastosować impulsator o większej liczbie impulsów na obrót. Nad programem trzeba się głębiej zadumać mimo jego prostoty

gosc's picture

Program impulsatora

Witam :)

Układ wykonałem na płytce testowej i okazało się, że układ ma wadę...
Mianowicie nie jest "odporny" na szybkie kręcenie się impulsatora lub szybką zmianę kierunku...

Posiedziałem, pomyślałem i wymyśliłem :)
Podaję kod który działa bardzo ładnie.
Pracę impulsatora należy wcisnąć w postaci podprogramu - tak najlepiej.
Sprawdzone i potwierdzone praktycznie :)

Techniczne: impulsator podaje impulsy w postaci jedynek - czyli impulsu 5v zasilania układu, wejścia muszą być podciągnięte opornikami 10k do masy - można wykonać programowo ale ja wolę dolutować opornik :P

Układ działa w taki sposób, że zwiększa lub zmiejsza liczbę w zakresie 0-255

Łatwo można go też przerobić aby działał jak układ przedstawiony powyżej.
Mam nadzieję, że się przyda do dalszej zabawy ten kod :)

Dim Licz As Byte
 
Cls
Licz = 0
 
 
 
Do
'######## ograniczenie aby zmienna licz nie była liczona w kółko tylko od 0 - 255
If Licz = 0 Then
Licz = 1
End If
 
If Licz = 255 Then
Licz = 254
End If
'######## koniec ograniczenia - ta część może być ale  nie musi...
 
 
If Pind.4 = 0 Then
Bitwait Pind.4 , Set
If Pind.3 = 0 Then
Decr Licz
Gosub Wys
End If
End If
 
If Pind.3 = 0 Then
Bitwait Pind.3 , Set
If Pind.4 = 0 Then
Incr Licz
Gosub Wys
End If
End If
 
Loop
 
 
 
Wys:
 
Cls
 
Locate 1 , 1
Lcd Licz
 
Return

gosc's picture

Dodatek

Popijając "złoty trunek" zmieniłem podprogramik 'wys' w taki sposób, że na określonych portach pojawiają się impulsy - kiedy kręcę w jedną stronę to mryga dioda zielona kiedy w drugą to dioda czerwona. Dioda świeci przez 30 ms i gaśnie - oczywiście można ten czas zmienić w zależności od potrzeby.

Oczywiście kod jest w pełni "odporny" szybkie kręcenie impulsatorem lub szybką zmianę kierunku obrotu.

Załączam kod - oczywiście w Bascomie :)

Pozdrawiam! :)

Dim Licz As Byte
 
Do
Licz = 1
 
If Pind.4 = 0 Then
Bitwait Pind.4 , Set
If Pind.3 = 0 Then
Decr Licz
Gosub Wys
End If
End If
 
If Pind.3 = 0 Then
Bitwait Pind.3 , Set
If Pind.4 = 0 Then
Incr Licz
Gosub Wys
End If
End If
 
Loop
 
 
Wys:
 
If Licz = 0 Then
Zielona = 1
Waitms 30
Zielona = 0
End If
 
If Licz = 2 Then
Czerwona = 1
Waitms 30
Czerwona = 0
End If
 
Return

mirley's picture

Re: Enkoder

na jakim procesorze było to testowane? Ma to zadziałać w Tiny 13 w którym można zrobić jedną może dwie zmienne. Odpornośc na bardzo szybkie kręcenie lub szybką zmianę kierunku akurat w tym przypadku nie mają znaczenia ale dzięki za fragment kodu. potestuje w swoim zakresie w kolejnych konstrukcjach z impulsatorem.

tak na marginesie to twój kod tez ma wady a mianowicie program wisi w pętli głównej czekając na zmianę stanu impulsatora, ale w zalezności od zastosowania należy korzystać z róznych rozwiązań

gosc's picture

Programik

Testowałem to na atmega8 z częstotliwością 8MHz.
Ale jestem przekonany, że będzie działało na attiny13.

W programie to zaledwie jedna zmienna...

A kolega użył w swoim aż (nie wiem czy prawidłowo liczę) 8 zmiennych i do tego jeszcze timer0... :P

Mój program na 99% będzie śmigał na attiny13 w układzie pierwotnego projektu powyżej :)

Co do polecenia 'bitwait' no jest to mała wada ale wciskając sterowanie impulsatora w podprogram nie jest to żaden problem ponieważ zmieniamy wartość zmiennej i wychodzimy z podprogramu i jest gitara :)

Post new comment

The content of this field is kept private and will not be shown publicly. If you have a Gravatar account, used to display your avatar.
  • You can use BBCode tags in the text. URLs will automatically be converted to links.
  • Use the special tag [adsense:format:slot] or [adsense:format:[group]:[channel][:slot]] or [adsense:block:location] to display Google AdSense ads.
  • You can enable syntax highlighting of source code with the following tags: [code], [blockcode], [c], [cpp], [java], [javascript], [php], [python], [qb].
  • Image links with 'rel="lightbox"' in the <a> tag will appear in a Lightbox when clicked on.

More information about formatting options