Нет, функция 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);
}
}