А и Б - последовательность импульсов, Б сдвинут на 180 градусов относительно А. Я на контролере делал след. образом- родсчет импульсов по каждому фронту, не важно положит. или отрицат. Направление счета- если А и В "0", приходит фронт полож. по А направление счета на увеличение, если полож. фронт по В то уменьшение счета. Пример кода на С для MC68HC908GP32:
CODE
signed int num;
char KbierTemp, trt;
//************** Инициализация для работы энкодера ************************
DIR_PORT_ENC &=~LINE_ENC; //определяем линии управления энкодера на ввод
PUL_PORT_ENC |= LINE_ENC; //включаем подтягивающие резисторы на входах энкодера
INTSCR_MODE1=OFF; //Инициализация прерываний по модулю KBIER. Динамический режим
INTSCR_IMASK1=ON; //Инициализация прерываний по модулю KBIER. Запрет прерываний по модулю KBIR
delay_10mks(10);
KBIER=(PORT_ENC & LINE_ENC); //Разрешить прерывания только для линий, установленных в "1"
INTSCR_ACK1=ON; //Инициализация прерываний по модулю KBIER. Сброс тригера TKBI
INTSCR_IMASK1=OFF; //Инициализация прерываний по модулю KBIER. Разрешение прерываний по модулю KBIR
//************** end ****************************************************************
void interrupt 15 Isr_KBIER(void)
{
if (!INA0_ENC && (KBIER & 0x02))
{
if (INB0_ENC) ++num;
if (!INB0_ENC) --num;
}
if (!INA1_ENC && (KBIER & 0x04))
{
if (!INB0_ENC) ++num;
if (INB0_ENC) --num;
}
if (!INB0_ENC && (KBIER & 0x01))
{
if (!INA0_ENC) ++num;
if (INA0_ENC) --num;
}
if (!INB1_ENC && (KBIER & 0x08))
{
if (INA0_ENC) ++num;
if (!INA0_ENC) --num;
}
KBIER=(PORT_ENC & LINE_ENC);
INTSCR_ACK1=ON; //Сброс тригера TKBI
}
//*** Cекция для определения входов енкодера ***************************************
//*** ENCR
#define PORT_ENC PTA //Порт входов енкодера
#define DIR_PORT_ENC DDRA //Направление линий входов енкодера
#define PUL_PORT_ENC PTAPUE //Направление линий входов енкодера
#define INA0_ENC PTA_PTA1 //Вход линии А енкодера
#define INA1_ENC PTA_PTA2 //Вход линии ~А енкодера
#define INB0_ENC PTA_PTA0 //Вход линии B енкодера
#define INB1_ENC PTA_PTA3 //Вход линии ~B енкодера
//#define LINE_ENC 0x09 //Используемые линии для работы энкодера в "1" не изпользуемые в "0"
#define LINE_ENC 0x0F //Используемые линии для работы энкодера в "1" не изпользуемые в "0"
Причина редактирования: Оформление цитаты исходника.