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


Несколько вопросов по программированию LTR 34.

Вы не вошли.

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

Дмитрий
09.02.2010 10:53:53
#1

Гость

Несколько вопросов по программированию LTR 34.

Здравствуйте!
Несколько вопросов по программированию LTR 34.
Используется один канал.

1.В функцию работы с ltr 34 программа должна передать массив, который содержит значения нужных напряжений.
Допустим, мы вычисляем функцию SIN через каждые 0.025 секунды. Т.е. элемент массива [0] - значение функции SIN в 0,
элемент [1] значение при времени 0.025, элемент [2] при времени 0.050 и т.д.
Вопрос в том, как связать эту переменную (назовем ее interval = 0.025) с параметрами, которые задаются при конфигурации LTR.
Другими словами, какая имеется связь/зависимость между этой переменной (interval = 0.025) и значениями FrequencyDivisor/FrequencyDAC,
а также между переменной и размером массива, который передается функциям LTR 34.

2. Размер массива, который передается функции LTR34_ProcessData, может быть произвольным? При задании размера, надо указывать количество
нужных для генерации элементов или просто полный размер массива такой же, как при его объявлении?


3. Правильно ли вызываются функции?

//Один раз при запуске программы
LTR34_Init
LTR34_Open


//Многократно при запуске функции
LTR34_Reset
LTR34_Config
LTR34_ProcessData
LTR34_Send
LTR34_DACStart
/*sleep*/
LTR34_DACStop


/Один раз при закрытии
LTR34_Close


Как я понял, разница между автогенерацией и потоковым режимом, в значении флага RingMode и некотором коде, который
должен располагаться между функциями LTR34_DACStart и LTR34_DACStop. В примере используется функции Sleep. Есть ли более
удачный (точный) вариант для VC++ вместо sleep?
В чем может быть заключена проблема, когда работает режим автогенерации, но совершенно не работает режим потоковой генерации.
При потоковой генерации подкачка не происходит, кроме того, что было отправлено в буфер изначально.

09.02.2010 12:10:02
#2

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

Re: Несколько вопросов по программированию LTR 34.

Когда работает режим автогенерации, но не работает режим потоковой генерации, то вероятно пропускной способности интерфейса не хватает для той скорости вывода данных, которую Вы устанавливаете.
- Какой у Вас крейт?
- USB или Ethernet?

09.02.2010 16:13:06
#3

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

Re: Несколько вопросов по программированию LTR 34.

1. Обычно делают наоборот: выбирают нужную частоту дискретизации F, отсюда известен квант времени delta_t = 1/F сек. Значит, каждое слово данных соответствует интервалу delta_t, и для синуса имеем
x(n) = A * sin(2 * pi * f * n * delta_t + phi), где A - амплитуда в кодах ЦАП, phi - начальная фаза в радианах, f - частота сигнала, Гц (f < F/2), n - номер отсчета, x(n) - значение отсчета в кодах АЦП.

2. Размер передаваемых данных должен соответствовать количеству выводимых отсчетов. Если я не ошибаюсь, параметр size задается в 32-битных словах.

3. В потоковом режиме, естественно, подкачку надо делать не только перед началом, но и во время работы (send start send send send... stop). Sleep по идее не нужен, потому что ltrserver ждет готовности модуля принять данные. Думаю, что можно сделать сплошной цикл send//'ов с таймаутом не меньше времени вывода буфера.

Дмитрий
09.02.2010 21:16:47
#4

Гость

Re: Несколько вопросов по программированию LTR 34.

Александр E,

1) Частота дискретизации - это частота которая может принимать значения от 0 до 60 верно(или та, которая от 0 до 500.000 Гц. В мануале, ЧД это переменная от 0 до 60)?
Т.е. минимальный интервал получается 0,017 сек?
Итого на одну секунду мы можешь рассчитать только 60 точек??? А если импульс идет допустим 10 мс, как в этом случае поступать?

2) Размер size задается в DWORD, как я понял если у нас допустим массив double[10000], где из 10000 элементов сгенерировано только 2000, то size можно задать просто как переменную типа INT с значением 2000. Верно? Или же с типом INT надо какие-то дополнительные преобразования делать, перед приравниванием к типу DWODR?


3) Для потоковое генерации(как написано в мануале) можно один раз задать

LTR34_ProcessData
LTR34_Send

перед запуском и все. Так как подкачка мне не нужна, а только одиночный импульс, который я и загружаю перед стартом генерации в выше написанные функции. Но такая схема не работает. При автогенерации осциллограф показывает хоть что-то, при одиночном импульсе - вообще никакой реакции на отправленные данные.


