Энкодер и его применение

Visits: 3098


Catcatcat_encoder_00Энкодер, представляет собой электромеханическое устройство позволяющее формировать кодовую последовательность указывающую направление вращения ротора. Энкодеры для управления функциями электронных устройств выполнены виде потенциометров. Энкодеры выпускаются в как с тактовой кнопкой так и без. Тактовая кнопка позволяет расширить функциональное назначение декодера. Схематически энкодер выглядит так:

Catcatcat_encoder_01

 Классическая последовательность формируемая энкодером выглядит так:Catcatcat_encoder_02

Но реально могут отличаться от классического.  Последовательность формируемая энкодером типа RE1201XD2.

Catcatcat_encoder_03

Catcatcat_encoder_04

Для считывания данных проще всего использовать свойства микроконтроллеров формирования прерываний по изменению состояния на входах. В этом примере будет рассмотрен пример получение данных с энкодера типа RE1201XD2. Логически программа будет построена следующим образом. За исходное состояние всегда принимается высокое состояние логических уровней. При получении прерываний от входов программа проверяет полученное состояние, если получено исходное состояние (входы А и В ==1), по проверяется предыдущее состояние, если предыдущее А и В ==0, то выполнено например, вращение по часовой стрелке, если А == 0, а В ==1, то вращение против часовой стрелки. В зависимости от полученного состояния устанавливаются флаги плюс или минус. А дальше программа в основном цикле обрабатывает изменение флагов, со сбросом их.

Схема подключения. Для PIC24 необходимо выбрать входы которые позволяют выполнять прерывание по изменению состояния, в примере выбраны входы RB4 и RB5.

Catcatcat_encoder_05


Для настройки порта для работы с энкодером необходимо выполнить следующие действия (PIC24):

/* настройка входов энкодера*/
                /* разрешение прерываний*/
                CNEN1 = 0b0000000011111000;
                CNEN2 = 0b0000000000000000;
                /* включение подтягивающих резисторов*/
                CNPU1 = 0b0000000011111000;
                CNPU2 = 0b0000000000000000;
                _CNIF = 0;/*сбросить прерывание*/
                _CNIE = 1;/*включить прерывание*/

Создать обработчик прерываний от изменения состояний по входам:

/* прерывание от энкодера*/
void __attribute__((interrupt, auto_psv)) _CNInterrupt (void)
{
    __delay_ms(1);
    if(_RB5 && _RB4 && !Flagw.RB5p && !Flagw.RB4p)
    {
        Flagw.MINUS=1;
    }
    else if(_RB5 && _RB4 && Flagw.RB5p && !Flagw.RB4p)
    {
        Flagw.PLUS=1;
    }

    Flagw.RB5p=_RB5;
    Flagw.RB4p=_RB4;
    _CNIF = 0;
}

Величина задержки __delay_ms(1) (__delay_us(200)) зависит от качества изготовления энкодера и приемлемой скорости вращения. Ну естественно перед началом основной программы включить прерывание!

Тестовый пример по изменению величины переменной, это должно быть в основном цикле программы, или в так называемой подпрограмме обработки устройств ввода данных:

        if(Flagw.PLUS)
        {
            chettt++;
            Flagw.PLUS=0;
        }
        if(Flagw.MINUS)
        {
            chettt--;
            Flagw.MINUS=0;
        }
        OledCursor (0,0);
        bin_dec(chettt,0,0,2);

Это может быть интересно