Меню
+7 (495) 785-95-25
sale@lcard.ru
sale@lcard.ru
Страницы 1
Добрый день.
Не работает пример L7XX.OSC из библиотеки lcomp. Компилирую его без изменений, в параметрах проекта в Command arguments указываю 0 e2010m, плата соответственно E2010, ревизия B. Программа запускается, но опрос не происходит. Индикатор не мигает, на экране все точки с амплитудой 0. С платой Е14-440 (и соответствующими параметрами) при этом пример работает. Модуль E2010 с программой LGraph 2 тоже работает, значит плата исправна. Что нужно изменить в примере для корректной работы?
pI умеет только из внутреннего буфера ЦАП и циклические будет гонять только если AutoInit в 1 (обычно это один период синуса напрмер ). pI2 умеет с подкачкой из буфера PC. Синхронизации между этими двумя потоками нет.
Я правильно понял, что под "этими двумя потоками" вы имеете ввиду АЦП и ЦАП?
Я попробовал включить внешнюю синхронизацию старта АЦП по свободному каналу, на который подключил ЦАП. Попробовал разные типы синхронизации. Фаза перестала быть совсем случайной. Но к сожалению, фаза всё равно получается недостаточно стабильной, скачет в пределах нескольких градусов.
Насколько я понял, у вас в принципе нет модулей с явной синхронизацией АЦП и ЦАП.
Добрый день.
Конфигурация: E14-440, библиотека lcomp, Qt, Windows 7.
ЦАП генерирует синусоидальный сигнал, который подаётся на вход цепи. На один канал АЦП подаётся сигнал со входа цепи, на другой с выхода.
Когда я использую интерфейс pI, то ЦАП и АЦП почему то работают в разное время, т.е. ЦАП генерирует сигнал некоторое время, а потом АЦП считывает сигнал, когда на входе уже не синусоида, а сигнал постоянного уровня соответствующий последнему выведенному значению.
Когда я использую интерфейс pI2, фаза сигнала на входе цепи имеет случайное значение. Видимо из-за того, что АЦП и ЦАП инициализируются по очереди, и это занимает разное время.
1. Что я делаю не так при использовании pI?
2. Можно ли как-то синхронизировать АЦП и ЦАП, чтобы сигнал на АЦП со входа цепи (с ЦАП) всегда имел одинаковую фазу?
Ниже приведены основные части кода.
void device::setup() // слот для первоначальной настройки
{
CallCreateInstance(L"lcomp.dll");
pIUnknown = CreateInstance(0);
pIUnknown->QueryInterface(IID_ILDEV,(void**)&pI);
pIUnknown->Release();
if(con_int>0)
pI->QueryInterface(IID_ILDEV2,(void**)&pI2);
pI->OpenLDevice();
pI->GetSlotParam(&sl);
pI->LoadBios("E440");
pI->PlataTest();
pI->ReadPlataDescr(&ph);
adcPar.t1.s_Type = L_ADC_PARAM;
adcPar.t1.AutoInit = 0;
adcPar.t1.dRate = 200.0;
adcPar.t1.dKadr = 0.0;
adcPar.t1.dScale = 0;
adcPar.t1.SynchroType = 0;
adcPar.t1.SynchroSensitivity = 0;
adcPar.t1.SynchroMode = 0;
adcPar.t1.AdChannel = 0;
adcPar.t1.AdPorog = 0;
adcPar.t1.NCh = 2;
adcPar.t1.Chn[0] = 0x0;
adcPar.t1.Chn[1] = 0x1;
adcPar.t1.FIFO = 2048;
adcPar.t1.IrqStep = 2048;
adcPar.t1.Pages = 2;
adcPar.t1.IrqEna = 1;
adcPar.t1.AdcEna = 1;
ULONG tm = 512000; // выделили память словах (2 байта)
pI->RequestBufferStream(&tm,L_STREAM_ADC);
pI->FillDAQparameters(&adcPar.t1);
pI->SetParametersStream(&adcPar.t1, &tm, (void **)&data, (void **)&sync,L_STREAM_ADC);
dacPar.t1.s_Type = L_DAC_PARAM;
dacPar.t1.AutoInit=0;
dacPar.t1.dRate=100.0;
dacPar.t1.FIFO=512;
dacPar.t1.IrqStep=512;
dacPar.t1.Pages=8;
dacPar.t1.IrqEna=1;
dacPar.t1.DacEna=1;
dacPar.t1.DacNumber=0;
pI->FillDAQparameters(&dacPar.t1);
ULONG db=512000;
pI->RequestBufferStream(&db, L_STREAM_DAC);
pI->SetParametersStream(&dacPar.t1,&db, (void **)&data1, (void **)&sync1,L_STREAM_DAC);
for(int i=0;i<4096;i++) data1[i]=((USHORT)(100*sin((2.0*(3.1415926*i)/8)))&0xFFF)|0x0000;
pI->EnableCorrection();
hEventData = CreateEvent(0,FALSE,FALSE,NULL);
pI->SetLDeviceEvent(hEventData);
qRegisterMetaType <HANDLE>("HANDLE");
Overflow.setHandle(hEventData); // в Qt для объекта класса QWinEventNotifier задаю событие, о котором будет выдан соответствующий сигнал
}
void device::start() // слот, запускающий поток
{
if(con_int>0) // con_int - переменная для выбора интерфейса
{
pI2->InitStartLDeviceEx(L_STREAM_ADC);
pI2->InitStartLDeviceEx(L_STREAM_DAC);
pI2->StartLDeviceEx(L_STREAM_DAC);
pI2->StartLDeviceEx(L_STREAM_ADC);}
else
{
pI->InitStartLDevice();
pI->StartLDevice();
}
Overflow.setEnabled(true);
}
void device::run() // слот, связанный с сигналом о переполнении буфера
{
if(con_int>0)
{
pI2->StopLDeviceEx(L_STREAM_ADC);
pI2->StopLDeviceEx(L_STREAM_DAC);
}
else
pI->StopLDevice();
for(int i=0;i<2048;i++)
{
Signal[0][i] = ((short *)(data))[2*i];
Signal[1][i] = ((short *)(data))[2*i+1];
}
// Тут идёт обработка сигнала и вычисления
if(con_int>0)
{
pI2->InitStartLDeviceEx(L_STREAM_ADC);
pI2->InitStartLDeviceEx(L_STREAM_DAC);
pI2->StartLDeviceEx(L_STREAM_DAC);
pI2->StartLDeviceEx(L_STREAM_ADC);
}
else
{
pI->InitStartLDevice();
pI->StartLDevice();
}
}
Здравствуйте! Провел эксперимент: питание оборудования осуществлялось от аккумуляторов, со входа АЦП снимался сигнал с помощью осциллографа. Реальный сигнал монотонно изменялся от -1В до 1В. При регистрации сигнала с помощью модуля наблюдались выбросы. Могут ли ошибки в программе влиять на значения, получаемые от АЦП? Я имею ввиду, что ошибка в значении появляется именно при вызове функции ADC_SAMPLE, а не при дальнейшей обработке полученного значения.
Опробуем указанные рекомендации. Утилита также была бы кстати.
Здравствуйте! Хотелось бы узнать, есть ли продвижение в данном вопросе.
1. 6C4988, Rec. C. Возможно он не 2003г., но старше остальных. Да, за все часы проверки ошибок с ним не возникало.
2. Сбои носят скорее случайный характер. Частота сбоев зависит от операционной системы. На Windows 7 сбои возникают примерно раз в 2 часа. На Windows 8 и 10 сбои появляются намного чаще.
1)8D525235, Rev. F;
2)9D984960, Rev. G;
3)7D358636, Rev. F.
Ранее описанная ошибка возникает на каждом из этих модулей.
1.Lusbapi v.3.4.
2.Данная проблема не возникала при использовании старых модулей (~2003г.). Так что проблемы со схемой подключения быть не должно.
Здравствуйте!
Возникла проблема при использовании функции ADC_SAMPLE из библиотеки lusbapi. Приведенная ниже функция периодически вызывается для опроса 3-х каналов. При этом при опросе второго из них зачастую возвращается неверное значение. Функция ADC_SAMPLE выполняется, сообщение об ошибке не появляется.
float __fastcall GetData(void)
{float U1, U2, U3;
short r1,r2,r3;
U1 = 0.0;
U2 = 0.0;
U3 = 0.0;
if(!pE440->ADC_SAMPLE(&r1, (WORD)(0x01)))
{Application->MessageBoxA("Не удалось", "ОШИБКА", MB_OK);} // 1
if(!pE440->ADC_SAMPLE(&r2, (WORD)(0x40)))
{Application->MessageBoxA("Не удалось", "ОШИБКА", MB_OK);}// 64
if(!pE440->ADC_SAMPLE(&r3, (WORD)(0x48)))
{Application->MessageBoxA("Не удалось", "ОШИБКА", MB_OK);} // 72
U1 = (10 / 8000.0) * r1 - 4.795;
U2 = (2.5 / 8000.0) * r2;
U3 = (-2.5 / 8000.0) * r3;
bufH = U1 / 1.0;
bufM = U2 / 1.0;
bufIr = U3;
Rr=r2;
return (bufH, bufM, bufIr, Rr);
}
Для примера приведу последовательные значения r2: 238, 425, 595, 750, 473, 1178. Значение должно монотонно возрастать, однако одно из значений выпадает.
Драйвера и прошивка последней версии. Использую Borland C++ Builder 6.0.
Здравствуйте. Возникла ранее описанная проблема http://www.lcard.ru/forums/viewtopic.php?id=9666 Есть 2 модуля: 1) №8D525235, при попытке обновить прошивку выдает ошибку 1009; 2) №9D984060, прошивка обновляется успешно, но проблема остается. Установлена библиотека LCOMP от 29.06.2015, ОС Windows XP.
Ну там АЦП прилично буферизуется. Значит такие параметры установлены...
При запуске примера осциллографа скорость отклика меньше секунды. На какие именно параметры стоит обратить внимание?
Использую модуль E14-440 и библиотеку виртуальных инструментов для labview 7.1. На основе примеров генератора и осциллографа пытался реализовать их комбинацию в одной программе. Программа генерирует сигнал синусоидальной формы. Выход ЦАП пока что подключен к входу АЦП. Сигнал генерируется корректно, отображается на экране осциллографа также корректно. Столкнулся со следующей проблемой: время отклика осциллографа на изменение сигнала составляет до 10 секунд. Достоверно установлено, что на выходе ЦАП сигнал изменяется достаточно быстро. В чем может быть проблема? Возможно ли реализовать данную программу с использованием вышеуказанных средств?
Страницы 1
Адрес: 117105, Москва, Варшавское шоссе, д. 5, корп. 4, стр. 2
Многоканальный телефон:
+7 (495) 785-95-25
Отдел продаж: sale@lcard.ru
Техническая поддержка: support@lcard.ru
Время работы: с 9-00 до 19-00 мск