Форум: Техническая поддержка

Тема: L-502 Получение данных с цифровых входов

Вы не вошли.

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

Nop
04.04.2018 20:54:08
#1

Участник
Здесь с 24.01.2018
Сообщений: 9

L-502 Получение данных с цифровых входов

Здравствуйте!

Имеется карта L-502. Требуется снимать данные цифровых входов с частотой 1МГц и обрабатывать их 500 раз в секунду
Провожу инициализацию (в компьютерной программе никаких инициализаций, кроме загрузки прошивки, не происходит):                   
           
params_set_din_freq_div( 2'000'000 / 1'000'000 );
sport_in_set_step_size( 1'000'000 / 500 );
configure();
stream_enable( L502_STREAM_DIN );
streams_start()

Есть счетчик прерываний uint64_t COUNTER. При каждом вызове функции usr_in_proc_data делаю COUNTER++

Во внешней программе запущен цикл со Sleep(100) и происходит вывод size и COUNTER (через X502_BfExecCmd):
...
size=2000 counter=205
size=2000 counter=369
size=2000 counter=533
size=2000 counter=697
size=2000 counter=861
...
Т.е. за 100мс компьютера происходит ~164 прерывания. Что соответствует потоку данных 164*2000*10=3'280'000 слов в секунду.
Что я делаю не так? Есть еще странность: если в stream_enable разрешить только поток АЦП, то прерывания все равно происходят.

05.04.2018 11:39:29
#2

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

Re: L-502 Получение данных с цифровых входов

Здравствуйте.
А поток с АЦП при этом у Вас разрешен?
Дело в том, что данные от DIN и АЦП передаются общим потоком и у них общий шаг прерывания (который устанавливается sport_in_set_step_size, поэтому в названии _in, а не _din). При этом частоты задаются свои, и с этой частотой данные с АЦП и DIN сливаются в общий поток и передаются в BF (т.е. если частота АЦП в 2 раза больше DIN, то у Вас будет поток, где слова АЦП в 2 раза чаще слов DIN). Соответственно в usr_in_proc_data передаются данные как АЦП, так и din (отличить их можно по формату слов), соответственно Вы можете разобрать данные в этой функции и обработать только DIN, если Вам это нужно.

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

Если частота АЦП у Вас 2Мгц и этот поток разрешено, то как раз получается 3000000 слов в секунду, что близко к Вашему замеру.

Nop
05.04.2018 15:49:18
#3

Участник
Здесь с 24.01.2018
Сообщений: 9

Re: L-502 Получение данных с цифровых входов

Спасибо за ответ!
А разве вызов stream_enable( L502_STREAM_DIN ); не запрещает все, кроме потока DIN?

05.04.2018 16:33:39
#4

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

Re: L-502 Получение данных с цифровых входов

Нет, он добавляет DIN к разрешенным потокам, т.е. те что были разрешены до вызова останутся разрешенными, если их явно не запретить.

RomanK
02.03.2021 11:45:38
#5

Гость

Re: L-502 Получение данных с цифровых входов

Купили вашу карту L502 для сбора цифровых данных. Проект очень ответственный и не дешевый.
  В процессе отладки обнаружились странности по настройке синхронного  ввода данных. 
  Особенно, когда работа с картой вырубает "операционку" (Windows 7).
  Судя по тому что прочитал выше, могу выразить сожаления из-за  потерянного времени.
   Сопоставляя с написанным, а именно то, что нужно обязательно отключить ненужные потоки, чтобы они не мешали используемым,
вижу , что у вас этого в описании нет! Также там не упоминается никак, какие из потоков включены по умолчанию!
  Чтобы все сразу вразнобой работало..... Извините, но обычно так не делают!
Пожалуйста доработайте хотя бы документацию!

RomanK
02.03.2021 16:32:28
#6

Гость

Re: L-502 Получение данных с цифровых входов

Следующая проблема:
Делитель частоты для синхронного ввода (din_freq_div) установлен величиной 20.
Считывание данных происходит по таймеру 0,1 сек.
Количество накопленных данных (под отладчиком)  в счетчике rdy_cnt оказывается  всегда большим: порядка  400 000 - размер буфера в DMA.
Хотя за 0,1 сек их должно быть в 40 раз меньше!
После разборки L502_ProcessData из них записывается в буфер данных цифрового ввода 1408 слов, примерно соответствует количеству слов за 2 прерывание  64 раза/сек, а не 10 раз/сек.
Где остальные данные?
Установка делителя частоты для синхронного ввода (din_freq_div) величиной 200 и более приводит к прекращению ввода данных.
Хуже того, ввод используемого на данный момент времени значения 20 не возвращает L502  к исходному и требуется перезагрузка компьютера.
В чем причина?

03.03.2021 20:12:13
#7

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

Re: L-502 Получение данных с цифровых входов