Гарманов Александр, дело в том, что подкачки данных не происходит, я их задаю(отправляю) только один раз, а потом просто вызываю функции Start и Stop. В этом случае играет ли роль пропускная способность?
- Узнаю
- USB

Спасибо за ответы, на может быть мои дилетантские вопросы.

09.02.2010 22:01:56
#5

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

Re: Несколько вопросов по программированию LTR 34.

Дмитрий, если подкачку данных не применяете,  то пропускная способность интерфейса значения не имеет.
В режиме автогенератора LTR34 может выдать до 500 Ксэмплов/c на любом типе крейта LTR.

Но для потокового режима LTR34 имеет следующие  ограничения:
- В LTR-U-1 до 200 Ксэмплов/c.
- В LTR-U-8(16)  до 400  Ксэмплов/c
- В LTR-EU-2(8,16) при работе через USB до 400  Ксэмплов/c
- В LTR-EU-2(8,16) при работе через Ethernet реально определяется достигнутой средней скоростью соединения.
- В LTR-EU-2(8,16) при непосредственном управлении от Blackfin крейт-контроллера, когда процессор является источником данных - до 500 Ксэмплов/c (этот режим не тестировался, но работать это должно).

Дмитрий
09.02.2010 22:25:21
#6

Гость

Re: Несколько вопросов по программированию LTR 34.

Гарманов Александр, прошу прощения, а что такое Ксэмплов/c? Это 500.000 значений напряжения в секунду способен преобразовать ЦАП ?

Дмитрий
09.02.2010 22:29:22
#7

Гость

Re: Несколько вопросов по программированию LTR 34.

Т.е не 500.000, а например 200.000 или 500.000 в зависимости от модели.

09.02.2010 23:06:29
#8

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

Re: Несколько вопросов по программированию LTR 34.

Дмитрий. Поясню совсем подробно:
1 сэмпл - это один 16-битный отсчёт данных ЦАП, который упакован в 32-битный формат LTR. Остальные 16 бит формата LTR является служебной частью (номер модуля, номер канала и другая служебная информация).
Приведу пример:
Когда говорится, например, про выходной поток ЦАП LTR34 до 500 Ксэмплов/c, это означает что ЦАП в одноканальном режиме способен синхронно  обновлять выходные значения 500 тыс раз в секунду, а в N-канальном режиме 500000/N раз в секунду по каждому каналу (N=1,2,4,8). Для потокового режима ЦАП передача данных по интерфейсу 500 Ксэмплов/c - это 2 MБ/c, поскольку сэмпл в LTR упакован в 4-х байтах.

Дмитрий
10.02.2010 00:07:24
#9

Гость

Re: Несколько вопросов по программированию LTR 34.

Гарманов Александр, спасибо.

10.02.2010 08:50:52
#10

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

Re: Несколько вопросов по программированию LTR 34.

Пожалуйста.
Режим непосредственного управления LTR34 через крейт-контроллер LTR-EU-2(8,16) - это когда подкачка данных в LTR34 сильно оптимизирована программно на уровне Blackfin. Этим режимом пока не занимались, но теоретически  500 Ксэмпл/c в потоке можно достигнуть. Реально - это пока только до 400 Ксэмпл через USB.

Дмитрий
10.02.2010 13:03:55
#11

Гость

Re: Несколько вопросов по программированию LTR 34.

Гарманов Александр, не могли бы вы при возможности ответить на вопросы, которые я адресовал Александру E.

Арсений
10.02.2010 14:03:43
#12

Гость

Re: Несколько вопросов по программированию LTR 34.

1) Частота дискретизации От 31250.0 до 500000.0
60 значений, вы передаёте делитель частоты, т.е. частота уже вычисляется по делителю:
http://www.lcard.ru/download/ltr34api.pdf
Пункт 4.3, стр 16.
Задаётся параметром "FrequencyDevisor" описание Пункт 3.1, стр 8.

2) Размер size можно и в int задавать, просто передаёте количество отчётов.

Дмитрий
10.02.2010 14:35:14
#13

Гость

Re: Несколько вопросов по программированию LTR 34.

Арсений,

Изначально, я так и понял. Но при этом вид графика(который строит программа) не совпадает с тем, что показывает осциллограф. Т.е. не совпадает длительность, количество цугов, частота. Поэтому я собственно и написал сюда.
Например, частота дискретизации равна F=400.000, тогда квант времени будет равен 1/F = 0,0000025. Выбираем потоковую генерацию, вызываем функцию

