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

Помогите с внешней синхронизацией для Е502

Вы не вошли.

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

14.11.2017 11:52:28
#1

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

Помогите с внешней синхронизацией для Е502

Здравствуйте.
Лет 10 используем в своем оборудовании Е14-440
Теперь понадобилось повысить точность, а также синхронизовать обработку сигнала с внешними событиями (это лазерная подгонка резисторов, нужна синхронизация измерений подгоняемого сопротивления с импульсами лазера).
Выбрали и купили на пробу экземпляр Е502 с процессором, в основном из-за возможности дописывать свои функции в ПО, как это делали для 440.
Требования к скорости обработки сигнала довольно жесткие, передавать данные в РС и обрабатывать их там не получается.
Помогите, плз, простым примером:
Канал АЦП единственный. Как задать параметры и запустить в режиме непрерывного сбора данных я, вроде, разобрался - там все стандартные функции. Как приделать свои команды управления - тоже.
То, что непонятно - как в фоновом режиме ожидать фронта сигнала на одном из цифровых входов (идеально в прерывании - задержка реакции не должна превышать единиц мкс), очистить буфер данных с АЦП, дождаться получения и считать заданное количество отсчетов АЦП во временный буфер. (Дальше простейшая обработка данных из этого буфера, принятие решения на вывод данных в цифровые выходы - это я уж сам), и снова ожидание фронта. В какое место исходников вписывать?
Спасибо.

14.11.2017 13:51:23
#2

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

Re: Помогите с внешней синхронизацией для Е502

Здравствуйте.
Самого по себе прерывания у Blackfin по фронту цифрового сигнала нет. То, что Вы хотите,  можно выполнить двумя разными способами на E502:
1. Использовать внешнюю синхронизацию запуска по фронту одного из сигналов SYN1 или SYN2. Эта штатная настройка модуля и в этом данные начнут приходить только после фронта. Но так как они после этого будут приходить всегда, то Вам нужно будут из blackfin после обработки нужного кол-ва данных остановить сбор и запустить снова для ожидания следующего фронта сигнала.
2. Помимо сбора АЦП включить и сбор данных с цифровых входов. Запустить сбор и изначально отбрасывать все данные АЦП. В функции анализа потока разбирать данные от цифровых входов и при обнаружении изменения состояния нужного бита просто обработать нужное Вам кол-во данных АЦП в потоке, следующее за этим изменением. После снова отбрасывать данные АЦП до обнаружения следующего фронта. В этом случае сбор перезапускать не нужно и можно использовать любой цифровой вход, но надо вручную отслеживать изменение входа.

14.11.2017 16:16:39
#3

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

Re: Помогите с внешней синхронизацией для Е502

Алексей, спасибо за ответ.
Меня бы устроил первый вариант - внешняя синхронизация по фронту SYNx.
Вопрос прежний - куда вписывать?
То есть, в обработчике пользовательских команд я этот режим запущу однократно. Но теперь мне нужно, чтобы он "самоподдерживался", пока я его не выключу. И это место - точно не обработчик команд пользователя - там мне нужно будет другие команды обрабатывать во время этого процесса.
Ну, и все-таки пример, если можно.
1. Запустить
2. Дождаться и считать во временный буфер.
3. Остановить и очистить буфер для следующего запуска.

Спасибо.

14.11.2017 16:55:27
#4

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

Re: Помогите с внешней синхронизацией для Е502

Обработка входных данных идет в usr_in_proc_data() в l502_user_process.c.
Соответственно, если Вы хотите обработать данные определенного размера и перезапустить сбор, то Вы можете просто ее реализовать так:

Если size меньше нужного, то вернуть 0, иначе выполняется Ваша обработка данных из data нужного размера. Если не нужно передавать эти данные в ПК, то можно сразу после обработки просто  вызвать streams_stop() и снова streams_start() (из l502_stream), чтобы остановить весь ввод, очистить буфер и снова запустить (но они перезапускают и передачу потока данных в ПК, поэтому если Вы еще этот блок передаете в ПК, то нужно сделать вариант streams_start и streams_stop без вызова функций остановки-запуска передачи потоков в ПК, которые начинаются с hdma_, и использовать их).

Также при начальной настройке модуля и запуске сбора стоит установить шаг прерывания для обработки данных равным (или кратной части) вашему размеру обрабатываемых данных, через sport_in_set_step_size()

14.11.2017 17:16:39
#5

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

Re: Помогите с внешней синхронизацией для Е502

Алексей, большое спасибо. В общих чертах понял. Буду разбираться.

21.12.2017 14:32:34
#6

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

Re: Помогите с внешней синхронизацией для Е502

