Pull to refresh

Открытый проект индуктивного абсолютного энкодера

Reading time 11 min
Views 29K

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

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

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

Когда говорят про индуктивный энкодер, то обычно представляют cебе такую конструкцию:

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

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

Микросхема LDC1101 содержит внутри осциллятор работающий на частоте в районе  0.5…10  МГц  с подключённым внешним LC контуром. Когда рядом с LC контуром появляется проводящий ток объект, частота контура меняется за счёт вносимой дополнительной индуктивности. Отклонение частоты контура измеряется микросхемой и записывается во внутренние регистры c 24-битным представлением. Оттуда это значение можно прочитать через интерфейс SPI.  Частота семплирования результатов измерений может достигать  150 тыс. отсчётов в секунду. Однако чем выше частота семплирования тем ниже точность измерения. Максимальное разрешение в 24 бита удаётся получить при частоте семплирования 15 тыс. семплов в секунду. При таком разрешении можно засечь микронные поперечные перемещения находящихся на сантиметровых дистанциях проводящих объектов. Но в нашем случае речь идёт о вращающемся объекте, и тут много неизвестных. Целью проекта было установить с какой угловой точностью и скоростью при ограничениях на размеры мы могли бы определять поворот.  

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

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

Схема платы энкодера
Схема платы энкодера

Модуль управляется микроконтроллером MKS22FN256VFT12 (120MHz, 256 КБ Flash, 64 КБ RAM ) Питание модуль получает от интерфейса USB(v 2.0 full speed) – 5 В  или от разъёма X1 - 3.3 В. Коммуникация с модулем осуществляется по интерфейсам:

  • CAN, разъем X2

  • SPI, разъем X1

  • I2C, разъем X1

  • USB, разъем X4

  • Отладочный интерфейс SWD, разъем X3

Перепрограммируется модуль через интерфейс SWD (X3) с помощью JTAG/SWD адаптера.

Плата энкодера

Вид верхнего слоя платы энкодера
Вид верхнего слоя платы энкодера

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

Сам расчёт индуктивности катушек производится с помощью таблиц Excel предоставляемых фирмой TI. В проекте это файл LDC_Tools-ext22.xlsx

Вот вид таблицы для расчётов:

Катушки индуктивности имеют следующие параметры

  • Количество витков в одном слое - 8

  • Количество слоёв - 4

  • Диаметр катушки - 5.2 мм

  • Ширина проводника в катушке - 0.102 мм

  • Расчётная индуктивность катушки - 2.729 мкГн

  • Ёмкость конденсаторов параллельных катушке - 200 пФ

  • Частота резонанса катушек без поднесённой цели - 6.75…6.77 МГц

А вот так выглядит катушка на 4-слойной плате:

Другой технологической особенностью является изготовление мишени для сенсора

В оригинальном апноуте представлена металлизация на плате в виде ромба по кругу.  

Ширина металлизации по радиусу не должна превышать диаметр катушек для сохранения линейности измерения.

Наша мишень получилась такая:

Разрабатывалась мишень в среде Altium Designer и для получения нужного контура металлизации использовался скрипт. Проект построителя мишени со скриптом находится в директории Target_builder. А выглядит процесс так:

Макет и испытания энкодера

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

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

Осциллограмма на катушке во время измерения индуктивности
Осциллограмма на катушке во время измерения индуктивности

Инициализация LDC1101 

В данном проекте используется режим измерения LHR – измерение индуктивности с высоким разрешением (24 бита) Время измерения в режиме LHR  задаётся уравнением:

Measurement Time (tCONV)= (RCOUNT[15:0] ˣ 16 + 55)/fCLKIN
RCOUNT = RCOUNT [15:8]×256 + RCOUNT [7:0]
Допустимый диапазон: 2 ≤ RCOUNT[15:0] ≤ 65535