LTR34_ProcessData
LTR34_Send

LTR34_DACStart
LTR34_DACStop

Если мы задаем массив из 400.000 элементов, то на выходе должен получиться сигнал длительностью 1 секунда(при потоковой генерации). Осциллограф же показывает совершенно другие значения, которые отличаются на порядок (а то и два) в меньшую сторону.
Такое же несоответствие имеет место и с частотой.

При автогерации (берем те же значения), происходит нечто подобное.
Передаем в функцию тот же массив из 400.000 элементов, и задаем длительность автогенерации 3 секунды. В итоге мы должны получить сигнал длительностью 3 секунды, состоящий из 3 одинаковых частей. При этом на осциллографе длительность примерно совпадает(+/- 100 мс), а вот с частотой и видом графика те же проблемы.

Арсений
10.02.2010 15:01:21
#14

Гость

Re: Несколько вопросов по программированию LTR 34.

Объясните зачем делать стоп сразу?? Комманда LTR34_DACStop отключает Генерацию, Вы загружаете память модуля, запускаете его и тут же останавливаете.

Порядок работы с модулем разобран подробно на 7-й странице описания.

Вам нужно для потокового режима:
1)Подключиться к модулю, настроить канналы,  частоту и остальные параметры
те.
Т.е. процедуры:
LTR34_Init
LTR34_Open
LTR34_Reset (Эта комманда не только сбрасывает настройки, но и сбрасывает выходы ЦАП)
Потом
LTR34_Config
2)Сформировать первый пакет данных используя LTR34_ProcessData
3)Загрузить данные в буффер модуля используя LTR34_Send
4)Запустить сбор функцией LTR34_DACStart

С этого момента модуль начнёт выдавать загруженные в него данные с заданной частотой, надеюсь вы обратили внимание, что модуль может работать в 1,2,4 или 8-ми каннальных режимах, это значит что частота вывода данных будет делиться соответственно на 1, 2, 4 или 8. Т.е при 400Кhz и 8 канналах ЦАП вы получите частоту по 50Кhz.

5)Необходимо по мере освобождения буфера досылать ему новые данные. Т.е. снова формировать массив, Подготавливать его Процедурой LTR34_ProcessData и отправлять процедурой LTR34_Send

6)Как только, вы решите что достаточно, то выключаете режим генерации функцией LTR34_DACStop
После этого никакие данные на ЦАП поступать небудут, модуль будет ждать возобновления работы, или сброса и переконфигурации.
7)Закрытие модуля перед закрытием программы
LTR34_Close

10.02.2010 15:19:57
#15

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

Re: Несколько вопросов по программированию LTR 34.

