Obsługa Impulsatora


Impulsator (Enkoder obrotowy) jest elementem przeważnie stosowanym w układach mikroprocesorowych. Pełni podobną funkcję jak potencjometr w układach analogowych. Zazwyczaj impulsator posiada 3 wyprowadzenia (dwa wyjścia i wyprowadzenie wspólne). Po podłączeniu napięcia zasilania do wyprowadzenia wspólnego podczas kręcenia enkoderem na dwóch jego wyjściach otrzymujemy przebiegi prostokątne przesunięte w fazie o pół okresu.

Od kierunku obrotu zależy który z przebiegów ma jeko pierwszy zbocze narastające. Częstotliwość przebiegów zależy od szybkości kręcenia impulsatora a także od konkretnego egzemplarza (ilosć impulsów na obrót). Zawarte poniżej procedury służą do obsługi takiego właśnie enkodera

Język Bascom 8051

Procedura poniżej współpracuje z impulsatorem podłączonym wyprowadzeniem wspólnym do masy układu:

Impulsator:
 In1 = P3.0
 In2 = P3.1
 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
    Rezultat = 1
    Incr Tryb
   End If
   If In1 = 0 And In2 = 1 Then
    Rezultat = -1
    Incr Tryb
   End If
  Case 2:
   If In1 = 0 And In2 = 0 Then Incr Tryb
  Case 3:
   If In1 = 1 And In2 = 0 Then
    Rezultat = -1
    Tryb = 0
   End If
   If In1 = 0 And In2 = 1 Then
    Rezultat = 1
    Tryb = 0
   End If
 End Select
Return

Do poprawnego działania tej procedury wymagane są zmienne które należy zadeklarować na początku programu:

'//////////// Impulsator  ////////////////////
Dim In1 As Bit , In2 As Bit
Dim Tryb As Byte , Rezultat As Integer
'/////////////////////////////////////////////

Poniżej przedstawione jest przykładowe wywoływanie procedury obsługi impulsatora. Zmienna Wartosc_ustawiana jest zwiększana lub zmniejszana podczas kręcenia impulsatorem:

Do
  Gosub Impulsator
  Wartosc_ustawiana = Wartosc_ustawiana + Rezultat
Loop
End

AttachmentSize
Przykładowy program testowy (Bascom 8051)1.42 KB



gosc's picture

Cześć. Moge prosić to w

Cześć.
Moge prosić to w Bascomie:)

mirley's picture

Nie rozumiem o co chodzi,

Nie rozumiem o co chodzi, prezentowany kod działa poprawnie i jest napisany w bascomie (tak jak napisałem wyżej)

gosc's picture

hmm?

