Российский производитель и разработчик сертифицированного измерительного оборудования с 1987 года


E14-140 синхронизация с АЦП

Вы не вошли.

 Поиск | Регистрация | Вход 

АлексейЛ
09.12.2015 14:20:46
#1

Гость

E14-140 синхронизация с АЦП

Здравствуйте.
Вопрос по плате E14-140MD. Не могли бы Вы привести пример кода на Delphi для случая, когда требуется режим работы ЦАП, синхронизированный с АЦП. Т.е. требуется перед каждым измерением выставлять значения на обоих каналах ЦАП, и затем производить измерения с нескольких каналов АЦП. К сожалению, в примерах отсутствует данный случай, а без примера кода не получилось написать рабочий вариант. Интересует конкретно, какие параметры ЦАП и АЦП необходимо установить, какого размера массив данных можно вводить в ЦАП и читать с АЦП, и как правильно составить запрос на чтение?

09.12.2015 15:00:32
#2

Инженер-электронщик
Откуда: "Л Кард"
Здесь с 21.04.2014
Сообщений: 4,597

Re: E14-140 синхронизация с АЦП

Здравствуйте.
Я полагаю, что перед тем как программировать, нужно сначала понять возможно ли это, с функциональной точки зрения.
В частности,   "режим работы ЦАП, синхронизированный с АЦП" возможен только для потокового режима АЦП и ЦАП (синхронный ввод-вывод). Но если это -  потоки на верхнем программном уровне, то невозможно "перед каждым измерением выставлять значения на обоих каналах ЦАП"...
Алексей, опишите подробнее Вашу задачу во времени (какие временные интервалы и временные задержки важны для этой задачи)

АлексейЛ
09.12.2015 15:30:50
#3

Гость

Re: E14-140 синхронизация с АЦП

В данном случае речь идет о физическом эксперименте, где каналы ЦАП задают внешнее воздействие на исследуемый объект (двигают электронный пучок по двум координатам), а АЦП измеряет полезные сигналы с нескольких каналов в каждой точке. Соответственно, в результате необходимо получить массив измеренных данных для каждой пары значений, выставляемых на каналы ЦАП. Работать предполагалось на минимальных частотах платы (этого вроде должно быть достаточно в плане скорости измерений, при этом это не должно влиять за физические процессы, происходящие в образце), правда возникла проблема в том, что минимальная частота работы ЦАП намного больше, чем минимальная частота работы АЦП. Потоковый режим удовлетворяет нашим требованиям, т.к. обработка данных осуществляется уже после завершения измерений.

09.12.2015 20:00:37
#4

Сотрудник "Л Кард"
Здесь с 24.04.2014
Сообщений: 1,519

Re: E14-140 синхронизация с АЦП

Если Вы используете библиотеку Lusbapi, то попробуйте  воспользоваться функциями не потокового, а однократного ввода и вывода данных: ADC_KADR() и DAC_SAMPLE(). Сначала с помощью DAC_SAMPLE() устанавливаете требуемый уровень сигнала на обоих каналах ЦАП, а затем используйте ADC_KADR() для считывания кадра данных с нужных каналов АЦП. Оценочное время выполнения этого алгоритма будет ~80мс. Если нужно - могу выслать консольный пример реализации данного алгоритма.

АлексейЛ
10.12.2015 00:42:35
#5

Гость

Re: E14-140 синхронизация с АЦП

Данная система была ранее нами реализована с помощью функций DAC_SAMPLE() и ADC_SAMPLE(). Время выполнения было 120 мс. Но это слишком медленно в нашем понимании. Т.е. в таком случае на сканирование 100 точек уходило 10 секунд. И это даже без накопления сигнала. А потом пришел человек, который делал подобные измерения 20 лет назад на непойми каком АЦП и сказал, что у него 1000 точек с накоплением раз 200 в каждой точке измерялось за несколько секунд и что мы со своими 10 сек на 100 точек попросту теряем время. Вот мы и решили попробовать за счет потокового ввода/вывода данных ускорить схему. Вопрос, насколько это возможно? И сильно ли изменит ситуацию использование ADC_KADR() вместо ADC_SAMPLE()?