Поясню по архитектуре (ведь, всё есть в руководстве, http://www.lcard.ru/download/ltr_hw.zip глава 12).
Посланные данные в LTR попадают в буфер  FIFO модуля LTR34 (размером до 2 млн. сэмплов), т.е становятся в очередь на вывод. Если же посылаете команду в LTR34, то она в очередь не становится, а действует немедленно, т.е. как только долетит до LTR34. Вот он  и останавливается поэтому быстро у Вас...

Кравцов Д.
17.08.2010 12:19:36
#16

Гость

Re: Несколько вопросов по программированию LTR 34.

Разбираюсь с ltr34, появились вопросы.
Видимо опечатка в ltr34api.pdf стр. 19:

conf.ChannelQnt=4; // Количество активных каналов
conf.LChTbl[0]=LTR34_CreateLChannel(1,0); // физ. канал 1, прямой выход
conf.LChTbl[0]=LTR34_CreateLChannel(3,1); // физ. канал 3, выход 1:10
conf.LChTbl[0]=LTR34_CreateLChannel(6,1); // физ. канал 6, выход 1:10
conf.LChTbl[0]=LTR34_CreateLChannel(7,0); // физ. канал 7, прямой выход

У всех номера каналов 0 - хотя по идее должны быть i++.

Пример на builder для ltr34:
Lcard//LTR//SOURCE//ltr-34//example//BCB_6

настраиваются каналы:
if(WORKS[i].CH_ON)//ищем задействованные каналы
{   LTR34.LChTbl[j]=LTR34_CreateLChannel(i+1,           WORKS[i].MODE);
  WORKS_ON[j]=i;//Запоминаем настройки используемых каналов
j++;//Наращиваем количество найденых каналов
}

При выборе каналов с 5 по 8 - при любой конфигурации LTR34_Config возвращает ошибку - LTR34_ERROR_WRONG_LCH_CONF (-3028)

LTR34-4 имеет активные каналы с 4-11 (OUT1 1:1,OUT1 1:10...OUT4 1:1,OUT4 1:10).
Т.е. имеется _8_ активных каналов, которые я могу настраивать как 1:1 и 1:10?
из при вашего примера настраиваю 1 канал как 1:1 - вывожу 100mV - показывает 100mV
настраиваю 1 канал, как 1:10 -
- вывожу 100mV - показывает 1000mV

Пытаюсь тоже самое проделать на 5 канале - возвращает ошибку LTR34_Config.

Собственно вопрос, как работают эти каналы?

17.08.2010 14:18:40
#17

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

Re: Несколько вопросов по программированию LTR 34.

1. LChTbl[всюду 0] - опечатка, конечно.
2. LTR34_ERROR_WRONG_LCH_CONF: я правильно понял, что у Вас модуль LTR34-4? Его отличие от LTR34-8 заключается как раз в отсутствии физических каналов с 5 по 8.
3. OUT 1:1 или 1:10 выбирает выходную цепь канала - с диапазоном 10 В или 1 В. Они просто выведены на разные контакты разъема. (На самом деле вообще сигнал выводится всегда на оба выхода, а режим 1:1 или 1:10 задает функции LTR34_ProcessData(), как пересчитывать вольты в коды ЦАП, и еще у них разные калибровочные коэффициенты)

17.08.2010 20:20:28
#18

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

Re: Несколько вопросов по программированию LTR 34.

Если выводимый сигнал должен быть больше, чем +-1 В, то нужно подключаться к выходу 1:1. Если меньше, то целесообразно использовать выход 1:10.
Как частный случай, пару смежных каналов можно использовать для вывода дифференциального сигнала +-20 В в режиме 1:1 и +-2 В режиме 1:10.

Кравцов Д.
20.08.2010 11:32:58
#19

Гость

Re: Несколько вопросов по программированию LTR 34.

Работаю в потоковом режиме.
В отдельном потоке генерирую данные, отправляю в ltr34, по флагу завершаю поток и пытаюсь остановить передачу данных функцией LTR34_DACStop(hLTR34) - в итоге возвращает ошибку LTR34_ERROR_CANT_STOP (-3023)

Напрашивается вопрос, что не так?

    GenerateData()
    LTR34DACStart();
    while (ThreadWorks){
           GenerateData()
        }
    // останавливаем режим
    LTR34_DACStart(hLTR34);

Арсений
20.08.2010 12:42:47
#20

Гость

Re: Несколько вопросов по программированию LTR 34.

..// останавливаем режим
..LTR34_DACStart(hLTR34);
Опечатка или и в коде так-же?
Попробуйте ту-же последовательность комманд без использования отдельного потока, может быть у вас накладываеться передача данных на отправку комманды? Поток заканчивает работы штатным образом? Процедуры обмена с LTR34 завершаються корректно?
Пришлите код, можно на ящик.

Кравцов Д.
20.08.2010 12:52:06
#21

Гость

Re: Несколько вопросов по программированию LTR 34.

да опечатался:
/ останавливаем режим
LTR34_DACStop(hLTR34);

Кравцов Д.
20.08.2010 13:00:27
#22

Гость

Re: Несколько вопросов по программированию LTR 34.

В основном потоке та же ошибка возвращается.

Кравцов Д.
20.08.2010 13:08:26
#23

Гость

Re: Несколько вопросов по программированию LTR 34.

Причем в режиме автогенерации такой ошибки нет.
Выскакивает только в потоковом.

Арсений
20.08.2010 13:14:45
#24

Гость

Re: Несколько вопросов по программированию LTR 34.

А у вас режим отправки подтверждений включен? (если да, то нужно вычитывать данные из модуля)
Напишите полностью настройки модуля при конфигурации или отправьте кусочек кода, возможно так будет легче.

Кравцов Д.
20.08.2010 13:32:09
#25

Гость

Re: Несколько вопросов по программированию LTR 34.

Заметил интересную вещь:
При передаче, если число переданных и принятых слов одинаково на момент прекращения генерации, то LTR34_DACStop(hLTR34); проходит без ошибок.

Получается, что, пока все данные записанные в буфер ltr_server//'a не будут переданы в модуль - остановить работу нельзя?

Контакты

Адрес: 117105, Москва, Варшавское шоссе, д. 5, корп. 4

Многоканальный телефон:+7 (495) 785-95-25

Письма и запросы: lcard@lcard.ru
Отдел продаж: sale@lcard.ru
Техническая поддержка: support@lcard.ru

Время работы: с 9-00 до 19-00 мск