Считывание данных с абсолютных энкодеров с помощью кода Баркера
Ранее я уже рассказывал о том, как работать с энкодером и увеличивать в 4 раза поличество отсчетов на оборот. Но то был инкрементальный энкодер. Его задача — на каждый сдвиг изменять сигнал на выходе.
Задача абсолютных энкодеров — выдавать непосредственное значение угла поворота, пусть и в своих единицах.
На рисунке представлен 12-разрядный абсолютный энкодер мелкосерийного советского производства. В документации он значится преобразователь угол-код.
Он питается от 5В, имеет 12 разрядных входов и 2 выхода — A и B.
Внутри имеется по два светодиода на разрядный вход (соответственно на A и B), фотодиоды и небольшая схемка формирования сигналов выходного каскада. Выход — на базе активного выхода микросхемы К133ЛА3 через резистор 68 Ом.
Эти знания пригодились для создания цепей согласования.
В роли микроконтроллера MSP430F2232.
Выходной каскад на базе массива дарлингтонов ULN2803.
Фото со стороны светодиодов.
Считать передаточные числа у редукторов у меня не было интереса, поэтому пусть это останется за кадром.
Управляющие провода с разъема сразу идут на светодиоды. Цепи фотодиодов идут через вот эту плату:
На двух транзисторных сборках реализованы ловушки сигналов для A и B, а на ЛА3 — выходные каскады.
К сожалению, конкретно этот датчик неисправен — он ранее разбирался, секции створок были сдвинуты друг относительно друга и все биты перемешались. Слабо представляю, как его выставить вновь.
Вот здесь я подробно расписал о работе в Eclipse над таким проектом.
А для работы с виртуальным COM-портом я воспользовался библиотекой от Teunis van Beelen
Тестирующая программа запрашивает данные датчиков и выводит их на экран. Мы так и не выяснили, на каком этапе из истинного значения датчика стали вычитать единицу. То ли это было в эпоху префолент, то ли появилось позднее…
Сам код Баркера прост как валенок.
Он позволяет сформировать данные на 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);
Задача абсолютных энкодеров — выдавать непосредственное значение угла поворота, пусть и в своих единицах.
На рисунке представлен 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 комментариев
А почему не на С. Очень много наработок, и люди больше использують С чем FORTRAN.
Задача была сделать драйвер на С, который можно было вызывать из программы на FORTRAN, которая уже была, давно работает и ее совершенно невозможно поддерживать (синтаксис f-77).
На основании некоторых ключевых слов в статье можно предположить, что была задача модернизировать что-то очень старое, но очень нужное. Если присмотреться в видео, то это что-то трехкоординатное, с двумя датчиками по X и по Y.
И если Вам вдруг попадется современный абсолютный энкодер, в том числе на сдвиговом регистре на входе, алгоритм считывания будет аналогичен.
Имелись в виду современные абсолютные энкодеры с аналогичным интерфейсом, коие есть, но гораздо проще найти абсолютный энкодер с профибасом или промэзернетом на выходе.
А если говорить о самом коде Баркера, то он вокруг нас где есть Wi-Fi.
т.е. код Баркера в таких граничных случаях позволяет однозначно считать данные.