asis-kbr.ru

автоматические системы и системы безопасности
Текущее время: 22 авг 2018, 00:30

Часовой пояс: UTC + 3 часа [ Летнее время ]




Начать новую тему Ответить на тему  [ 1 сообщение ] 
Автор Сообщение
 Заголовок сообщения: работа с ЭНКОДЕРОМ
СообщениеДобавлено: 13 янв 2013, 22:54 
Не в сети
Администратор
Аватара пользователя

Зарегистрирован: 19 янв 2012, 12:52
Сообщения: 575
Откуда: KBR
Обработка энкодера от Леонида Ивановича,
взял отсюда http://radiokot.ru/forum/viewtopic.php? ... ncPrevPrev
или отсюда http://caxapa.ru/207402.html

Код:
//МОДУЛЬ ПОДДЕРЖКИ ЭНКОДЕРА (От Леонида Ивановича)
//Для подавления дребезга используется анализ двух последовательных
//состояний. Это позволяет обойтись без временных задержек.
//Функция EncoderInit() должна вызываться один раз в начале программы.
//Функция EncoderExe() должна вызываться в основном цикле.
//При повороте энкодера на шаг вправо или влево изменяется значение глобальной переменной EncoderValue.
//
//
//Глобалльные переменные
signed char EncoderValue = 0;

//Константы
#define EncoderDDR DDRC                        /*порт настройки*/
#define EncoderPORT PORTC                    /*порт управления*/
#define EncoderPIN PINC                        /*порт чтения*/
#define EncoderF1 (1<<3)                    /*пины чтения енкодера*/
#define EncoderF2 (1<<4)                    /*пины чтения енкодера*/
enum { State0, StateA, StateB, StateAB };     //состояния энкодера

//Переменные
static char EncPrev;                          //предыдущее состояние энкодера
static char EncPrevPrev;                      //пред-предыдущее состояние энкодера

//Инициализация энкодера
void EncoderInit(void)
{
    EncoderDDR &= ~(EncoderF1 | EncoderF2); //настройка портов на ввод
    EncoderPORT |= EncoderF1 | EncoderF2;   //включение подтягивающих резисторов
    EncPrev = State0;                       //инициализация предыдущего состояния
    EncPrevPrev = State0;                   //инициализация пред-предыдущего состояния
}

//Обработка энкодера
void EncoderExe(void)
{
    char EncCur = 0;

    if(! (EncoderPIN & EncoderF1)) 
        EncCur  
= StateA; //опрос фазы 1 энкодера
    
    if
(! (EncoderPIN & EncoderF2)) 
        EncCur 
|= StateB; //опрос фазы 2 энкодера
    
    if
(EncCur != EncPrev) {                    //если состояние изменилось,
        if(EncPrev == StateAB && EncCur != EncPrevPrev ){//если предыдущее состояние StateAB и текущее и пред-предыдущее не равны,
            if(EncCur == StateB)              //если текущее состояние StateB,
                EncoderValue ++;            //шаг вверх
            else                              
                EncoderValue 
--;            //шаг вниз
        }
        EncPrevPrev = EncPrev;              //сохранение пред-предыдущего состояния
        EncPrev = EncCur;                   //сохранение предыдущего состояния
    }
}
 


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ 1 сообщение ] 

Часовой пояс: UTC + 3 часа [ Летнее время ]


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB