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

Форум

Вы не вошли.

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

#1 Re: Техническая поддержка » E-502 Циклический вывод » 12.04.2018 07:59:11

Нет, функция X502_SetOutFreq() не помогает при циклическом выводе.
В описании это описано так:

@brief Установка частоты синхронного вывода.

Вот поэтому и возник вопрос, работает ли установка частоты именно при циклическом выводе.
В качестве примера:

void __fastcall TForm1::btnStartSyncDacClick(TObject *Sender) {
   btnStopSyncDacClick(this);
	try {
		lastErr = setupParams();
		//Установка значения внутренней опорной частоты синхронизации  2 МГц
		lastErr = X502_SetRefFreq(hnd, X502_REF_FREQ_2000KHZ);
		double f_dout=StrToFloat(lbeFrOutDac->Text);
		uint32_t result_freq_div=0;
		//Исходя из заданных параметров, функция подбирает делитель частоты синхронного
	//вывода так, чтобы полученная частота была наиболее близка к указанной,
	//и возвращает полученное значение частоты.
		lastErr = X502_CalcOutFreq(X502_REF_FREQ_2000KHZ, &f_dout, &result_freq_div);
		lbeFrOutDac->Text=FloatToStrF(f_dout, ffFixed, 8, 2);
		//MessageDlg("Частота вывода: " + FloatToStrF(f_dout, ffFixed, 8, 2), mtWarning, TMsgDlgButtons() << mbOK, NULL);
		//if (err == X502_ERR_OK)
		lastErr = X502_Configure(hnd, 0);
		// Установка начальных значений для ЦАП
		double uBegin = 0;
		X502_AsyncOutDac(hnd, X502_DAC_CH1, uBegin, X502_DAC_FLAGS_VOLT | X502_DAC_FLAGS_CALIBR);
		if (lastErr != X502_ERR_OK) {
			MessageDlg("Ошибка настройки параметров платы: " + String(X502_GetErrorString(lastErr)), mtError, TMsgDlgButtons() << mbOK, NULL);
		}
		// Разрешение нужных синхронных потоков (каналы ЦАП, цифровые выходы) с помощью
		if (lastErr == X502_ERR_OK) {
			lastErr = X502_StreamsEnable(hnd, X502_STREAM_DAC1);
            double fG =0;
			lastErr = X502_GetRefFreqValue(hnd, &fG);
			//Установка частоты синхронного вывода
			lastErr =X502_SetOutFreq(hnd,&f_dout);
			// Выделение циклического буфера указанного размера с помощью
			int frec = StrToInt(lbeFcDacOut->Text);
			// int fSin=50;
			int sz = f_dout / frec;
			// шаг отчета
			double stepM = (double)2 * M_PI / sz;
			double* buf = new double[sz];
			uint32_t* bufOut = new uint32_t[sz];
			for (int i = 0; i < sz; i++) {
				buf[i] = 3 * sin((double)i * stepM);
			}
			initChart(chartTst, 1, false);
			chartTst->LeftAxis->Maximum = 5;
			chartTst->LeftAxis->Minimum = -5;
			chartTst->BottomAxis->Maximum = sz + 1;
			double* bufChart = new double[sz+1];
			for (int i = 0; i < sz; i++) {
			  bufChart[i]=buf[i];
			}
			bufChart[sz]=0;
			chartTst->Series[0]->AddArray(bufChart, sz);
			chartTst->Refresh();
			delete bufChart;
			// Подготовка данных для вывода в модуль.
			lastErr = X502_PrepareData(hnd, buf, NULL, NULL, sz, X502_DAC_FLAGS_VOLT | X502_DAC_FLAGS_CALIBR, bufOut);
			lastErr = X502_OutCycleLoadStart(hnd, sz);
			// Загрузка данных указанного размера для циклического вывода с помощью одного или нескольких вызовов
			int tout = 1;
			lastErr = X502_Send(hnd, bufOut, sz, tout);
			// Сделать загруженный сигнал активным с помощью   с флагом X502_OUT_CYCLE_FLAGS_WAIT_DONE.
			lastErr = X502_OutCycleSetup(hnd, X502_OUT_CYCLE_FLAGS_WAIT_DONE);
			// Запустить синхронный ввод-вывод через
			lastErr = X502_StreamsStart(hnd);
			delete buf;
			delete bufOut;

		}
		else {
			//
		}

	}
	catch (Exception *ex) {
		TLog::ErrFullSaveLog(ex);
		// AnsiString msg
		// programSettings.colorMSG = programSettings.colorBrak;
		// TExtFunction::UpdateStatusBar(programSettings.gsStatusBar, strStatus, _msg, programSettings.colorMSG);
		// TExtFunction::UpdateLabelStatus(programSettings.gsStatusLabel, strStatus, _msg, programSettings.colorMSG);
		// MessageDlg(ex->Message, mtError, TMsgDlgButtons() << mbOK, NULL);
	}
}

