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


Проблема при программировании LTR34

Вы не вошли.

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

Константин
22.03.2012 16:14:38
#1

Гость

Проблема при программировании LTR34

При работе с ЦАП LTR34 (крейт LTR-EU-8)  возник (неразрешимый на данный момент) вопрос:

Используется потоковый режим с подтверждением "На каждое слово".

В нижеуказанном коде наблюдается ошибка (код: -8) при втором и последующем обращении к функции LTR34_Recv() в цикле while:

    for (int i=0; i<100; i++)
    {
        res34=LTR34_ProcessData(&cap34, DataOut1, ArrayToSend, size34, true);

        res34=LTR34_Send(&cap34, ArrayToSend, size34, 1);

        while (!cap34.BufferEmpty)
        {
            res34=LTR34_Recv(&cap34,&data1,NULL,size34,5);
            if (res34<=0)
            {
                fl_run=0;
            }
        }
    }
   
где &cap34 - указатель на управляющую структуру модуля, тип TLTR34.

Правильно ли осуществляется заполнение буфера при его опустошении?

22.03.2012 18:10:58
#2

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

Re: Проблема при программировании LTR34

Несколько смущает передача вторым параметром в LTR34_Recv() &data1 – data1 как объявлено?
Вы должны передать туда указатель на массив размером size34 – так ли это?

А так, при правильной работе указанный код приведет к следующему: сперва Вы запишете некий сигнал размером size34, затем LTR34 выдаст этот сигнал на ЦАП, выдавая по подтверждению на каждое слово. Вы их все прочитаете, после чего, когда последнее подтверждение дойдет до компьютера у Вас начнется следующая итерация цикла – то есть на ЦАП между двумя сигналами с разных итераций цикла будет выводиться постоянное значение, равное последнему отсчету, в течение времени, пока последнее подтверждение дойдет до компьютера, Вы его обработаете и  новый массив отсчетов дойдет до LTR34 – если это то, что Вам нужно, то такой код подойдет (только надо по-хорошему проверять результаты ProcessData и Send, ну и таймаут всего 5 млс на прием не слишком ли мал?).

Кирилл
04.02.2013 04:43:20
#3

Гость

Re: Проблема при программировании LTR34

Здравствуйте. Пишу программу многоканальной генерации сигналов (синус, радиоимпульс) в Delphi 7 для модуля ltr34. Проблема в следующем: на выходе сигнал не постоянный, а дискретизованный (состоит из отдельных пиков). К примеру синус представляет собой множество пиков с синусоидальной огибающей. Из-за чего это может происходить?

LTR34.FrequencyDivisor:=60;
LTR34.UseClb:=true;
LTR34.AcknowledgeType:=false;
LTR34.LChTbl[0]:=LTR34_CreateLChannel(1,0);              LTR34.LChTbl[1]:=LTR34_CreateLChannel(2,0);                LTR34.LChTbl[2]:=LTR34_CreateLChannel(3,0);                LTR34.LChTbl[3]:=LTR34_CreateLChannel(4,0);
err:=LTR34_Config(@LTR34);
if TESTERROR(err,memo1,/' &#202;&#238;&#237;&#244;&#232;&#227;&#243;&#240;&#224;&#246;&#232;&#255; LTR34/')then exit;
    for iR:=0 to 999 do
      begin
            DATA[iR,0]:=AR*sin(iR*(pi/250));
err:=LTR34_ProcessData(@LTR34,@DATA,@WORD_DATA,5000,1);
    if TESTERROR(err,memo1,/' &#207;&#238;&#228;&#227;&#238;&#242;&#238;&#226;&#234;&#224; &#228;&#224;&#237;&#237;&#251;&#245; &#228;&#235;&#255; LTR34/')then exit;
    err:=LTR34_Send(@LTR34,@WORD_DATA,5000,10000);
    if TESTERROR(err,memo1,/' &#206;&#242;&#239;&#240;&#224;&#226;&#234;&#224; &#228;&#224;&#237;&#237;&#251;&#245; &#228;&#235;&#255; LTR34/')then exit;
    err:=LTR34_DACStart(@LTR34);

04.02.2013 07:47:37
#4

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

Re: Проблема при программировании LTR34

Кирилл, поясните Вашу задачу. Какие параметры радиоимпульса хотите получить на выходе LTR34:
- амплитуда (Вольты),
- длительность (секунды),
- частота несущей (Герцы)?

Кирилл
04.02.2013 08:19:14
#5

Гость

Re: Проблема при программировании LTR34

Амплитуда 5В
Несущая до 3 кГц
Длительность различная до 1 сек примерно

04.02.2013 10:18:15
#6

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

Re: Проблема при программировании LTR34

О корректности программного кода подскажут коллеги. Сначала по функциональным возможностям LTR34:
1.  "Cтупеньки" с установленным периодом дискретизации там должны присутствовать, поскольку LTR34 не имеет ни интерполяции сигнала на выходе, ни выходного фильтра.
2. Применение LTR34 для выходного синусоидального сигнала 3 кГц возможно, но надо понимать, что выше 3 кГц по частоте подниматься не стоит, поскольку возникнут искажения из-за ограничений скорости нарастания.

Кирилл, уточните, какой у Вас крейт LTR и по какому интерфейсу с ним работаете?

04.02.2013 11:24:54
#7

Сотрудник "Л Кард"
Здесь с 18.04.2014
Сообщений: 810

Re: Проблема при программировании LTR34

