Меню
+7 (495) 785-95-25
sale@lcard.ru
sale@lcard.ru
Страницы 1
у меня нет цели все перевести в формат lusbapi, мне надо получить параметры АЦП. в lusbapi есть пример этого, в lcomp_linux нету (по крайней мере, я не нашел), поэтому здесь и привожу в пример метод из lusbapi.
DIOC_SEND_COMMAND такой команды драйвер для модуля не знает. там есть все исходники же. и посылки команды и чтения массива данных там есть.
вижу обработку этой команды в ldevusbu.c, также при выполнении этого участка кода в dmesg вижу
[278147.636296] lcard: in DIOC_SEND_COMMAND
[278147.636299] lcard: 1 0 2 0
в исходниках есть команды чтения массива данных, да, но нет описания формата этих данных, чтобы перевести их в структуру ADC_PARS_E154.
с методом GetArray_DM, вроде, разобрался, но те данные, которые он возвращает, нельзя просто так взять и использовать, как это сделано в Lusbapi (BOOL WINAPI TLE154::GET_ADC_PARS(ADC_PARS_E154 * const AdcPars)).
можете более точнее указать, где в исходниках или примерах можно посмотреть разбор массива данных от GetArray_DM?
спасибо!
а про broken pipe что-то можете подсказать?
в ioctl((int)hDevice, dwIoControlCode, &ibuf) в hDevice передаю значение из hVxd объекта типа DaqE154 через вызов LDeviceIoControl:
WORD InBuf[4] = { 0x0001, V_GET_ARRAY, ADC_PARS_BASE, 0x0 };
for(i = 0x0; i < sizeof(buf); i += MAX_USB_CONTROL_PIPE_BLOCK)
{
InBuf[0x2] = (WORD)(ADC_PARS_BASE + i);
if (!LDeviceIoControl(hl, DIOC_SEND_COMMAND, &InBuf, sizeof (InBuf), buf + i, std::min( (ULONG)(sizeof(buf) - i), (ULONG)MAX_USB_CONTROL_PIPE_BLOCK), &cbRet, NULL))
{
LAST_ERROR_NUMBER(5);
//return FALSE;
}
}
но получаю ошибку.
куда копать?
но непонятно, почему их 4 пары, если я задал опрос только двух каналов, а всего у модуля 8 АЦП-каналов?
а, понял: их 4, потому что 4 варианта усиления, так?
калибровочные коэфиц. лежат в структуре PLATA_DESCR после вызова ReadlPlataDescr. в manual.pdf см описание структуры и функции. емнип сначала лежат смещения потом масштаб по усилениям. Корректировать надо руками. А потом уже переводить в вольты.
спасибо за ответ.
структуру видел, описание в manual.pdf про калибровочные коэффициенты такое:
float KoefADC[8] - калибровочные коэффициенты АЦП
и все.
в ioctl.h есть комментарий
float KoefADC[8]; // 4 offs 4 scale
но непонятно, почему их 4 пары, если я задал опрос только двух каналов, а всего у модуля 8 АЦП-каналов?
Добрый день!
прошу помощи в вопросе корреткировки данных, полученных с модуля E154.
модуль подключен по USB, работа ведется в системе Linux (4.4.0-130-generic #156-Ubuntu x86_64 GNU/Linux), разработка приложения ведется на C++.
проблема заключается в получении калибровочных коэффициентов с модуля.
в руководстве программиста для e154 написано, что надо получить заполненную структуру MODULE_DESCRIPTION_E154 и из нее использовать поля Adc.OffsetCalibration и Adc.ScaleCalibration.
т.к. работа ведется под Linux, подключить и использовать библиотеку Lusbapi нельзя и готовые методы для получения этой структуры недоступны, поэтому я пробовал реализовать свой метод GET_ADC_PARS через LDeviceIoControl.
но в методе LDeviceIoControl вызов ioctl((int)hDevice, dwIoControlCode, &ibuf) возвращает ошибку "Broken pipe" вместо данных, а если использовать методы device->GetArray_DM(ADC_PARS_BASE, sizeof(buf), buf), то методы возвращают false, т.е. данные тоже не удается получить.
я ж правильно понимаю, что для этого модуля метод EnableCorrection не реализован, поэтому надо собственноручно делать коррекцию?
сейчас пока конвертацию сделал так:
double ScaleGain[4]={5.0/2000., 1.6/2000., 0.5/2000., 0.16/2000.};
double K_offset, K_scale;
int gain_index;
gain_index=(channel >> 6) & 3;
K_offset=0.0;
K_scale=pd.t7.KoefADC[channel]*ScaleGain[gain_index];
*dest=(acp_code+K_offset)*K_scale;
кажется, что без смещения такая конвертация не совсем верна.
Страницы 1
Адрес: 117105, Москва, Варшавское шоссе, д. 5, корп. 4, стр. 2
Многоканальный телефон:
+7 (495) 785-95-25
Отдел продаж: sale@lcard.ru
Техническая поддержка: support@lcard.ru
Время работы: с 9-00 до 19-00 мск