Универсальный внешний накопитель для всех iOS-устройств, совместим с PC/Mac, Android
Header Banner
8 800 100 5771 | +7 495 540 4266
c 9:00 до 24:00 пн-пт | c 10:00 до 18:00 сб
0 Comments

Содержание

Сопрягаем энкодер и микроконтроллер - 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

Распиновка энкодера

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


Поиск данных по Вашему запросу:

Схемы, справочники, даташиты:

Прайс-листы, цены:

Обсуждения, статьи, мануалы:

Дождитесь окончания поиска во всех базах.
По завершению появится ссылка для доступа к найденным материалам.
ПОСМОТРИТЕ ВИДЕО ПО ТЕМЕ: Подключаем энкодер к ардуино

Измеряя параметры вращения: энкодеры Bourns


By mAxSpace , September 26, in Схемотехника для начинающих. Как подключить энкодер, чтоб при вращении в одну сторону мы имели импульсы на одном выходе устройства, при вращении в другую сторону импульсы были на другом выходе устройсва. Конкретно нужно вращением влево многократно замыкать одну кнопку клавиатыры, вращением вправо - другую. Для замыкания планирую использовать шинный коммутатор кн8, осталость только между энкодером и этим коммутатором поставить умный "распознавальщик" направления вращения.

Выручайте пожалуйста - два дня по инету шарю - ни одной практической схемы, на макетке пробовал схемы со слов - тоже не выходит ничего путного. Мы принимаем формат Sprint-Layout 6!

Экспорт в Gerber из Sprint-Layout 6. Помоему так делал. На счёт энкодеров, в них бывают различия по логике работы на 1бит за один оборот, хотя и выглядят одинаково,. Конденсаторы Panasonic. Часть 4. Полимеры — номенклатура. Главной конструктивной особенностью таких конденсаторов является полимерный материал, используемый в качестве проводящего слоя. Полимер обеспечивает конденсаторам высокую электрическую проводимость и пониженное эквивалентное сопротивление ESR.

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

Читать статью. Кстати вопрос у меня самого есть. Я делал энкодер из сидиромовского двигателя, там есть датчики хола, но! Они на три фазы, подключив 2 датчика значения очень трудно и нечетко меняются. Как бы это согласовать три фазы с двумя??

Микросхему пока взял ла13 первая под руку попалась. Теперь осталось подумать как избавиться от паразитного импульса, кстати возникает он в момент когда на другом выходе состояние меняется с единицы на ноль. STM32G0 - средства противодействия угрозам безопасности. Результатом выполнения требований безопасности всегда является усложнение разрабатываемой системы. Особенно чувствительными эти расходы стали теперь, в процессе массового внедрения IoT.

Обладая мощным набором инструментов информационной безопасности, микроконтроллеры STM32G0 производства STMicroelectronics, объединив в себе невысокую цену, энергоэффективность и расширенный арсенал встроенных аппаратных инструментов, способны обеспечить полную безопасность разрабатываемого устройства. До 48 слоев. Быстрое прототипирование плат. Монтаж плат под ключ. Это имеет какой то практический смысл? Все до безобразия просто. Ему правда это дается с трудом , но главное желание.

Я сам начал этим заниматься не так давно, всего лет 8 назад и поверьте это значительно расширяет возможности, а при работе с цифровой техникой тем более.

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

You can post now and register later. If you have an account, sign in now to post with your account. Note: Your post will require moderator approval before it will be visible. Restore formatting. Only 75 emoji are allowed. Display as a link instead. Clear editor. Upload or insert images from URL.

By Dmitryy. Схемотехника для начинающих Search In. All Activity Home Вопрос-Ответ. Как Подключить Энкодер? Recommended Posts. Posted September 26, edited. Edited September 26, by mAxSpace. Share this post Link to post Share on other sites. Студенческое спонсорство. Posted September 26, Микросхему пока взял ла13 первая под руку попалась Теперь осталось подумать как избавиться от паразитного импульса, кстати возникает он в момент когда на другом выходе состояние меняется с единицы на ноль.

STM32G0 - средства противодействия угрозам безопасности Результатом выполнения требований безопасности всегда является усложнение разрабатываемой системы. Как избавиьтся от этих ложных импульсов? Производство печатных плат До 48 слоев. Posted September 27, edited. А по чему именно так надо? Posted September 27, Posted September 28, Posted September 28, edited. Edited September 29, by mAxSpace. Join the conversation You can post now and register later.

