Из этой статьи вы узнаете, что такое энкодер, зачем он нужен, и как его подружить с микроконтроллером. Если вы пользовались современной стиральной машиной, микроволновой печью или аудио системой то, скорее всего вы уже имели дело с энкодером, сами того не подозревая. Например, в большинстве современных домашних и автомобильных стерео систем энкодеры используются для регулировки громкости звука.
Энкодер или датчик угла поворота – это электромеханическое устройство, предназначенное для преобразования углового положения вала или оси в электрические сигналы. Существует два основных типа энкодеров — инкрементные и абсолютные.
Инкрементный энкодер при вращении формирует импульсы, число которых пропорционально углу поворота. Подсчет числа этих импульсов даст нам величину угла поворота вала энкодера относительно его начального положения. Этот тип энкодеров не формирует выходные импульсы, когда его вал находится в покое. Инкрементные энкодеры находят широкое применение в индустриальных средствах управления, бытовой и музыкальной технике.
У него 5 выводов. 2 вывода на фотографии слева – выводы кнопки, 3 вывода на фотографии справа – выводы энкодера. Из них — 2 сигнальных и 1 общий. Он посередине. Схема подключения энкодера ничем не отличается от подключения обычных кнопок. Сигнальные выводы энкодера подключаем к любому порту ввода вывода микроконтроллера. Общий вывод энкодера сажаем на землю. Для защиты от дребезга контактов не лишним будет добавить еще пару керамических конденсаторов номиналом в несколько нанофарад. Выводы микроконтроллера в программе конфигурируем как входы и включаем подтягивающие резисторы. Можно использовать внешние.
Когда ручка энкодера стоит неподвижно – на входах микроконтроллера присутствуют логические единицы. Когда ручку энкодера поворачивают, на выводах микроконтроллера появляются два прямоугольных сигнала сдвинутых друг относительно друга. От направления вращения вала энкодера зависит, какой из сигналов будет опережать другой. На рисунке ниже представлены возможные варианты сигналов для идеального случая.
Внутри энкодера имеются контакты, которые при вращении то замыкаются, то размыкаются. Этот процесс естественно сопровождается дребезгом, поэтому реальные сигналы могут выглядеть вот так.
Сигналы сняты со старого энкодера, включенного без фильтрующих конденсаторов.
Алгоритм обработки сигналов энкодера выглядит следующим образом. В обработчике прерывания таймера запускается функция опроса энкодера. Она считывает логические уровни, присутствующие на выводах микроконтроллера к которым подключен энкодер и записывает их во временную переменную. Внутри функции есть статическая переменная (переменная, которая сохраняет свое значение при выходе из функции) хранящая последовательность предыдущих состояний. С помощью битовой маски микроконтроллер выделяет из этой переменной последнее состояние и сравнивает его с текущим, чтобы определить произошли ли изменения. Если состояния равны – функция завершает работу, если отличны – значение статической переменной сдвигается влево на 2 разряда и на «освободившееся» место записывается текущее состояние. Таким образом, если вал энкодера вращается, функция будет постоянно сохранять некую повторяющуюся кодовую последовательность. При вращении вправо – это будет 11100001. При вращении влево – 11010010. По этим последовательностям микроконтроллер и будет понимать, в какую сторону происходит вращение.
Исходник для работы с энкодером можно скачать здесь. Архив содержит два файла: encoder.h и encoder.c. В хедере задаются порт и номера выводов, к которым подключен энкодер, константы LEFT_SPIN и RIGHT_SPIN. Также там описаны прототипы функций. Сишный файл содержит реализацию функций.Опрос энкодера я обычно произвожу с частотой ~ 4 кГц. Если опрашивать медленней, микроконтроллер будет пропускать импульсы при быстрых поворотах ручки энкодера. Если энкодер используется для установки линейно меняющейся величины, например для установки времени в часах, то в качестве констант LEFT_SPIN и RIGHT_SPIN удобно использовать числа 255 и 1 соответственно. В обработчике сигналов энкодера эти числа просто складываются с устанавливаемой величиной. При сложении с 1 величина увеличивается на 1, при сложении с 255 уменьшается на 1. Конечно это актуально если эта величина однобайтная. Ну а в принципе константы LEFT_SPIN и RIGHT_SPIN можно выбирать произвольно, главное правильно написать обработчик. На этом все.
Исходник для работы с энкодером здесь.
chipenable.ru
Опубликовано 2015-04-04 22:51:49 автором Ruslan В этом уроке мы научимся работать с инкрементальным энкодером на микроконтролле. В наш энкодер встроена еще и кнопка. С помощью одного лишь энкодера можно легко осуществлять управление практически любым девайсом! Например, представим себе листание деревовидного меню ( прокрутка — листания меню, нажатие — переход в подкатегорию меню). Энкодер — это цифровой датчик угла поворота. У нашего инкрементального энкодера 5 контактов. Три (Общий, А и В) отвечают за вращение и 2 — это встроенная кнопка. Сначала разберемся, как подключить энкодер к микроконтроллеру и как с него считывать данные.
Напишем простую программу которая будет опрашивать энкодер и выводить на дисплей переменную, которая будет меняться в зависимости от направления вращения энкодера Пример кода #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
Наконец то у меня появилась эта замечательная крутилка и теперь я хочу рассказать вам как с ней работать. Мой энкодер (EC12E24204A9) представляет из себя примерно следующее:
Энкодер имеет три контакта: Общий, А и В. Общий обычно всегда подключается к земле а два других к любым пинам микроконтроллера. Выводы А и В должны быть подтянуты к плюсу питания через резисторы порядка 10 кОм, чтоб исключить ложные срабатывания от наводок. Использовать внутреннюю подтяжку микроконтроллера я бы не посоветовал. Уж очень она слабая. Для демонстрации работы, повесим еще 8 светодиодов. (примечание: Если используется мега16, мега32 и старше то необходимо выключить jtag иначе половина светодиодов гореть не будет)
Крутим ручку энкодера вправо — огонек бежит вправо. Крутим влево — огонек бежит влево. Как работает энкодер? Будем разбираться. Ничего сложного нет. Посмотрим на графики ниже.
При вращении энкодера в одну сторону сигнал выглядит так:
В другую:
Возникает вопрос, а как же микроконтроллеру различить направление вращения энкодера ?
Существуют два популярных алгоритма опроса энкодера:
У каждого из этих способов опроса существуют свои недостатки и преимущества. Я попробовал оба и остановился на втором способе. Опрос при помощи прерываний хорош тем, что можно обеспечить мгновенную реакцию на поворот ручки энкодера. Но имеется и серьёзный недостаток. Такой как дребезг контактов. Для его подавления конечно можно применить различные программные и аппаратные средства но я не стал заморачиваться. Рассмотрим поподробнее второй алгоритм опроса. В процессе работы, микроконтроллер непрерывно считывает данные с пинов на которых висит энкодер и сравнивает то что он считал с результатом предыдущего считывания. В зависимости от результата сравнения состояний, программа делает выводы о направлении вращения. В программе есть комментарии, я думаю их будет достаточно для понимания алгоритма. Если есть вопросы, то спросить можно как всегда в комментах.
Исходник
avrdevices.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
Из этой статьи вы узнаете, что такое энкодер, зачем он нужен, и как его подружить с микроконтроллером. Если вы пользовались современной стиральной машиной, микроволновой печью или аудио системой то, скорее всего вы уже имели дело с энкодером, сами того не подозревая. Например, в большинстве современных домашних и автомобильных стерео систем энкодеры используются для регулировки громкости звука.
Энкодер или датчик угла поворота – это электромеханическое устройство, предназначенное для преобразования углового положения вала или оси в электрические сигналы. Существует два основных типа энкодеров — инкрементные и абсолютные.
Инкрементный энкодер при вращении формирует импульсы, число которых пропорционально углу поворота. Подсчет числа этих импульсов даст нам величину угла поворота вала энкодера относительно его начального положения. Этот тип энкодеров не формирует выходные импульсы, когда его вал находится в покое. Инкрементные энкодеры находят широкое применение в индустриальных средствах управления, бытовой и музыкальной технике.
Абсолютный энкодер для каждой позиции своего вала выдает уникальный код. Ему, в отличии от инкрементного энкодера, счетчик не нужен, угол вращения всегда известен. Абсолютный энкодер формирует сигнал и когда вал вращается, и когда он находится в покое. Абсолютный энкодер не теряет информацию о своем положении при потере питания и не требует возврата в начальную позицию. Этот тип энкодеров применяется в промышленно оборудовании — робототехнике, станках, конвейерных линиях.
Я хотел бы рассказать о сопряжении инкрементного механического энкодера с микроконтроллером. Для этого я приобрел инкрементный энкодер фирмы 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. Также там описаны прототипы функций. Сишный файл содержит реализацию функций.Опрос энкодера я обычно произвожу с частотой ~ 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
В этой статье пойдет речь о энкодере и о том как его подключить к микроконтроллеру. Встретить его можно в таких устройствах как аудиосистемы, стиральные машины, микроволновкой и ряде современных устройств. К примеру в аудиосистемах энкодеры и микроконтроллеры используются для регулировки громкости. Но ладно хватит уже воды, давайте ближе к делу.
Энкодер или как его еще называют датчик угла поворота — представляет собой электромеханическое устройство, которое преобразует положение угла вала в электрический сигнал. Энкодеры делятся на 2 типа абсолютные и инкрементные.
В инкрементных энкодерах при повороте вала формируются импульсы, количество этих импульсов пропорционально углу поворота вала. Если подсчитать эти импульсы то можно узнать угол поворота вала энкодера. Если ручка энкодера находится в покое то импульсы не формируются. Такие энкодеры широко применяются в аудио системах и промышленных средствах управления.
Абсолтные энкодеры имеют совершенно другой принцип дейставия, основаная на выдачи уникального кода каждому положению вала. Формирование импульсов происходит когда вал вращается и когда он в покое. Причем информация о текущем положения вала, сохранится даже после прекращения подачи напряжения.
В нашем примере мы подключим инкрементный энкодер с микроконтроллером. Энкодер PEC12 422OF SOO24 который имеет 24 импульса за 1 оборот.
Энкодер имеет 5 выводов, 3 из них это выводы самого энкодера, а другие два это кнопка. У выводов энкодера одни вывод общий а 2 другие сигнальные. Схема подключения ничем не отличается от схемы подключения обычной кнопки. Сигнальные выводы подключаются в портам ввода/вывода микроконтроллера. А общий вывод котоый посередине соединяется к земле. С целью защиты от дребезга контактов можно добавить конденсаторы емкостью несколько нФ. Выводы к которым мы подключили энкодер настраиваем в программе как входы и включаем подтягивающие резисторы, можно подключить внешние резисторы.
Принцип действия энкодера основан на замыкании и размыкании контактов, когда ручку никто не крутит то на входе в МК имеется логическая еденица. Когда ручку начинают поворачивать то появляются два прямоугольных импульса которые сдвинуты друг относительно друга. От того в какую сторону крутим будет зависить какой сигнал опережает.
Но так как имеется друбезг контактов в любых картина будет выглядить следующим образом.
Алгоритм работы программы микроконтроллера
С определенным интервалом начинается вызов функции опроса энкодера. Эта функция считывает логические уровни, которые присутсвуют на выводах микроконтроллера и производит запись этого значения во временную переменную. Внутри функции опроса энкодера существует другая статичная переменная которая сохраняется при выходе из этой функции в ней хранится последовательность предыдуших значений. Из этой переменной берется последнее записанное значение и сравнивается с текущим для того чтобы определить были ли изменения. Если эти значения равны тот происходит выход из функции, а если они отличаются то значение статичной переменной сдвигается на 2 разряда влево и в «свободное» место записывается новое (текущее) значение.
Получается что когда вал энкодера вращается то во временную переменную будет постоянно записываться новое значение и получится повторяющаяся кодовая последовательность. Если вращаем вправо булед : 11100001, а если влево то 11010010. По этим значениям можно понять в какую сторону крутится вал.
В архиве есть 2 файла encoder.h и encoder.c. Изначалоно нужно задать порт и номер выводов к которым производится подключение это переменные LEFT_SPIN и RIGHT_SPIN. В файле «c» находится реализация функций.
Вызов функции опроса энкодера происходит с частототй в 4 кГц. Если опрашивать с меньшей частотой то МК может пропустить импульсы в случае быстрого вращения вала.
Исходник программы под микроконтроллер
radio-magic.ru