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

Е502 Синхронный вывод

Вы не вошли.

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

Татьяна НИИИ1
29.08.2018 14:05:22
#1

Гость

Е502 Синхронный вывод

Добрый день.
Используются модули E-502-P-EU-D №2Т222478 и E-502-P-EU-D №2Т222510
Задача: обеспечить синхронный вывод данных с ЦАП двух модулей. Для  аппаратной синхронизации витыми парами были соединены входы Start_Out – Start_In и  Conf_Out – Conf_In. Длина провода 30см, питание модулей от аккумулятора 12В. Выводимый сигнал фазоманипулированный сигнал прямоугольной формы амплитудой 4 В. В ведущем модуле задействованы 2 выхода ЦАП, в ведомом только ЦАП1. Частота дискретизации сигналов 500 кГц. При запуске вывода на ведомом модуле происходит смещение начало вывода сигнала с переменной длительностью. При этом визуально наблюдается изменение длительности смещения сигнала ведомого модуля относительно сигнала ведущего.

29.08.2018 14:23:10
#2

Инженер-электронщик
Откуда: "Л Кард"
Здесь с 21.04.2014
Сообщений: 4,597

Re: Е502 Синхронный вывод

Здравствуйте.
Ведомый запускаете заранее? Ведомый при этом должен ждать сигнала синхронизации, который возникнет аппаратно после старта ведущего. Иначе, действительно синхронизация между ними разойдётся...
...Либо не сконфигурировали у ведущего синхровыходы "ведущий - с трансляцией на выход", а у ведомого - "ведомый, на вход".

Татьяна НИИИ1
29.08.2018 14:52:56
#3

Гость

Re: Е502 Синхронный вывод

В соответствии с библиотеками L-Card была написана следующая процедура:
hnd1 - ведущий, hnd2 - ведомый.
        PrepareDAC(hnd1, buf1, buf2, bufSize, sampleRate, DAC_1);
    PrepareDAC(hnd2, buf3, NULL, bufSize, sampleRate, DAC_2);

    X502_StreamsStart(hnd2);
    X502_StreamsStart(hnd1);

void __fastcall e502_api::PrepareDAC(t_x502_hnd &_hnd, double *buf1, double *buf2, uint32_t bufSize, double sampleRate, NumberDAC dac)
{
    int32_t err = X502_ERR_OK;
    double f_dac = sampleRate;

    X502_StreamsStop(_hnd);        // принудительная остановка ЦАПа

    if (err == X502_ERR_OK)
        err = X502_SetSyncMode(_hnd, X502_SYNC_INTERNAL);

    if(dac == DAC_2)
        if (err == X502_ERR_OK)
            err = X502_SetSyncStartMode(_hnd, X502_SYNC_EXTERNAL_MASTER);

    if (err == X502_ERR_OK)
        err = X502_SetRefFreq(_hnd, X502_REF_FREQ_2000KHZ);

    if (err == X502_ERR_OK)
        err = X502_SetOutFreq(_hnd, &f_dac);

    if (err == X502_ERR_OK) {
        uint32_t streams;

        switch(dac) {
            case DAC_1:    streams = X502_STREAM_DAC1 | X502_STREAM_DAC2;
                            break;
            case DAC_2:  streams = X502_STREAM_DAC1;
                            break;
        }
        err = X502_StreamsEnable(_hnd, streams);
    }

    /* Записываем настройки в модуль */
    if (err == X502_ERR_OK)
        err = X502_Configure(_hnd, 0);

    uint32_t bufCycle;
    uint32_t *out_buf;
    switch(dac) {
        case DAC_1: out_buf = new uint32_t[2 * bufSize];
                        bufCycle = 2 * bufSize;
                        break;
        case DAC_2:    out_buf = new uint32_t[bufSize];
                        bufCycle = bufSize;
                        break;
   }

    if (err == X502_ERR_OK)
        err = X502_OutCycleLoadStart(_hnd, bufCycle);

    if (err == X502_ERR_OK)
        switch(dac)    //выбор канала DAC для буфера из wav файла
        {
            case 0:     err = X502_PrepareData(_hnd, buf1, buf2, NULL, bufSize, X502_DAC_FLAGS_VOLT, out_buf);
                        break;
            case 1:  err = X502_PrepareData(_hnd, buf1, NULL, NULL, bufSize, X502_DAC_FLAGS_VOLT, out_buf);
                        break;
        }
    //err = X502_PrepareData(hnd, buf1, NULL, buf2, bufSize, X502_DAC_FLAGS_VOLT, out_buf);

    if (err == X502_ERR_OK)
        err = X502_Send(_hnd, out_buf, bufCycle, 1000);

    if (err >= X502_ERR_OK)
        X502_OutCycleSetup(_hnd, X502_OUT_CYCLE_FLAGS_WAIT_DONE);

    delete[] out_buf;
}

29.08.2018 21:13:31
#4

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

Re: Е502 Синхронный вывод