10.12.2015 08:19:31
#6

Инженер-электронщик
Откуда: "Л Кард"
Здесь с 21.04.2014
Сообщений: 4,597

Re: E14-140 синхронизация с АЦП

Алексей, асинхронные операции - медленные, поскольку они проходят по каналу Control Pipe USB. Синхронные потоковые операции  быстрее, поскольку они проходят по каналу Bulk USB, но эти операции сильно буферизированы (с большой задержкой буферизации). Читайте:
http://www.lcard.ru/support/faq/realtime_on_pc
Чтобы real-time задача работала быстрее на уровне ПК, нужно либо применять АЦП с внутренним интерфейсом ПК (ISA, PCI, PCI Express), где меньше задержка буферизации,  либо выносить Real-time задачу  на уровне встроенного процессора:
http://www.lcard.ru/support/faq/devices_for_real_time, например,
перейти на E14-440 и заняться низкоуровневым программированием Blackfin...  (Возможность программировать пользователем процессор AT91SAM7S256 в E14-140М проблематична по нескольким причинам).

АлексейЛ
10.12.2015 13:14:40
#7

Гость

Re: E14-140 синхронизация с АЦП

А потоковый режим АЦП и ЦАП разве не подходит? Мне ведь не нужно каждый отсчет в отдельности обрабатывать. Мне нужно получить все отчеты, когда уже измерения закончены. Чтобы не обращаться к плате через USB за каждым отсчетом. Или запуск ЦАП, синхронизированный с запуском АЦП, означает, что они синхронизированы только в момент запуска, а потом они работают уже независимо друг от друга с теми параметрами, которые в них были заложены?

10.12.2015 20:22:14
#8

Сотрудник "Л Кард"
Здесь с 17.04.2014
Сообщений: 1,338

Re: E14-140 синхронизация с АЦП

Если Ваша задача состоит в том, чтобы выдавать некоторую последовательность точек на ЦАП (заранее известную, т.е. не нужно по данным АЦП принимать решение, какую следующую точку ЦАП выставить) и получить результаты измерения с АЦП, соответствующие выставленным значениям ЦАП, то тогда Вы действительно можете использовать потоковый режим АЦП и ЦАП, так как у E14-140MD есть синхронный запуск АЦП и ЦАП и они работают синхронно. Т.е. можно заранее сформировать массив данных на ЦАП на весь эксперимент, чтобы в течение такого-то времени была выставлена первая точка (т.е. сколько-то отсчетов на ЦАП повторяется первая точка), затем в течение того же времени вторая и тп., и поставить всю последовательность на передачу в модуль (если правда массив данных получится очень большой, то его придется формировать и подкачивать во время эксперимента и тогда нужно следить, чтобы буфер не переполнился). Затем запускается синхронно АЦП и ЦАП и соответственно исходя из частоты АЦП будет столько-то отсчетов соответствовать первой точке и т.п. (только нужно учитывать переходные процессы в Вашей системе, т.е. сколько-то первых отсчетов, соответствующих каждой точке нужно отбрасывать при обработке).

Про режимы ЦАП в E14-140MD можете посмотреть в этом документе http://www.lcard.ru/download/e14_140m_addendum_dac.pdf.

АлексейЛ
11.12.2015 00:43:28
#9

Гость

Re: E14-140 синхронизация с АЦП

Алексей L Card пишет:

в том, чтобы выдавать некоторую последовательность точек на ЦАП (заранее известную, т.е. не нужно по данным АЦП принимать решение, какую следующую точку ЦАП выставить) и получить результаты измерения с АЦП, соответствующие выставленным значениям ЦАП