Reply to this topic Go To Topic Listing. Announcements Прочитайте перед созданием темы! Вадим, а не лучше в качестве усилителя для ушей использовать каскад преда натали? Ато бюджет устройства разрастается все больше и больше. Обсуждаем Комплектующие Два раза щёлкните лев. Не забудьте поставить галочку - соблюдать пропорции.

Only Music 2. Лучше разделение каналов и меньше перекрестных помех. Лучший результат- моноблоки. Хуже- двойное моно в одном корпусе от двух трансформаторов. Хуже- двойное моно в одном корпусе с одним трансформатором и полностью раздельными обмотками. Еще хуже-псевдо двойное моно. Совсем не факт. Двойное моно дает полное отсутствие земляных петель при правильной разводке, соответственно отсутствие фона и шума с частотой сети и ей кратной. Плюс лучше взаимопроникновение между каналами.

Да будет срач! Тема про политику. Игорян, давай я объясню? Кароче, сейчас будет абсолютно новое общество. Где не будет ни олигархов, ни нищих. Будут проживать простые живые люди, при чём не только в пределах СССРа, а вообще на всей планете. Это безусловно очень долгая песня, лет на растянется.

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

Сегодня 3. А я ему отвечаю, что енто брэд энд сивый кэбл. У живого человека априори не должно быть ни каких документов! Достаточно афедевита клятвы , и всё.


Подключение модуля энкодера (KY-040) к Arduino и создание простейшего счетчика импульсов.

В итоге преимущества данной серии состоят не только в том, что дистрибьютор или пользователь может выбирать настройки через стандартные интерфейсы USB и LPT ноутбука либо ПК, чтобы максимально адаптировать устройство к условиям работы, но и в том, что благодаря максимальной унификации комплектующих обеспечиваются минимальные сроки изготовления энкодера, поставок и ввода в эксплуатацию. Повышение производственной и эксплуатационной технологичности изделия означает итоговое снижение системной цены. С года, когда Макс Стегманн основал компанию Stegmann, ее головной офис и производственные площади находятся в Швенингене Германия. За эти годы небольшая фирма — производитель энкодеров — прошла значительный путь, достигнув мирового лидерства в данной отрасли и годового оборота, превышающего 50 млн евро. Среди важных достижений компании в сфере разработки абсолютных и инкрементальных энкодеров стоит назвать:.

Если крутить ручку энкодера в другую сторону, получим обратную последовательность: 3, 2, 1, 0. То есть, зная последовательность.

Вопросы и ответы

Авторизация Зарегистрироваться Логин или эл. Напомнить пароль Пароль. Войти Запомнить меня. Да, именно такое сочетание никак не связанных между собой девайсов мы рассмотрим сегодня. Абсолютные энкодеры выдают непосредственно угол, абсолютное положение, тогда как инкрементальный — определённое число щелчков на оборот и направление. Вообще, энкодеры бывают механические, оптические или магнитные. Внутри находятся два датчика расположенные друг за другом над кодирующим диском , которые при вращении ручки последовательно замыкают крайние выводы на средний. А как насчёт рассматриваемого нами экземпляра? При вращении ручки вращается скользящий контакт сложной формы над тремя секторами, которые соединены с соответствующими выводами. Вот он и замыкает средний сектор на контактные площадки то левого, то правого вывода в нужной последовательности.

Как подключить энкодер к Ардуино

By mAxSpace , September 26, in Схемотехника для начинающих. Как подключить энкодер, чтоб при вращении в одну сторону мы имели импульсы на одном выходе устройства, при вращении в другую сторону импульсы были на другом выходе устройсва. Конкретно нужно вращением влево многократно замыкать одну кнопку клавиатыры, вращением вправо - другую. Для замыкания планирую использовать шинный коммутатор кн8, осталость только между энкодером и этим коммутатором поставить умный "распознавальщик" направления вращения.

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

Программируемые инкрементальные энкодеры серии DRS61

Прошу выслать учебные проекты для фрезерного станка с поворотным зажимным столом ось В и магазином инструментов , счет позиций по энкодеру. Высылаю учебные проект для фрезерного станка с поворотным зажимным столом ось В и магазином инструментов , счет позиций по энкодеру. Здравствуйте, прошу высылать пример фрезерного станка. Станок с поворотным столом с зажимом, ось B с инкрементальным датчиком и цап. Магазин инструментов с поиском инструмента на базе оси от точки к точке.

