Witam
Usiłuję napisać kod dla ATmegi88 obsługującej silnik i encoder zamontowany na wale silnika. Encoder ma 400 impulsów na obrót a silnik rozkręca się do max 4800obr/min.
Całość ma być serwem sterowanym z zewnątrz przez USART. Jakiś czas temu mierzyłem się już z podobnym problemem, ale poległem. Nie mogłem napisać nic działającego i z upływem czasu zniechęcenie wzięło górę. Teraz znowu mnie naszło i z nowymi pomysłami i zapałem próbuje ogarnąć temat. Niestety encoder dalej jest dla mnie problematyczny. Napisałem sterowanie przez PWM z timera0 silnikiem (to działa), mam komunikację z terminalem do wyświetlania impulsów(też działa), encoder wyjściem A podłączyłem do wejścia timera1 PD5 i wysyłając stan licznika na terminal widzę, że też działa, tzn zlicza impulsy, ale tylko w górę. Tu pytanie, jak to zrobić żeby zliczać impulsy w górę i w dół? Chciałem jakoś badać stan wyjścia B encodera, które jest przesunięte względem A, ale jak?
Myślałem nad wykorzystaniem przerwania INT0 lub INT1 w którym w momencie wystąpienia badałbym wyjście B, ale impulsy z encodera mogą pojawiać się max co ok. 31u sekund więc angażowanie procesora tak często do obsługi przerwania i jeszcze badanie w tym przerwaniu czy pin jest w stanie wysokim lub niskim, chyba nie jest dobre (tak mi się przynajmniej wydaję). Procesor ma jeszcze inne rzeczy do zrobienia więc wydaje mi się, że to złe rozwiązanie. Timer2 generuje mi takty dla timera programowego, timer0 jak napisałem wcześniej zajmuje się PWM-em, więc został mi timer1. Jak to ogarnąć. W internecie jest sporo o encoderach, ale większość dotyczy encoderów ręcznych, natomiast o optycznych z silnikiem jest nie za wiele, a przynajmniej nie znalazłem dla siebie odpowiedzi.
Elektrycznie wszystko działa, sprawdzałem na oscyloskopie i widać dwa przebiegi z encodera, zresztą jak wcześniej wspomniałem na terminalu ma ładnie pokazany przyrost licznika T1, niestety tylko przyrost.