Да, вот именно это и требуется. Изначально в своем вопросе я просто попросил привести пример соответствующего кода для правильной настройки параметров ЦАП и АЦП и получения массива данных с АЦП в таком случае, т.к. мануала немного недостаточно, а примера данного случая нет.

11.12.2015 13:11:25
#10

Сотрудник "Л Кард"
Здесь с 24.04.2014
Сообщений: 1,519

Re: E14-140 синхронизация с АЦП

1.

сильно ли изменит ситуацию использование ADC_KADR() вместо ADC_SAMPLE()

Всё зависит от кол-ва используемых каналов АЦП. В первом приближении можно полагать, что время выполнения ADC_KADR() равно   'ChannelsQuantity' * ADC_SAMPLE().
И ещё: если у Вас в компьютере USB 1.1 контроллер  реализован на базе OHCI (Open Host Controller Interface), то функции  ADC_SAMPLE(), ADC_SAMPLES(), ADC_KADR() и ADC_SAMPLE() будут выполнять раза в 2-3 быстрее, чем на USB 1.1 контроллерах типа UHCI (Universal Host Controller Interface).
2.

Или запуск ЦАП, синхронизированный с запуском АЦП, означает, что они синхронизированы только в момент запуска, а потом они работают уже независимо друг от друга с теми параметрами, которые в них были заложены?

На модуле E-140M АЦП и ЦАП тактируются от одного кварцевого генератора, т.ч. 'разбежки' в работе АЦП и ЦАП не будет.
3. При потоковой реализации вашего алгоритма необходимо выполнить следующие шаги:
   а. выбрать кратные частоты работы АЦП и ЦАП;
   b. в структуре параметров ЦАП установить поле SyncWithADC равным 1;
   c. корректно сформировать буфер данных для вывода на ЦАП;
   d. с помощью функции WriteData() выставить предварительный запрос на вывод  данных на ЦАП;
   e. с помощью функции START_DAC() запустить ЦАП;
   f. теперь можно запускать АЦП и осуществлять сбор требуемого кол-ва данных.

АлексейЛ
11.12.2015 14:48:01
#11

Гость

Re: E14-140 синхронизация с АЦП

Тихомиров Сергей пишет:

f. теперь можно запускать АЦП и осуществлять сбор требуемого кол-ва данных.

Вот тут и начинаются проблемы. Можете объяснить по моему коду что я делаю не так? Чтение идет из 1 и 16 каналов АЦП. Весь диапазон ЦАП делится на 100 точек, каждая из которых повторяется 50 раз подряд, при этом в данном случае изменение значений происходит только по одному из каналов ЦАП.

  pModule.STOP_DAC;
  pModule.STOP_ADC;

//  Устанавливаем параметры ЦАП
  Pall:=100;
  Pone:=100;
  NPo:=Pall*Pone;

  pModule.GET_DAC_PARS(@dp);
  dp.DacRate:=25;
  dp.SyncWithADC:=1;
  dp.SetZeroOnStop:=0;
  pModule.SET_DAC_PARS(@dp);

  Pind:=0;
  for i:=1 to Pall do
  begin
    for j:=0 to Pone-1 do
    begin
      Xd[j+Pind]:=32767-Round(65536/Pall*(i+Pind));
    end;
    Pind:=Pind+Pone;
  end;
  for i:=0 to NPo-1 do if (i mod 2) <> 0 then Xd[i]:=0;

  Req_d.NumberOfWordsToPass:=NPo;
  Req_d.Buffer:=@Xd;
  Req_d.TimeOut:=2000;

//  Устанавливаем параметры АЦП
  pModule.GET_ADC_PARS(@ap);
  ap.AdcRate:=25;
  ap.ControlTable[0]:=15;
  ap.ControlTable[1]:=0;
  ap.ChannelsQuantity:=1;
  pModule.SET_ADC_PARS(@ap);

//  Вводим параметры сканирования и данные в ЦАП
  pModule.WriteData(@Req_d);