moze i poprawnie dziala ale przy malych obrotach impulsatora troszke szybszy obrot i niestety z poprawnym dzialaniem niema nic wspolnego ;( dawalem nawet kondensatory 100n przeciw zakluceniom ale dalej niepomoglo ;(

mirley's picture

Re: Impulsator

Popatrz na rozwiązanie jakie zastosowałem w układzie http://mirley.firlej.org/cyfrowy_przedwzmacniacz . Miałem tani impulsator za 4 zł i zachowywał się całkowicie inaczej niż taki porządny za kilkanaście złotych. W tym projekcie zobaczysz procedurki dla takiego taniego impulsatora a jak znajdę trochę czasu to zamieszczę odpowiedni fragment kodu także dla niego.

Ps. Kod działa dla dobrego impulsatora który po obrocie o jeden impuls ma raz stany 11 a raz 00. Nie daję na stronę niesprawdzonych kodów źródłowych pisanych na sucho. To wszystko to wycinek z działającego programu.

gosc's picture

Probuje twój kod i dalej nic

Probuje twój kod i dalej nic dodam ze robie to na atmega8 a impulsator to alps (japan) po oborocie o jeden impuls ma 11 a raz 00 tak jak pisales co robie zle ?

$regfile = "m8def.dat"
$crystal = 8000000
Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.0 , E = Portc.4 , Rs = Portc.5
Config Lcd = 24 * 2
 
 
Dim Tryb As Byte , Rezultat As Integer
Dim Wart As Byte
Dim In1 As Bit , In2 As Bit
 
Config Pinb.0 = Input
Config Pinb.1 = Input
I1 Alias Pinb.0
I2 Alias Pinb.1
Set Portb.0
Set Portb.1
 
Cls
Do
Locate 1 , 1
Lcd "wartosc: " ; Wart ; "   "
Locate 2 , 1
Lcd In1 ; " " ; In2
Gosub Impulsator
Wart = Wart + Rezultat
Loop
End
 
Impulsator:
 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
 
Return


mirley's picture

Re: Impulsator

Obsługa LCD nie może być bezpośrednio w Do Loop:

Do
Locate 1 , 1                    '<<LCD tu nie może być
Lcd "wartosc: " ; Wart ; " "    '<<LCD tu nie może być
Locate 2 , 1                    '<<LCD tu nie może być
Lcd In1 ; " " ; In2             '<<LCD tu nie może być
Gosub Impulsator
Wart = Wart + Rezultat
Loop

Wyświetlanie LCD zajmuje strasznie dużo czasu i gdy w każdej iteracji pętli głównej ma on to wykonać to poprostu za wolno wywołuje obsługę impulsatora a co za tym idzie gubi obroty itp. Daj jakiegoś ifa który będzie wyswietlał na LCD dopiero np po kliknięciu w przycisk. Lepiej jednak w tym przypadku całą obsługę LCD wywoływać co np 100ms za pomocą flagi ustawianej przez przerwanie

Możesz jeszcze zamiast LCD sprawdzić działanie podłączając do portu kilka diod led i wyświetlać wynik binarnie. Nie spowoduje to znaczących opóźnień.

gosc's picture

wydaje mi sie ze i tak

wydaje mi sie ze i tak wyswietlanie wyniku co 100ms niepomoglo by poniewarz w chwili wyswietlania i tak nastąpiły by opoznienia dla impulsatora ;( a skoro mam juz wykorzystac przerwanie na wyświetlanie LCD to chyba bedzie lepiej zastosowac to przerwanie do impulsatora ?
tzn kanał A do int a kanał B do jakiegos portu i sprawdzac stan np jesli 1 to obrotu w lewo jesli 0 to w prawo tylko czy w takim przypadku da sie wyeliminowac zakłucenia powstajace z drgania styków ? czy raczej dodac kondensatory 100n (port a i masa port b i masa) ? bo wiem ze wyjście INT jest bardzo czułe...

mirley's picture

Re: Impulsator

Po pierwsze to "wydawać" to się może jak siedzisz przy piwie :) Trzeba poprostu sprawdzić jak działa lepiej. Tutaj przedstawiam tylko jedno z zapewne bardzo wielu rozwiązań. Poza tym to napisałem abyś wykorzystał przerwanie timera (a nie przerwanie zewnętrzne) i odpowiedni dzielnik na zmiennej aby wygenerować flagę obsługi wyswietlacza (wyświetlacz dalej będzie tam w Do Loop ale odpowiedni if pozwoli go włączyć tylko co jakiś czas). Już tak robiłem z impulsatorem i LCD i nie było problemów. Plik z moim starym programem testowym jest w załączniku.

Ps. Ten pomysł z twoimi wejściami A i B to wytłumacz dokładniej bo nie wiem o co Ci chodzi z kanałem A i B z których jeden podłączony jest do przerwania a drugi do innego portu.

gosc's picture

int

Masz racje trzeba to przy piwie przemyslec ;) bede probował na diodach tak jak wczesniej pisales a zamiast timera mozna by chyba wykorzystac jakas zmienna ktora po kazdym przejsci do porocedury byla by zwiekszana o 1
oczywiscie niebedzie to tak dokladne jak na timer.

impulsator:
incr A
....
return

do
gosub impulsator
if a > 200 then
a=0
gosub wyswietl_wynik
end if
...
loop

Jesli chodzi o przerwania to pomysl byl taki podlanczam jeden kanal impulsatora do int0
np kanal A i ustawiam aktywowanie przerwania na zbocze opadajace w trakcie przerwania sprawdzam stan drugiego wyjscia

przerwanie:
if B=1 then
incr wartosc
else
decr wartosc
end if
return

i jeszcze jeden mankament zeby w zmiennej Wartosc_ustawiana wartosc zmienila sie o jednen trzeba obrocic impulsator o 2 impulsy

mirley's picture

Re: Impulsator

To rozwiązanie z licznikiem co napisałeś jest już troszkę lepsze od poprzedniego. Prześledź jeszcze mój kod przedwzmacniacza cyfrowego, tylko obsługę impulsatora daj tą co tutaj jest. Zobaczysz tam o co chodziło mi z przerwaniami, mimo że nie ma tam LCD

Jak znajdę czas to napiszę taki prosty program testowy z LCD i tu umieszczę. Narazie jednak są święta więc czas na jakiś odpoczynek :)