Высокое разрешение энкодера цифровой поворотный кодер pinout опто датчик CAS60

Теория и практика. Кейсы, схемы, примеры и технические решения, обзоры интересных электротехнических новинок. Уроки, книги, видео. Профессиональное обучение и развитие. Сайт для электриков и домашних мастеров, а также для всех, кто интересуется электротехникой, электроникой и автоматикой. Категории: Схемы на микроконтроллерах Количество просмотров: Комментарии к статье: 0.

По часовой стрелке, если смотреть на вал энкодера в направлении «A», ср. Модульная система измерительных роликов SICK для энкодеров с.

Что за контакт ( I ) в распиновке энкодера?

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

Primary Menu

ВИДЕО ПО ТЕМЕ: Тахометр своими руками на Arduino

Описание работы енкодера Поворотный энкодер имеет фиксированное число позиций на оборот. Эти позиции легко ощущаются руками как небольшие щелчки при повороте оси энкодера. Данный модуль энкодера имеет тридцать таких позиций. Количество таких позиций характеризует чувствительность датчика вращения.

Размеры зажимного фланца: единица измерения: мм. Iron and steel Металлургия Водное хозяйство промышленности Военный, радар, антенна Инжиниринг Машинное оборудование порта Поднимаясь Ветроэнергетической промышленности Сценическое оборудование И других отраслей промышленности.

Энкодер и шкала

Опубликовано: Модуль энкодер KY является механическим датчиком угла поворота, он преобразует угол поворота вращающегося объекта например вала в электрические сигналы сдвинутые на 90 градусов относительно друг друга. Итак, не вдаваясь в подробности внутрисхемного устройства энкодера об этом будет отдельная статья , произведем его подключение к плате Arduino Uno. Схема подключения модуля энкодера в связке с многоразрядным семисегментным индикатором:. Нам достаточно будет просто разобрать состояние сигналов которые дают вывода CLK и DT, для этого есть небольшая схемная диаграмма, которая покажет как сдвинуты сигналы при вращении в ту или иную стороны. Из диаграммы видно что, каждый раз когда сигнал А контакт CLK энкодера переходит от высокого уровня к низкому, считывается состояние сигнала Б контакт DT энкодера.

Просмотр полной версии : Подбор энкодера. Добрый день. Для начала нужно знать, какую задачу Вы будете решать при помощи энкодера.


all-audio.pro

Подключение энкодера к микроконтроллеру | 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

Подключение поворотного энкодера к компьютеру через USB / Habr

Давно хотел приспособить к ноуту регулятор громкости, сделанный из энкодера. Подключать этот регулятор нужно будет к USB, чтобы все было «по-взрослому» (да и по-другому никак внешнее устройство к ноуту не подключишь). Крутим энкодер влево — громкость должна уменьшаться, вправо — должна увеличиваться. Жмем вниз ручку энкодера — запускаем какую-нибудь полезную программу, или переключаемся на регулирование тембра.

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

Такие устройства — не редкость в совремеменных автомагнитолах и любых бытовых устройствах, пользовательский интерфейс которых обрабатывается микроконтроллером (а это почитай любая бытовая техника), и где нужна плавная регулировка или настройка. В энкодер часто встраивают и третий контакт, работающий как кнопка на ручке — когда утапливаем ручку энкодера вниз (вдоль оси), то эта кнопка срабатывает. Очень обогащает возможности интерфейса с пользователем — на одном энкодере можно построить всю систему управления электронным устройством (зато добавляется гемор программисту, но это уже мелочи). У меня как раз и был такой энкодер.

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

Чтобы заработал регулятор громкости, нужно решить, как минимум, три инженерные задачи:

Шаг 1. Создание низкоскоростного USB-устройства на макетке.
Шаг 2. Подключить к этому USB-устройству энкодер, добиться, чтобы микроконтроллер его отрабатывал, и передавал в компьютер информацию о вращении энкодера.
Шаг 3. Разобраться, как можно программно управлять регулятором громкости. Наверняка есть какое-нибудь мультимедиа-API, которое позволяет это делать. Программа минимум — нужно написать программку, которая будет принимать сигналы от USB-устройства и управлять громкостью. Неплохо бы, конечно, написать драйвер, но за это браться страшновато. Лучше оставим на потом.

Итак, опишу процесс создания регулятора по шагам. Подробности опускаю, иначе будет слишком скучно. Кому интересно, см. исходники [6] и документацию по ссылкам.