#2 Техническая поддержка » E-502 Циклический вывод » 11.04.2018 12:44:49

stix_s
Ответов: 3

Добрый день, при циклическом выводе на ЦАП частота вывода меняется при помощи функции
       

lastErr = X502_CalcOutFreq(X502_REF_FREQ_2000KHZ, &f_dout, &result_freq_div)

?
Складывается впечатление, что она всегда равна половине опорной частоты.

#3 Re: Техническая поддержка » X502 в отчетах АЦП » 02.04.2018 13:05:06

Гарманов Александр пишет:

Здравствуйте. В FPGA x-502 присутствует 24-битная  внутренняя целочисленная арифметика линейной коррекции данных (использующая калибровочные коэффициенты), а также присутствует  арифметика усреднения данных. Всё это расширяет формат представления данных АЦП, что повышает разрешающую способность преобразователя, например, при применении усреднения. В любом случае, от x-502 приходят на верхний программный уровень 24-битные скорректированные данные АЦП, упакованные в 32-битное слово (с добавлением индексной части).

Ясно, спасибо.
Индексная часть - это старшие 8 разрядов 32-битного слова?
Какую информацию содержит индексная часть?
PS

#4 Re: Техническая поддержка » X502 в отчетах АЦП » 02.04.2018 13:04:27

Гарманов Александр пишет:

Здравствуйте. В FPGA x-502 присутствует 24-битная  внутренняя целочисленная арифметика линейной коррекции данных (использующая калибровочные коэффициенты), а также присутствует  арифметика усреднения данных. Всё это расширяет формат представления данных АЦП, что повышает разрешающую способность преобразователя, например, при применении усреднения. В любом случае, от x-502 приходят на верхний программный уровень 24-битные скорректированные данные АЦП, упакованные в 32-битное слово (с добавлением индексной части).

#5 Техническая поддержка » X502 в отчетах АЦП » 02.04.2018 09:21:09

stix_s
Ответов: 4

добрый день
Вопрос по карте L502
Почему при 16-разрядной АЦП диапазон отчетов вместо максимального 65536
в функции

int32_t X502_ProcessAdcData (t_x502_hnd hnd, const uint32_t
*src, double *dest, uint32_t *size, uint32_t flags)

Если данные АЦП не переводятся в Вольты и при этом не были изменены
заводские калибровочные коэффициенты, то возвращенное значение равное
X502_ADC_SCALE_CODE_MAX соответствует напряжению равному максимальному для используемого диапазона

X502_ADC_SCALE_CODE_MAX = 6 000 000
Чем вызвана столь большая величина?

#7 Re: Техническая поддержка » E502 установка частоты сбора » 20.11.2017 07:35:12

Код - слегка доработанный ваш тестовый пример, который с драйверами идетx 502_example

#9 Re: Техническая поддержка » E502 установка частоты сбора » 20.11.2017 07:31:56

дополнительно

