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

Разрывы при выдаче синусоиды через L-502

Вы не вошли.

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

Nop
05.10.2020 22:11:29
#1

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

Разрывы при выдаче синусоиды через L-502

Здравствуйте!
Карта L-502 с прошивкой 0.4 (и 0.10)
Есть задача принимать аналоговый сигнал и DIN и выдавать этот же сигнал через два ЦАП'а.
Оцифровка входа 1МГц (АЦП и DIN), выход 1МГц (только ЦАП). Настроено прерывание 2000 раз в секунду, соответственно,
использую выходной буфер в 1000 слов. При приеме АЦП значение преобразую в 16-ти битное и записываю попеременно
для ЦАП1 и ЦАП2 в выходной буфер.
И при этом получаю разрывы при выдаче. Ситуация исправляется, если выдавать 1000 - 2 слова, но это же не дело?

Так это выглядит (желтым цветом принимаемый сигнал, зеленым - ЦАП1, отключен ЦАП2):

Скрытый текст

sin.png

Nop
05.10.2020 22:17:38
#2

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

Re: Разрывы при выдаче синусоиды через L-502

Nop пишет:

если выдавать 1000 - 2 слова

Ошибся, 500 - 2 конечно же для этой настройки. Но если прерывать 1000 раз в секунду, та же картина.

07.10.2020 16:59:59
#3

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

Re: Разрывы при выдаче синусоиды через L-502

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

Не совсем понятно, речь идет о написании данного алгоритма в программе для сигнального процессора BlackFin?
Можете привести куски кода обработки входных данных и управления выводом, или прислать на почту минимальный вариант проекта прошивки, на котором проявляется проблема.
Какой масштаб времени в клетке в приведенной осциллограмме?

Nop
09.10.2020 22:50:40
#4

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

Re: Разрывы при выдаче синусоиды через L-502

Архив послал на почту support@lcard.ru
Прошивка создана на основе вашей штатной. В архиве только ваши измененные и мои файлы.
Запускается подачей команды L502_BF_CMD_CODE_USER + 1 с PC
Масштаб 100 микросекунд

14.10.2020 21:24:06
#5

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

Re: Разрывы при выдаче синусоиды через L-502

Здравствуйте.
Я посмотрел Ваш код. Из найденных проблем:
1. Массивы adcArray и dacArray у Вас объявлены внутри функции, как локальные переменные, которые создаются на стеке. Соответственно при выходе из функции они могут быть перезаписаны, а функция sport_tx_start_req только запускает dma на вывод, реально передача выполняется в фоне (и по ее завершению вызывается соответствующая функция). У Вас там есть указание секции, но по крайней мере на той версии VisualDSP, что я собирал, этот атрибут никак не влиял на переменные на стеке (прошивка бинарно такая же как и без секций). Таким образом, нужно либо их объявить вне функций, либо указать static, тогда и секции явно указывать не нужно.
2. в присланном файле в buildDacOutputArray передается размер OUT_BUF_SIZE, хотя в функции этот параметр - размер данных АЦП, который в 2 раза должен быть меньше для Вашего случая. Таким образом, Вы обрабатываете в два раза больше данных выходя за границу массива и что самое худшее, заполняете в выходной массив в 2 раза больше данных, что может повредить какие-то переменные, расположенные после массива dacArray.
3. Т.к. функция sport_tx_start_req только запускает DMA, но сам буфер во время DMA используется, то пока его передача не будет полностью завершена, буфер использовать нельзя. Т.к. у Вас будет небольшая задержка от запуска DMA до момента собственно передачи данных в SPORT процессора, т.е. вывод идет с небольшим смещением по времени, то на момент следующего входа в функцию usr_in_proc_data может еще использоваться последние слова буфера. Чтобы это исключить я сделал двойную буферизацию - обявил dacArray[2][OUT_BUFF_SIZE_ALL] и ввел переменную номера используемого буфера dacArrayNum (также static, чтобы сохраняла значения между вызовами), изначально равную 0, и в функции buildDacOutputArray и sport_tx_start_req передавал dacArray[dacArrayNum] и после sport_tx_start_req делал переход к другой половинке dacArrayNum ^= 1.

В принципе после этих изменений измеренный сигнал стал без каких-либо артефактов. Попробуйте у себя, решится ли проблема.

Nop
16.10.2020 02:59:33
#6

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

Re: Разрывы при выдаче синусоиды через L-502

Здравствуйте! Спасибо за ответ, действительно помогло!
Описанные Вами особенности работы функции sport_tx_start_req были для меня не очевидны.

С пунктом 2 несогласен, т.к. за раз принимаю 500(ЦАП) + 500(DIN) слов, и при этом OUT_BUF_SIZE=1000000/2000=500
В выдаче я формирую две синусоиды, поэтому должен выдавать OUT_BUFF_SIZE * 2= 1000 слов
Что я и делаю.
Вроде бы, все правильно...

16.10.2020 10:32:20
#7

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

Re: Разрывы при выдаче синусоиды через L-502

Да, по второму пункту согласен, не обратил внимание, что у Вас две разные константы OUT_BUF_SIZE и OUT_BUF_SIZE_ALL и в первом вызове используется первая, а во втором вторая.

Контакты

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

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

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

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