Считывание данных с абсолютных энкодеров с помощью кода Баркера

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

Задача абсолютных энкодеров — выдавать непосредственное значение угла поворота, пусть и в своих единицах.

На рисунке представлен 12-разрядный абсолютный энкодер мелкосерийного советского производства. В документации он значится преобразователь угол-код.
Он питается от 5В, имеет 12 разрядных входов и 2 выхода — A и B.

Внутри имеется по два светодиода на разрядный вход (соответственно на A и B), фотодиоды и небольшая схемка формирования сигналов выходного каскада. Выход — на базе активного выхода микросхемы К133ЛА3 через резистор 68 Ом.
Эти знания пригодились для создания цепей согласования.
В роли микроконтроллера MSP430F2232.
Выходной каскад на базе массива дарлингтонов ULN2803.

Внутренности

На КДПВ вы видите датчик со снятым кожухом. Видны три секции датчиков. На каждом — 4 кольца, 2х4 светодиода и столько же фотодиодов. Рассмотрим секцию поближе:

Фото со стороны светодиодов.
Считать передаточные числа у редукторов у меня не было интереса, поэтому пусть это останется за кадром.
Управляющие провода с разъема сразу идут на светодиоды. Цепи фотодиодов идут через вот эту плату:

На двух транзисторных сборках реализованы ловушки сигналов для A и B, а на ЛА3 — выходные каскады.

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

Управляющая программа для ПК

Задачей было оставить основной программный модуль на FORTRAN, а данные снимать не с ISA шины, как это было в программе раньше, а через USB Virtual-COM port. Драйвер COM-порта написан на C.
Вот здесь я подробно расписал о работе в Eclipse над таким проектом.
А для работы с виртуальным COM-портом я воспользовался библиотекой от Teunis van Beelen
Тестирующая программа запрашивает данные датчиков и выводит их на экран. Мы так и не выяснили, на каком этапе из истинного значения датчика стали вычитать единицу. То ли это было в эпоху префолент, то ли появилось позднее…

Код Баркера

Прошивка микроконтроллера с частотой 5кГц, смотрит, а не пришло ли ей что в UART, если пришло, считывает данные с датчика и возвращает два байта в порт. Для правильного считывания данных с энкодера используется код баркера. Он исключает ошибки граничных значений положения шторки, обеспечивая гарантию целостности данных.
Сам код Баркера прост как валенок.
точнее как два валенка
Он позволяет сформировать данные на 1 разряд больше, чем есть на датчике.
Самый младший разряд формируется искусственно, с помощью операции A XOR B.
Все последующие разряды формируются по простой логике:
if (data[current-1] == 1){
data[current] = read(B);
}
else{
data[current] = read(A);
}
или через тернарный оператор(хотя в ассемблере выглядит одинаково):
data[current] = data[current-1] == 1? read(B): read(A);

8 комментариев

avatar
Задачей было оставить основной программный модуль на FORTRAN,

А почему не на С. Очень много наработок, и люди больше использують С чем FORTRAN.
avatar
Потому что в техническом задании была прописана именно такая задача.
Задача была сделать драйвер на С, который можно было вызывать из программы на FORTRAN, которая уже была, давно работает и ее совершенно невозможно поддерживать (синтаксис f-77).
avatar
И где ты откопал этот почтенный датчик?
avatar
Совершенно точный, но совершенно бесполезный ответ на ваш вопрос — у заказчика.

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

И если Вам вдруг попадется современный абсолютный энкодер, в том числе на сдвиговом регистре на входе, алгоритм считывания будет аналогичен.
Комментарий отредактирован 2014-11-01 00:47:56 пользователем radiolok
avatar
И если Вам вдруг попадется современный абсолютный энкодер, в том числе на сдвиговом регистре на входе, алгоритм считывания будет аналогичен.
Нет, ты ошибаешься!
avatar
В интернете всегда кто-то неправ.

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

А если говорить о самом коде Баркера, то он вокруг нас где есть Wi-Fi.
avatar
Я так и не понял, чем этот «код Баркера» так хорош? Пишут, что он «даёт шумоподобный сигнал». Ну и что в этом полезного?
avatar
хорош он тем, что за счет смещения считывателей каналов на четверть сектора, гарантированно не будет случая, когда светодиод считываемого канала будет наполовину закрыт шторкой, и не понятно, это еще единица, или уже нуль.
т.е. код Баркера в таких граничных случаях позволяет однозначно считать данные.
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.