[Шаг 1. Создание низкоскоростного USB-устройства на макетке]

Этот шаг прошел, даже не начавшись — как-то слишком просто и банально. Тупо скачал пример проекта по ссылке [1]. Поправил файлик usbconfig.h — для понтов назвал мое устройство ENCODER DEMO, на большее фантазии не хватило. Проверил в Makefile тип проца (ATmega16), частоту кварца (16 МГц) — чтобы соответствовало моей макетке AVR-USB-MEGA16. Скомпилил проект в AVRStudio, прошил макетку, подключил к компьютеру — все завелось с полоборота, мое USB-устройство исправно заработало как виртуальный COM-порт — все в точности так, как написано в статье [1].

[Шаг 2. Подключить к USB-устройству энкодер]

Этот шаг у меня вызывал самые большие опасения, что все заработает как надо. Что энкодер подключу и смогу его читать — в этом я не сомневался. Были сомнения, что смогу его считывать качественно, когда в фоне работает ещё и обработка протокола USB — все-таки это задача для микроконтроллера не из легких (как впоследствии оказалось — волновался я совершенно напрасно).

Как обычно, начал рыться в Интернете в поисках готовых подпрограмм для чтения энкодера. Нашел очень быстро то, что нужно — именно для AVR, очень простой код на C [2], файлики encoder.c и encoder.h. Что ни говори, а open source крутая штука.

Приделал два индикационных светодиода — ЗЕЛЕНЫЙ и ЖЕЛТЫЙ — для обозначения направления вращения энкодера. Подключил энкодер для удобства прямо к разъему ISP, воспользовавшись тем, что сигналы MOSI, MISO и SCK — это всего лишь ножки PB5, PB6 и PB7 микроконтроллера ATmega16 (подключил туда фазы A и B, а также кнопку энкодера).

Поправил определения ножек, добавил код инициализации. Присоединил к проекту модуль encoder.c. Добавил в главный цикл main управление зеленым и желтым светодиодами, когда приходит инфа с энкодера. КРАСНЫЙ светодиод привязал к кнопке энкодера — когда её нажимаем, красный светодиод зажигается, отпускаем — гаснет. Скомпилировал, прошил — работает. Кручу ручку влево, и в такт щелчкам энкодера вспыхивает зеленый светодиод. Кручу ручку вправо — вспыхивает желтый светодиод. Несмотря на то, что чтение энкодера происходит методом поллинга, благодаря эффективному коду к чтению энкодеру НИКАКИХ нареканий даже при одновременной работе с библиотекой V-USB (респект, Pashgan!). Добавил вывод информации от энкодера в виртуальный COM-порт (крутим энкодер влево вывожу в консоль минусики '-', крутим вправо вывожу в консоль плюсики '+'). По таймеру каждые 10 мс вывожу состояние кнопки энкодера и индицирую её красным светодиодом (кнопка нажата — передаю символ '1', отпущена — '0'). Все работает. Скукотища.

В заключение выкинул модули cmd.c, crc16.c, eepromutil.c, strval.c. Объем кода упал до 3 килобайт — отлично, теперь поместится и в память ATtiny45 (можно в будущем задействовать макетку AVR-USB-TINY45, она меньше по размерам и дешевле).

[Шаг 3. Разобраться, как можно программно управлять регулятором громкости]

Как обычно, прогуглил вопрос. Отсеял кучу мусора, и наконец выгреб жемчужину — [3]. Дальше дело техники. Достаю любимый детский конструктор — Visual Studio. Ни о чем не думая, визардом генерю dialog-based приложение. Бросаю на панель движок регулятора громкости, привязываю к нему переменную, добавляю обработчик положения движка. При старте приложения настраиваю движок на минимум 0 и максимум 65535 (чтобы соответствовало границам значения громкости, которым манипулируют библиотеки управления микшером). Считываю функцией mixerGetControlDetails текущее значение громкости, и ставлю движок регулятора в соответствующее положение. В обработчике положения движка все наоборот — читаю положение движка и функцией mixerSetControlDetails устанавливаю нужную громкость. Управление громкостью делаю в точности так, как написано в статье [3]. Проверил — работает.

