8-900-374-94-44
[email protected]
Slide Image
Меню

Алгоритм опроса энкодера – Еще один способ опроса энкодера

Сопрягаем энкодер и микроконтроллер — chipenable.ru

  Из этой статьи вы узнаете, что такое энкодер, зачем он нужен, и как его подружить с микроконтроллером. Если вы пользовались современной стиральной машиной, микроволновой печью или аудио системой то, скорее всего вы уже имели дело с энкодером, сами того не подозревая. Например, в большинстве современных домашних и автомобильных стерео систем энкодеры используются для регулировки громкости звука.
   Энкодер или датчик угла поворота – это электромеханическое устройство, предназначенное для преобразования углового положения вала или оси в электрические сигналы. Существует два основных типа энкодеров  — инкрементные и абсолютные.
   Инкрементный энкодер при вращении формирует импульсы, число которых пропорционально углу поворота. Подсчет числа этих  импульсов даст нам величину угла поворота вала энкодера относительно его начального положения. Этот тип энкодеров не формирует выходные импульсы, когда его вал находится в покое. Инкрементные энкодеры находят широкое применение в индустриальных средствах управления, бытовой и  музыкальной технике.

Абсолютный энкодер для каждой позиции своего вала выдает уникальный код.  Ему, в отличии от инкрементного энкодера, счетчик не нужен, угол вращения всегда известен. Абсолютный энкодер формирует сигнал и когда вал вращается, и когда он находится в покое. Абсолютный энкодер не теряет информацию о своем положении при потере питания и не требует возврата в начальную позицию. Этот тип энкодеров применяется в промышленно оборудовании — робототехнике, станках, конвейерных линиях.
  Я хотел бы рассказать о сопряжении инкрементного механического энкодера с микроконтроллером.  Для этого я приобрел инкрементный энкодер фирмы Bourns — PEC12-4220F-S0024. Вот расшифровка его названия согласно datasheet: PEC12 – модель, 4 – вертикальное положение выводов, 2 – 24 стопора, 20 – длина вала в мм, S – наличие кнопки, 0024 – 24 импульса за оборот.

   У него 5 выводов. 2 вывода на фотографии слева – выводы кнопки, 3 вывода на фотографии справа – выводы энкодера. Из них — 2 сигнальных и 1 общий. Он посередине. Схема подключения энкодера ничем не отличается от подключения обычных кнопок. Сигнальные выводы энкодера подключаем к любому порту ввода вывода микроконтроллера. Общий вывод энкодера сажаем на землю. Для защиты от дребезга контактов не лишним будет добавить еще пару керамических конденсаторов номиналом в несколько нанофарад. Выводы микроконтроллера в программе конфигурируем как входы и включаем подтягивающие резисторы. Можно использовать внешние.


   Когда ручка энкодера стоит неподвижно – на входах микроконтроллера присутствуют логические единицы. Когда ручку энкодера поворачивают, на выводах микроконтроллера появляются два прямоугольных сигнала сдвинутых друг относительно друга. От направления вращения вала энкодера зависит, какой из сигналов будет опережать другой. На рисунке ниже представлены возможные варианты сигналов для идеального случая.


 

    Внутри энкодера имеются контакты, которые при вращении то замыкаются, то размыкаются. Этот процесс естественно сопровождается дребезгом, поэтому реальные сигналы могут выглядеть вот так.  

 

Сигналы сняты со старого энкодера, включенного без фильтрующих конденсаторов.

   Алгоритм обработки сигналов энкодера выглядит следующим образом. В обработчике прерывания таймера запускается функция опроса энкодера. Она считывает логические уровни, присутствующие на выводах микроконтроллера к которым подключен энкодер и записывает их во временную переменную. Внутри функции есть статическая переменная (переменная, которая сохраняет свое значение при выходе из функции) хранящая последовательность предыдущих состояний. С помощью битовой маски микроконтроллер выделяет из этой переменной последнее состояние и сравнивает его с текущим, чтобы определить произошли ли изменения. Если состояния равны – функция завершает работу, если отличны – значение статической переменной сдвигается влево на 2 разряда и на «освободившееся» место записывается текущее состояние. Таким образом, если вал энкодера вращается, функция будет постоянно сохранять некую повторяющуюся кодовую последовательность. При вращении вправо – это будет 11100001. При вращении влево – 11010010. По этим последовательностям микроконтроллер и будет понимать, в какую сторону происходит вращение.

   Исходник для работы с энкодером можно скачать здесь. Архив содержит два файла: encoder.h и encoder.c. В хедере задаются порт и номера выводов, к которым подключен энкодер, константы LEFT_SPIN и RIGHT_SPIN. Также там описаны прототипы функций. Сишный файл содержит реализацию функций.