int err = -99;
    AnsiString msg = "";
    // 4.3.4.13 Установка значения внутренней опорной частоты синхронизации.
    int frefInt = StrToFloat(ledFref->Text) * 1000;
    // frefInt=2000000
    err = X502_SetRefFreq(hnd, frefInt);
    msg = X502_GetErrorString(err);
    double frefDbl = 0;
    // 4.3.4.5 Установка делителя частоты сбора для АЦП div=2
    int divADC = StrToInt(ledDivFref->Text);
    err = X502_SetAdcFreqDivider(hnd, divADC);
    msg = X502_GetErrorString(err);
    // 4.3.4.6 Установка значения межкадровой задержки для АЦП. delay=1980
    int delayADC = StrToInt(ledDelayADC->Text);
    err = X502_SetAdcInterframeDelay(hnd, delayADC);
    msg = X502_GetErrorString(err);
    // 4.3.4.7 Установка делителя частоты синхронного ввода с цифровых линий.
    int divDIN = StrToInt(ledDivDin->Text);
    err = X502_SetDinFreqDivider(hnd, divDIN);
    msg = X502_GetErrorString(err);
    // err = X502_Configure(hnd, 0);
    msg = X502_GetErrorString(err);
    // 4.3.4.15 Получение значения опорной частоты синхронизации.
    err = X502_GetRefFreqValue(hnd, &frefDbl);
    msg = X502_GetErrorString(err);
    // frefDbl=0 ???
    ledFref->Text = IntToStr((int)frefDbl / 1000);
    edtDinFreq->Text = FloatToStr(frefDbl / divDIN);
    // 4.3.4.12 Получить текущие значения частот сбора АЦП
    double fADC = 0;
    double fFrame = 0;
    err = X502_GetAdcFreq(hnd, &fADC, &fFrame);
    msg = X502_GetErrorString(err);
    // frefDbl=0 fFrame=0 ?????
    edtAdcFreq->Text = FloatToStr(fADC);
    edtAdcFreqLch->Text = FloatToStr(fFrame);
    err = 0;

Логических каналов 10,все  с общей землей, диапазон +/- 10В

	/* Устанавливаем кол-во логических каналов */
	err = X502_SetLChannelCount(hnd, lch_cnt);//lch_cnt=10
	for (int i = 0; i < lch_cnt; i++) {
		// t_x502_hnd hnd, uint32_t lch, uint32_t phy_ch,uint32_t mode, uint32_t range, uint32_t avg)
		int avg = StrToInt(ledKoefAVG->Text); //по умолчанию avg=1
		err = X502_SetLChannel(hnd, i, 0, 0, 0, avg);
	}

также, если перед установкой межкадровой задержки изначально попробовать выставить по частоте, то отрабатывает верно

void __fastcall TForm1::adcFreqEditChange(TObject *Sender) {
	int32_t err = -99;
	if (hnd != NULL) {
		/* устанавливаем кол-во логических каналов, чтобы правильно
		 расчитать частоту на канал */
		// int32_t err = X502_SetLChannelCount(hnd, cbbLChCnt->ItemIndex+1);
		err = X502_SetLChannelCount(hnd, 10);
		if (err == X502_ERR_OK)
			err = setAdcFreq();
		if (err != X502_ERR_OK) {
			MessageDlg("Ошибка установки частоты сбора: " + String(X502_GetErrorString(err)), mtError, TMsgDlgButtons() << mbOK, NULL);
			return;
		}
	}
	if (err != X502_ERR_OK) {
		MessageDlg("Ошибка установки межкадрового промежутка " + String(X502_GetErrorString(err)), mtError, TMsgDlgButtons() << mbOK, NULL);
		return;
	}
}

#10 Техническая поддержка » E502 установка частоты сбора » 17.11.2017 09:22:01

stix_s
Ответов: 6

Добрый день
прописываю в модуль параметры