Теперь осталось дело за малым — читать, что приходит с виртуального COM-порта (на нём у нас висит свежеиспеченное USB-устройство с энкодером). Если пришел минусик (-) то двигаем движок влево (уменьшаем громкость), плюсик (+), то двигаем движок вправо (увеличиваем громкость). Если приходят символы 0 и 1, то соответственно управляем состоянием чекбокса (просто для индикации — нажата кнопка энкодера, или нет). С COM-портом можно работать, как с обычным файлом (см. [4]). Инициализируем подключение к COM-порту как открытие файла (вызовом ::CreateFile) в блокирующем режиме. Запускаем отдельный поток, туда в бесконечный цикл добавляем чтение файла (блокирующим вызовом ::ReadFile) по одному символу, и этот символ анализируем. По тому, какой символ пришел, крутим движок слайдера в нужную сторону (громкость будет регулировать обработчик слайдера) или обновляем состояние чекбокса. Проверил — работает.

Вот и все, собственно. Дальше можно заниматься бесконечным (и, наверное, бесполезным) улучшательством. Сделать автоматический поиск нужного виртуального COM-порта (сейчас для упрощения имя COM-порта передается через командную строку). Переделать USB-устройство с CDC-класса на HID — это может упростить код USB-устройства, а также упростить программный поиск и открытие устройства на компьютере по VID и HID. Или написать вместо программы сервис (чтобы не надо было запускать отдельную программу). Или даже драйвер. Это очень интересно, но не умею (может, кто из хабравчан научит уму-разуму?..). Прикрутить к кнопке энкодера какое-нибудь действие. Ну и так далее до бесконечности.

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

[UPD120803]

Один грамотный человек собрал на микроконтроллере AVR регулятор громкости — USB HID устройство, эмулирующее стандартную мультимедийную клавиатуру (как предлагалось в комментариях). Такая клавиатура имеет возможность регулировать громкость без дополнительного программного обеспечения, всю необходимую работу выполняет драйвер операционной системы.

[Ссылки]

1. USB консоль для управления радиолюбительскими приборами.
2. Тут нашел код для энкодера. Тут авторское описание алгоритма.
3. Описание, как работать с микшером звуковой карты через mixerSetControlDetails.
4. Как работать с COM-портом в Windows.
5. Видеоролик, демонстрирующий работу регулятора громкости.
6. Исходники проекта ENCODER DEMO (проект AVRStudio и проект Visual Studio).

habr.com

Как подключить энкодер к частотному преобразователю. Схема

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

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

Теперь представим, что энкодер идеальный и его контакты не страдают дребезгом. Подключим к выводам энкодера осциллограф и начнем вращать ручку энкодера. Импульсы будут сдвинуты относительно друг друга на 90 градусов. Если крутить ручку мощности (кВт) вправо, влево или назад, то будем иметь последовательности панели управления:

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

Возьмем обычный энкодер, у которого есть дребезг контактов. Зона дребезга:

При переключении с логической единицы на логический ноль возникает дребезг. С дребезгом можно бороться двумя способами: аппаратным и программным применением.

Аппаратный способ – это подключение серии конденсаторов частотника, триггеров Шмитта, как указано на схеме панели управления:

Рекомендуется применять метод борьбы с дребезгом – программный. Такой метод описан в библиотеке Ротери. Данная библиотека содержит несколько функций, которые нужны для настройки выводов векторного контроллера на ввод, и подключение подтягивающих мощность (кВт) резисторов. В библиотеке нужно указывать соответствующие команды и задачи. Данной командой включается подтягивающий резистор внутри контроллера панели частотника.

Функция серии Get position vfd возвращает значение энкодера. Данная фукнция нужна для получения количества импульсов, которые считал энкодер. Функция set Position vfd нужна для загрузки значения, с которого энкодер начнет свой счет.

Функция tick должна быть рассмотрена подробнее. Переменные этой функции sig1 и sig2 записывают состояние векторного pin, к которой подключен энкодер. Дальше эти pin записываются в переменную thisState vfd, которая является текущим состоянием энкодера. Если текущее состояние энкодера не равно предыдущему, то вычисляются новые направления счета и количество импульсов мощности сохраняется в переменной Position. Когда энкодер вернется в свое начальное векторное положение, произойдет сдвиг вправо на два разряда, и новое значение управления нужно записать в переменную PositionExt. Данная переменная нужна для сохранения серии результатов задач, которые будут иметь применение в основной программе.

Счет

Проанализировав состояние энкодера при вращении влево и вправо, составляем таблицу:

