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

E-502 Циклический вывод

Вы не вошли.

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

11.04.2018 12:44:49
#1

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

E-502 Циклический вывод

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

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

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

11.04.2018 15:48:36
#2

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

Re: E-502 Циклический вывод

Добрый день.

Правильнее сказать, что данная функция может рассчитать делитель частоты  и результирующую частоты вывода, чтобы она была наиболее близка к переданному в f_dout значению. Сама она эту частоту не устанавливает и как раз позволяет делать расчет без описателя модуля.

Если нужно именно установить, то для этого используются функция X502_SetOutFreq() (или X502_SetOutFreqDivider()).

Частота в половину опорной - это максимальная частота вывода.

12.04.2018 07:59:11
#3

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

Re: E-502 Циклический вывод

Нет, функция 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);
	}
}
12.04.2018 14:02:35
#4

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

Re: E-502 Циклический вывод

Функция X502_SetOutFreq() (аналогично другим настройкам) должна вызываться до X502_Configure()

Контакты

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

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

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

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