int err = -99;
    AnsiString msg = "";
    // 4.3.4.13 Установка значения внутренней опорной частоты синхронизации.
    int frefInt = StrToFloat(ledFref->Text) * 1000;
    // frefInt=2000000
    err = X502_SetRefFreq(hnd, frefInt);
    msg = X502_GetErrorString(err);
    double frefDbl = 0;
    // 4.3.4.5 Установка делителя частоты сбора для АЦП div=2
    int divADC = StrToInt(ledDivFref->Text);
    err = X502_SetAdcFreqDivider(hnd, divADC);
    msg = X502_GetErrorString(err);
    // 4.3.4.6 Установка значения межкадровой задержки для АЦП. delay=1980
    int delayADC = StrToInt(ledDelayADC->Text);
    err = X502_SetAdcInterframeDelay(hnd, delayADC);
    msg = X502_GetErrorString(err);
    // 4.3.4.7 Установка делителя частоты синхронного ввода с цифровых линий.
    int divDIN = StrToInt(ledDivDin->Text);
    err = X502_SetDinFreqDivider(hnd, divDIN);
    msg = X502_GetErrorString(err);
    // err = X502_Configure(hnd, 0);
    msg = X502_GetErrorString(err);
    // 4.3.4.15 Получение значения опорной частоты синхронизации.
    err = X502_GetRefFreqValue(hnd, &frefDbl);
    msg = X502_GetErrorString(err);
    // frefDbl=0 ???
    ledFref->Text = IntToStr((int)frefDbl / 1000);
    edtDinFreq->Text = FloatToStr(frefDbl / divDIN);
    // 4.3.4.12 Получить текущие значения частот сбора АЦП
    double fADC = 0;
    double fFrame = 0;
    err = X502_GetAdcFreq(hnd, &fADC, &fFrame);
    msg = X502_GetErrorString(err);
    // frefDbl=0 fFrame=0 ?????
    edtAdcFreq->Text = FloatToStr(fADC);
    edtAdcFreqLch->Text = FloatToStr(fFrame);
    err = 0;

На выходе получаю весьма странное значение кадровой частоты
fFrame=1009,08173562059
Включаю синхронный сбор на Е502 на АЦП и цифровые входы

err = X502_StreamsEnable(hnd, X502_STREAM_ADC);
err = X502_StreamsEnable(hnd, X502_STREAM_DIN);

запускаю сбор ...
останавливаю сбор
снова ставлю параметры ничего не меняя
И сейчас
err = X502_GetAdcFreq(hnd, &fADC, &fFrame);
возвращает мне
fFrame=1000 ровно
В чем фокус?

#11 Re: Техническая поддержка » L791 SetParametersStream » 10.10.2017 09:08:00

adcParams.t2.IrqStep = 1024;
//adcParams.t2.Pages = 4*countLogCh; //countLogCh =5
// по идее буфер равен  adcParams.t2.Pages * adcParams.t2.IrqStep =1024*4*5= 20480
pInterface->FillDAQparameters(&adcParams.t2);
ULONG tm = 1024*4*countLogCh;
// tm =20480
//Выделяет память в ОЗУ компьютера под большой кольцевой буфер. Память выделяется с выравниванием размера на 4096 байт.
pInterface->RequestBufferStream(&tm, L_STREAM_ADC);
Size = 0;
pInterface->SetParametersStream(NULL, &Size, (void**)&data,void**)&sync, L_STREAM_ADC);
//получаем Size=10240

Почему?
И буфер выделяется в байтах или в ULONG?

#12 Re: Техническая поддержка » L791 SetParametersStream » 25.09.2017 08:33:12

Ситуация такая: перед запуском сбора в синхронном режиме, SetParametersStream возвращает в переменной UsedSize значение 0. Почему так может быть?
Настройки:
        TLogChannel_parameters* chPar = NULL;
        IDaqLDevice* pInterface = (IDaqLDevice*)pI_void;
        ADC_PAR parAdc;
        parAdc.t2.s_Type = L_ADC_PARAM;
        parAdc.t2.FIFO = 1024;
        parAdc.t2.IrqStep = 1024;
        parAdc.t2.Pages = 64;
        parAdc.t2.AutoInit = 1;
        parAdc.t2.dRate = measures_frequency_kHz;
        parAdc.t2.dKadr = kadrs_delay_ms;
        parAdc.t2.Reserved1 = 0;
        parAdc.t2.SynchroType = 0;
        parAdc.t2.SynchroSrc = 0;
        for (int i = 0; i < countLogCh; i++) {
            parAdc.t2.Chn[ i ] = CalcPortBits(lcLogChannelsParam[ i ]->numLogicalChannel, lcLogChannelsParam[ i ]->rangeADC, lcLogChannelsParam[ i ]->collectedMode != 0);
        }
        parAdc.t2.NCh = lcLogChannelsParam.size();
        parAdc.t2.IrqEna = 0;
        parAdc.t2.AdcEna = 1;

