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


Неправил. задержк. при кол-ве отсч. не равных 3072

Вы не вошли.

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

Сергей
08.03.2006 19:04:17
#1

Гость

Неправил. задержк. при кол-ве отсч. не равных 3072

Здравствуйте. Помогите, пожалуйста, решить проблему.
У меня модуль Е440, который был приобретен 13 сентября 2004 года. Пишу программу на Delphi 5 под ОС Windows XP. AdcRate=2 кГц (частота работы АЦП), InterKadrDelay=0,5 мс (межкадровая задержка), ChannelsQuantity=1 (число активных каналов), длина управляющей таблицы=1, усиление=1. Первую половинку буфера собираю в массив Buffer_1, вторую – в массив Buffer_2. Измеряю время заполнения каждой из половинок при разном кол-ве отсчетов (DataStep).

При проведении ряда тестов были получены следующие результаты:

1) DataStep=32 (в первую половинку буфера 32 отсчета и во вторую – 32);
а) время заполнения первой половинки (32 отсчета) – 3067 мс;
б) время заполнения второй половинки (32 отсчета) – 2 мс;
в) общее время заполнения буфера (64 отсчета) – 3069 мс.
г) на один отсчет приходится 3069 / 64 = 47,95 мс (я опрашиваю 1 канал), т.е. межкадровая задержка =47,95 мс, а должна быть =0,5 мс. Хотя функция FILL_ADC_PARS возвращает InterKadrDelay = 0,5. Судя по тесту она = 47,95 мс.
д) время заполнения половинок буфера отличается СИЛЬНО

2) DataStep=1024 (в первую половинку буфера 1024 отсчета и во вторую – 1024);
а) ---//--- 3070 мс;
б) ---//--- 4 мс;
в) ---//--- 3074 мс.
г) на один отсчет приходится 3047 / 2048 = 1,487 мс, т.е. межкадровая задержка =1,487 мс, а должна быть =0,5 мс.
д) время заполнения половинок буфера отличается СИЛЬНО

Дальше при увеличении DataStep до 3072  задержка приближается к 0,5

3) DataStep=3072 (в первую половинку буфера 3072 отсчета и во вторую – 3072);
а) ---//--- 3074 мс;
б) ---//--- 9 мс;
в) ---//--- 3083 мс.
г) на один отсчет приходится 3083 / 6144 = 0,501 мс, т.е. межкадровая задержка =0,501 мс. Получили то, что должны были получить.
д) время заполнения половинок буфера отличается СИЛЬНО

Теперь же если увеличить DataStep на 32, т.е. DataStep=3072+32=3104 отсчета, то задержка снова не такая, какая должна быть.

4) DataStep=3104 (в первую половинку буфера 3104 отсчета и во вторую – 3104);
а) ---//--- 3075 мс;
б) ---//--- 3064 мс;
в) ---//--- 6139 мс.
г) на один отсчет приходится 6139 / 6208 = 0,988 мс, т.е. межкадровая задержка =0,988 мс, а должна быть =0,5 мс.
Время заполнения половинок буфера отличается НЕ сильно

Дальше при увеличении DataStep до 6144 межкадровая задержка снова приближается к 0,5 мс, а после увеличения на 32, т.е. 3144+32=6176 мс она равна 0,745 мс

ВЫВОД: правильные задержки, можно получать только при кол-ве отсчетов кратных 3072. Но данные будут получены не равномерно во времени, т.к. время заполнения половинок буфера отличается:
при DataStep=3072, время отличается сильно.
при DataStep=3072*2=6144, время отличается НЕ сильно.
при DataStep=3072*3=9216, время отличается сильно.
А как же быть, если нужно кол-во отсчетов не кратные 3072.

При необходимости пришлю исходник.

09.03.2006 12:00:55
#2

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

Re: Неправил. задержк. при кол-ве отсч. не равных 3072

То, что Вы измеряете не является в "чистом" виде временем сбора DataStep отсчётов. Поскольку при использумых Вами параметрах сбора в приведенных  временАх присутствует сильная зависимость от соотношения величин DataStep и длины FIFO буфера АЦП в DSP модуля.
Как отмечено в тех.описании (например, на функцию FILL_ADC_PARS), передача данных из модуля в РС осуществляется только пачками по FifoLenght/2 отсчётов. Т.е. пока текущая половика FIFO буфера АЦП полностью не заполнится данными, их передача в РС не происходит.
Смотри также www.lcard.ru/forum.php3?action=viewthread&thread=1128

Сергей
09.03.2006 20:38:29
#3

Гость

Re: Неправил. задержк. при кол-ве отсч. не равных 3072

Сергей, большое спасибо за помощь. Я разобрался.
Подскажите пожалуйста еще формулу расчета максимальной межкадровой задержки (InterKadrDelay) в модуле Е440 при заданных частоте работы АЦП (AdcRate) и кол-ве активных каналов (ChannelsQuantity). Минимальную задержку я определяю так: 1/AdcRate.
Максимальную задержку определяю так:
а) ap.InterKadrDelay:=9999999//любое большое число
б) передаю в FILL_ADC_PARS(@ap)
в) в InterKadrDelay возвращается максимально возможная задержка при заданной AdcRate.
Хотелось бы рассчитать ее более простым способом.
Мне это нужно для определения двух неизвестных: AdcRate и InterKadrDelay, если известна частота одного канала (ChannelRate) и кол-во активных каналов (ChannelsQuantity). Последовательно уменьшая AdcRate и увеличивая InterKadrDelay я приближаюсь к необходимой ChannelRate. Но для этого мне нужно знать до каких пор можно увеличивать InterKadrDelay. Это очень долго. Может быть у Вас есть более быстрый алгоритм?

10.03.2006 11:21:34
#4

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

Re: Неправил. задержк. при кол-ве отсч. не равных 3072

Смотрите исходники на функцию FILL_ADC_PARS().