Этот пример показывает, как получить данные об угловом положении с помощью инкрементного углового кодера и многофункционального сбора данных (DAQ) устройство с квадратурной функциональностью измерения энкодера Data Acquisition Toolbox.
Инкрементный угловой кодер обычно монтируется на вале механической системы, такой как ветряной двигатель или роботизированная рука, чтобы обеспечить движение или информацию о положении. Выходные параметры энкодера два квадратурных сигнала, которые предоставляют информацию об относительном изменении в положении и направлении вращения. Встречная подсистема устройства DAQ использует сигналы, выведенные энкодером, чтобы вычислить изменение в положении и отслеживать новое значение положения. В MATLAB встречный входной канал используется, чтобы считать значения положения.
Этот пример использует оптический энкодер вала (США Цифровой H6 2500-IE S) и многофункциональное устройство DAQ (NI USB-6255) со встречными каналами, которые имеют квадратурную возможность энкодера.
Создайте сеанс для ni
и добавьте встречный входной канал для типа измерения Position
.
s = daq.createSession('ni'); ch1 = addCounterInputChannel(s, 'Dev1', 0, 'Position')
ch1 = Data acquisition counter input position channel 'ctr0' on device 'Dev1': EncoderType: X1 ZResetEnable: 0 ZResetValue: 0 ZResetCondition: BothHigh TerminalA: 'PFI8' TerminalB: 'PFI10' TerminalZ: 'PFI9' Name: '' ID: 'ctr0' Device: [1x1 daq.ni.DeviceInfo] MeasurementType: 'Position'
Ротационные квадратурные выходные параметры энкодера два квадратурных сигнала, A и B, которые предоставляют информацию об относительном изменении в положении и направлении вращения. Опционально, некоторые модели также выводят индекс или ссылочный сигнал, Z, который активен однажды на оборот. Можно использовать это, чтобы сбросить встречное положение к известному ссылочному значению.
Соедините A, B, и Z сигнализируют о выходных параметрах к соответствующим входным терминалам, заданным таблицей данных устройства DAQ (PFI8, PFI10 и PFI9 для NI USB-6255).
ch1.TerminalA ch1.TerminalB ch1.TerminalZ
ans = PFI8 ans = PFI10 ans = PFI9
Сконфигурируйте квадратурный тип кодировки цикла (X1, X2 или X4). Это соответствует количеству количеств (встречный шаг значения или декременты) для каждого квадратурного цикла (1, 2, или 4.)
ch1.EncoderType = 'X1';
Оборудование счетчика устройства DAQ отслеживает относительные изменения положения, сообщенные энкодером. Используйте inputSingleScan
, чтобы считать обновленное положение из встречного входного канала.
encoderPosition = inputSingleScan(s)
encoderPosition = 0
Этот пример использует оптическую модель энкодера с разрешением 2 500 квадратурных циклов на оборот вала, как задано в таблице данных энкодера.
Преобразуйте встречные значения в угловое положение (в градусах) с помощью разрешения датчика и типа кодировки ('X1' в этом случае).
encoderCPR = 2500; encoderPositionDeg = encoderPosition * 360/encoderCPR
encoderPositionDeg = 0
Для приложений, где пора-разрешение требуется, сбор данных должен быть синхронизирован оборудованием (синхронизированный). Как подтверждение концепции, этот пример характеризует движение качающегося маятника путем измерения его углового положения по сравнению со временем.
Чтобы получить синхронизированные оборудованием данные из встречного входного канала, устройства NI требуют использования внешнего таймера или использования часов от другой подсистемы.
Добавьте канал аналогового входа в сеанс, чтобы автоматически совместно использовать часы сканирования этой системы.
addAnalogInputChannel(s, 'Dev1', 0, 'Voltage');
Сконфигурируйте уровень приобретения (samples/s) и длительность приобретения в секундах.
s.Rate = 10000; s.DurationInSeconds = 35;
Получите данные на переднем плане.
[positionData, timestamps] = startForeground(s);
По умолчанию встречные показания положения являются значениями беззнаковых целых чисел. Встречные каналы устройства 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. Возможные значения:
'BothLow'
'BothHigh'
'AHigh'
'BHigh'
ch1.ZResetCondition = 'BothLow';
Задайте значение положения абсолютной ссылки ZResetValue
, к которому будет сброшено встречное значение.
ch1.ZResetValue = 0;
Получите и постройте набор синхронизированных оборудованием встречных данных о положении, чтобы показать, как можно использовать энкодер Z индексный сигнал автоматически сбросить встречное значение к известному ссылочному значению.
[positionData2, timestamps2] = startForeground(s); figure; plot(timestamps2, positionData2(:,1)); xlabel('Time (s)'); ylabel('Counter value for quadrature encoder (counts)');
Полученные данные о положении соответствуют валу углового кодера, который вращается постоянно. Заметьте, как перед первым разом встречное значение сбрасывается, на значение положения не ссылаются к абсолютной позиции, тогда как другие события сброса счетчика имеют место, когда встречное значение 2500 (энкодер значение CPR).