В этом примере показано, как получить данные углового положения с помощью инкрементного роторного кодера и многофункционального устройства сбора данных (DAQ) с функцией измерения квадратурного кодера Data Acquisition Toolbox.
Инкрементный поворотный кодер обычно устанавливают на валу механической системы, такой как ветряная турбина или манипулятор робота, для обеспечения информации о движении или положении. Кодер выдает два квадратурных сигнала, которые обеспечивают информацию об относительном изменении положения и направлении вращения. Подсистема счетчика устройства DAQ использует сигналы, выдаваемые кодером, для вычисления изменения положения и отслеживания самого последнего значения положения. В MATLAB входной канал с Position тип измерения используется для считывания значений положения.
В этом примере используются оптический кодер вала (US Digital H6-2500-IE-S) и многофункциональное устройство DAQ (NI USB-6255) с каналами счетчика, которые имеют возможность квадратурного кодера.
Создание объекта сбора данных и добавление входного канала с помощью Position тип измерения.
s = daq('ni'); ch1 = addinput(s, 'Dev1', 'ctr0', 'Position');
Вращающийся квадратурный кодер выдает два квадратурных сигнала, А и В, которые обеспечивают информацию об относительном изменении положения и направлении вращения. При необходимости некоторые модели также выдают индекс или опорный сигнал Z, который активен один раз за оборот. Можно использовать сигнал Z для сброса положения счетчика до известного опорного значения.
Подключите выходные сигналы A, B и Z устройства кодирования к соответствующим входным клеммам DAQ, указанным в спецификации устройства DAQ (PFI8, PFI10 и PFI9 для NI USB-6255). Правильные клеммы зависят от модели устройства и используемого канала счетчика и могут быть перечислены путем считывания следующих свойств:
ch1.TerminalA
ans =
'PFI8'
ch1.TerminalB
ans =
'PFI10'
ch1.TerminalZ
ans =
'PFI9'
Настройте тип кодирования квадратурного цикла (X1, X2 или X4). Это соответствует количеству счетчиков (приращения или уменьшения значения счетчика), выводимых кодером для каждого квадратурного цикла (1, 2 или 4.), как указано в таблице данных кодера.
ch1.EncoderType = 'X1';
Аппаратные средства счетчика устройств DAQ отслеживают относительные изменения положения, передаваемые кодером. Использовать read для считывания обновленной позиции из входного канала счетчика.
encoderPosition = read(s, 1, 'OutputFormat', 'Matrix')
encoderPosition =
0
В этом примере используется модель оптического кодера с разрешением 2500 квадратурных циклов на оборот вала, как указано в спецификации кодера.
Преобразуйте значения счетчиков в угловое положение (в градусах), используя разрешение кодировщика и тип кодирования («X1» в данном случае).
encoderCPR = 2500; encoderPositionDeg = encoderPosition * 360/encoderCPR
encoderPositionDeg =
0
Для приложений, где требуется высокое разрешение по времени, сбор данных должен быть аппаратно синхронизирован (синхронизирован). В качестве доказательства концепции этот пример характеризует движение качающегося маятника измерением его углового положения по времени.
Чтобы получить аппаратно-синхронизированные данные от входного канала счетчика, устройства NI DAQ требуют использования внешнего синхросигнала или использования синхросигнала от другой подсистемы.
Добавьте аналоговый входной канал к объекту сбора данных для автоматического совместного использования часов сканирования этой системы.
addinput(s, 'Dev1', 'ai0', 'Voltage');
Настройте скорость сбора данных (выборки/с) и продолжительность сбора данных в секундах.
s.Rate = 10000; daqDuration = seconds(35);
Получение данных на переднем плане.
[positionData, timestamps] = read(s, daqDuration, 'OutputFormat', 'Matrix');
По умолчанию показания положения счетчика являются целочисленными значениями без знака. Каналы счетчика устройства DAQ, используемые в этом примере, являются 32-разрядными, поэтому любое считанное значение счетчика будет находиться в диапазоне от 0 до 2 ^ 32-1. В зависимости от приложения, вы можете захотеть получить значения позиции со знаком (положительные или отрицательные), так как уменьшение значения счетчика после нуля является прерывистым переходом к 2 ^ 32-1.
Для 32-разрядных каналов счетчиков используйте 2 ^ 31 в качестве порогового значения счетчика для преобразования в значения позиции со знаком. Результат допустим, если фактическое значение позиции находится в диапазоне от -2 ^ 31 + 1 до 2 ^ 31.
counterNBits = 32; signedThreshold = 2^(counterNBits-1); signedData = positionData(:,1); signedData(signedData > signedThreshold) = signedData(signedData > signedThreshold) - 2^counterNBits;
Вычислите данные положения кодера в градусах.
positionDataDeg = signedData * 360/encoderCPR;
Постройте график данных углового положения со знаком, полученных для колебательного движения маятника.
figure plot(timestamps, positionDataDeg); xlabel('Time (s)'); ylabel('Angular position (deg.)');

Квадратурные сигналы A и B, выдаваемые инкрементными роторными кодерами, обеспечивают только относительную информацию положения (направление движения и изменения положения). Необязательный опорный сигнал Z представляет собой один импульсный выход, один раз за оборот вала кодера в заранее определенном абсолютном положении. Привязка значения относительного положения к известному эталону абсолютного положения позволяет инкрементному роторному кодеру функционировать как псевдотолюстному кодеру положения. Это полезно для точного позиционирования (например, промышленной автоматизации, робототехники, солнечного слежения, радиолокационной антенны или телескопического позиционирования).
Для инкрементных роторных кодеров, которые обеспечивают выход Z-индексного сигнала, значение положения счетчика может быть сконфигурировано для автоматического сброса до известного опорного значения.
Установите ZResetEnable и ZResetCondition свойства.
ch1.ZResetEnable = true;
Сконфигурируйте ZResetCondition, который основан на фазовых сигналах А и В.
ch1.ZResetCondition = 'BothLow';
Укажите абсолютное значение опорной позиции ZResetValue для которого будет сброшено значение счетчика.
ch1.ZResetValue = 0;
Получите и постройте график набора аппаратных данных положения счетчика, чтобы показать, как можно использовать сигнал индекса Z кодера для автоматического сброса значения счетчика на известное опорное значение.
[positionData2, timestamps2] = read(s, daqDuration, 'OutputFormat', 'matrix'); figure plot(timestamps2, positionData2(:,1)); xlabel('Time (s)'); ylabel('Counter value for quadrature encoder (counts)');

Полученные данные о положении соответствуют вращающемуся валу кодера, который непрерывно вращается. Обратите внимание, что перед первым сбросом значения счетчика значение положения не ссылается на абсолютное положение, тогда как другие события сброса счетчика происходят, когда значение счетчика равно 2500 (значение CPR кодера).