Кирилл, что Вы имеете в виду? Слова "множество пиков с синусоидальной огибающей" звучат так, как будто там короткие импульсы, между которыми нуль (..|..|..|..), что едва ли возможно.
А если ступенчатый сигнал (_гГг_гГг_)- это нормально, как написал Александр Гарманов.

04.02.2013 13:50:59
#8

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

Re: Проблема при программировании LTR34

а поле LTR34.ChannelQnt вы установили в нужное значение (у Вас как я понимаю 4 канала?).

и как объявлено DATA?

Кирилл
05.02.2013 01:17:37
#9

Гость

Re: Проблема при программировании LTR34

Крейт LTR-U-1. Связь по USB.
Сигнал от ЦАП представлен в виде импульсов .|.|.|. огибающая которых является требуемым сигналом (синусоида, радиоимпульс). Как раз ступенек то и нет.
Задание каналов:
LTR34.ChannelQnt:=4;             LTR34.LChTbl[0]:=LTR34_CreateLChannel(1,0);                LTR34.LChTbl[1]:=LTR34_CreateLChannel(2,0);                LTR34.LChTbl[2]:=LTR34_CreateLChannel(3,0);                LTR34.LChTbl[3]:=LTR34_CreateLChannel(4,0);

DATA объявлено следующим образом:
DATA:array[0..9999,0..4]of DOUBLE;
WORD_DATA:array[0..9999]of integer;

Кирилл
05.02.2013 01:26:13
#10

Гость

Re: Проблема при программировании LTR34

Для примера если мы задаем синусоиду частотой 3 кГц, то на одном периоде укладывается примерно 35 таких пиков. Расстояние между их максимума составляет примерно 10 мкс. При этом частота огибающей этих пиков составляет синусоиду с частотой 3 кГц, задаваемую с помощью программы.

05.02.2013 08:18:07
#11

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

Re: Проблема при программировании LTR34

Кирилл, FrequencyDivisor:=60 соответствует трафику 500 тыс.отсчётов в секунду. А LTR-U-1 способен прокачать только  200 тыс.отсчётов в секунду - это написано в документации на LTR-U-1.

05.02.2013 08:21:43
#12

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

Re: Проблема при программировании LTR34

500 тыс.отсчётов в секунду будет работать ТОЛЬКО в режиме кольца (не в потоковом режиме).

Кирилл
05.02.2013 08:39:27
#13

Гость

Re: Проблема при программировании LTR34

У меня как раз работа в режиме кольца

Кирилл
05.02.2013 08:40:51
#14

Гость

Re: Проблема при программировании LTR34

Смена параметра FrequencyDivisor также ничего не дала.

05.02.2013 10:15:48
#15

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

Re: Проблема при программировании LTR34

Если я не ошибаюсь, то в Delphi массив с границами [0..4] - массив на 5 элементов (0,1,2,3,4). т.е. на 4 канала нужно DATA:array[0..9999,0..3]of DOUBLE;

Также не до конца понятно почему размер WORD_DATA меньше размера DATA. По идее если у Вас Nch (4) каналов и Вы хотите вывести сигнал по n семплов на каждый канал, то:

DATA:array[0..n-1,0..Nch-1]of DOUBLE;
WORD_DATA:array[0..(n*Nch - 1)]of integer;

.......

err:=LTR34_ProcessData(@LTR34,@DATA,@WORD_DATA,n*Nch,1);
...............
err:=LTR34_Send(@LTR34,@WORD_DATA,n*Nch,10000);

Кирилл
06.02.2013 02:39:15
#16

Гость

Re: Проблема при программировании LTR34

Я действительно указал неправильные значения в тексте программы для массива WORD_DATA и строках вывода. Сейчас все изменил на правильные значения:
DATA:array[0..999,0..3]of DOUBLE;
WORD_DATA:array[0..3999]of integer;
err:=LTR34_ProcessData(@LTR34,@DATA,@WORD_DATA,4000,1);
err:=LTR34_Send(@LTR34,@WORD_DATA,4000,10000);

Однако теперь программа выдает ошибку при попытке компиляции: /'Invalid floating point operation/', указывая на строку err:=LTR34_ProcessData(@LTR34,@DATA,@WORD_DATA,4000,1);

В чем может быть ошибка?
И второй вопрос во второй строке вывода что за второе число (10000), что оно регулирует? я не совсем понял его назначение.

06.02.2013 07:53:18
#17

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

Re: Проблема при программировании LTR34

По поводу 10000 в LTR34_Send - то это таймаут на передачу данных в модуль (в данном случае 10 с). Т.е. LTR34_Send вернет управление либо когда передаст все данные, которые запрашивались, либо когда истечет указанный таймаут (нештатная ситуация, и в этом случае LTR34_Send вернет ошибку).

По поводу ошибки компиляции - это странно... Вы же вроде не меняли программу за исключением размеров массивов - не очень понятно как это могло повлиять именно на сборку... Если что - можете прислать проект мне на почту - посмотрю сегодня днем.

07.02.2013 10:47:04
#18

Сотрудник "Л Кард"
Здесь с 18.04.2014
Сообщений: 810

Re: Проблема при программировании LTR34

Может быть, ошибка все-таки при выполнении, а не при компиляции? Вы компилируете отдельной командой или сразу с запуском?
Проверьте цикл, заполняющий массив data[], там все элементы заполняются?

07.02.2013 19:16:43
#19

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

Re: Проблема при программировании LTR34

Ответил на письмо по почте