Меню
+7 (495) 785-95-25
sale@lcard.ru
sale@lcard.ru
Нет, функция 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);
}
}
Добрый день, при циклическом выводе на ЦАП частота вывода меняется при помощи функции
lastErr = X502_CalcOutFreq(X502_REF_FREQ_2000KHZ, &f_dout, &result_freq_div)
?
Складывается впечатление, что она всегда равна половине опорной частоты.
Здравствуйте. В FPGA x-502 присутствует 24-битная внутренняя целочисленная арифметика линейной коррекции данных (использующая калибровочные коэффициенты), а также присутствует арифметика усреднения данных. Всё это расширяет формат представления данных АЦП, что повышает разрешающую способность преобразователя, например, при применении усреднения. В любом случае, от x-502 приходят на верхний программный уровень 24-битные скорректированные данные АЦП, упакованные в 32-битное слово (с добавлением индексной части).
Ясно, спасибо.
Индексная часть - это старшие 8 разрядов 32-битного слова?
Какую информацию содержит индексная часть?
PS
Здравствуйте. В FPGA x-502 присутствует 24-битная внутренняя целочисленная арифметика линейной коррекции данных (использующая калибровочные коэффициенты), а также присутствует арифметика усреднения данных. Всё это расширяет формат представления данных АЦП, что повышает разрешающую способность преобразователя, например, при применении усреднения. В любом случае, от x-502 приходят на верхний программный уровень 24-битные скорректированные данные АЦП, упакованные в 32-битное слово (с добавлением индексной части).
добрый день
Вопрос по карте 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
Чем вызвана столь большая величина?
может прошивку модуля обновить?
Код - слегка доработанный ваш тестовый пример, который с драйверами идетx 502_example
divDIN=2000
дополнительно
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;
}
}
Добрый день
прописываю в модуль параметры
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 ровно
В чем фокус?
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?
Ситуация такая: перед запуском сбора в синхронном режиме, 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 отрабатываются нормально.
512к буфер согласно документации на L791 это предел
Вопрос в другом
при вызове
SetParametersStream размер буфера устанавливается?
То есть я могу указать карте - буфер какого размера использовать БЕЗ НАЧАЛА сбора или размер буфера определяет контроллер карты по своим собственным усмотрениям?
Добрый день.
при использовании функции
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 бессмысленно?
наоборот, я имел ввиду так:
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);
То есть на один вход подаем сигнал старта, а на другой частоту синхронизации.
И все с внешнего устройства.
А что именно подключено к входам АЦП? Что за источники напряжения? они постоянны?
Алексей, спасибо, нашел свою ошибку в настройках стенда.
При таких настройках синхронизации данные с АЦП все равно неверные?
Угу
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
Алексей, после переключения из режима
X502_SYNC_INTERNAL в X502_SYNC_DI_SYN2_FALL
нужна задержка после
err = X502_Configure(workX502.hndX502, 0);
чтобы в модуле настройки по регистрам разбежались ?
если да, то какая?
Спасибо, буду размышлять, как выкрутиться.
Непонятно, Куда пропадают отчеты с АЦП
И что делать с тем значением, которое остается на конвейере.
Получается, что при следующем запуске измерений я первым отчетом получу старое непонятного срока? Или при
err = X502_StreamsStart(workX502.hndX502);
идет сброс и буфера и конвейера?
По поводу двух пропущенный импульсов, я не увидел, что Вы настраиваете не только частоту от SYN2, но и старт от него же. В этом случае действительно повторяется пропуск двух импульсов,
Да, но почему это происходит только после переключения из режима
X502_SYNC_INTERNAL в X502_SYNC_DI_SYN2_FALL?
может необходимо выставить некую задержку после
err = X502_Configure(workX502.hndX502, 0);?
но если честно я не очень вижу смысл настраивать и старт по тому же признаку,
Ну такова задумка электронщиков.
т.к. если Вы старт настроите INTERNAL, то в любом сбор запустится сразу но первый отсчет будет оцифрован только по первому фронту.
В режиме старта INTERNAL модуль должен работать всегда предсказуемо, что нужно добавить один лишний импульс (т.к. последнее измерение как бы застревает в модуле и не передается). Попробуйте с такой настройкой.
То есть
err = X502_SetSyncMode(workX502.hndX502, X502_SYNC_INTERNAL);
и
err = X502_SetSyncStartMode(workX502.hndX502, X502_SYNC_DI_SYN2_FALL);
так?
Кстати, это 8-ая Ваша тема по программированию L-502/E-502 на наших форумах, где техподдержка L-Card исправно Вам отвечает.
И за это вам огромное спасибо.
Чтобы понять ньюансы использования оборудования L-Card и выявить в чем ошибка обращусь еще не раз
При подобном тесте:
// режим синхронизации
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
В штатном примере при изменении синхронизации на внешюю у меня при первом запуске на два импульса приходит один отсчет, т.к. не приходит только последний семпл.
В штатном примере попробуйте выставить внешнюю синхронизацию.
Запустить сбор.
И выставить асинхронно выходы.
Ваш пример дает ту же ошибку - 1004. Поверьте.
Запуск преобразования АЦП от внешнего синхросигнала ранее обсуждался в этой конференции: http://www.lcard.ru/forums/viewtopic.php?id=9761
И тогда уже выяснили, что один лишний импульс синхронизации нужно добавлять в конце.
Поэтому, полученную "конвейерную задержку" получения данных АЦП относительно внешних одиночных синхроимпульсов следует воспринимать как особенность для данного частного случая.
1) Александр - я НЕ электронщик, у вас в документации этого нет.
2) Как я могу узнать, что ПОДОБНЫЙ вопрос уже обсуждался?
Именно с данным набором МС?
Ну пропишите в доке.
Я даже не знаю - надо мне прошивку обновить или нет - подскажите способ получать извещения по мылу.
Но, то что при первом запуске функции сбора пролетает 2 отчета ...
Готов Алексею предоставить тестовый пример.
Не совсем понятно, все же с точки зрения вызовов функций, что происходит до первого и до второго запуска. Открывается ли соединение после первого запуска? Используется ли сейчас асинхронный вывод при этом? Что за источник частоты, он как-то урпавляется?
Соединение открывается при запуске ПО, устанавливается внутреняя синхронизация.
Предполагаем, что обрыва соединения нет.
При инициализации (запуске ПО) производится проверка соединения с модулем, прописываются параметры модуля.
Источник частоты - внешний, НЕ управляется ПО Л-Кард или модулем Е502
Как я уже сообщал:
получает управляющий сигнал
ждет секунду
выдает пачку импульсов, это вся его задача.
В штатном примере при изменении синхронизации на внешюю у меня при первом запуске на два импульса приходит один отсчет, т.к. не приходит только последний семпл.
В штатном примере, Алексей ... надо посмотреть, что и в какой последовательности вы производите и чем отличается от моего вопроса.
Попробуйте изначально задать внутреннюю синхронизацию.
И не запуская потока сбора переключить на внешнюю.
По поводу же значений с каналов, то сперва нужно проверить на штатном софте, соответствуют ли сигналы ожидаемым, и если нет, то проблема в первую очередь проверить соответствие подключения настройкам
Алексей, собственно значения каналов при внутренней синхронизации проверены, там все в порядке.
Функция практически аналогична вашему тестовому примеру.
А вот с внешней синхронизацией ... возникают вопросы.
Поскольку при первой попытке сбора данных с АЦП при внешней синхронизации я получаю только 18 отчетов вместо 20, но есть подозрение, что согласно сообщению
Гарманов Александр
При первом импульсе буфер АЦП пуст первый сигнал заполняет буфер и только второй сигнал заставляет его передать данные дальше.
Адрес: 117105, Москва, Варшавское шоссе, д. 5, корп. 4, стр. 2
Многоканальный телефон:
+7 (495) 785-95-25
Отдел продаж: sale@lcard.ru
Техническая поддержка: support@lcard.ru
Время работы: с 9-00 до 19-00 мск