Значение RCOUNT устанавливается через регистры: LHR_RCOUNT_LSB и LHR_RCOUNT_MSB. Для частоты измерений 2 кГц устанавливаем RCOUNT = 496 (0x1F0). Для оптимальной разрешающей способности сенсора в режиме LHR должно соблюдаться условие ƒCLKIN > 4*ƒsensor_max. Где ƒCLKIN частота тактирования LDC1101 (16 МГц в данном случае) , ƒsensor_max частота сенсора подаваема на измеритель. Для соблюдения этого условия назначаем коэффициент деления для  ƒsensor_max в регистре  LHR_CONFIG равный 2.

Типичная форма сигналов измерения индуктивности 4-я сенсорами при равномерном вращении мишени
Типичная форма сигналов измерения индуктивности 4-я сенсорами при равномерном вращении мишени

Как видно сигналы немного не синусоидальны, тем не менее после их сложения получается довольно равномерная пила

Способы калибровки и расчёт угла поворота

Калибровка заключается в снятии графиков индуктивности с 4-х катушек и вычислении на их основе констант нормирования, которые потом применяются для вычисления угла по текущим данным с датчиков.

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

Здесь показан скрипт для среды MATLAB демонстрирующий такой способ калибровки

% В рабочем пространстве должен быть загружен массив recdata с записью сигналов от
% 4-х датчиков во время как минимум одного полного поворота мишени и переменная st означающая период выборки сигналов

% Результатом работы скрипта является получение констант AX OX AY OY
% необходимых для вычисления угла и вывод графика угла поворота мишени 
% 

% Находим разностные значения с парных датчиков
X = recdata(1,:) - recdata(3,:); % Вычисляем сигнал X
Y = recdata(2,:) - recdata(4,:); % Вычисляем сигнал Y сдвинутый относительно X на 90 град

% Находим верхние пики  сигнала X
[pX_h] = findpeaks(X,'MinPeakDistance',100,'MinPeakProminence',10000);
% Находим нижние пики  сигнала X
[pX_l] = findpeaks(-X,'MinPeakDistance',100,'MinPeakProminence',10000);
pX_l = -pX_l; % Восстанавливаем знак 
AX = (pX_h(1)- pX_l(1))/2; % Амплитуда X
OX = (pX_h(1)+ pX_l(1))/2; % Смещение  X

% Находим верхние пики  сигнала Y
[pY_h] = findpeaks(Y,'MinPeakDistance',100,'MinPeakProminence',10000); % Указываем чтобы пики не были слишком близко друг от друга и слишком маленькими
% Находим нижние пики  сигнала B
[pY_l] = findpeaks(-Y,'MinPeakDistance',100,'MinPeakProminence',10000);
pY_l = -pY_l; % Восстанавливаем знак 
AY = (pY_h(1)- pY_l(1))/2; % Амплитуда Y
OY = (pY_h(1)+ pY_l(1))/2; % Смещение   Y

X = (X-OX)/AX; % Корректируем сигналы масштабированием и сдвигом
Y = (Y-OY)/AY;

% Готовим окно для вывода графиков
x_axis = linspace(0, st*(length(recdata)-1),length(recdata) ); 
scrsz = get(groot,'ScreenSize');
figure('OuterPosition',[1 50 scrsz(3) scrsz(4)-50]); % 

sbpl = subplot(2,1,1); %  divides the current figure into an m-by-n grid and creates an axes for a subplot in the position specified by p
plot(sbpl, x_axis, X, x_axis, Y); 
grid on;

A = atan(X./Y)*180/pi+90;
A = A + (Y>0).*180;
sbpl = subplot(2,1,2);
plot(sbpl, x_axis, A); 
grid on;

% Дополнительно проверим в каких границах находится полученный угол
[pA_h] = findpeaks(A,'MinPeakDistance',10,'MinPeakProminence',10);
[pA_l] = findpeaks(-A,'MinPeakDistance',10,'MinPeakProminence',10);
pA_l = -pA_l; % Восстанавливаем знак
% Вычищаем рабочее пространство от лишних переменных 
clear x_axis scrsz sbpl pX_h pX_l pY_h pY_l  
Результат выполнения скрипта в MATLAB
Результат выполнения скрипта в MATLAB

