Этот пример показывает, как получить данные углового положения с помощью инкрементного вращательного энкодера и устройства сбора многофункциональных данных (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');
Вращающийся квадратурный энкодер выводит два квадратурных сигнала, A и B, которые обеспечивают информацию об относительном изменении положения и направлении вращения. Опционально, некоторые модели также выводят индекс или опорный сигнал, 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
, который основан на сигналах A и B фазы.
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 энкодера).