Распиновка энкодера: Подключение энкодера к Arduino | AlexGyver Technologies

Энкодер – подключение, настройка (юстировка), программирование

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

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

  • Инкрементальный энкодер
  • Абсолютный энкодер
  • Энкодер с параллельным интерфейсом (встречается редко)
  • Энкодер с последовательным интерфейсом (широко распространен)

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

Программирование энкодера

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

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

Настройка энкодера, юстировка

После программирования энкодера следует его настройка (юстировка). У каждого производителя Настройка энкодера, юстировка индивидуальная.

Самые распространенные производители энкодеров:

  • Siemens
  • Heidenhain
  • Kubler
  • Omron
  • Sick

Также Настройка энкодера, юстировка будет зависеть от двигателя, на котором он установлен.

Проверка энкодера

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

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

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

Схема энкодера

К кому обратиться?

Специализированный сервисный центр «Кернел» выполнит профессиональное подключение, настройку (юстировку) и программирование энкодеров любых производителей в сжатые сроки и за разумные деньги.

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

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

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

Как с нами связаться

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

  • Заказав обратный звонок (кнопка в правом нижнем углу сайта)
  • Посредством чата (кнопка расположена с левой стороны сайта)
  • Либо позвонив по номеру: +7(8482) 79-78-54; +7(917) 121-53-01
  • Написав на электронную почту: [email protected]

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

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

Статей о работе с энкодером написано немало. В общем как и статей о других, рассматриваемых на этом сайте вопросах. Однако существуют, и имеют на это полное право, сотни рецептов приготовления борща или, допустим, шашлыка — каждый выбирает наиболее подходящий для себя. Это есть в некоторой степени выражение пресловутой «свободы выбора» и, если бы мой блог был философской направленности, то, вслед за вступлением, на головы читателей полились бы потоки дальнейших рассуждений о сущности бытия и прочее 🙂 Хорошо что это не так, и я здесь просто покажу мой подход к использованию этого весьма удобного элемента в связке с микроконтроллерами.
Об устройстве инкрементального энкодера неплохо написано здесь, или, допустим здесь — ничего сложного там не имеется. В простейшем случае — это как две кнопки, замыкающиеся определённым образом при вращении ротора. Удобная вещь, а, если ещё и с дополнительной кнопкой — то вообще универсальное устройство ввода для конструкций на микроконтроллерах!

Цена энкодеров почему-то до сих пор относительно высока, ну, конечно не слишком, но как для двух кнопок, то… Поэтому, прогуливаясь по различным барахолкам и блошиным рынкам, советую обращать внимание на распродажи битых плат зарубежных радиоэлектронных изделий по бросовым ценам — можно за копейки купить плату с установленным там хорошим качественным энкодером. Мне посчастливилось купить таким образом плату управления от фирменного музцентра «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. Удачи, коллеги!

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

Сопрягаем энкодер и микроконтроллер — 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 можно выбирать произвольно, главное правильно написать обработчик. На этом все.

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

Распиновка разъёма энкодера — Электропривод

Вторая серия.

Снял крышку энкодера:

отодрал наклейку:

Два провода ведущие вниз — очевидно питание подсветки.

Напротив, снизу на плате имеется какая-то десятиногая

хрень, очевидно что-то светочувствительное.

Микросхемы идентификации не поддались.

С платы выходит 8 проводов, до разъёма доходит 5, остальные

обрезаны.

Пять, как бы, в самый раз:

общий, питание, sin, cos, нулевая метка.

Шестой контакт звонится накоротко с одним из поводов

идущих вниз, со всеми «движками» подстроечных резисторов

с 11 и 12 ногой микросхемы с буквами TA, с 1, 8, 12 ногами

микросхемы с буквами CNE и с левой нижней ногой

светочувствительной десятиножки.

Предполагаю, что это «общий».

Первый контакт звонится накоротко с 3 ногой микросхемы

с буквами TA,с 16 ногой микросхемы с буквами CNE

и с правой нижней ногой светочувствительной десятиножки.

Предполагаю, что это питание.

Остальные три — выходы.

Осталось подать питание (какое?) и смотреть, что на

выходах. Но страшновато.

Может у кого есть какие предложения?

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

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

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