Алексей, нужна помощь еще.
Модуль Е-502 запустился, программу внутри правлю, в этом смысле все ОК.
Мои изменения (условно) - для отладки - было несколько больше, но пока все лишнее убрал.
1. В функции usr_in_proc_data выбросил передачу в РС по ДМА вообще - она (передача) там мне не нужна - просто закомментировал.
2. В функции usr_in_proc_data вставил запись данных (3 первых слова) в некие ячейки памяти Arr, примерно:
int32_t i;
for ( i = 0; i < 2; i++ ) Arr [ i ] = *data++;
  streams_stop ();
  stream_in_buf_free ( size );
  streams_start ();
  return ( size );
То есть пока вся обработка сводится к этому - только для разборок с непонятками.
3. Добавил пользовательскую команду, которая пересылает Arr в РС.

В программе на РС примерная инициализация настроек:
   X502_SetLChannelCount ( FE502Hnd, 1 ); // Один лог канал
   X502_SetLChannel ( FE502Hnd, 0, 0, X502_LCH_MODE_COMM, 0, 2 ); // на физич канал 1
   X502_SetSyncMode ( FE502Hnd, X502_SYNC_INTERNAL );
   X502_SetSyncStartMode ( FE502Hnd, X502_SYNC_INTERNAL );
   X502_SetRefFreq ( FE502Hnd, X502_REF_FREQ_2000KHZ );
   X502_SetAdcFreqDivider ( FE502Hnd, 2 );
   X502_SetAdcInterframeDelay ( FE502Hnd, 0 );
   X502_Configure ( FE502Hnd, info );
    X502_StreamsStop ( FE502Hnd );
    X502_SetStreamBufSize ( FE502Hnd, X502_STREAM_CH_IN, 10000 );
    X502_StreamsDisable ( FE502Hnd, X502_STREAM_ADC or X502_STREAM_DIN or X502_STREAM_DAC1 or X502_STREAM_DAC2 or X502_STREAM_DOUT );
    X502_SetStreamStep ( FE502Hnd, X502_STREAM_CH_IN, 150 ); // На самом деле здесь переменная примерно от 3 до 500
    X502_StreamsEnable ( FE502Hnd, X502_STREAM_ADC );
    X502_Configure ( FE502Hnd, info );
    X502_StreamsStart ( FE502Hnd );

То есть я должен видеть переданные на РС данные в виде 0xD0xxxxxx - с первого физ канала, с общей землей. Я их и вижу, но не всегда. С вероятностью примерно 30% я вижу абстракцию типа 0xEBxxxxxx  0x5Bxxxxxx  0xD3xxxxxx, причем стабильно именно такие наборы (в следующем запуске программы, правда, могут быть и другие, но похожие). По косвенным данным в процессе отладки таких странных данных может быть либо часть буфера (стабильная по длине для данных настроек шага буфера), либо вообще все.
ЧТО ЭТО???????????????????????
При всем при том LGraph вроде работает нормально (без моих дописок в прогу, естественно).

21.12.2017 19:53:25
#7

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

Re: Помогите с внешней синхронизацией для Е502

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

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

Не до конца понял про часть буфера, я как вроде понял, что передаете всегда 3 слова?
Вы формируете и передаете эти 3 слова сейчас однократно?

В принципе я посмотрел, может вызывать stream_start() и stream_stop() из usr_in_proc_data() не совсем корректно, т.к. функция вызывается из середины обработки данных потока и ее результат используется для обновления позиции в буфере, хотя в реальности у Вас уже будет перезапущен сбор. Более корректно будет например ввести глобальный флаг запроса перезапуска сбора, который устанавливать в usr_in_proc_data, когда данные собраны, а проверять в конце stream_proc и если он установлен - сбрасывать его и делать streams_stop (); streans_start(), хотя не уверен, что это связано с Вашей проблемой.

22.12.2017 08:47:39
#8

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

Re: Помогите с внешней синхронизацией для Е502

Здравствуйте.
Не обращайте внимание на передачу наверх. Она работает.
Что мне нужно в принципе - в первом сообщении в ветке.
Я должен запускать съем N данных (это шаг буфера), последние M из них усреднить и принять некое решение (обнулить DO1 или не трогать). Дальше опять запустить сбор. В принципе, в некоторых случаях этот сбор запускается от SYN1, в других - от внутренней синхронизации - сейчас пока только от внутренней. А результат усреднения может быть передан в РС с помощью пользовательской команды.
Я это написал и получил совершенно непонятный результат. Результат усреднения никак не похож на реальные данные. То, что описано в последнем моем сообщении - результат 2-х дней евпатории - было выброшена вся реальная обработка и написана просто передача трех элементов наверх.
Еще раз. Предельно простая задача. Нужно запустить сбор (ТОЛЬКО АЦП, только канал 1 с общей землей) N (несколько десятков) отсчетов с частотой 1МГц, остановить сбор после их получения, обработать, запустить сбор снова.
Что я делаю не так? Откуда там данные от других каналов? и даже пользовательские????