FillDaqParameters и RequestBufferStream отрабатываются нормально.

#13 Re: Техническая поддержка » L791 SetParametersStream » 25.09.2017 07:01:17

512к буфер согласно документации на L791 это предел
Вопрос в другом
при вызове
SetParametersStream размер буфера устанавливается?
То есть я могу указать карте - буфер какого размера использовать БЕЗ НАЧАЛА сбора или размер буфера определяет контроллер карты по своим собственным усмотрениям?

#14 Техническая поддержка » L791 SetParametersStream » 22.09.2017 09:43:57

stix_s
Ответов: 7

Добрый день.
при использовании функции

SetParametersStream
Описание :
Вызов этой функции настраивает плату АЦП/ЦАП на заданные параметры ввода
или вывода данных.
Определение :
IFC(ULONG) SetParametersStream(PDAQ_PAR sp, ULONG *UsedSize, void** Data,
void** Sync, ULONG StreamId = L_STREAM_ADC) = 0;
Параметры :
sp - структура, которая описывает параметры ввода или вывода данных
( ADC_PAR,DAC_PAR или другая в зависимости от типа поля s_Type);
UsedSize - переменная, в которой будет возвращено количество реально
используемой памяти (в отсчетах АЦП);
Data - переменная, в которой будет возвращен адрес начала большого буфера;
Sync - переменная, в которой будет возвращен адрес переменной синхронизации;
StreamId - дескриптор потока (L_STREAM_ADC, L_STREAM_DAC или другой);

UsedSize - переменная, в которой будет возвращено количество реально
используемой памяти (в отсчетах АЦП)
То есть если запуск сбора не запущен, то вернет 0?
И задавать этот параметр отличным от 0 бессмысленно?

#15 Re: Техническая поддержка » E502 внешняя синхронизацмя » 21.07.2017 09:21:59

Алексей L Card пишет:

наоборот, я имел ввиду так:

err = X502_SetSyncMode(workX502.hndX502, X502_SYNC_DI_SYN2_FALL);
err = X502_SetSyncStartMode(workX502.hndX502, X502_SYNC_INTERNAL);

Алексей, а возможен вариант

err = X502_SetSyncMode(workX502.hndX502, workX502.hndX502, X502_SYNC_DI_SYN1_FALL);
и
err = X502_SetSyncStartMode(workX502.hndX502, X502_SYNC_DI_SYN2_FALL);

То есть на один вход подаем сигнал старта, а на другой частоту синхронизации.
И все с внешнего устройства.

#16 Re: Техническая поддержка » E502 внешняя синхронизацмя » 12.07.2017 13:19:00

Алексей L Card пишет:

А что именно подключено к входам АЦП? Что за источники напряжения? они постоянны?

Алексей, спасибо, нашел свою ошибку в настройках стенда.

#17 Re: Техническая поддержка » E502 внешняя синхронизацмя » 12.07.2017 11:48:43

Алексей L Card пишет:

При таких настройках синхронизации данные с АЦП все равно неверные?

Угу sad

adcData: 0 Value: -0,0032
adcData: 1 Value: 0,0016
adcData: 2 Value: -0,0140
adcData: 3 Value: 0,0016
adcData: 4 Value: 1,1000
adcData: 5 Value: 0,0012
adcData: 6 Value: 0,0020
adcData: 7 Value: 0,0024
adcData: 8 Value: -0,0900
adcData: 9 Value: 0,0028
adcData: 10 Value: 0,0020
adcData: 11 Value: 0,0016
adcData: 12 Value: 0,0008
adcData: 13 Value: 0,0012
adcData: 14 Value: 0,0028
adcData: 15 Value: 0,0024
adcData: 16 Value: 0,0024
adcData: 17 Value: 0,0024
adcData: 18 Value: -0,0130

