В этом примере показано, как получить данные об угловом положении с помощью инкрементного углового кодера и многофункционального сбора данных (DAQ) устройство с квадратурной функциональностью измерения энкодера Data Acquisition Toolbox.
Инкрементный угловой кодер обычно монтируется на вале механической системы, такой как ветряной двигатель или роботизированная рука, чтобы обеспечить движение или информацию о положении. Выходные параметры энкодера два квадратурных сигнала, которые предоставляют информацию об относительном изменении в положении и направлении вращения. Встречная подсистема устройства DAQ использует сигналы, выведенные энкодером, чтобы вычислить изменение в положении и отслеживать новое значение положения. В MATLAB, входном канале с Position
тип измерения используется, чтобы считать значения положения.
Этот пример использует оптический энкодер вала (США Цифровой 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
Этот пример использует оптическую модель энкодера с разрешением 2 500 квадратурных циклов на оборот вала, как задано в таблице данных энкодера.
Преобразуйте встречные значения в угловое положение (в градусах) с помощью разрешения датчика и типа кодировки ('X1' в этом случае).
encoderCPR = 2500; encoderPositionDeg = encoderPosition * 360/encoderCPR
encoderPositionDeg = 0
Для приложений, где пора-разрешение требуется, сбор данных должен быть синхронизирован оборудованием (синхронизированный). Как подтверждение концепции, этот пример характеризует движение качающегося маятника путем измерения его углового положения по сравнению со временем.
Чтобы получить синхронизированные оборудованием данные из встречного входного канала, устройства DAQ NI требуют использования внешнего таймера или использования часов от другой подсистемы.
Добавьте канал аналогового входа в объект сбора данных автоматически совместно использовать часы скана этой системы.
addinput(s, 'Dev1', 'ai0', 'Voltage');
Сконфигурируйте уровень приобретения (samples/s) и длительность приобретения в секундах.
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).