Шумы и другие факторы

График статического шума при измерении угла устройством при частоте семплирования 2 Кгц
График статического шума при измерении угла устройством при частоте семплирования 2 Кгц

Измерения статического шума показали, что при  измерение угла при частоте семплирования 2 кГц отсутствует шум  в показаниях до 11 бит,  а  при частоте семплирования 1 кГц до 12 бит.

Влияние температуры

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

Температура

Угол

-15

114

30

113

50

112.5

Измерения показали, что в диапазоне изменения температуры от -20 до +50 град. С измеренное значение угла меняется на 2 град. На плате модуля для компенсации влияния температуры установлен термистор. Сенсоры сохраняли работоспособность при температуре -30 град. С.

Влияние изменения зазора между мишенью и сенсорами на точность измерения угла

График влияния изменения дистанции от сенсоров до цели. Дистанция менялась на 0.1 мм и меньше. Минимум меди цели был над сенсором 4
График влияния изменения дистанции от сенсоров до цели. Дистанция менялась на 0.1 мм и меньше. Минимум меди цели был над сенсором 4

График показывает, что изменение уровня сигналов на сенсорах на 2% приводит к изменению значения угла на 0.1% , т.е. схема измерения компенсирует влияние изменения зазора на точность измерений. Более точную характеристику влияния зазора получить не удалось поскольку механическая конструкция для тестирования не была оснащена инструментами для измерения малых приращений дистанции. Общий вывод таков: сенсор очень чувствителен к неравномерному изменению зазора между мишенью и 4-ми катушками сенсора. Лучшая компенсация достигается, когда зазор одинаково меняется от мишени до всех катушек.

Влияние внешнего магнитного поля.

При поднесении магнита на близкое расстояние к катушкам их показания не менялись. Вывод: магнитное поле не влияет на сенсоры.

Программное обеспечение

Программное обеспечение (ПО) модуля написано с использованием операционной системы реального времени uCOS-III. Компилируется проект ПО в среде IAR embedded workbench for ARM. Файл рабочего пространства проекта называется AngleSens.eww и находится в директории IAR_proj .

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

Подключение к терминалу VT100 модуля служит для наблюдения и управления в реальном времени содержимым всех регистров 4-х микросхем сенсоров LDC1101. Параметры связи при подключении к порту (скорость, чётность и т.д.) могут быть произвольными. Если компьютер с более ранними версиями Windows (8, 7, XP ...) не находит драйвера виртуальных портов автоматически, то можно использовать файл fsl_ucwxp.inf из директории проекта для ручной установки драйверов.

Сервис FreeMaster в микроконтроллере даёт возможность подключиться к нему через специализированную программу FreeMaster выполняющуюся на  компьютере. Эта программа позволяет в удобной форме выводить графики сигналов и значения переменных из микроконтроллера в реальном времени, выдавать команды в микроконтроллер и экспортировать данные в Matlab для последующего анализа. Связь осуществляется через USB посредством виртуального COM порта.   В программе FreeMaster все выполненные в ней настройки графиков и панелей с наблюдаемыми переменными сохраняются в файлы проектов c расширением .pmp. Для данного проекта был разработан демонстрационный проект с сохранен в файле FreeMaster_ANSIN.pmp   

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

Из окна программы FreeMaster (Application Commands) также можно отправить команды модулю. Реализованы следующие:

  • Update_registers - записывает в регистры всех 4-х микросхем сенсоров данные из массива LDC1101_regs[0..3]. Ячейки этого массива доступны для прямого редактирования во FreeMаster. И данная команда переносит их значения непосредственно в регистры микросхем.

  • Save_settings -   сохраняет калибровочные константы из структуры cdata во внутреннюю Flash память микроконтроллера модуля. Поля структуры cdata доступны для редактирования во FreeMaster но, чтобы отредактированные данные сохранить надо выполнить эту команду.   

  • Reset - программный сброс модуля.