А должно быть

adcData: 0 Value: 0,5
adcData: 1 Value: 0,0016
adcData: 2 Value: 1,8
adcData: 3 Value: 0,0016
adcData: 4 Value: 1,1000
adcData: 5 Value: 0,0012
adcData: 6 Value: 0,0020
adcData: 7 Value: 0,0024
adcData: 8 Value: -0,0900
adcData: 9 Value: 0,0028
adcData: 10 Value: 0,5
adcData: 11 Value: 0,0016
adcData: 12 Value: 1,8
adcData: 13 Value: 0,0012
adcData: 14 Value: 1,1000
adcData: 15 Value: 0,0024
adcData: 16 Value: 0,0024
adcData: 17 Value: 0,0024
adcData: 18 Value: -0,0130

#18 Re: Техническая поддержка » E502 внешняя синхронизацмя » 12.07.2017 11:27:42

Алексей,  после переключения из режима
X502_SYNC_INTERNAL  в X502_SYNC_DI_SYN2_FALL
нужна задержка после
err = X502_Configure(workX502.hndX502, 0);
чтобы в модуле настройки по регистрам разбежались ?
если да, то какая?

#19 Re: Техническая поддержка » E502 внешняя синхронизацмя » 12.07.2017 11:03:15

Спасибо, буду размышлять, как выкрутиться.
Непонятно, Куда пропадают отчеты с АЦП sad
И что делать с тем значением, которое остается на конвейере.
Получается, что при следующем запуске измерений я первым отчетом получу старое непонятного срока? Или при
err = X502_StreamsStart(workX502.hndX502);
идет сброс и буфера и конвейера?

#20 Re: Техническая поддержка » E502 внешняя синхронизацмя » 12.07.2017 10:55:20

Алексей L Card пишет:

По поводу двух пропущенный импульсов, я не увидел, что Вы настраиваете не только частоту от SYN2, но и старт от него же. В этом случае действительно повторяется пропуск двух импульсов,

Да, но почему это происходит только после переключения из режима
X502_SYNC_INTERNAL  в X502_SYNC_DI_SYN2_FALL?
может необходимо выставить некую задержку после
err = X502_Configure(workX502.hndX502, 0);?

Алексей L Card пишет:

но если честно я не очень вижу смысл настраивать и старт по тому же признаку,

Ну такова задумка электронщиков.

Алексей L Card пишет:

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

То есть
err = X502_SetSyncMode(workX502.hndX502, X502_SYNC_INTERNAL);
и
err = X502_SetSyncStartMode(workX502.hndX502, X502_SYNC_DI_SYN2_FALL);
так?

#21 Re: Техническая поддержка » E502 внешняя синхронизацмя » 12.07.2017 07:17:10

Гарманов Александр пишет:

Кстати, это 8-ая Ваша тема по программированию L-502/E-502 на наших форумах, где техподдержка L-Card исправно Вам отвечает.