void InitEncoder(void) – инициализирует выводы порта.

void PollEncoder(void)
– однократно опрашивает энкодер. Если зафиксировано вращение, записывает в буфер одну из констант, если нет, просто завершает работу.

unsigned char GetStateEncoder(void)
– возвращает содержимое буфера и очищает его.

   Опрос энкодера я обычно произвожу с частотой ~ 4 кГц. Если опрашивать медленней, микроконтроллер будет пропускать импульсы при быстрых поворотах ручки энкодера. Если энкодер используется для установки линейно меняющейся величины, например для установки времени в часах, то в качестве констант LEFT_SPIN и RIGHT_SPIN удобно использовать числа 255 и 1 соответственно. В обработчике сигналов энкодера эти числа просто складываются с устанавливаемой величиной. При сложении с 1 величина увеличивается на 1, при сложении с 255 уменьшается на 1. Конечно это актуально если эта величина однобайтная. Ну а в принципе константы LEFT_SPIN и RIGHT_SPIN можно выбирать произвольно, главное правильно написать обработчик. На этом все.

Исходник для работы с энкодером здесь.

chipenable.ru

Подключение энкодера к микроконтроллеру — GreenChip.com.ua

Опубликовано 2015-04-04 22:51:49 автором Ruslan


В этом уроке мы научимся работать с инкрементальным энкодером на микроконтролле. В наш энкодер встроена еще и кнопка. С помощью одного лишь энкодера можно легко осуществлять управление практически любым девайсом! Например, представим себе листание деревовидного меню ( прокрутка — листания меню, нажатие — переход в подкатегорию меню).
Энкодер — это цифровой датчик угла поворота. У нашего инкрементального энкодера 5 контактов. Три (Общий, А и В) отвечают за вращение и 2 — это встроенная кнопка. Сначала разберемся, как подключить энкодер к микроконтроллеру и как с него считывать данные.
С Энкодера выходят два сигнала А и В, сдвинутых на 90 градусов по фазе. Выводы A и B должны быть подтянуты к плюс питанию резистором в 1 кОм для избежания ложных срабатываний, а центральный — на землю. Я, для надежности, подключил внешнюю подтяжку. Существуют два распространенных алгоритма опроса энкодера:
  • Опрос при помощи прерываний этот метод прост в использовании, но возможны ложные срабатывания когда энкодер раздолбается. Суть заключается в следующем. Настраиваем прерывание по восходящему фронту и подключаем его к каналу А, в обработчике прерывания проверяем канал В, и дальше проще некуда: если там высокий уровень — делаем ‘+1’, если низкий ‘-1’ нашему счетчику импульсов.
  • Опрос со сравнением предыдущего состояния энкодера и текущего этот метод немного сложнее предыдущего, но боле надежен. В процессе работы, микроконтроллер циклически опрашивает энкодер и сравнивает то, что он считал, с результатом предыдущего считывания. В зависимости от результата сравнения, программа делает выводы о направлении вращения.

Напишем простую программу которая будет опрашивать энкодер и выводить на дисплей переменную, которая будет меняться в зависимости от направления вращения энкодера

Пример кода

#include <mega8.h> 
#include <stdio.h> 
#include <delay.h> 
#include <alcd.h> 
unsigned char lcd[32],enc=0,NewEncState,PrevEncState,z=0; 
 
