|
- Участник
- Здесь с 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 разрешить только поток АЦП, то прерывания все равно происходят.
|
|
- Сотрудник "Л Кард"
- Здесь с 17.04.2014
- Сообщений: 1,292
|
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 слов в секунду, что близко к Вашему замеру.
|
|
- Участник
- Здесь с 24.01.2018
- Сообщений: 9
|
Re: L-502 Получение данных с цифровых входов
Спасибо за ответ! А разве вызов stream_enable( L502_STREAM_DIN ); не запрещает все, кроме потока DIN?
|
|
- Сотрудник "Л Кард"
- Здесь с 17.04.2014
- Сообщений: 1,292
|
Re: L-502 Получение данных с цифровых входов
Нет, он добавляет DIN к разрешенным потокам, т.е. те что были разрешены до вызова останутся разрешенными, если их явно не запретить.
|
|
|
Re: L-502 Получение данных с цифровых входов
Купили вашу карту L502 для сбора цифровых данных. Проект очень ответственный и не дешевый. В процессе отладки обнаружились странности по настройке синхронного ввода данных. Особенно, когда работа с картой вырубает "операционку" (Windows 7). Судя по тому что прочитал выше, могу выразить сожаления из-за потерянного времени. Сопоставляя с написанным, а именно то, что нужно обязательно отключить ненужные потоки, чтобы они не мешали используемым, вижу , что у вас этого в описании нет! Также там не упоминается никак, какие из потоков включены по умолчанию! Чтобы все сразу вразнобой работало..... Извините, но обычно так не делают! Пожалуйста доработайте хотя бы документацию!
|
|
|
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 к исходному и требуется перезагрузка компьютера. В чем причина?
|
|
- Сотрудник "Л Кард"
- Здесь с 17.04.2014
- Сообщений: 1,292
|
Re: L-502 Получение данных с цифровых входов
Честно говоря, что-либо понять из Ваших сообщений достаточно сложно. Если предположить, что Вы используете модуль в режиме с сигнальным процессором и как-то изменяете штатную прошивку, то в ней действительно по умолчанию разрешен сбор данных с АЦП и если Вам он не требуется, то его нужно запретить (либо вызовом stream_disable(L502_STREAM_ADC) на уровне BlackFin (или изменение начального состояния g_streams в l502_streams.c, либо через X502_StreamsDisable() на верхнем уровне), как это уже обсуждалось в данной теме. Если ввод с АЦП не разрешен, то точек на ввод понятно будет значительно больше, а ProcessData из всех введенных данных сохранит в din_data только данные, относящиеся к цифровому вводу, а данные АЦП в adc_data (или отбросит, если нулевой указатель), что может объяснять уменьшение данных на выходе. В режиме с сигнальным процессором (в отличие от работы без него) открытие модуля само по себе не приводит к переводу модуля в начальное состояние или останову сбора данных, т.к. в общем случае это может быть неприемлемо, т.к. для своей прошивки части клиентов может быть необходимо, чтобы модуль выполнял специальные функции и при отключении ПО верхнего уровня и последующего подключение модуль бы не сбивало, но при необходимости на верхнем уровне можно узнать, запущен ли сбор данных и остановить его и перезаписать прошивки сигнального процессора, если это необходимо. В общем случае написание встроенного ПО внутри модуля дает больше возможностей пользователю, но и более сложное и дает пользователю больше возможностей ввести модуль в некорректно работающий режим.
|
|
|
Re: L-502 Получение данных с цифровых входов
Спасибо за ответ! Действительно забыл указать подробности. BlackFin_а нет, АЦП нет )) Плата работает чисто на цифровой ввод. Пришлось потратить целый день чтобы выяснить простую вещь: либо у вас не работает L502_SetDinFreq(), либо его описание не соответствует тому как оно понимается обычным пользователем. Я (и не только я) ) понимаем из описания так, что это должен быть делитель, который делит тактовую частоту 2Мгц (или 1,5) и уже на пониженной тактовой снимаются состояния цифровых входов и с этой пониженной частотой они накапливаются в L502 и затем уже поступают в DMA со своими интервалами и прочими особенностями. Похоже, что это не так. Если нет, то отлаживать систему на максимальных скоростях очень неудобно! Вначале я пытался именно это и проверить стандартными под отладчиком методами. К сожалению, отладка "в лоб" под QT внесла немало непонятного и пришлось замерить в длительных циклах время и количество считываемых слов в секунду. Стало понятно что при всех раскладах это 2*106 отсчетов с точностью таймера. Попытка переставлять L502_SetDinFreq() до или после других настроек и команд результата не дала. Кроме "зависаний" ))
|
|
- Сотрудник "Л Кард"
- Здесь с 17.04.2014
- Сообщений: 1,292
|
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).
|
|
|
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);
|
|
- Сотрудник "Л Кард"
- Здесь с 17.04.2014
- Сообщений: 1,292
|
Re: L-502 Получение данных с цифровых входов
У Вас отсутствует вызов L502_Configure(), по которому все установленные настройки собственно записываются в модуль. Должен быть после вызова всех функций L502_SetXXX до L502_StreamsStart() (положение L502_StreamsEnable()/L502_StreamsDisable() относительно Configure() не принципиально).
|
|
|
Re: L-502 Получение данных с цифровых входов
Спасибо за ответ! Делитель заработал.
|