Теперь представим, что энкодер идеальный и его контакты не страдают дребезгом. Подключим к выводам энкодера осциллограф и начнем вращать ручку энкодера. Импульсы будут сдвинуты относительно друг друга на 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 импульсов. Теперь скручиваем обратно, вращая ручку против часовой стрелки. Центральная ось энкодера работает как кнопка. Она очищает от нулей свободные разряды индикатора. У кнопки есть небольшой дребезг контактов, поэтому выключение и включение происходит не сразу. Программным путем, дребезг устраняется. Это основа работы с модулем энкодера.

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

Подключение 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
Что у меня получилось из этой затеи можно увидеть на фото:
фото макета
И видео: 90000 Rotary Encoder Pinout, Features, Circuit and Working 90001 90002 90003 ROTORY ENCODER 90004 is a device used for knowing the 90003 axial movement and its direction 90004. Although they are available in various types here we are going to discuss about simple contact type encoder module. Here we are going to use 90003 M274 ROTARY ENCODER MODULE 90004. 90009 90002 90009 90012 90003 ROTARY ENCODER MODULE Pin Configuration 90004 90015 90002 ROTARY ENCODER module is five pin device as shown in the 90003 M274 pinout 90004.In them four pins are compulsory for using the module. 90009 90020 90021 90022 90023 90002 90003 Pin Name 90004 90009 90028 90023 90002 90003 Description 90004 90009 90028 90035 90022 90023 90002 GND 90009 90028 90023 90002 Connected to GROUND 90009 90028 90035 90022 90023 90002 + 90009 90028 90023 90002 Connected to + 5V 90009 90028 90035 90022 90023 90002 SW 90009 90028 90023 90002 Output of internal button 90009 90028 90035 90022 90023 90002 DT 90009 90028 90023 90002 Contact A output or DATA 90009 90028 90035 90022 90023 90002 CLK 90009 90028 90023 90002 Contact B output or CLOCK 90009 90028 90035 90086 90087 90002 In the above pins Contact A or DT and Contact B or CLK are used to measure the axis movement and direction.90009 90002 90009 90012 90003 ROTARY ENCODER MODULE Features and Specifications 90004 90015 90096 90097 360º free rotation. 90098 90097 20 steps or cycles per revolution 90098 90097 Incremental type encoder 90098 90097 Can work on low voltages 90098 90097 Maximum operating temperature: 0 ° C to + 80 ° C 90098 90097 Easy interface 90098 90097 Long life. 90098 90111 90002 90009 90012 90003 Where M274 ROTARY ENCODER MODULES are Used? 90004 90015 90002 Here are few applications where M274 is chosen over other encoder modules 90009 90002 90003 Case1: 90004 M274 is used when the cost of installment is considered.M274 is one of cheapest and robust encoders on the market. It is easily available to invest and replace. 90009 90002 90003 Case2: 90004 M274 is easy to work with considering the complex modules out there. We only need to consider two outputs to work with this module. 90009 90002 90003 Case3: 90004 With this encoder we can measure the axial movement and also the direction of change. 90009 90002 90009 90002 Also the module does not need any additional components to install in a system 90009 90002 90009 90012 90003 How to Use M274 ROTARY ENCODER MODULES 90004 90015 90002 For understanding the 90003 working of M274 rotary encoder 90004, consider the simple circuit configuration shown below.90009 90002 90147 90009 90002 Here we have connected two outputs to two LEDs to check the state of the module. The button is of no use here so it left alone. The module is powered by + 5V power source. Now for understanding the output of encoder let us consider internal stricture of encoder. 90009 90002 90009 90002 Here A and B are outputs and these contacts are left sliding internally on a rotating disk. This disk has divided in to conductive (dark segment) and nonconductive segments (white segments) as shown in figure.The conductive contacts or dark segments are jointly connected to + 5V. So when the points come in contact with dark segments they are simply coming in contact with + 5V. 90009 90002 90009 90002 Now when the disk rotates clock wise, the point A comes in contact with conductive segment (dark part) first and provides an output + 5V. After that point B comes in contact with conductive segment and provides + 5V. So in the circuit D1 LED turns ON first following D2 LED. Hence when the axis of encoder is rotated clock wise point A provides + 5V first and then B provides + 5V.90009 90002 90009 90002 If the axis keeps rotating the point A leaves the conductive segment (dark part) and moves on to nonconductive part (white part). So the output A goes LOW. Next the point B leaves conductive part making output B LOW. With that D1 turns OFF first next D2 turns OFF. 90009 90002 90009 90002 If the axis keeps rotating the cycle repeats and output A goes high following output B. So we will have a pulse output every time the points move from one segment to other.90009 90002 90009 90002 As these pulses state the change of axis, we can take them as a measure for axial movement. If this logic signal is given to controller, the controller can measure the clockwise axial movement. 90009 90002 90009 90002 Similarly if the disk moves anticlockwise, point B comes in contact with conductive segment first providing + 5V at output B. With disk keep moving point A comes in contact with dark segment. With that output A gives + 5V. So in the circuit D2 LED turns ON first after that D1 LED turns ON.Turning OFF also follows the same pattern to complete a cycle. For every cycle there will be voltage pulse at the output. 90009 90002 90009 90002 As before these voltage signals represent the axial movement. We can take them as a measure for axial movement. If this logic signal is given to controller, the controller can measure the anticlockwise axial movement. 90009 90002 90009 90002 This way we can find the axial movement and the direction of rotation through rotary encoder. 90009 90002 90009 90012 90003 Applications 90004 90015 90096 90097 Security systems.90098 90097 Motors 90098 90097 Robotic arms 90098 90097 Vending machines. 90098 90097 Industrial machines. 90098 90097 Engineering systems. 90098 90097 Measuring instruments. 90098 90097 Hobby projects. 90098 90097 Systems where systematic change INPUT device is needed like CROs, signal generator etc. 90098 90111 90002 90009 90012 90003 2D Model 90004 90015 90002 All measurements are given in millimeters.90009 90002 90218 90009 .90000 Arduino Rotary Encoder Wiring 90001 90002 Rotary encoder is an electro-mechanical instrument that that converts rotational motion into analog or digital information. Apparently it seems like potentiometer however it has turning capability in both clockwise as well as counter-clockwise directions upto infinite extent. In this article we will see Arduino rotary encoder wiring. 90003 90002 Rotary encoders are of several types. Two main types include relative (incremental) and absolute encoders.The output of absolute encoder is a value proportional to the current shaft angle while incremental encoder’s output is step of shaft and its direction. 90003 90006 Rotary Encoder Pinout: 90007 90002 90009 90003 90002 Rotary encoder has 5 pins; three of them on encoder side while two on the click button side. 90003 90002 The two (1 & 2) pins are actually push buttons where 1 is grounded and 2 acts like a switch while on encoder side the corner pins (3 & 5) are connected to the Arduino board whereas the middle pin of the encoder is grounded .90003 90002 However when rotary encoder is mounted on the breakout board, all the five pins are available on the same side. The pictorial comparison is given below. 90003 90002 90018 90003 90006 Arduino Rotary Encoder Wiring: 90007 90002 Arduino rotary encoder wiring is shown below. 90003 90002 90025 90003 90002 90003 .90000 Optical encoders 01 — RepRap 90001 Optical encoders 01 90002 Release status: unknown 90003 90004 90005 90006 90007 Description 90008 90009 90006 90002 Linear Optical Encoder Components 90003 90009 90014 90005 90006 90007 License 90008 90009 90006 90002 unknown 90003 90009 90014 90005 90006 90007 Author 90008 90009 90006 90009 90014 90005 90006 90007 Contributors 90008 90009 90006 90009 90014 90005 90006 90007 Based-on 90008 90009 90006 90009 90014 90005 90006 90007 Categories 90008 90009 90006 90009 90014 90005 90006 90007 CAD Models 90008 90009 90006 90009 90014 90005 90006 90007 External Link 90008 90009 90006 90009 90014 90073 90002 For those who enjoy scavenging, many components useful for constructing 3D printers can be found in inkjet printers.This often includes optical encoders and strips. This page gives information on finding and using these items. 90003 90002 Cheap inkjet printers can be obtained from garage sales or recycling centers. Do not get laser printers, since they do not have the right optical components in them. Not all inkjet printers have optical encoders and strips in them. It is easy to tell by opening the lid (as if to change the ink). You should see a grey plastic strip close to the shiny metal rod and running parallel to it.The printers that people sell cheaply or recycle generally are somewhat inky inside. Do not get ink on the optical strip, though you may be able to clean it off. 90003 90002 The strip runs through the optical sensor, which may be quite hidden. It is probably on the back side of the assembly that holds the ink cartridges. 90003 90002 The pictures below show two inkjet printers (both Dell) with the covers open. The gray encoder strips are visible. 90003 90082 90083 90002 Optical strip identification 90003 90086 90083 90002 Optical strip identification 90003 90086 90091 90002 The following pictures show a partially disassembled printer with the strip and encoder (sensor).90003 90082 90083 90086 90083 90086 90091 90002 After you have removed the moving assembly you should be able to see the optical sensor. It will have a black plastic case with a slot for the strip. It will be soldered to a small printed circuit board. Do whatever you have to in order to get this circuit board free of everything else without damaging the sensor. Unsolder the sensor from the circuit board. It will have either 4 or 6 pins. If it has six pins, the pins will be in a group of 4 and a group of 2.The following are common desoldering techniques. 90003 90002 a. Make a big blob of solder that covers all 4 pins and will stay molten long enough that the sensor can be pulled free of the board (because all 4 pins are loose at the same time). 90003 90002 b. Remove the solder from around the pins with a solder socking device or solder wick. 90003 90002 c. Since you do not care about the circuit board, nibble away at it (but not with your sharpest wire cutters) until the pins are separated from each other and they can be unsoldered from the circuit board remnants one at a time.90003 90082 90083 90086 90083 90086 90083 90086 90115 90091.90000 Interfaces | ODrive 90001 90002 While developing custom ODrive control code it is recommend that your motors are free to spin continuously and are not connected to a drivetrain with limited travel. 90003 90002 The ODrive can be controlled over various ports and protocols. If you’re comfortable with embedded systems development, you can also run custom code directly on the ODrive. For that refer to the developer documentation. 90003 90006 Table of contents 90007 90008 Pinout 90009 90010 90011 90012 90013 GPIO 90014 90013 primary 90014 90013 step / dir 90014 90013 other 90014 90021 90022 90023 90012 90025 GPIO1 90026 90025 UART TX 90026 90025 Axis0 Step 90026 90025 Analog input, PWM input 90026 90021 90012 90025 GPIO2 90026 90025 UART RX 90026 90025 Axis0 Dir 90026 90025 Analog input, PWM input 90026 90021 90012 90025 GPIO3 90026 90025 90026 90025 Axis1 Step (+) 90026 90025 Analog input, PWM input 90026 90021 90012 90025 GPIO4 90026 90025 90026 90025 Axis1 Dir (+) 90026 90025 Analog input, PWM input 90026 90021 90012 90025 GPIO5 90026 90025 90026 90025 90026 90025 Analog input (*) 90026 90021 90012 90025 GPIO6 (*) 90026 90025 90026 90025 90026 90025 90026 90021 90012 90025 GPIO7 (*) 90026 90025 90026 90025 Axis1 Step (*) 90026 90025 90026 90021 90012 90025 GPIO8 (*) 90026 90025 90026 90025 Axis1 Dir (*) 90026 90025 90026 90021 90104 90105 90002 (+) on ODrive v3.4 and earlier 90107 (*) ODrive v3.5 and later 90003 90002 Notes: 90003 90111 90112 You must also connect GND between ODrive and your other board. 90113 90112 ODrive v3.3 and onward have 5V tolerant GPIO pins. 90113 90112 ODrive v3.5 and later have some noise suppression filters on the default step / dir pins 90113 90112 You can change the step / dir pins using 90119 axis.config. _gpio_pin 90120. 90113 90122 90006 Pin function priorities 90007 90125 90112 PWM in, if enabled.Disabled by default. 90113 90112 UART, 90129 Enabled by default 90130. 90113 90112 Step / Dir, if enabled. Disabled by default. 90113 90112 Analog, default behavior if not overridden (only on supported pins). 90113 90112 Digital in, default behavior on pins not capable of analog input. 90113 90138 90002 For predictable results, try to have only one feature enabled for any one pin. When changing pin assignments you must: 90003 90111 90112 90119 odrv0.save_configuration () 90120 90113 90112 90119 odrv0.reboot () 90120 90113 90122 90006 Analog input 90007 90002 Analog inputs can be used to measure voltages between 0 and 3.3V. Odrive uses a 12 bit ADC (4096 steps) and so has a maximum resolution of 0.8 mV. Some GPIO pins require the appropriate pin priority (see above) to be set before they can be used as an analog input. To read the voltage on GPIO1 in odrive tool the following would be entered: 90119 odrv0.get_adc_voltage (1) 90120 90003 90006 Hall feedback pinout 90007 90002 When the encoder mode is set to hall feedback, the pinout on the encoder port is as follows: 90003 90010 90011 90012 90013 Label on ODrive 90014 90013 Hall feedback 90014 90021 90022 90023 90012 90025 A 90026 90025 Hall A 90026 90021 90012 90025 B 90026 90025 Hall B 90026 90021 90012 90025 Z 90026 90025 Hall C 90026 90021 90104 90105 90008 Native Protocol 90009 90002 This protocol is what the ODrive Tool uses to talk to the ODrive.If you have a choice, this is the recommended protocol for all applications. The native protocol runs on USB and can also be configured to run on UART. 90003 90195 Python 90196 90002 The ODrive Tool you installed as part of the Getting Started guide comes with a library that you can use to easily control the ODrive from Python. 90003 90002 Assuming you already installed the odrive library (90119 pip install odrive 90120), the simplest program to control the ODrive is this: 90003 90203 90119 import odrive odrv0 = odrive.find_any () print (str (odrv0.vbus_voltage)) 90120 90206 90002 For a more comprehensive example, see tools / odrive_demo.py. 90003 90195 Other languages ​​90196 90002 We do not have an official library for you just yet. Check the community, there might be someone working on it. If you want to write a library yourself, refer to the native protocol specification. You are of course welcome to contribute it back. 90003 90008 ASCII protocol 90009 90002 This is a simpler alternative to the native protocol if you do not need all its bells and whistles.Before you use this, be sure that you’re ok with its limitations. The ASCII protocol is enabled by default on UART and can also be enabled on USB alongside with the native protocol. 90003 90002 For more details, see the ASCII protocol specification. 90003 90006 Arduino 90007 90002 There is an Arduino library that gives some examples on how to use the ASCII protocol to communicate with the ODrive. Check it out here. 90003 90008 Step / direction 90009 90002 This is the simplest possible way of controlling the ODrive.It is also the most primitive and fragile one. So do not use it unless you must interoperate with other hardware that you do not control. 90003 90002 Pinout: 90003 90111 90112 Step / dir signals: see Pinout above. Note in that section how to reassign the pins. 90113 90112 GND: you must connect the grounds of the devices together. Use any GND pin on J3 of the ODrive. 90113 90122 90002 To enable step / dir mode for the GPIO, set 90119 .config.enable_step_dir 90120 to true for each axis that you wish to use this on.Axis 0 step / dir pins conflicts with UART, and the UART takes priority. So to be able to use step / dir on Axis 0, you must also set 90119 odrv0.config.enable_uart = False 90120. See the pin function priorities for more detail. Do not forget to save configuration and reboot. 90003 90002 There is also a config variable called 90119 .config.counts_per_step 90120, which specifies how many encoder counts a «step» corresponds to. It can be any floating point value. The maximum step rate is pending tests, but it should handle at least 50kHz.If you want to test it, please be aware that the failure mode on too high step rates is expected to be that the motors shuts down and coasts. 90003 90002 Please be aware that there is no enable line right now, and the step / direction interface is enabled by default, and remains active as long as the ODrive is in position control mode. To get the ODrive to go into position control mode at bootup, see how to configure the startup procedure. 90003 90008 RC PWM input 90009 90002 You can control the ODrive directly from an hobby RC receiver.90003 90002 Some GPIO pins can be used for PWM input, if they are not allocated to other functions. For example, you must disable the UART to use GPIO 1,2. See the pin function priorities for more detail. 90003 90002 Any of the numerical parameters that are writable from the ODrive Tool can be hooked up to a PWM input. As an example, we’ll configure GPIO4 to control the angle of axis 0. We want the axis to move within a range of -1500 to 1500 encoder counts. 90003 90125 90112 Make sure you’re able control the axis 0 angle by writing to 90119 odrv0.axis0.controller.pos_setpoint 90120. If you need help with this follow the getting started guide. 90113 90112 If you want to control your ODrive with the PWM input without using anything else to activate the ODrive, you can configure the ODrive such that axis 0 automatically goes operational at startup. See here for more information. 90113 90112 In ODrive Tool, configure the PWM input mapping 90203 90119 In [1]: odrv0.config.gpio4_pwm_mapping.min = -1500 In [2]: odrv0.config.gpio4_pwm_mapping.max = 1500 In [3]: odrv0.config.gpio4_pwm_mapping.endpoint = odrv0.axis0.controller._remote_attributes [ ‘pos_setpoint’] 90120 90206 90002 Note: you can disable the input by setting 90119 odrv0.config.gpio4_pwm_mapping.endpoint = None 90120 90003 90113 90112 Save the configuration and reboot 90203 90119 In [4]: ​​odrv0.save_configuration () In [5]: odrv0.reboot () 90120 90206 90113 90112 With the ODrive powered off, connect the RC receiver ground to the ODrive’s GND and one of the RC receiver signals to GPIO4.You may try to power the receiver from the ODrive’s 5V supply if it does not draw too much power. Power up the the RC transmitter. You should now be able to control axis 0 from one of the RC sticks. 90113 90138 90002 Be sure to setup the Failsafe feature on your RC Receiver so that if connection is lost between the remote and the receiver, the receiver outputs 0 for the velocity setpoint of both axes (or whatever is safest for your configuration). Also note that if the receiver turns off (loss of power, etc) or if the signal from the receiver to the ODrive is lost (wire comes unplugged, etc), the ODrive will continue the last commanded velocity setpoint.There is currently no timeout function in the ODrive for PWM inputs. 90003 90008 Ports 90009 90002 Note: when you use an existing library you do not have to deal with the specifics described in this section. 90003 90006 USB 90007 90002 This section assumes that you are familiar with the general USB architecture, in particular with terms like «configuration», «interface» and «endpoint». 90003 90002 On USB the ODrive provides a single configuration which is a composite device consisting of a CDC device (virtual COM port) and a vendor specific device.90003 What is a composite device? 90002 A composite device is a device where interfaces are grouped by interface association descriptors. For such devices, the host OS loads an intermediate driver, so that each of the interface groups can be treated like a separate device and have its own host-side driver attached. 90003 90002 On the ODrive, the following interface groups are present: 90003 90111 90112 Interface Association: Communication Device Class (CDC) 90111 90112 Interface 0: 90111 90112 Endpoint 90119 0x82 90120: CDC commands 90113 90122 90113 90112 Interface 1: 90111 90112 Endpoint 90119 0x01 90120: CDC data OUT 90113 90112 Endpoint 90119 0x81 90120: CDC data IN 90113 90122 90113 90122 90113 90112 Interface Association: Vendor Specific Device Class 90111 90112 Interface 2: 90111 90112 Endpoint 90119 0x03 90120: data OUT 90113 90112 Endpoint 90119 0x83 90120: data IN 90113 90122 90113 90122 90113 90122 90002 The endpoint pairs 90119 0x01, 0x81 90120 and 90119 0x03, 0x83 90120 behave exactly identical, only their descriptors (interface class, …) are different.90003 90002 If you plan to access the USB endpoints directly it is recommended that you use interface 2. The other interfaces (the ones associated with the CDC device) are usually claimed by the CDC driver of the host OS, so their endpoints can not be used without first detaching the CDC driver. 90003 90006 UART 90007 90002 Baud rate: 115200 Pinout: 90003 90111 90112 GPIO 1: Tx (connect to Rx of other device) 90113 90112 GPIO 2: Rx (connect to Tx of other device) 90113 90112 GND: you must connect the grounds of the devices together.Use any GND pin on J3 of the ODrive. 90113 90122 .

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

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