gosc's picture

:) wiec chce uzywac

:) wiec chce uzywac impulsatora z programem centrafuse to skorka fronted zamiast explorera obslugujacy multomedia ,gps, etc.... w setupie CF jest mozliwosc przypisania kombinacji klawiszy danej funkcji ja chce uzyc z funkcja poglasniania i sciszania, a takze jak bedzie mozna basy i soprany kozystajac z impulsatora z SW poprzez klikniecie, w trakcie ustwaiania danej fukcji w programie wystarczy kliknac rejestruj i w tym momecie naciniecie klawisza na klawiaturze jest przypisywane do tej funkcji, zrobilem to na usb z klawiatury numeycznej nie przeszkadza potem w uzywaniu klawiatury tekstowej czy cyfr podczas dzwonienia, do poglasniania uzylem Num 8 do sciszania Num 2 do przewijania mp3 nastepna podpiolem do Num 6 a cofnij do Num 4 wszytko na mikroswiczach jesli da sie w ATTiny 2313 zrobic tak by sterowal jak ta klawiatura numeryczna podajac na wejscie PS/2 kody tych klawiaszy bylo by fajnie zaoszczedzil bym USB jesli nie to wystarcz jak ATTiny bedzie podawal impulsy na diody porzy kreceniu impulsatorem a ja je sobie odpowiednio podepne do plytki z orginalnej klawiatury nie wiem jaki ma chip bo to tylko plama z zywicy na plytce :) w razie co moge narysowac w przebiegach 0 , 1 jak mialoby to dzialac

gosc's picture

to moze narysuje diagram jak

to moze narysuje diagram jak ma to funkcjonowac bedzie berdziej zrozumiale :) juz obczailem na allegor impulsatory za 2,8zl jedne ma 20 impulsow na obrot drogi ma 30 impulsow na obrot rozniia sie tez oska jedna jest karbowana 2 jest z nacieciem

mirley's picture

Re: Impulsator ATTiny2313

Żeby zrobić coś co wysyła znaki po PS/2 to muszę co nie co o tym poczytać. Najlepszy byłby RS232 bo to już wiem. Ewentualnie przejściówka RS232 na USB. Nie wiem tylko czy twój program ma możliwość sterowania przez RS232.

Jeśli była by mozliwość sterowania klawiszami poprzez zwieranie transoptorem odpowiedniej linni to z pewnością było by to łatwiejsze do zrobienia.

Zapiszę sobie na stronie głównej projekt do realizacji ale nie mogę zapewnić żadnego sensownego terminu realizacji.

gosc's picture

:) moze bylby potrzebny jakis

:) moze bylby potrzebny jakis plugin co do rs232 to mam 4 posty COM wolne :) byloby latwo podlaczyc tylko jak przypisac to klawiaturze :) w smumie to ja mam klawiaturke tylko musze miec cos co zastpi palec ktory naciska klawiasz przy pomocy impulsatora bo sam ipulsator przy kreceniu naciska oba klawiasze tylko w rozych odstepach czasu a musi naciska raz w jeden raz 2 :) oczywiscie za pomoca transoptora

mirley's picture

Re: Impulsator

To żeby pojawiały się impulsy na jednym wyprowadzeniu przy kręceniu w prawo a na drugim przy kręceniu w lewo poprzez transoptor nie jest problemem jeśli dasz rady podłączyć to pod odpowiedni klawisz w klawiaturze.

gosc's picture

ps2

witam z tego co pamietam BASCOM obsluguje klawiatore ps2 jest gotowa komenda. A jesli chodzi o ten impulsator to dziala ok ale trzeba obrucic o 2 impulsy zeby zmienic wartosc o 1
probowalem jeszcze na przerwaniach zrobic programik ale niewiem czego jak skonfiguruje w bascomie przerwanie na zbocze opadajace to niedziala tak jak powinno ! czyli dziala na zbocze opadajace i narastajace :/ i gdzies mi sie obilo o uszy ze ta komenda w bascomie niedziala zadobrze dla atmegi :/ albo ja cos robie nie tak ale podlanczam przycisk do masy druga nozka do INT0 wlanczam rezystor podciagajacy ustawiam przerwanie na falling i jak wcisne przycisk nastepuje przeskok do podprogramu tak jak powinno byc ! ale niestety jak puszcze to tez nastepuje przeskok do podprogramu :/