Честно говоря, что-либо понять из Ваших сообщений достаточно сложно.
Если предположить, что Вы используете модуль в режиме с сигнальным процессором и как-то изменяете штатную прошивку, то в ней действительно по умолчанию разрешен сбор данных с АЦП и если Вам он не требуется, то его нужно запретить (либо вызовом stream_disable(L502_STREAM_ADC) на уровне BlackFin (или изменение начального состояния g_streams в l502_streams.c, либо через X502_StreamsDisable() на верхнем уровне), как это уже обсуждалось в данной теме.

Если ввод с АЦП не разрешен, то точек на ввод понятно будет значительно больше, а ProcessData из всех введенных данных сохранит в din_data только данные, относящиеся к цифровому вводу, а данные АЦП в adc_data (или отбросит, если нулевой указатель), что может объяснять уменьшение данных на выходе.

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

RomanK
04.03.2021 09:57:17
#8

Гость

Re: L-502 Получение данных с цифровых входов

Спасибо за ответ! Действительно забыл указать подробности.
  BlackFin_а нет, АЦП нет ))
Плата работает чисто на цифровой ввод.
Пришлось потратить целый день чтобы выяснить простую вещь: либо у вас не работает L502_SetDinFreq(), либо его описание не соответствует тому как
оно понимается обычным пользователем.
   Я (и не только я) ) понимаем из описания так, что это должен быть делитель, который делит тактовую  частоту 2Мгц (или 1,5) и уже на пониженной тактовой снимаются состояния цифровых входов и с этой пониженной частотой они накапливаются в L502 и затем уже поступают в DMA со своими интервалами и прочими особенностями. Похоже, что  это не так. Если нет, то отлаживать систему на максимальных скоростях очень неудобно!
  Вначале я пытался именно это и проверить стандартными под отладчиком методами.
   К сожалению, отладка "в лоб" под QT внесла немало непонятного и пришлось замерить в длительных циклах время и количество считываемых слов в секунду. Стало понятно что при всех раскладах  это 2*106 отсчетов с точностью таймера.
  Попытка переставлять L502_SetDinFreq()  до или после других настроек и команд результата не дала. Кроме "зависаний" ))

04.03.2021 19:59:47
#9

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

Re: L-502 Получение данных с цифровых входов

Ок, просто Вы писали в теме по BlackFin, и чем-то описание схоже вашей проблемы.
Правда пока не совсем понятно, с чем связана Ваша проблема, деление частоты должно работать как Вы изначально его описали.
Попробуйте следующее:
- убедитесь, что установлена последняя версия lpcie_sdk с сайта (https://www.lcard.ru/download/lpcie_setup.exe)
- проверьте версию прошивки ПЛИС модуля (либо в своей программе, либо через X502Studio (https://www.lcard.ru/download/x502studio.zip)), а также корректность читаемого серийного номера платы L-502. Версия должна быть 0.9 или 0.10, если ниже нужно обновить (с помощью утилиты в lxfw-update в директории tools из sdk). Если версия и серийный номер отображаются некорректно, то возможно у Вас версия прошивки ПЛИС ниже 0.9 и есть проблемы совместимостью с Вашей мат. платой, которые были устранены в версии 0.9. По хорошему нужно обновить прошивку платы тогда на другом ПК.
- попробуйте взять код один в один из консольного примера https://www.lcard.ru/download/examples/ … m_read.zip, заменить строку X502_StreamsEnable(hnd, X502_STREAM_ADC | X502_STREAM_DIN) на X502_StreamsEnable(hnd, X502_STREAM_DIN), чтобы не разрешать прием данных АЦП, и поменять определение DIN_FREQ на нужную частоту, а READ_BLOCK_SIZE  на нужный размер чтения. Проверьте, приводит изменение частоты к понижению скорости приема данных.
- если все работает корректно, то можно подстроить шаг прерывания (т.к. если Вы вручную настраиваете малый шаг прерывания, а частота по какой-то причине осталась старая или все же разрешен сбор с АЦП, то в предельном случае это может привести к частоте прерываний слишком частой для Windows).

RomanK
05.03.2021 14:57:13
#10

Гость

Re: L-502 Получение данных с цифровых входов

Было:
board_rev      0
fpga_ver        4
plda_ver        1
serial              "4T366281"
После обновления прошивки программой Д502-fpga-update-all   
стало
fpga_ver        10
Перезапуск  ничего не дал,  ввод идет по прежнему с 2М отсчетов/с

Еще раз прошу прощения!
Плата действительно оказалась с  BlackFin и  АЦП.
Но поскольку они не используются, мне и в голову не пришло проверять их наличие...

Работа идет через ПЛИС, т.е. BlackFin не задействован.
Установки параметров при запуске для L502  следующие:
L502_SetRefFreq(L502_0, L502_REF_FREQ_2000KHZ);
L502_SetSynMode(L502_0, L502_SYNC_INTERNAL);
L502_SetDinFreqDivider(L502_0, din_freq_div);    // перед этим  делается присвоение uint32_t  din_freq_div =5;
L502_StreamsDisable(L502_0, L502_STREAM_ALL_IN | L502_STREAM_ALL_OUT);
L502_StreamsEnable(L502_0, L502_STREAM_DIN);
L502_StreamsStart(L502_0);

05.03.2021 15:41:38
#11

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

Re: L-502 Получение данных с цифровых входов

У Вас отсутствует вызов L502_Configure(), по которому все установленные настройки собственно записываются в модуль. Должен быть после вызова всех функций L502_SetXXX до L502_StreamsStart() (положение L502_StreamsEnable()/L502_StreamsDisable() относительно Configure() не принципиально).

RomanK
09.03.2021 11:46:11
#12

Гость

Re: L-502 Получение данных с цифровых входов

Спасибо за ответ!
  Делитель заработал.

Контакты

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

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

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

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