И за это вам огромное спасибо.
Чтобы понять ньюансы использования оборудования L-Card и выявить в чем ошибка обращусь еще не раз smile
При подобном тесте:

   	// режим синхронизации
	err = X502_SetSyncMode(workX502.hndX502, X502_SYNC_INTERNAL);
	_msg = X502_GetErrorString(err);
	//  условие запуска синхронного ввода/вывода данных.
	err = X502_SetSyncStartMode(workX502.hndX502, X502_SYNC_INTERNAL);
    	// Записываем настройки в модуль
	err = X502_Configure(workX502.hndX502, 0);
	//-----------
	// 10 каналов, внешняя синхронизация по спаду 	err = workX502.SetupParams(10, X502_SYNC_DI_SYN2_FALL, X502_SYNC_DI_SYN2_FALL);
	// устанавливаем кол-во логических каналов, lch_cnt=10
	err = X502_SetLChannelCount(workX502.hndX502, lch_cnt);
	_msg = X502_GetErrorString(err);
	// настраиваем лог каналы
	for (int i = 0; i < lch_cnt; i++) {
	  err = X502_SetLChannel (workX502.hndX502, i, i, X502_LCH_MODE_COMM, X502_ADC_RANGE_10, 1);
	  _msg = X502_GetErrorString(err);
	}
	// режим синхронизации
	err = X502_SetSyncMode(workX502.hndX502, X502_SYNC_DI_SYN2_FALL);
	_msg = X502_GetErrorString(err);
	//  условие запуска синхронного ввода/вывода данных.
	err = X502_SetSyncStartMode(workX502.hndX502, X502_SYNC_DI_SYN2_FALL);
	_msg = X502_GetErrorString(err);
	// Установка значения внешней опорной частоты синхронизации
	X502_SetExtRefFreqValue(workX502.hndX502, 180000);
	// настраиваем частоту сбора с АЦП и цифровых
	// Устанавливаем частоту синхронного сбора  для АЦП 1МГц
	err = X502_SetAdcFreq(workX502.hndX502, &x502AdcFreq, &x502AdcFreqLch);
	_msg = X502_GetErrorString(err);
	// Устанавливаем частоту синхронного сбора  для цифровых x502DinFreq = 2000
	err = X502_SetDinFreq(workX502.hndX502, &x502DinFreq);
	_msg = X502_GetErrorString(err);

	// пропускаем каждый 2 такт
	err = X502_SetAdcFreqDivider(workX502.hndX502, 1);
	_msg = X502_GetErrorString(err);
	// Разрешение синхронных потоков на ввод/вывод.
	err = X502_StreamsEnable(workX502.hndX502, X502_STREAM_ADC);
	_msg = X502_GetErrorString(err);
	// Записываем настройки в модуль
	err = X502_Configure(workX502.hndX502, 0);
	_msg = X502_GetErrorString(err);
	// выставим 1 на DO10
	unsigned int start_time = clock(); // начальное время
	err = workX502.SetAsyncDigOut(512, _msg);
	_msg = X502_GetErrorString(err);
	// запустим поток сбора
	err = X502_StreamsStart(workX502.hndX502);
	// выставим 1 на DO10
	 //err = workX502.SetAsyncDigOut(512, _msg);
	_msg = X502_GetErrorString(err);
	unsigned int end_time = clock();
	unsigned int search_time = end_time - start_time; // искомое время
	// Sleep(30);
	// Поспим
	Sleep(3000);
	// Функция возвращает количество отсчетов, которые были приняты из модуля
	// во внутренний буфер и готовы для считывания
	err = X502_GetRecvReadyCount(workX502.hndX502, &rcvCountReady);
	_msg = X502_GetErrorString(err);
	// заберем, что пришло
	rcvSizeRealStep = X502_Recv(workX502.hndX502, rcv_buf, 200, 200);

Всегда 18 отчетов. И пропал повтор канала 4 Value: 1,1000

adcData: 0 Value: -0,0048
adcData: 1 Value: 0,0020
adcData: 2 Value: -0,0180
adcData: 3 Value: 0,0016
adcData: 4 Value: 1,1000
adcData: 5 Value: 0,0024
adcData: 6 Value: 0,0024
adcData: 7 Value: 0,0020
adcData: 8 Value: -0,0380
adcData: 9 Value: 0,0016
adcData: 10 Value: 0,0016
adcData: 11 Value: 0,0016
adcData: 12 Value: 0,0016
adcData: 13 Value: 0,0024
adcData: 14 Value: 0,0020
adcData: 15 Value: 0,0016
adcData: 16 Value: 0,0020
adcData: 17 Value: 0,0024

Было