Его начальное положение 1-1. При повороте вправо произошел щелчок, единица стала логическим нулем. Новое значение this State vfd равно 01. Согласно команды данный результат суммируется со значением переменной Position.

Из-за того, что произошел дребезг, позиция стала 11, после перерасчета порядковый номер стал 7. После того, как дребезг закончился, нужно фиксировать новое положение 01 и к предыдущему нулю добавляется единица. При повороте энкодера произошел один щелчок, и значение переменной Position стало единицей.

Происходит второй щелчок при повороте энкодера направо, и вместо позиции 01 мы имеем позицию 00. После того, как весь дребезг закончится, на выходе управления также имеем значение единицы. При четвертом щелчке, когда позиция с 10 стала 11, мы имеем значение 6. После окончания дребезга остается 6.

В некоторых энкодерах имеет применение кнопка панели. При ее нажатии и отпускании тоже будет дребезг контактов, нужно применить библиотеку Bounce. Функции этой библиотеки нужны для задания pin, к которому будет подключена кнопка, задач времени задержки в миллисекундах. Если произошло нажатие на кнопку, то функция мощности (кВт) возвращает векторное значение true, если нет, то false vfd.

Принципиальная схема подключения энкодера к преобразователю частоты

Данная схема состоит из платы Arduino Uno, инкрементального энкодера, четырехразрядного светодиодного индикатора, ключевых транзисторов и ограничительного резистора. Эта схема называется счетчиком импульсов. Она считает импульсы, которые будет воспроизводить энкодер при его вращении. Энкодер своими выводами подключен к каналам А2 и А3, вывод кнопки подключен к выводу А4, средний вывод подключен к земле, второй вывод тоже к земле.

Рассмотрим скетч, который называется счетчиком импульсов энкодера управления частотника. Вначале подключаем библиотеки для работы таймера, индикатора LS, для работы с энкодером, для кнопки.

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

Если нажимаем на кнопку индикатора, переменная обнулится, на индикаторе будет ноль.

Подключение энкодера промышленного назначения к Arduino

Наша задача суметь управлять скоростью асинхронного двигателя с помощью программы на компьютере. У нас имеется преобразователь частоты (частотник):

Для домашних заданий такая информация не нужна. На фотографии энкодер промышленного назначения для асинхронного двигателя управления мощностью (кВт) станков:

В станкостроении энкодеры широко применяются для преобразователей частоты асинхронных двигателей. Они монтируются как датчики обратной связи по своей скорости. Такие энкодеры имеют большую дискретность от 100 импульсов на оборот до 1 млн импульсов на оборот. У этой марки дискретность равна 500 имп. на оборот.

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

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

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

Рассмотрим энкодеры синуса и косинуса. Они выдают выходной сигнал косинуса или синуса. Далее, с помощью устройства интерполятора мощности образуют из них импульсы. Сигналы такого вида можно изменять в размерах. Питание энкодера осуществляется от напряжения 5 вольт.

Сигнал «А» — это сигнал импульса прямого типа. Количество импульсов с этого сигнала приходит на каждом обороте. Оно равно 500 (дискретность датчика).

Сигнал «В» — тоже прямой сигнал импульса. С него на каждом обороте поступает число импульсов по дискретности датчика, который смещен от канала «А» на 90 градусов (500).

Сигнал «R» — это сигнал метки «нуль». С одного оборота датчика получается один импульс.

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

Подключение

Подключение простое. Подсоединяем напряжение 5 вольт на выходы энкодера. У нас раскладка: провод коричневого цвета – 0 В, белого цвета — +5 В, розовый, зеленый и красный – А, В, R.

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

В нашем случае мы не будем применять прерывания, потому что мы работаем с 4-мя датчиками, они эксплуатируются одновременно. Если применять схему прерываний, наверняка возникнет ситуация потери импульсов. У нас эта проблема решается путем установления значка наличия движения. А мы рассматривали эксплуатацию энкодеров промышленного назначения.

Работа счетчика импульсов на основе модуля энкодера

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

Покрутим ручку энкодера по часовой стрелке. Значение счетчика инкрементируется на единицу при каждом щелчке энкодера. Наибольшее число можно накрутить 999999999. это число должно заполнить все разряды нашего семисегментного индикатора. Если вращать ручку дальше, то счетчик обнулится, начнет снова считать с нуля.