mirley's picture

Re: Impulsator Ps2 itp

Tak wiem że jest gotowa komenda ale nie znaczy że bedzie mi działać, więc napisałem że musze potestować troszkę. A tak wogóle to ta komenda chyba odbiera znaki z klawiatury a nie wysyła do komputera. Ale mniejsza o to, będę się nad tym zastanawiał jak przyjdzie odpowiedni czas.

Odnośnie impulsatora to też tak miałem kiedyś ale drugi kod który umieściłem powinien załatwić sprawę bo u mnie działa w przedwzmacniaczu cyfrowym wszystko.

Odnośnie przerwań to jeśli masz podłączony przycisk do int i rezystorem podciągnięty do +vcc to drgania styków pewnie załatwiają Ci mnóstwo przerwań na opadającym zboczu. Dodaj kondensator równolegle do przycisku i zobacz efekt. Ja przerwania testowałem przy okazji układu wykrywania zera. Liczyło dokładnie 100 zer na okres w sieci :)

gosc's picture

:) to by wystarczylo i

:) to by wystarczylo i wymyslilem ze skoro uzyc mam ATTiny2313 i zeby wykozystac wiecej wyjsc to te wyjscia parami rozszerzyc do 3 par +/- wybieranych sekwencyjnie kliknieciem impulsatora z warunkiem zeby po 5 sek samoczynie wracalo do pierwszej pary jesli sie nie kliknie albo nie obroci impulsatora, wtedy mialbym regolacje glosnosci a jak bede chcial regolowac basy albo soprany to sobie klikna raz albo 2 razy wtedy bylo by idealnie, z podlaczeniem transoptorow nie bedzie problemu bo teraz mam kabelki zakonczone mikrostykami i klikam na kazdy oddzielnie :), tylko miejscia z przodu malo i duzo klawiszy sie nie zmiesci a impulsator mi zastepuje 6 przyciskow w takim ukladzie jw. :) mysle ze to nie bylo by trudne do zrobienia a juz cudownie by bylo jakby mozna bylo jeszcze sterowac 3 kolorowa dioda zgodnie z sekwecja by sie zmienial kolor za kazdym nacisnieciem pokretla gdzie w spoczynku czyli glosnosc by mogla swiecic zielona, po jednym kliku basy czerwona i po nastepnym kliku niebieska soprany :)

mirley's picture

Re: Impulsator

Takie rozwiązanie da się wykombinować, tylko trochę czasu potrzebuje bo aktualnie go nie mam. Zresztą nie będę się powtarzał bo już od dawna nie mam dużo czasu :)

gosc's picture

OK :) az tak mi sie nie

OK :) az tak mi sie nie spieszy impulsatorek bede mial najwczesniej w polowie maja :) co myslisz o PCDIMMER i sterowniku DMX znalazlem na necie interface na ATmega8 przez usb steruje dimmerami na triakach poprzez ATTiny2313 Program wyglada na dobry http://www.pcdimmer.de :) mysle ze moze to dzialac shcematy i wsady sa do scagniecia sterowniki do wina i rozne pluginy :), bede zagladal czasem :) tez mam mase roboty i na wlasne sprawy mniej :) WIEC CIE ROZUMIE :) pozdrowionka

gosc's picture

impuls

Witam interesuje mnie taki programik do obslugi impulsatora ale na procek -> attiny12 <- jest to wogule mozliwe ?? on niema sram-u a mam tylko atmege8 troche zaduza na taki prosty programik chodzi mi tylko zeby podawalo na pinach impulsy czyli jak krece w prawo to na jednym pinie podaje impulsy a jak krece w lewo to na drugim , attiny12 by sie do tego nadawal bo tylko 8 pinow akurat tyle ile trzeba ..

mirley's picture

Re: impuls

Nie da się napisać takiego programu w bascomie, bo potrzebny jest RAM na zmienne. Może dałoby się w asemblerze ale nie znam tego języka.

gosc's picture

ale na attiny13 nie powinno

ale na attiny13 nie powinno byc problemu ???

mirley's picture

Re: Impulsator

Nie tylko nie powinno być problemu ale wręcz nie ma problemu bo już taki układ zrobiłem tutaj

gosc's picture

i własnie o to mi chodziło

i własnie o to mi chodziło :D

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