adcData: 0 Value: -0,0032
adcData: 1 Value: 0,0024
adcData: 2 Value: -0,0130
adcData: 3 Value: 0,0024
adcData: 4 Value: 1,1000
adcData: 5 Value: 0,0028
adcData: 6 Value: -0,0080
adcData: 7 Value: 0,0028
adcData: 8 Value: -0,1900
adcData: 9 Value: 0,0032
adcData: 10 Value: -0,0190
adcData: 11 Value: 0,0024
adcData: 12 Value: 0,0016
adcData: 13 Value: 0,0020
adcData: 14 Value: 1,1000
adcData: 15 Value: 0,0020
adcData: 16 Value: 0,0024
adcData: 17 Value: 0,0020

#22 Re: Техническая поддержка » E502 внешняя синхронизацмя » 11.07.2017 20:44:57

Алексей L Card пишет:

В штатном примере при изменении синхронизации на внешюю у меня при первом запуске на два импульса приходит один отсчет, т.к. не приходит только последний семпл.

В штатном примере попробуйте выставить внешнюю синхронизацию.
Запустить сбор.
И выставить асинхронно выходы.
Ваш пример дает ту же ошибку - 1004. Поверьте.

#23 Re: Техническая поддержка » E502 внешняя синхронизацмя » 11.07.2017 20:41:39

Гарманов Александр пишет:

Запуск преобразования АЦП от внешнего синхросигнала ранее обсуждался в этой конференции: http://www.lcard.ru/forums/viewtopic.php?id=9761
И тогда уже выяснили, что один лишний импульс синхронизации нужно добавлять в конце.
Поэтому, полученную "конвейерную задержку" получения данных АЦП относительно внешних одиночных синхроимпульсов следует воспринимать как особенность для данного частного случая.

1) Александр - я НЕ электронщик, у вас в документации этого нет.
2) Как я могу узнать, что ПОДОБНЫЙ вопрос уже обсуждался?
Именно с данным набором МС?
Ну пропишите в доке.
Я даже не знаю - надо мне прошивку обновить или нет - подскажите способ получать извещения по мылу.

Но, то что при первом запуске функции сбора пролетает 2 отчета ...
Готов Алексею предоставить тестовый пример.

#24 Re: Техническая поддержка » E502 внешняя синхронизацмя » 11.07.2017 20:33:55

Алексей L Card пишет:

Не совсем понятно, все же с точки зрения вызовов функций, что происходит до первого и до второго запуска. Открывается ли соединение после первого запуска? Используется ли сейчас асинхронный вывод при этом? Что за источник частоты, он как-то урпавляется?

Соединение открывается при запуске ПО, устанавливается внутреняя синхронизация.
Предполагаем, что обрыва соединения нет.
При инициализации (запуске ПО) производится проверка соединения с модулем, прописываются параметры модуля.
Источник частоты - внешний, НЕ управляется ПО Л-Кард или модулем Е502
Как я уже сообщал:
получает управляющий сигнал
ждет секунду
выдает пачку импульсов, это вся его задача.

Алексей L Card пишет:

В штатном примере при изменении синхронизации на внешюю у меня при первом запуске на два импульса приходит один отсчет, т.к. не приходит только последний семпл.

В штатном примере, Алексей ... надо посмотреть, что и в какой последовательности вы производите и чем отличается от моего вопроса.
Попробуйте изначально задать внутреннюю синхронизацию.
И не запуская потока сбора переключить на внешнюю.

#25 Re: Техническая поддержка » E502 внешняя синхронизацмя » 11.07.2017 16:59:54

Алексей L Card пишет:

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

Алексей, собственно значения каналов при внутренней синхронизации проверены, там все в порядке.
Функция практически аналогична вашему тестовому примеру.
А вот с внешней синхронизацией ... возникают вопросы.
Поскольку при первой попытке сбора данных с АЦП при внешней синхронизации я получаю только 18 отчетов вместо 20, но есть подозрение, что согласно сообщению
Гарманов Александр
При первом импульсе буфер АЦП пуст  первый сигнал заполняет буфер и только второй сигнал заставляет его передать данные дальше.

Контакты

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

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

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

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