Для примера накрутим 120 импульсов. Теперь скручиваем обратно, вращая ручку против часовой стрелки. Центральная ось энкодера работает как кнопка. Она очищает от нулей свободные разряды индикатора. У кнопки есть небольшой дребезг контактов, поэтому выключение и включение происходит не сразу. Программным путем, дребезг устраняется. Это основа работы с модулем энкодера.

chistotnik.ru

Подключение N-кодера(энкодер) к микроконтроллеру AVR

При конструировании всяких подвижных агрегатов, будь то робот или станок на производстве, встает вопрос о контроле положения движущихся частей. Для таких целей используют валкодеры (их еще называют энкодеры, датчики положения). Валкодеры бывают механические и оптические. Типичный механический валкодер представляет собой диск с прорезями и две группы контактов:

При вращении диск замыкает и размыкает контакты, образуя синус и косинус сигналы. Направление кручения ручки определить легко. На нижние контакты подадим низкий уровень, а верхние «подтянем» резисторами к +5В и с них будем снимать сигнал. Условимся, что с Контактной Пары №1 будем снимать синус сигнал, а с Контактной Пары №2 – косинус сигнал. При кручении по часовой стрелке имеем такие сигналы:

То есть, косинус сигнал смещен относительно синуса «вперед» на 90 градусов. А против часовой:

Видно, что косинус смещен относительно синуса «назад» на 90 градусов.
Оптический энкодер состоит из прозрачного диска (зубчатого колесика), с темными черточками и двух разнесенных пар фотоизлучателя и фотоприемника, которые с помощью операционного усилителя формируют такие же TTL косинус и синус сигналы, как и у механического валкодера. Также встречаются валкодеры в виде длинной прозрачной «линейки» с черточками, по этой линейке ездит каретка с фотоизлучателями/фотоприемниками, такие часто встречаются в струйных принтерах и отвечают за положение печатающей каретки по горизонтали.

Перейдем к практической части. Соорудим из шариковой мышки валкодер для экспериментов. Выпотрошим всю мышиную начинку, и на освободившейся плате спаяем схему:

Схема состоит из двух идентичных каналов. Конденсаторы С1,С2 – блокировочные по 0.1мкФ. Резисторы R1,R2,R5,R6 по 10 кОм, R4,R7,R10,R11 – 5,1 кОм, R9 – ограничительный на 1 кОм, R3,R8 – 1 МОм. D1-J1-J2 – оптопара, используемая в мышке, иногда она бывает с общим катодом, а не с общим анодом, как изображено на схеме. Подключение такой оптопары не составит труда, достаточно поменять местами входа операционного усилителя.

Проверим с помощью тестера правильность косинус-синус сигналов при движении мышки. Если все как задумывалось – то припаяем энкодер к микроконтроллеру:

Косинус сигнал мы повесим на внешнее прерывание INT0, а синус – на PD0. Здесь я немного по-другому подключил ЖКИ, сигнал RS повесил на вывод PD1, а не на PD2, как я обычно делаю.
Перейдем к написанию программы, демонстрирующую работу с валкодером. Условимся, что вертикальным движением мышки мы будем изменять значение некоторой переменной position в границах от -9999 до 9999 и выводить его на ЖКИ.. Алгоритм работы программы очень прост. Нам необходимо включить внешнее прерывание INT0 по фронту косинус сигнала.

