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

image
Однажды ко мне попал линейный энкодер ПЛФ-3 и мне захотелось подключить его к микроконтроллеру. Однако, как оказалось, дело это не самое простое. Какие именно проблемы возникли при этом, и как они были решены — читайте далее.

ПЛФ-3 — линейный инкрементальный энкодер. Его назначение — измерять относительные перемещения частей приборов. Обеспечиваемая точность может быть очень высокой — до долей мкм. Принцип работы такого энкодера довольно прост — есть стеклянная «линейка» (1) с нанесенными на нее штрихами, относительно которой перемещается каретка, на которой закреплены источник света (3), оптическая система (2,4) и набор фотодиодов. Оптическая система и фотодиоды сгруппированы в пары, так чтобы на их выходе формировались квадратурные сигналы (со сдвигом в 90 градусов). За счет этого можно определять направление движения энкодера.

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

Судьба энкодера, попавшего ко мне, была нелегкой. Изначально он входил в состав микроскопа ИМЦЛ150х50Б, который стоял в нашем институте. Микроскоп был никому не нужен, и в его списали вместе с кучей других приборов. Тащить их на задний двор никому не хотелось, и все приборы просто выкинули в окно (высота там около 10 метров). Уже после этого я заметил разбитый микроскоп, и снял с него два энкодера. Как ни странно, в обоих энкодерах стеклянные линейки остались целыми, но каретки были довольно сильно повреждены, хотя позже удалось привести их в более приличное состояние.
Внешний вид каретки:

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

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

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

Фото конструкции:

В качестве ОУ используется LM358. На еще одной LM358 собрал простейший компаратор на два канала. Таким образом, я получил два цифровых квадратурных сигнала. Для эксперимента я подал их на Arduino, с подключенной библиотекой, предназначенной для работы с быстрыми энкодерами. Тут-то и вылезли проблемы.
Как оказалось, по каким-то причинам средний уровень сигнала в каждом из каналов сильно «плавает» — на величину, чуть ли не большую амплитуды сигнала. Понятно, что при таких условиях компаратор нормально работать не будет. Положение среднего уровня зависело от абсолютного положения каретки энкодера, так что проблема была явно связана с ним самим. Была еще одна проблема — насколько я понял, разность фаз сигналов в каналах была не 90 градусов. В некоторых случаях она доходила до 120 градусов, из-за чего фронты сигналов оказывались слишком близко друг от друга. В результате при попытке двигать энкодер в счетчике Arduino постоянно накапливалась ошибка, и довольно большая.
Поэтому я решил пойти по более необычному пути — обрабатывать аналоговые сигналы на STM32F4-DISCOVERY. Для проверки работы алгоритмов я записал сигналы с энкодера при помощи USB-осциллографа, а потом обрабатывал их в самописной программе на ПК.
Пример проблемного участка сигнала:

Толстая синяя линия — средний уровень сигнала. Алгоритм в данном случае выполняет роль компаратора с определенным уровнем гистерезиса — его выходные сигналы тоже выведены на график. Выборки в каналах ведутся одновременно — они отмечены черными точками. На графике красным отмечен участок, показывающий пересечение фронтов компаратора. Очевидно, что в нормальных квадратурных сигналах фронты пересекаться не должны. При сдвиге фаз аналоговые сигналы должны пересекаться на уровне 0.7 от амплитуды сигнала. Здесь, как видно, они могут пересекаются при меньших значениях.

Для того, чтобы скомпенсировать вышеупомянутые эффекты, пришлось написать специальный алгоритм, который с минимальной задержкой вычисляет текущую величину среднего уровня в каждом из каналов, которая потом используется для работы программного компаратора. По данным от компараторов определяется наличие движения и его направление. В случае обнаружения вышеупомянутых «пересечений фронтов» счетчик энкодера уменьшается или увеличивается на 2, в зависимости от предыдущего направления движения.
Контроллер захватывает аналоговые сигналы при помощи сразу двух АЦП, работающих одновременно, причем скорость выборок приходится делать очень высокой — более 300 ksps. Один АЦП генерирует прерывания, из обработчика которых вызывается вышеупомянутый алгоритм. Из-за высокой частоты прерываний и достаточно длинного алгоритма загрузка контроллера получается довольно высокой.
Результат измерений переводится в микроны и выводится на ЖКИ от кассового аппарата Штрих-М.

У энкодера ПЛФ-3 шаг штрихов линейки составляет 20 мкм. С учетом того, что энкодер формирует квадратурные сигналы, дискретность измеряемого расстояния после «компаратора» составляет 5 мкм. Так как сигнал на выходе датчика аналоговый, то можно повысить точность измерений, вычисляя арктангенс отношения сигнала в каналах (с учетом величины среднего уровня в каждом из каналов). Так как вычислять atan с частотой 300кгц на контроллере проблематично, а результат измерений просто отображается на экране, то я вычисляю atan для перед выводом на индикатор. Для более высокой точности нужно было бы дополнительно нормировать сигналы в каналах, но я не стал это реализовывать. В своей программе я ограничил дискретность 1 мкм — с использованным энкодером получить даже такую точность кажется не совсем реально.
Видео работы:

Исходники: github.com/iliasam/stm32_linear_encoder
  • +3
  • 22 ноября 2015, 17:04
  • citizen

Комментарии (9)

RSS свернуть / развернуть
Оу… имел дело с энкодерами ПДФ… уж больно они к питанию требовательны… если память не дает сбоев: там ток нужно 1 А обеспечить и напругу 24 В, а на деле как минимум надо источник с током ампера два.
Может и тут та же проблема с нулем?
0
Как я уже писал, в моем энкодере ничего, кроме фотодиодов и лампочки, не было.
0
понял, да — тут источник не при чем… а если подтягивающие резисторы добавить?
0
Тащить их на задний двор никому не хотелось, и все приборы просто выкинули в окно (высота там около 10 метров).
институты такие институты))))
0
Вот это тоже меня просто убило. Ну не нужен тебе микроскоп, но нахера его ломать тогда? Причём это исключительно от злобной тупости. Поставь на авито за бутылку с самовывозом — и тебе бутылка, и институту пустое помещение, и микроскопу новый дом. Пещерные люди, мать их.
+1
Кстати, новый микроскоп стоит около 380 круб. Даже совсем поломанный думаю за десятку бы ушел…
0
Зачем использовать микролампочку, когда её можно заменить на светодиод? Сформировать пучок света тоже не проблема. Древние фотодиоды скорее всего заваливают фронты импульсов.
0
Я пробовал установить светодиод, но при этом сигнала с фотодиодов практически не было — судя по всему, оптическая схема рассчитана именно на лампочку.
Все проблемы с плохим сигналом у конкретного энкодера были явно связаны с повреждениями механики и самой линейки — они проявлялись при определенных положениях каретки.
0
Я и говорю — фотодиоды древние. Если чисто попрактиковаться в написании алгоритма обработки нелинейно изменяющихся сигналов — могу понять.
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.