Здравствуйте.
1. Какого порядка времена задержек сигналов между модулями наблюдаете (макс. задержку)? Каким образом фиксируете эту задержку? Задержку наблюдаете именно в начале сигнала?
2. Проверьте версии прошивок ПЛИС и Контроллера (доступны как через api в информации о устройстве, так и можно посмотреть через демонстрационной программе lqmeasstudio (https://bitbucket.org/lcard/lqmeasstudio/downloads). Если не последние (0.14 и 1.0.19 соответственно), обновите их (для обновления прошивки плис нужно запустить tools\lxfw-update\e502-fpga-update-all.bat из последнего SDK, а прошивку ARM можно обновить через lqmeasstudio, скачав файл отсюда http://www.lcard.ru/download/e502-m4.bin). Как минимум версия прошивки ПЛИС не должна быть меньше 0.11.
   Какая при этом версия прошивки PLDA?
3. Если проблема остается, то можно провести эксперимент на программе lqmeasstudio, задав точно такие же параметры, как у Вас, только установив доступный там стандартный сигнал, одинаковый на всех каналах. Это поможет понять, проблема в Вашей программе или в чем-то другом (представленный код выглядит правильным, но все же это не полная программа и лучше убедится явно). Я на этой программе производил эксперимент с установкой как синусоидального сигнала, так и импульса на тех же каналах ЦАП, что у Вас и с подключением их на АЦП одного модуля. Все сигналы всех модулей начинали генерироваться одновременно (в пределах одного периода дискретизации) и в первом кадре начало всех сигналов совпадало (далее уже шло расхождение из-за разных генераторов модулей, т.к. у Вас частота используется внутренняя в каждом модуле).
4. Точно это не проблема, связанная с оставшимся уровнем с предыдущей генерации (т.к. при останове на ЦАП остается значение, которое было в момент останова и сохранится до вывода первого отсчета следующего запуска и если оно будет такое же, то начало генерации будет не видно на сигнале). Можно после останова генерации вывести асинхронно начальное значение, отличное от первой точки сигналов, чтобы всегда явно видеть начало генерации (в lqmeasstudio это можно сделать с помощью параметра "предустановка" в настройках сигнала, выбрав "указанное значение").

Отредактировано Алексей L Card (29.08.2018 21:26:33)

30.08.2018 11:12:55
#5

Инженер-электронщик
Откуда: "Л Кард"
Здесь с 21.04.2014
Сообщений: 4,597

Re: Е502 Синхронный вывод

Если используется только внутренняя частота преобразования  АЦП/ЦАП в каждом из модулей, то это значит, что частоты преобразования в каждом модуле некогерентны и синхронизация по линиям CONV_OUT - CONV_IN реально не используется. В таком режиме (с синхронизацией только по сигналам START) привязка будет только на момент старта (с точностью до периода между ведущим и ведомы из-за несогласованности начальной фазы частот преобразования), а в остальное время после старта будет ещё сказываться разбег частот преобразований, который можно оценить, как максимум, 100 ppm, но наверняка - не больше  50 ppm при комнатной температуре.

30.08.2018 13:33:46
#6

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

Re: Е502 Синхронный вывод

Прошивки ПЛИС и Контроллера были изменены, но прошивка  PLDA осталась равной 0.
При старте программы сигнал на выходах ведущего и ведомого ЦАПа строго синхронизированы, на втором цикле смещение где-то 1,5 микросекунды, на последующих циклах оно нарастает. Подаем один и тот же сигнал на все выходы ЦАП. Во втором модуле используется частота от внешнего мастера по разъему межмодульной синхронизации
if(dac == DAC_2)
        if (err == X502_ERR_OK)
            err = X502_SetSyncStartMode(_hnd, X502_SYNC_EXTERNAL_MASTER);

30.08.2018 13:48:10
#7

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

Re: Е502 Синхронный вывод

Эта функция задает как раз только режим синхронизации старта (и работает как Вы и написали)
Для использования и частоты от внешнего мастера нужно вызывать для ведомого и X502_SetSyncMode также с параметром X502_SYNC_EXTERNAL_MASTER (а не INTERNAL как у Вас)

Только при этом при использовании внешней опорной частоты для корректной работы она должна быть 1.5 МГц, т.е. придется сделать X502_SetRefFreq(_hnd, X502_REF_FREQ_1500KHZ).

30.08.2018 14:36:20
#8

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

Re: Е502 Синхронный вывод

Я вызвала функцию  X502_SetSyncMode(_hnd, X502_SYNC_EXTERNAL_MASTER) для ведомого. и установила 1,5МГц частоту. Теперь сигнал синхронный но с ведомого ЦАПа смещен на 2,5 микросекунды. будто бы раньше начинает работать.
А еще в руководстве написано, что для модуля E502 вывод на ЦАП при опорной частоте 1.5 МГц работает только для версии прошивки PLDA 1 или выше. а у нас получается,что версия прошивки 0.

30.08.2018 15:05:27
#9

Инженер-электронщик
Откуда: "Л Кард"
Здесь с 21.04.2014
Сообщений: 4,597

Re: Е502 Синхронный вывод

Татьяна НИИИ пишет:

А еще в руководстве написано, что для модуля E502 вывод на ЦАП при опорной частоте 1.5 МГц работает только для версии прошивки PLDA 1 или выше. а у нас получается,что версия прошивки 0.

Для перешивки этих CPLD необходимо передать модули в L-Card. Дистанционно не получится.

30.08.2018 16:20:08
#10

Инженер-электронщик
Откуда: "Л Кард"
Здесь с 21.04.2014
Сообщений: 4,597

Re: Е502 Синхронный вывод

@ Татьяна, а какая точность синхронизации по времени Вам нужна между двумя каналами ЦАП в разных модулях? 
Если Ваши требования будут реалистичны, с точки зрения возможностей проекта E-502, то мы готовы сначала у себя проверить именно этот случай и сообщить Вам результаты по точности синхронизации перед тем, как что-то перешивать.

03.09.2018 14:39:12
#11

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

Re: Е502 Синхронный вывод

спасибо большое. Все заработало с опорной частотой 2МГц.

Контакты

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

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

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

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