Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Прошу помощи с алгоритмом обработки энкодера EC11
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
rushack
Прошу помощи с алгоритмом обработки энкодера EC11.
Мучаюсь второй день, энкодер какой-то нестандартный, в основном все инкриментные энкодеры выдают код Грея и их обработать не составляет труда, а с этим (ABC) я уже голову сломал.

Datasheet EC11

В datasheet, он находится под номером 11, более точная марка EC11EH.

Вот что он отсылает на выводы A, B, C.


Ручка не фиксируется, и может занимать любое положение, либо в 0 либо на любом из 3х выводах.
Petka
Цитата(rushack @ Oct 5 2009, 20:56) *
Прошу помощи с алгоритмом обработки энкодера EC11.

Чего тут сложного:
Запоминаете фазу (A,B или C), на которой прошлый раз было "ON".
Ну и когда будет снова "ON". Смотрите что было в прошлый раз:
A -> B = - 1
A -> C = + 1
B -> C = - 1
B -> A = + 1
C -> A = - 1
C -> B = + 1

Всё.

P.S.
A -> A = 0
B -> B = 0
C -> C = 0
rushack
Petka, огромное Вам спасибо! Всё получилось.

Собрал небольшую схемку для проверки.
Энкодер висит на порту B микросхемы ATmega32. PB1,PB2,PB3 - A,B,C энкодера соответственно.
Светодиоды повесил на порт C.
Если крутим оный влево, значит загорается светодиод на выходе PC0, если в право то PC1.

Вот исходник, может кому пригодится.

CODE
#include <stdio.h>
#include <avr/delay.h>
#include <avr/signal.h>

//Подпрограммы
void le(void)
{
//Зажигаем светодиод на PC0
PORTC |= _BV(PC0);
//И гасим светодиод на PC1
PORTC &= ~_BV(PC1);
}

void ri(void)
{
//Зажигаем светодиод на PC1
PORTC |= _BV(PC1);
//И гасим светодиод на PC0
PORTC &= ~_BV(PC0);
}

int main(void)
{

// Раздел переменных
int sost_A =0,sost_B=0,sost_C=0,sostn_A=0,sostn_B=0,sostn_C=0;


//Настраиваем порты
DDRB = 0x00;
PORTB = 0xff;

DDRC = 0b00000011;
PORTC = 0x00;

while(1)
{
//Запоминаем состояние портов
if (!(PINB & (1<<PINB1)))
{
sost_A = 1; //A
sost_B = 0;
sost_C = 0;
}

if (!(PINB & (1<<PINB2)))
{
sost_A = 0; //B
sost_B = 1;
sost_C = 0;
}

if (!(PINB & (1<<PINB3)))
{
sost_A = 0; //C
sost_B = 0;
sost_C = 1;
}

//Ждём 50 ms
_delay_ms(50);

//Запоминаем состояние портов
if (!(PINB & (1<<PINB1)))
{
sostn_A = 1; //A
sostn_B = 0;
sostn_C = 0;
}

if (!(PINB & (1<<PINB2)))
{
sostn_A = 0; //B
sostn_B = 1;
sostn_C = 0;
}

if (!(PINB & (1<<PINB3)))
{
sostn_A = 0; //C
sostn_B = 0;
sostn_C = 1;
}

//Сравниваем запомненные состояния
if ((sost_A & sostn_B)==1) le();
if ((sost_A & sostn_C)==1) ri();

if ((sost_B & sostn_C)==1) le();
if ((sost_B & sostn_A)==1) ri();

if ((sost_C & sostn_A)==1) le();
if ((sost_C & sostn_B)==1) ri();

// Обнуляем флаги
sostn_A = 0;
sostn_B = 0;
sostn_C = 0;
sost_A = 0;
sost_B = 0;
sost_B = 0;

}
}
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.