Процесс калибровки модуля

В микроконтроллере калибровочные константы хранятся в структуре cdata.

Чтобы установить в микроконтроллере правильные калибровочные константы следует выполнить следующие шаги.

Открыть программу FreeMaster, и выполнить действия как указано ниже. Через меню Tools -> Connection Wizard вызвать диалог опций подключения. Выбрать опцию как на скриншоте.


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


В левой панели программы с названием Project Tree выбрать пункт Calibrating_parameters. В нижней панели отобразятся текущие параметры калибровки:

  • cdata.ax - амплитуда сигнала X cdata.ox - смещение сигнала X

  • cdata.ay - амплитуда сигнала Y

  • cdata.oy - смещение сигнала Y

  • cdata.offset - смещение измерительного тракта, служит для настройки максимального размаха сигналов в регистрах LHR

  • cdata.rcount - задает внутреннюю частоту выборки сенсоров LDC1101

На этом этапе регулируем cdata.offset и cdata.rcount чтобы добиться установить нужную частоту выборки и размах сигналов. Мишень при этом должна равномерно вращаться.


Переходим на пункт LHR Samples в панели Project Tree. Мишень вращается. Нажимаем кнопку Run. Спустя десяток секунд Stop. Появляется запись сигналов как на скриншоте.


Включаем Matlab и запускаем в нем скрипт Import_from_FreeMaster_Util.m (находится в директории проекта Matlab). Окно FreeMaster должно при этом оставаться открытым и без изменений. В результате выполнения скрипта появится график с данными перенесёнными из окна FreeMaster.


Запустить в Matlab скрипт Calculation of calibration constants.m  (находится в директории проекта Matlab). В результате выполнения скрипта появится график с преобразованными сигналами и графиком угла поворота. Одновременно с этим в рабочем пространстве Matlab появится калибровочные константы: AX, OX, AY, OY. Их надо перенести в переменные cdata.ax ,cdata.ox,cdata.ay,cdata.oy соответственно и выполнить команду Save_settings в нижней левой панели окна FreeMaster с названием Application Commands. Это приведет к сохранению констант во Flash памяти модуля.

Протокол обмена с хост контроллером по шине SPI

Кроме связи с компьютером ПО модуля способно выдавать данные через интерфейс SPI на внешний управляющий контроллер - хост. Ниже дано описание протокола.  При подключении хоста к модулю следует установит режим SPI как показано на рисунке ниже

SPI интерфейс модуля работает в режиме слэйва. Хост микроконтроллер работает в режиме мастера. Частота тактирования SPI не более 10МГц. Модуль отдаёт хосту измеренную величину угла в формате float point состоящим из 4-х байт младшим байтом вперёд. Внутренняя частота обновления значения угла в модуле чуть выше 2 КГц.

Протокол обмена по SPI
Протокол обмена по SPI

Обмен начинается с установки модулем сигнала лог.1 на лини READY.
Хост читает блок данных фиксированной длины равной 6-и байтам. Блок данных содержит текущее значение угла, измеренного модулем.   Поле ID = 0.
После того как 6-ть байт будут прочитаны хостом модуль готовится к приёму 6-и байт от хоста и снимает сигнал READY. После снятия сигнала READY хост может в течении 500 мкс (чтобы выдержать частоту семплирования 2 КГц) выдать пакет из 6-и байт модулю, который модуль прочитает и выполнит с данными какие-либо действия. Пакет, например, может содержать команду модулю для начала обмена служебной информацией (это требует реализации). Если хост не выдал пакета команды, то модуль продолжает каждые 500 мкс (или другое предварительно согласованное время) выдавать сигнал READY. Сигнал READY не снимается пока хост не прочитает 6-ть байт из модуля.  

Итог

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

Весь проект находится здесь

Tags:
Hubs:
+125
Comments 122
Comments Comments 122

Articles