Пин PD0 выставить как вход. А в подпрограмме обработки прерывания сделать опрос PD0, если на нем низкий уровень – инкрементировать нашу переменную position, а если высокий – декрементировать (и не забыть про наши ограничения в |position|<=9999). В теле главной программы запишем вечный цикл, в котором будем выводить значение переменной position на ЖКИ.

  1. #include <avr/io.h>//библиотека ввода/вывода

  2. #include <avr/interrupt.h>//библиотека прерываний

  3.  

  4. #define RS 1 //RS=PD1

  5. #define E 3 //E=PD3

  6.  

  7. #define TIME 10 //Константа временной задержки для ЖКИ

  8. //Частота тактирование МК - 4Мгц

  9.  

  10. int position=0;

  11.  

  12. //Функция задержки(паузы)

  13. void pause (unsigned int a)

  14. { unsigned int i;

  15.  

  16. for (i=a;i>0;i--);

  17. }

  18.  

  19. void lcd_com (unsigned char lcd) //Передача команды ЖКИ

  20. { unsigned char temp;

  21.  

  22. temp=(lcd&~(1<<RS))|(1<<E); //RS=0 – это команда

  23. PORTD=temp; //Выводим на portD старшую тетраду команды, сигналы RS, E

  24. asm("nop"); //Небольшая задержка в 1 такт МК, для стабилизации

  25. PORTD=temp&~(1<<E); //Сигнал записи команды

  26.  

  27. temp=((lcd*16)&~(1<<RS))|(1<<E); //RS=0 – это команда

  28. PORTD=temp; //Выводим на portD младшую тетраду команды, сигналы RS, E

  29. asm("nop"); //Небольшая задержка в 1 такт МК, для стабилизации

  30. PORTD=temp&~(1<<E); //Сигнал записи команды

  31.  

  32. pause (10*TIME); //Пауза для выполнения команды

  33. }

  34.  

  35. void lcd_dat (unsigned char lcd) //Запись данных в ЖКИ

  36. { unsigned char temp;

  37.  

  38. temp=(lcd|(1<<RS))|(1<<E); //RS=1 – это данные

  39. PORTD=temp; //Выводим на portD старшую тетраду данных, сигналы RS, E

  40. asm("nop"); //Небольшая задержка в 1 такт МК, для стабилизации

  41. PORTD=temp&~(1<<E); //Сигнал записи данных

  42.  

  43. temp=((lcd*16)|(1<<RS))|(1<<E); //RS=1 – это данные

  44. PORTD=temp; //Выводим на portD младшую тетраду данных, сигналы RS, E

  45. asm("nop"); //Небольшая задержка в 1 такт МК, для стабилизации

  46. PORTD=temp&~(1<<E); //Сигнал записи данных

  47.  

  48. pause(TIME); //Пауза для вывода данных

  49. }

  50.  

  51. void lcd_init (void) //Иниализация ЖКИ

  52. {

  53. lcd_com(0x2c); //4-проводный интерфейс, 5x8 размер символа

  54. pause(100*TIME);

  55. lcd_com(0x0c); //Показать изображение, курсор не показывать

  56. pause(100*TIME);

  57. lcd_com(0x01); //Очистить DDRAM и установить курсор на 0x00

  58. pause (100*TIME);

  59. }

  60.  

  61. //Вывод на ЖКИ переменной position

  62. void write_position(void)

  63. { unsigned char i;

  64. long int temp;

  65. temp=position;

  66. lcd_com(0x80);

  67. if (temp<0) { //проверяем знак переменной

  68. lcd_dat('-');

  69. temp=-temp;

  70. }

  71. else lcd_dat(' ');

  72.  

  73. i=temp/1000; //пишем тысячи

  74. temp=temp-i*1000;

  75. lcd_dat(0x30+i);

  76.  

  77. i=temp/100; //сотни

  78. temp=temp-i*100;

  79. lcd_dat(0x30+i);

  80.  

  81. i=temp/10; //десятки

  82. temp=temp-i*10;

  83. lcd_dat(0x30+i);

  84.  

  85. i=temp/1; //единицы

  86. temp=temp-i*1;

  87. lcd_dat(0x30+i);

  88. }

  89.  

  90. ISR (INT0_vect)

  91. {

  92. if (((PIND&0x01)==0x00)&&(position<9999)) position=position+1; //инкремент position

  93. if (((PIND&0x01)==0x01)&&(position>-9999))position=position-1; //декремент position

  94. }

  95.  

  96. int main(void)

  97. {

  98. DDRD=0xfa; //PD0,PD2 как входа, остальные - выхода

  99. PORTD=0x05;

  100.  

  101. pause(3000); //Задержка для включения ЖКИ

  102. lcd_init(); //Инициализация ЖКИ

  103.  

  104. MCUCR=(1<<ISC01)|(1<<ISC00); //Включаем прерывание INT0 по фронту на PD2

  105. GICR=(1<<INT0);

  106.  

  107. write_position(); //Пишем position

  108.  

  109. sei(); //Разрешаем прерывания

  110.  

  111. while(1)

  112. write_position();

  113.  

  114.  

  115. return 1;

  116. }


Выводить значение переменной position можно сразу же после ее изменения. Но тогда обработка прерывания будет занимать много времени, а в это время, при быстром вращении валкодера можно пропустить дискрету. Так что не стоит забывать делать обработку прерывания как можно более короткой.
Скачать прошивку под ATmega8 в виде проекта для AVR Studio 4
Что у меня получилось из этой затеи можно увидеть на фото:

И видео:

avrlab.com

Отправить ответ

avatar
  Подписаться  
Уведомление о