void MyscanEncoder() 
      {      
      unsigned char OUTB=PINB; 
      NewEncState = OUTB & 0b00011000;            // наш энкодер подключен к выводам 4 и 5 порта B  
      NewEncState = NewEncState>>3;               // делаем сдвиг на 3 для удобства  
if (NewEncState!=PrevEncState)                    //проверяем, изменилось ли состояние на выходе энкодера 
{    
    enc=(enc

Комментарии — (1)

Добавить комментарий
Для отправки комментария вы должны авторизоваться.

articles.greenchip.com.ua

Подключаем энкодер к AVR — AVR devices

Наконец то у меня появилась эта замечательная крутилка и теперь я хочу рассказать вам как с ней работать. Мой энкодер (EC12E24204A9)  представляет из себя примерно следующее:

Энкодер имеет три контакта: Общий, А и В. Общий обычно всегда подключается к земле а два других к любым пинам микроконтроллера. Выводы А и В должны быть подтянуты к плюсу питания через резисторы порядка 10 кОм, чтоб исключить ложные срабатывания от наводок. Использовать внутреннюю подтяжку микроконтроллера я бы не посоветовал. Уж очень она слабая.  Для демонстрации работы, повесим еще 8 светодиодов. (примечание: Если используется мега16, мега32  и старше то необходимо выключить jtag иначе половина светодиодов гореть не будет)

Итак получили следующую схему:


Крутим ручку энкодера вправо — огонек бежит вправо. Крутим влево — огонек бежит влево.  Как работает энкодер? Будем разбираться. Ничего сложного нет. Посмотрим на графики ниже.
При  вращении энкодера в одну сторону сигнал выглядит  так:

В другую:

Возникает вопрос, а как же микроконтроллеру различить направление вращения энкодера ?

Существуют два популярных алгоритма опроса энкодера:

  • Опрос при помощи прерываний
  • Опрос со сравнением предыдущего состояния энкодера и текущего

У каждого из этих способов опроса существуют свои недостатки и преимущества. Я попробовал оба и остановился на втором способе. Опрос при помощи прерываний хорош тем, что можно обеспечить мгновенную реакцию на поворот ручки энкодера. Но имеется и серьёзный недостаток. Такой как дребезг контактов. Для его подавления конечно можно применить различные программные и аппаратные средства но я не стал заморачиваться. Рассмотрим поподробнее второй алгоритм опроса. В процессе работы, микроконтроллер непрерывно считывает данные с пинов на которых висит энкодер и сравнивает то что он считал с результатом предыдущего считывания. В зависимости от результата сравнения состояний, программа делает выводы о направлении вращения. В программе есть комментарии, я думаю их будет достаточно для понимания алгоритма. Если есть вопросы, то спросить можно как всегда в комментах.

Исходник

avrdevices.ru

Подключение энкодера к микроконтроллеру | RadioLaba.ru

             #include <p16f628a .INC>

             LIST        p=16F628A    

             __CONFIG    H’3F18′           ;конфигурация микроконтроллера

 

flag          equ         20h              ;перечисление регистров общего назначения

flag1         equ         21h              ;присвоение названий адресам регистров

shet          equ         22h              ;

shet1         equ         23h              ;

W_TEMP        equ         7Eh              ;

STATUS_TEMP   equ         7Fh              ;

 

 

#DEFINE       enc1        PORTB,4          ;присвоение названий линиям ввода-вывода

#DEFINE       enc2        PORTB,5          ;микроконтроллера

 

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

 

              org         0000h            ;начать выполнение программы с адреса 0000h

              goto        Start            ;переход на метку Start

          

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;Подпрограмма обработки прерываний

 

              org         0004h            ;начать выполнение подпрограммы с адреса 0004h

      

              movwf       W_TEMP           ;сохранение значений ключевых регистров

              swapf       STATUS,W         ;

              clrf        STATUS           ;

              movwf       STATUS_TEMP      ;

                  

              btfsc       enc1             ;опрос состояний выводов энкодера и сохранение

              bsf         flag,0           ;полученных значений в регистр flag

              btfss       enc1             ;сохранение значения вывода enc1 в 0-й бит

              bcf         flag,0           ;сохранение значения вывода enc2 в 1-й бит

              btfsc       enc2             ;

              bsf         flag,1           ;

              btfss       enc2             ;

              bcf         flag,1           ;

 

              btfss       flag,2           ;проверка предыдущего состояния выводов

              goto        vih              ;энкодера (2-й и 3-й биты регистра flag)

              btfss       flag,3           ;если оба значения не равны 1 переходим

              goto        vih              ;на метку vih, для выхода из обработчика

              btfss       flag1,0          ;проверка флага (0-й бит регистра flag1)

              goto        i2               ;инкремента/декремента регистра shet

              incf        shet1,F          ;если флаг не установлен-переходим (метка i2)

              movlw       .3               ;на проверку факта поворота ручки энкодера

              xorwf       shet1,W          ;при установленном флаге инкрементируем

              btfss       STATUS,Z         ;регистр shet1, проверяем на равенство

              goto        vih              ;числу 3, если не равно-переходим на метку

              bcf         flag1,0          ;vih, для выхода из обработчика

              clrf        shet1            ;если shet1 равен 3-очищаем регистр и

                                           ;сбрасываем флаг инкремента/декремента

                                           ;регистра shet

            

i2            btfsc       flag,0           ;определение направления вращения ручки

              goto        i1               ;энкодера, если enc1=1 переходим на метку i1

              btfss       flag,1           ;если enc1=0 и enc2=1 произошел поворот

              goto        vih              ;в положительную сторону (условно)

                                           ;соответственно далее по ходу кода производим  

                                           ;инкремент регистра shet

                                           ;состояние enc1=0 и enc2=0 игнорируется-

                                           ;переходом на метку выхода vih

              

              incf        shet,F           ;инкемент регистра shet, максимальное значение

              movlw       .0               ;ограничивается на уровне 255

              xorwf       shet,W           ;

              btfss       STATUS,Z         ;

              goto        vih2             ;

              movlw       .255             ;

              movwf       shet             ;

              goto        vih2             ;переход на метку vih2

              

i1            btfsc       flag,1           ;определение направления вращения ручки

              goto        vih              ;энкодера, если enc1=1 и enc2=0 произошел

                                           ;поворот в отрицательную сторону (условно)

                                           ;соответственно далее по ходу кода производим

                                           ;декремент регистра shet

                                           ;состояние enc1=1 и enc2=1 игнорируется-

                                           ;переходом на метку выхода vih

 

              decf        shet,F           ;декремент регистра shet, минимальное значение

              movlw       .255             ;ограничивается на уровне 0

              xorwf       shet,W           ;

              btfss       STATUS,Z         ;

              goto        vih2             ;

              clrf        shet             ;

 

vih2          bsf         flag1,0          ;установка флага инкремента/декремента регистра shet

              bsf         flag1,1          ;установка флага регистрации поворота энкодера

                                           ;для дальнейшего опроса в основной программе

vih           rlf         flag,F           ;сдвиг содержимого регистра flag

              rlf         flag,F           ;влево на 2 бита

 

              bcf         INTCON,T0IF      ;сброс флага прерывания по переполнению TMR0

              movlw       .15              ;запись числа 15 в регистр таймера TMR0

              movwf       TMR0             ;равнозначно временной задержке примерно 1мс

                                                                                    

              swapf       STATUS_TEMP,W    ;восстановление содержимого ключевых регистров

              movwf       STATUS           ;

              swapf       W_TEMP,F         ;

              swapf       W_TEMP,W         ;

                                           ;

              retfie                       ;выход из подпрограммы прерывания

 

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;Основная программа

                                

            

Start         movlw       b’00000000′      ;запись нулей в выходные защелки порта B

              movwf       PORTB

 

              movlw       b’00000111′      ;выключение компараторов

              movwf       CMCON

 

              bsf         STATUS,RP0       ;настройка линий ввода\вывода порта B

              movlw       b’00110111′          

              movwf       TRISB

            

                                           ;запись двоичного числа 11010001 в регистр

              movlw       b’11010001′      ;OPTION_REG, тем самым устанавливаем внутренний

              movwf       OPTION_REG       ;источник тактового сигнала для TMR0

              bcf         STATUS,RP0       ;включаем предделитель перед TMR0

                                           ;устанавливаем коэффициент предделителя 1:4

 

              clrf        shet             ;очистка дополнительных регистров

              clrf        shet1            ;

              clrf        flag1            ;

  

              clrf        TMR0             ;очистка регистра таймера TMR0

              bcf         INTCON,T0IF      ;сброс флага прерывания по переполнению TMR0

              bsf         INTCON,T0IE      ;разрешение прерываний по переполнению TMR0

              bsf         INTCON,GIE       ;глобальное разрешение прерываний

      

a1            btfss       flag1,1          ;опрос флага регистрации поворота энкодера

              goto        a1               ;флаг регистрации равен нулю: переход на метку a1

              bcf         flag1,1          ;флаг равен единице: сброс флага регистрации

              movf        shet,W           ;вывод содержимого регистра shet на цифровое

              call        vivod            ;табло

              goto        a1

 

              ……………..            ;подпрограммы вывода содержимого    

              ……………..            ;регистра shet на семисегментные индикаторы

              ……………..            ;

 

              end                          ;конец всей программы

                                           ;</p16f628a>

radiolaba.ru

Сопрягаем энкодер и микроконтроллер — chipenable.ru

  Из этой статьи вы узнаете, что такое энкодер, зачем он нужен, и как его подружить с микроконтроллером. Если вы пользовались современной стиральной машиной, микроволновой печью или аудио системой то, скорее всего вы уже имели дело с энкодером, сами того не подозревая. Например, в большинстве современных домашних и автомобильных стерео систем энкодеры используются для регулировки громкости звука.
   Энкодер или датчик угла поворота – это электромеханическое устройство, предназначенное для преобразования углового положения вала или оси в электрические сигналы. Существует два основных типа энкодеров  — инкрементные и абсолютные.
   Инкрементный энкодер при вращении формирует импульсы, число которых пропорционально углу поворота. Подсчет числа этих  импульсов даст нам величину угла поворота вала энкодера относительно его начального положения. Этот тип энкодеров не формирует выходные импульсы, когда его вал находится в покое. Инкрементные энкодеры находят широкое применение в индустриальных средствах управления, бытовой и  музыкальной технике.
Абсолютный энкодер для каждой позиции своего вала выдает уникальный код.  Ему, в отличии от инкрементного энкодера, счетчик не нужен, угол вращения всегда известен. Абсолютный энкодер формирует сигнал и когда вал вращается, и когда он находится в покое. Абсолютный энкодер не теряет информацию о своем положении при потере питания и не требует возврата в начальную позицию. Этот тип энкодеров применяется в промышленно оборудовании — робототехнике, станках, конвейерных линиях.
  Я хотел бы рассказать о сопряжении инкрементного механического энкодера с микроконтроллером.  Для этого я приобрел инкрементный энкодер фирмы Bourns — PEC12-4220F-S0024. Вот расшифровка его названия согласно datasheet: PEC12 – модель, 4 – вертикальное положение выводов, 2 – 24 стопора, 20 – длина вала в мм, S – наличие кнопки, 0024 – 24 импульса за оборот.

   У него 5 выводов. 2 вывода на фотографии слева – выводы кнопки, 3 вывода на фотографии справа – выводы энкодера. Из них — 2 сигнальных и 1 общий. Он посередине. Схема подключения энкодера ничем не отличается от подключения обычных кнопок. Сигнальные выводы энкодера подключаем к любому порту ввода вывода микроконтроллера. Общий вывод энкодера сажаем на землю. Для защиты от дребезга контактов не лишним будет добавить еще пару керамических конденсаторов номиналом в несколько нанофарад. Выводы микроконтроллера в программе конфигурируем как входы и включаем подтягивающие резисторы. Можно использовать внешние.


   Когда ручка энкодера стоит неподвижно – на входах микроконтроллера присутствуют логические единицы. Когда ручку энкодера поворачивают, на выводах микроконтроллера появляются два прямоугольных сигнала сдвинутых друг относительно друга. От направления вращения вала энкодера зависит, какой из сигналов будет опережать другой. На рисунке ниже представлены возможные варианты сигналов для идеального случая.


 

    Внутри энкодера имеются контакты, которые при вращении то замыкаются, то размыкаются. Этот процесс естественно сопровождается дребезгом, поэтому реальные сигналы могут выглядеть вот так.  

 

Сигналы сняты со старого энкодера, включенного без фильтрующих конденсаторов.

   Алгоритм обработки сигналов энкодера выглядит следующим образом. В обработчике прерывания таймера запускается функция опроса энкодера. Она считывает логические уровни, присутствующие на выводах микроконтроллера к которым подключен энкодер и записывает их во временную переменную. Внутри функции есть статическая переменная (переменная, которая сохраняет свое значение при выходе из функции) хранящая последовательность предыдущих состояний. С помощью битовой маски микроконтроллер выделяет из этой переменной последнее состояние и сравнивает его с текущим, чтобы определить произошли ли изменения. Если состояния равны – функция завершает работу, если отличны – значение статической переменной сдвигается влево на 2 разряда и на «освободившееся» место записывается текущее состояние. Таким образом, если вал энкодера вращается, функция будет постоянно сохранять некую повторяющуюся кодовую последовательность. При вращении вправо – это будет 11100001. При вращении влево – 11010010. По этим последовательностям микроконтроллер и будет понимать, в какую сторону происходит вращение.

   Исходник для работы с энкодером можно скачать здесь. Архив содержит два файла: encoder.h и encoder.c. В хедере задаются порт и номера выводов, к которым подключен энкодер, константы LEFT_SPIN и RIGHT_SPIN. Также там описаны прототипы функций. Сишный файл содержит реализацию функций.
void InitEncoder(void) – инициализирует выводы порта.

void PollEncoder(void)
– однократно опрашивает энкодер. Если зафиксировано вращение, записывает в буфер одну из констант, если нет, просто завершает работу.

unsigned char GetStateEncoder(void)
– возвращает содержимое буфера и очищает его.

   Опрос энкодера я обычно произвожу с частотой ~ 4 кГц. Если опрашивать медленней, микроконтроллер будет пропускать импульсы при быстрых поворотах ручки энкодера. Если энкодер используется для установки линейно меняющейся величины, например для установки времени в часах, то в качестве констант LEFT_SPIN и RIGHT_SPIN удобно использовать числа 255 и 1 соответственно. В обработчике сигналов энкодера эти числа просто складываются с устанавливаемой величиной. При сложении с 1 величина увеличивается на 1, при сложении с 255 уменьшается на 1. Конечно это актуально если эта величина однобайтная. Ну а в принципе константы LEFT_SPIN и RIGHT_SPIN можно выбирать произвольно, главное правильно написать обработчик. На этом все.

Исходник для работы с энкодером здесь.

chipenable.ru

Энкодер. Некоторые ньюансы. | Любительские конструкции на микроконтроллерах

Статей о работе с энкодером написано немало. В общем как и статей о других, рассматриваемых на этом сайте вопросах. Однако существуют, и имеют на это полное право, сотни рецептов приготовления борща или, допустим, шашлыка — каждый выбирает наиболее подходящий для себя. Это есть в некоторой степени выражение пресловутой «свободы выбора» и, если бы мой блог был философской направленности, то, вслед за вступлением, на головы читателей полились бы потоки дальнейших рассуждений о сущности бытия и прочее 🙂 Хорошо что это не так, и я здесь просто покажу мой подход к использованию этого весьма удобного элемента в связке с микроконтроллерами.
Об устройстве инкрементального энкодера неплохо написано здесь, или, допустим здесь — ничего сложного там не имеется. В простейшем случае — это как две кнопки, замыкающиеся определённым образом при вращении ротора. Удобная вещь, а, если ещё и с дополнительной кнопкой — то вообще универсальное устройство ввода для конструкций на микроконтроллерах!
Цена энкодеров почему-то до сих пор относительно высока, ну, конечно не слишком, но как для двух кнопок, то… Поэтому, прогуливаясь по различным барахолкам и блошиным рынкам, советую обращать внимание на распродажи битых плат зарубежных радиоэлектронных изделий по бросовым ценам — можно за копейки купить плату с установленным там хорошим качественным энкодером. Мне посчастливилось купить таким образом плату управления от фирменного музцентра «Sony» из которой я и выпаял героя сегодняшней публикации. Качественная сборка, отсутствие люфтов, чёткая фиксация и тактильные ощущения при вращении ротора позволили мне верить надписи на корпусе «Jpn». Поиск даташита в интернет по маркировке не принёс никаких результатов, поэтому для определения распиновки я применил хорошо работающую методику, которой пользуюсь уже давно. Прозвонка мультиметром не даст вам однозначного ответа, который из выводов общий.
Для точного определения выводов понадобится двухлучевой осциллограф, источник питания 3 — 5 В, резистор 5 — 100 кОм и сам энкодер. От плюса источника через резистор присоедините  параллельно два проводника к двум любым выводам энкодера и на каждый из этих двух выводов присоедините по каналу осциллографа. Оставшийся вывод энкодера вешаем на минус (общий) питания, туда же и корпус осциллографа. Крутим ротор и наблюдаем картинку…
Лично я, чтоб не морочиться с резистором и батарейками, просто подключил энкодер к микроконтроллерному модулю предварительно прошив кристалл программкой, переводящей какой-либо порт  в режим входов с подключенными pull-up внутренними резисторами — это суть та же схема, что я описывал выше.
Соединитель с жёлтым кембриком — это корпус, два с синим — +5В с порта чипа. Так вот, о картинке… Мне повезло, и я с первого раза подключил правильно. Картинка получается такая:
Поменяем местами «корпусной» провод с любым из двух других. Ещё раз крутим:

Сравнение осциллограмм явно показывает, что при правильном подключении общего вывода значений на входах порта будет четыре, а при любом другом только три — можете поэкспериментировать. Примем «жёлтый» канал осциллографа как старший разряд. Слева направо отсчитываем значения: 1-я осциллограмма — 00, 01, 11, 10, 00 … — код Грея ; 2-я осциллограмма — 00, 01, 11, 00 … —  болт от кода Грея. Четвёртый вывод моего энкодера оказался никуда не подключенным, видимо в других модификациях сюда подключается вывод дополнительной кнопки, замыкающейся при нажатии на ротор.
Теперь о программной реализации. Яростный холивар на форумах о том, как же лучше обрабатывать энкодер — по внешнему прерыванию или циклическим опросом, ясно показывает, что народ спорит каждый о своём. В дествительности же всё зависит от КОНКРЕТНОЙ задачи. Для меня энкодер — устройство ввода информации (управления меню), и отдавать на его обработку столь драгоценный ресурс как внешнее прерывание нет смысла. Поэтому для себя я написал универсальную библиотечку и пользуюсь ей во всех своих проектах, где применяется энкодер. В заголовочном файле выбираются порт и разряды, его обслуживающие . Кроме того при вызове функции устанавливаются минимальные и максимальные значения — это очень удобно! Ведь для установки одних параметров нужен, например,  диапазон 0 — 10, а для других — 2000 — 50000. Ещё в функцию добавил фрагмент который позволяет учитывать сколько изменений состояний в конкретном энкодере на один щелчок. Кстати, именно поэтому мультиметром трудно вызвонить распиновку энкодера! Ведь «поймать» четыре, даже два,  промежуточных состояния ротора между соседними щелчками ой как непросто! Функцию можно вызывать в главном цикле или по переполнению таймера с определённой периодичностью, или как Вам захочется. Переменные EncState, EncData объявляйте как глобальные в главном файле проекта, а если они «перевариваются» в обработчике прерываний — то ещё и volatile. Удачи, коллеги!

Архив с исходниками на С.

www.embed.com.ua

Подключение энкодера к микроконтроллеру

Подробности
Категория: Микроконтроллеры
Опубликовано 23.06.2016 12:36
Автор: Admin
Просмотров: 1516

В этой статье пойдет речь о энкодере и о том как его подключить к микроконтроллеру. Встретить его можно в таких устройствах как аудиосистемы, стиральные машины, микроволновкой и ряде современных устройств. К примеру в аудиосистемах энкодеры и микроконтроллеры используются для регулировки громкости. Но ладно хватит уже воды, давайте ближе к делу.

Энкодер или как его еще называют датчик угла поворота — представляет собой электромеханическое устройство, которое преобразует положение угла вала в электрический сигнал. Энкодеры делятся на 2 типа абсолютные и инкрементные.

В инкрементных энкодерах при повороте вала формируются импульсы, количество этих импульсов пропорционально углу поворота вала. Если подсчитать эти импульсы то можно узнать угол поворота вала энкодера. Если ручка энкодера находится в покое то импульсы не формируются. Такие энкодеры широко применяются в аудио системах и промышленных средствах управления.

Абсолтные энкодеры имеют совершенно другой принцип дейставия, основаная на выдачи уникального кода каждому положению вала. Формирование импульсов происходит когда вал вращается и когда он в покое. Причем информация о текущем положения вала, сохранится даже после прекращения подачи напряжения.

В нашем примере мы подключим инкрементный энкодер с микроконтроллером. Энкодер PEC12 422OF SOO24 который имеет 24 импульса за 1 оборот.

Энкодер имеет 5 выводов, 3 из них это выводы самого энкодера, а другие два это кнопка. У выводов энкодера одни вывод общий а 2 другие сигнальные. Схема подключения ничем не отличается от схемы подключения обычной кнопки. Сигнальные выводы подключаются в портам ввода/вывода микроконтроллера. А общий вывод котоый посередине соединяется к земле. С целью защиты от дребезга контактов можно добавить конденсаторы емкостью несколько нФ. Выводы к которым мы подключили энкодер настраиваем в программе как входы и включаем подтягивающие резисторы, можно подключить внешние резисторы.

Схема подключения энкодера к микроконтроллеру

Принцип действия энкодера основан на замыкании и размыкании контактов, когда ручку никто не крутит то на входе в МК имеется логическая еденица. Когда ручку начинают поворачивать то появляются два прямоугольных импульса которые сдвинуты друг относительно друга. От того в какую сторону крутим будет зависить какой сигнал опережает.

Но так как имеется друбезг контактов в любых картина будет выглядить следующим образом.

Алгоритм работы программы микроконтроллера

С определенным интервалом начинается вызов функции опроса энкодера. Эта функция считывает логические уровни, которые присутсвуют на выводах микроконтроллера и производит запись этого значения во временную переменную. Внутри функции опроса энкодера существует другая статичная переменная которая сохраняется при выходе из этой функции в ней хранится последовательность предыдуших значений. Из этой переменной берется последнее записанное значение и сравнивается с текущим для того чтобы определить были ли изменения. Если эти значения равны тот происходит выход из функции, а если они отличаются то значение статичной переменной сдвигается на 2 разряда влево и в «свободное» место записывается новое (текущее) значение.

Получается что когда вал энкодера вращается то во временную переменную будет постоянно записываться новое значение и получится повторяющаяся кодовая последовательность. Если вращаем вправо булед : 11100001, а если влево то 11010010. По этим значениям можно понять в какую сторону крутится вал.

В архиве есть 2 файла encoder.h и encoder.c. Изначалоно нужно задать порт и номер выводов к которым производится подключение это переменные LEFT_SPIN и RIGHT_SPIN. В файле «c» находится реализация функций.

  • void InitEncoder(void) — фукнция которая инициализирует выводы;
  • void PollEncoder(void) — функция опроса энкодера, если есть вращение то пишем значение в функцию, если нет то просто выходим из функции так как нам нечего тут делать;
  • unsigned char GetStateEncoder(void) — переменная возвращает содержимое буфера и очищает его.

Вызов функции опроса энкодера происходит с частототй в 4 кГц. Если опрашивать с меньшей частотой то МК может пропустить импульсы в случае быстрого вращения вала.

Исходник программы под микроконтроллер

  • < Назад
  • Вперёд >
Добавить комментарий

radio-magic.ru

Добавить комментарий

Ваш адрес email не будет опубликован.