Views: 3134
Энкодер, представляет собой электромеханическое устройство позволяющее формировать кодовую последовательность указывающую направление вращения ротора. Энкодеры для управления функциями электронных устройств выполнены виде потенциометров. Энкодеры выпускаются в как с тактовой кнопкой так и без. Тактовая кнопка позволяет расширить функциональное назначение декодера. Схематически энкодер выглядит так:
Классическая последовательность формируемая энкодером выглядит так:
Но реально могут отличаться от классического. Последовательность формируемая энкодером типа RE1201XD2.
Для считывания данных проще всего использовать свойства микроконтроллеров формирования прерываний по изменению состояния на входах. В этом примере будет рассмотрен пример получение данных с энкодера типа RE1201XD2. Логически программа будет построена следующим образом. За исходное состояние всегда принимается высокое состояние логических уровней. При получении прерываний от входов программа проверяет полученное состояние, если получено исходное состояние (входы А и В ==1), по проверяется предыдущее состояние, если предыдущее А и В ==0, то выполнено например, вращение по часовой стрелке, если А == 0, а В ==1, то вращение против часовой стрелки. В зависимости от полученного состояния устанавливаются флаги плюс или минус. А дальше программа в основном цикле обрабатывает изменение флагов, со сбросом их.
Схема подключения. Для PIC24 необходимо выбрать входы которые позволяют выполнять прерывание по изменению состояния, в примере выбраны входы RB4 и RB5.
Для настройки порта для работы с энкодером необходимо выполнить следующие действия (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);
Это может быть интересно