//  Устанавливаем параметры сканирования АЦП
  Req_a.NumberOfWordsToPass:=stepsAll+1;
  Req_a.TimeOut:=2000;
  Req_a.Buffer:=@Yd;
  Req_a.Overlapped:=0;

//  Запускаем АЦП и ЦАП
  pModule.START_DAC;
  pModule.START_ADC;

//  Читаем данные из АЦП
  pModule.ReadData(@Req_a);

  pModule.STOP_ADC;
  pModule.STOP_DAC;
11.12.2015 16:18:57
#12

Сотрудник "Л Кард"
Здесь с 24.04.2014
Сообщений: 1,519

Re: E14-140 синхронизация с АЦП

1. Я правильно понимаю, что опрашивать надо два канала АЦП: 1-ый и 16-ый?    А почему тогда для сбора данных задаётся всего один канал АЦП:

ap.ChannelsQuantity:=1;


2. Кратными должны быть следующие частоты:
           KadrRate - частота кадра АЦП
    и
           DacRate - частота синхронного вывода сразу на оба канала ЦАП.
    А конкретно в Вашем примере после выполнения функций SET_ADC_PARS() и   SET_DAC_PARS() параметры ap.KadrRate и  dp.DacRate должны быть равны.

АлексейЛ
11.12.2015 16:57:04
#13

Гость

Re: E14-140 синхронизация с АЦП

Еще есть проблема с тем, что ЦАП не успевает пройти весь массив заданных координат. Т.е. он проходит первые несколько точек, а затем всё завершается. При этом, если поставить метку в отладчике на строчку pModule.WriteData(@Req_d);, дойдя до которой программа остановится и будет ждать, пока я не разрешу ей дальнейшее выполнение, ЦАП успеет пройти все точки заданного массива. Не нужно ли в программе в этом месте делать какую-либо задержку?

Тихомиров Сергей пишет:

после выполнения функций SET_ADC_PARS() и   SET_DAC_PARS() параметры ap.KadrRate и  dp.DacRate должны быть равны.

У меня после выполения этих функций ap.KadrRate становится равным 12.5, независимо от значения dp.DacRate.

11.12.2015 19:45:51
#14

Сотрудник "Л Кард"
Здесь с 24.04.2014
Сообщений: 1,519

Re: E14-140 синхронизация с АЦП

1. Функцию WriteData следует использовать в асинхронном режиме, т.е. полю Req_d.Overlapped должен быть присвоен указатель на  структуру типа OVERLAPPED. Тогда эта функция только выставляет системе асинхронный запрос на передачу требуемого кол-ва данных в модуль и на этом завершает своё выполнение. Собственно сам вывод данных на ЦАП начнётся при последующем вызове функции START_DAC() (в общем случае), а в Вашем конкретном случае ещё и после дополнительного вызова функции START_ADC().

  // OVERLAPPED структура
  ReadOv : OVERLAPPED;
  .....
  // инициализация структуры типа OVERLAPPED
  ZeroMemory(@ReadOv, sizeof(OVERLAPPED));
  // создаём событие для асинхронного запроса
  ReadOv.hEvent := CreateEvent(nil, FALSE , FALSE, nil);
  // формируем структуру Req_d
  Req_d.NumberOfWordsToPass:=NPo;
  Req_d.Buffer:=@Xd;
  Req_d.Overlapped := @ReadOv;
  Req_d.TimeOut:=2000;

2.

У меня после выполнения этих функций ap.KadrRate становится равным 12.5, независимо от значения dp.DacRate.

