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

E502 установка частоты сбора

Вы не вошли.

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

17.11.2017 09:22:01
#1

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

E502 установка частоты сбора

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

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 ровно
В чем фокус?

17.11.2017 13:04:45
#2

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

Re: E502 установка частоты сбора

Добрый день.
В коде не указаны все параметры, которые влияют на результирующую частоту кадров (как количество логических каналов), поэтому нельзя понять, насколько число 1009,08173562059  является правильным.
Если все влияющие на частоту фрейма параметры не меняются (число лог. каналов, fref, делитель ацп и межкадровая задержка), то функция X502_GetAdcFreq должна возвращать одинаковое значение. Если это не так, то нужен предельно краткий полный пример, воспроизводящий ситуацию и не делающий никаких других действий кроме необходимых.

20.11.2017 07:31:56
#3

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

Re: E502 установка частоты сбора

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

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;
	}
}
20.11.2017 07:33:12
#4

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

Re: E502 установка частоты сбора

divDIN=2000

20.11.2017 07:35:12
#5

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

Re: E502 установка частоты сбора

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

20.11.2017 07:51:09
#6

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

Re: E502 установка частоты сбора

может прошивку модуля обновить?

20.11.2017 16:11:08
#7

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

Re: E502 установка частоты сбора

Если я правильно понял, то в первом случае Вы устанавливаете количество каналов после вызова GetAdcFreq(). Частота кадра зависит от частоты АЦП, межкадровой задержки и количества каналов, соответственно на основании текущих установленных настроек GetAdcFreq() и рассчитывает ее. Если у Вас еще не настроено количество каналов, то и значение будет рассчитано неверно.

Контакты

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

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

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

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