22.12.2017 15:52:09
#9

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

Re: Помогите с внешней синхронизацией для Е502

Принимать от ПЛИС Blackfin такие данные при таких настройках не должен, и т.к. сбор идет в изначальной прошивке нормально, то и не принимает. Скорее всего это случается из-за того что в качестве данных ошибочно передается мусор, а не реально пришедшие данные.

Соответственно нужно определить какое изменение штатной прошивки к этому приводит. Также насколько я понимаю у Вас эти 3 слова постоянно обновляются, т.к. сбор перезапускается и эта функция вызывается снова и снова, перезаписывая один и те же данные.

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

22.12.2017 17:33:20
#10

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

Re: Помогите с внешней синхронизацией для Е502

Спасибо.
Буду пробовать с глобальным флагом.

24.12.2017 10:44:33
#11

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

Re: Помогите с внешней синхронизацией для Е502

Еще раз спасибо - так заработало.

24.12.2017 11:11:03
#12

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

Re: Помогите с внешней синхронизацией для Е502

Если можно, подскажите еще немного.
Мне нужно передать из программы на РС в нижнюю программу некоторую величину в ДИСКРЕТАХ (в формате 24 бита, так у вас это там выглядит), соответствующую заданной величине в ВОЛЬТАХ.
Как выглядит ФОРМУЛА такого перевода?
Спасибо.

24.12.2017 16:56:47
#13

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

Re: Помогите с внешней синхронизацией для Е502

Если речь идет про АЦП, то оно калибруется так, что код X502_ADC_SCALE_CODE_MAX (6000000) соответствует напряжению диапазона (если используете диапазон +-10В, то - 10 В), т.е. код по вольтам получается как code = (int) (V * X502_ADC_SCALE_CODE_MAX  / VR), где V - напряжение, которое нужно перевести в код, а VR - напряжение используемого диапазона.

24.12.2017 19:47:32
#14

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

Re: Помогите с внешней синхронизацией для Е502

Спасибо, то что нужно.

27.12.2017 10:57:11
#15

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

Re: Помогите с внешней синхронизацией для Е502

Запутался в коэффициентах с этой вашей растяжкой до 6000000.
Нужно произвести собственную калибровку АЦП.
1. Сбрасываю коэффициенты для данной шкалы в 1 (наклон) и 0 (смещение). Работает.
2. Подаю напряжение V1 (близко к 0В).  Запоминаю точное значение напряжение и показания АЦП ( N1).
3. Подаю напряжение V2 (близко к максимуму шкалы).  Запоминаю точное значение напряжение и показания АЦП (N2).
Наклон понятно. Но как посчитать СМЕЩЕНИЕ? Не понимаю, когда вы его там внутри применяете - до растяжки или после.
Спасибо.

27.12.2017 12:57:39
#16

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

Re: Помогите с внешней синхронизацией для Е502

Если Вы устанавливаете коэффициенты с верхнего уровня с помощью X502_SetAdcCoef(), то результирующий код вычисляется (как указанов в описании функции) как (val - offs) * k, где val - некалиброванный код с АЦП, т.е. до растяжения. Если записываете напрямую в регистры ПЛИС, то там меняется знак смещения (т.е. функция записывает в регистр ПЛИС -offs, а внутри ПЛИС используется сложение в формуле).

27.12.2017 13:15:29
#17

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

Re: Помогите с внешней синхронизацией для Е502

Да, я использую X502_SetAdcCoef.
Описание на нее я читал.  Но не понял.
Я же вижу то, что вы выдаете в функции X502_GetAdcCoef. K  там близок к 1. Таким образом, умножая полученные с АЦП данные на примерно 1, нельзя получить размах в 6000000.
Собственно вопрос отсюда. Нерастянутые данные я получить не могу. Имею только растянутые. как они из нерастянутых получаются?
Еще раз - как, имея данные с АЦП в диапазоне +-6000000 получить число для задания смещения в X502_SetAdcCoef?

27.12.2017 13:43:13
#18

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

Re: Помогите с внешней синхронизацией для Е502

Не до конца понял сперва, что имеете ввиду под "растянутыми". Данные с АЦП перед калибровкой переводятся в 24-битный код (добавляется нулевой байт справа), а затем уже  все операции выполняются в 24-битной арифметике.

27.12.2017 13:48:45
#19

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

Re: Помогите с внешней синхронизацией для Е502

Т.е. смещение - это 24-битный "растянутый" код

28.12.2017 11:57:56
#20

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

Re: Помогите с внешней синхронизацией для Е502

Спасибо. Я понял.
Не хватало вот этой фразы  "добавляется нулевой байт справа"
Заработало.

Контакты

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

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

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

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