Я имел в виду, что частоты работы АЦП и ЦАП необходимо подбирать так, чтобы ap.KadrRate и  dp.DacRate были бы кратны (в общем случае), а в Вашем конкретном случае - равны. Например, так:

 
  //  Устанавливаем параметры ЦАП
  pModule.GET_DAC_PARS(@dp);
  dp.DacRate:=25.0;
  dp.SyncWithADC:=1;
  dp.SetZeroOnStop:=0;
  pModule.SET_DAC_PARS(@dp);
  //  Устанавливаем параметры АЦП
  pModule.GET_ADC_PARS(@ap);
  ap.AdcRate:=50.0;
  ap.InterKadrDelay:=0.0;
  ap.ControlTable[0]:=15;
  ap.ControlTable[1]:=0;
  ap.ChannelsQuantity:=2;
  pModule.SET_ADC_PARS(@ap);

3.Неплохо бы было проверять на ошибку выполнение каждой функции библиотеки Lusbapi. Это часто позволяет уберечься от многих недоразумений.

АлексейЛ
15.12.2015 16:11:36
#15

Гость

Re: E14-140 синхронизация с АЦП

Как определить когда АЦП завершила работу? Т.к. если не вставлять задержку между pModule.START_ADC; и pModule.ReadData(@Req_a);, то при большом количестве точек плата не успевает пройти все точки и завершает работу раньше, чем нужно. А если считать задержку на глаз, то точно вычислить не получается.

Еще вопрос. Я правильно понимаю, что в выходном массиве данных АЦП информация идет покадрово, а в каждом кадре отсчеты располагаются соответственно каналам в ControlTable?

15.12.2015 18:18:57
#16

Сотрудник "Л Кард"
Здесь с 24.04.2014
Сообщений: 1,519

Re: E14-140 синхронизация с АЦП

1.

Как определить когда АЦП завершила работу? ...

Модуль физически останавливает работу АЦП только по выполнении функции STOP_ADC(). А что означает фраза "при большом количестве точек плата не успевает пройти все точки"? Следует ли понимать, что при небольшом количестве точек всё работает нормально?


2.

Я правильно понимаю, что в выходном массиве данных АЦП информация идет по-кадрово, а в каждом кадре отсчеты располагаются соответственно каналам в ControlTable?

Да, именно так.

АлексейЛ
16.12.2015 12:43:56
#17

Гость

Re: E14-140 синхронизация с АЦП

Тихомиров Сергей пишет:

А что означает фраза "при большом количестве точек плата не успевает пройти все точки"?

Это означает, что ЦАП не проходит весь массив значений, который ему задается, и работа просто прекращается.

Тихомиров Сергей пишет:

Следует ли понимать, что при небольшом количестве точек всё работает нормально?

Да, до какого-то количества задаваемых точек ЦАП успевает пройти весь массив, а потом, с увеличением количества точек, процесс прерывается до его завершения.
Как было выше написано в коде

//  Запускаем АЦП и ЦАП
  pModule.START_DAC;
  pModule.START_ADC;

//  Читаем данные из АЦП
  pModule.ReadData(@Req_a);

  pModule.STOP_ADC;
  pModule.STOP_DAC;

Т.е. между командами никаких задержек изначально нет. И, возможно, STOP_ADC и STOP_DAC могут сработать до того, как ЦАП прошел по всему заданному ему массиву.

АлексейЛ
16.12.2015 13:37:10
#18

Гость

Re: E14-140 синхронизация с АЦП

Как вариант, чтобы не вставлять задержку, можно увеличить частоту ЦАП и АЦП.

17.12.2015 18:51:55
#19

Сотрудник "Л Кард"
Здесь с 24.04.2014
Сообщений: 1,519

Re: E14-140 синхронизация с АЦП

В Вашем случае функция ReadData(), работающая в синхронном режиме, должна завершиться только после того, как получит stepsAll+1 отсчётов с АЦП модуля (с обоих каналов). По времени это должно совпасть с завершением вывода на ЦАП NPo отсчётов. Величины stepsAll+1 и NPo должны быть согласованы, а в Вашем случае - равны.

АлексейЛ
21.12.2015 12:47:54
#20

Гость

Re: E14-140 синхронизация с АЦП

Тихомиров Сергей пишет:

Вашем случае - равны

Не помогло.