Меню
+7 (495) 785-95-25
sale@lcard.ru
sale@lcard.ru
На 200 кГц проработало всю ночь без ошибок. Поставил 2000 Гц. Посмотрим что будет. Я вчера еще одно изменение сделал: почему-то с утра не смог запустить через тот разъем USB, к которому был подключен е502 (ни lsusb ни программа не видела АЦП, хотя в винде все было ок), подключил к другому.
У вас какой стандарт USB используется: 2.0 или 3.0? Может тут возможно засада типа "легкой" несовместимости?
ну максимум что можно поставить для случая 10 каналов - это 200 кГц. Хорошо, попробую этот вариант. Кстати, сегодня еще раз запустил в 7 утра и до сих пор ошибки нет.
Вот что получилось после примерно 2-х часов работы:
Версия библиотеки: 1.1.4
usb dev count = 1
Доступны следующие модули:
Модуль № 0: E502, USB Сер. номер: 2T222563
Введите номер модуля, с которым хотите работать (от 0 до 0)
0
Установлена связь со следующим модулем:
Серийный номер : 2T222563
Наличие ЦАП : Да
Наличие BlackFin : Да
Наличие гальваноразвязки: Да
Индустриальное исп. : Нет
Наличие интерф. PCI/PCIe: Нет
Наличие интерф. USB : Да
Наличие интерф. Ethernet: Да
Версия ПЛИС : 0.1
Версия PLDA : 0
Версия прошивки ARM : 1.0.5.0
Установлены частоты:
Частота сбора АЦП = 2000000
Частота на лог. канал = 4000
Частота цифрового ввода = 4000
Сбор данных запущен. Для останова нажмите CTRL+C
Ошибка обработки данных: -140
buff[0] = 0xd2001e64
buff[1] = 0xd3001e64
buff[2] = 0xd4001e64
buff[3] = 0xd5001fea
buff[4] = 0xd6001f27
buff[5] = 0xd70020ac
buff[6] = 0xd8001cdf
buff[7] = 0xd9001c1c
buff[8] = 0xd9001c1c
buff[9] = 0xd9001c1c
Сбор данных остановлен успешно
но кстати говоря в своей программе я частоту снижал до < 1000 Гц, ошибка все равно появлялась... можно и здесь попробовать. А вот такой вопрос - дамп принятого массива может чем-то помочь в анализе этой проблемы?
4000 Гц
вот, сработало - выпала "ошибка обработки данных" примерно через час: вместо 3 каналов в x502_stream_read поставил 10. Так что похоже проблема скорее всего не в многопоточности..
разобрался почему в Линуксе не запускалось - надо было стартовать от root (sudo x502_stream_read)... В винде ошибок не было за пару часов работы, запустил в Линуксе.
Но у меня возникло подозрение - а не может быть так, что эта ошибка из-за многопоточности программы? x502_strem_read однопоточная, а я пользую класс QAdcObject в отдельном потоке.
1. да с чего это... перегрузил комп, все равно usb_dev_count = 0
2. в примере я вырезал часть, т.к. у меня нет файла l502-reg.ldr, соответственно нечего грузить.. и вырезал лишнего. Вот теперь в винде запускается нормально:
$ x502_stream_read
Версия библиотеки: 1.1.4
Доступны следующие модули:
Модуль № 0: E502, USB Сер. номер: 2T222563
Введите номер модуля, с которым хотите работать (от 0 до 0)
0
Установлена связь со следующим модулем:
Серийный номер : 2T222563
Наличие ЦАП : Да
Наличие BlackFin : Да
Наличие гальваноразвязки: Да
Индустриальное исп. : Нет
Наличие интерф. PCI/PCIe: Нет
Наличие интерф. USB : Да
Наличие интерф. Ethernet: Да
Версия ПЛИС : 0.1
Версия PLDA : 0
Версия прошивки ARM : 1.0.5.0
Установлены частоты:
Частота сбора АЦП = 2000000
Частота на лог. канал = 666667
Частота цифрового ввода = 2000000
Сбор данных запущен. Для останова нажмите любую клавишу
Теперь некоторое время надо ждать возможного появления ошибки
Странно, а в винде эта функция работает ().. вот что я получаю в окне:
$ x502_stream_read
Версия библиотеки: 1.1.4
Доступны следующие модули:
Модуль № 0: E502, USB Сер. номер: 2T222563
Введите номер модуля, с которым хотите работать (от 0 до 0)
0
Установлена связь со следующим модулем:
Серийный номер : 2T222563
Наличие ЦАП : Да
Наличие BlackFin : Да
Наличие гальваноразвязки: Да
Индустриальное исп. : Нет
Наличие интерф. PCI/PCIe: Нет
Наличие интерф. USB : Да
Наличие интерф. Ethernet: Да
Версия ПЛИС : 0.1
Версия PLDA : 0
Версия прошивки ARM : 1.0.5.0
Сбор данных запущен. Для останова нажмите любую клавишу
Ошибка приема данных: Синхронный сбор уже остановлен
Сбор данных остановлен успешно
x502_stream_read вообще не находит никакого устройства, функция E502_UsbGetDevRecordsList возвращает 0 в usb_devcnt, что вообще говоря странно. Я пользуюсь E502_UsbGetSerialList и она возвращает одно устройство, кроме того lsusb тоже показывает, что устройство есть с ID 2a52:e502. Исходники кода пытался положить с помощью клавиши Загрузки... наверное неправильно? Тогда вот пусть будут прямо здесь:
#include "QAdcObject.h"
QAdcObject::QAdcObject(QObject *parent) : QObject(parent)
{
m_bRun = false;
m_dev = 0;
}
QAdcObject::~QAdcObject()
{
if(m_dev != 0)
{
m_bRun = false;
X502_Close(m_dev);
X502_Free(m_dev);
}
}
#define channel_count 10
//#define CHECK_ADC_SCALE
void QAdcObject::init()
{
char serial[2][X502_SERIAL_SIZE];
qint32 err, devs;
if(m_dev != 0)
{
m_bRun = false;
X502_Close(m_dev);
X502_Free(m_dev);
}
err = E502_UsbGetSerialList(serial, 2, X502_GETDEVS_FLAGS_ONLY_NOT_OPENED, (uint32_t*)&devs);
if(devs == 0)
{
QDebug() << "e502 device not found";
return;
}
m_dev = X502_Create();
err = E502_OpenUsb(m_dev, serial[0]);
if(err != 0)
{
QDebug() << "open e502 failed";
X502_Free(m_dev);
return;
}
err = X502_SetMode(m_dev, X502_MODE_FPGA);
if(err < 0)
{
QDebug() << QString("set mode failed (%1)").arg(err);
}
err = X502_SetLChannelCount(m_dev, channel_count);
if(err < 0)
{
QDebug() << QString("set channel count failed (%1)").arg(err);
}
for(int i = 0; i < channel_count; i++)
{
err = X502_SetLChannel(m_dev, i, i, X502_LCH_MODE_COMM, X502_ADC_RANGE_5, 1);
if(err < 0)
{
QDebug() << QString("set logical channel failed (%1)").arg(err);
}
}
err = X502_SetSyncMode(m_dev, X502_SYNC_INTERNAL);
if(err < 0)
{
qDebug() << QString("set sync mode failed (%1)").arg(err);
}
err = X502_SetSyncStartMode(m_dev, X502_SYNC_INTERNAL);
if(err < 0)
{
qDebug() << QString("set sync start mode failed (%1)").arg(err);
}
double fAdcFrame = 4000.0;
double fAcq = 2000000.0;
err = X502_SetAdcFreq(m_dev, &fAcq, &fAdcFrame);
if(err < 0)
{
qDebug() << QString("set adc frequency failed (%1)").arg(err);
}
err = X502_Configure(m_dev, 0);
if(err < 0)
{
qDebug() << QString("set configure failed (%1)").arg(err);
}
}
//#define ADC_REORDER_DATA
void QAdcObject::startAdc(bool)
{
qint32 buffer[32];
qint32 rcv_size, adc_size, err;
err = X502_SetStreamBufSize(m_dev, X502_STREAM_CH_IN, channel_count);
if(err < 0)
{
QDebug() << QString("set stream buffer size failed (%1)").arg(err);
}
err = X502_SetStreamStep(m_dev, X502_STREAM_CH_IN, channel_count);
if(err < 0)
{
QDebug() << QString("set stream step failed (%1)").arg(err);
}
err = X502_StreamsEnable(m_dev, X502_STREAM_ADC);
if(err < 0)
{
QDebug() << QString("set stream enable failed (%1)").arg(err);
}
err = X502_StreamsStart(m_dev);
if(err < 0)
{
QDebug() << QString("set stream start failed (%1)").arg(err);
}
m_bRun = true;
while(m_bRun)
{
rcv_size = channel_count;
rcv_size = X502_Recv(m_dev, (uint32_t*)buffer, rcv_size, 2000);
if(rcv_size <= 0)
{
QDebug() << QString("error received adc data");
continue;
}
adc_size = rcv_size;
#ifdef ADC_REORDER_DATA
int first_lch;
double adc_data[channel_count];
X502_GetNextExpectedLchNum(m_dev, (uint32_t*)&first_lch);
err = X502_ProcessAdcData(m_dev, (uint32_t*)buffer, adc_data, (uint32_t*)&adc_size,
X502_PROC_FLAGS_VOLT);
#else
err = X502_ProcessAdcData(m_dev, (uint32_t*)buffer, ret, (uint32_t*)&adc_size,
X502_PROC_FLAGS_VOLT);
#endif
if(err < 0)
{
QDebug() << QString("error processing data [%1]").arg(err);
//helper for restart stream after error. It's working but not ever time...
X502_StreamsStop(m_dev);
X502_StreamsStart(m_dev);
continue;
}
#ifdef ADC_REORDER_DATA
for(int lch = 0; lch < adc_size; ++lch)
{
int pos = (lch >= first_lch)? lch - first_lch : adc_size - first_lch + lch;
if(pos < adc_size)
{
ret[lch] = adc_data[pos];
}
}
#endif
// there is should be my processing data
}
X502_StreamsStop(m_dev);
X502_StreamsDisable(m_dev, X502_STREAM_ADC);
}Сделал стриминг на Е502, но примерно через час работы X502_ProcessAdcData выдает ошибку X502_ERR_PROC_INVALID_CH_NUM. Частота 4 кГц 10 каналов.. вроде не так уж и много. Предположил, что не справляется ОС (начинал тестирование с Win7). Уменьшал частоту до 2 кГц, потом до 1 кГц... не помогло, все равно через некоторое время опять возникала та же ошибка. Решил попробовать поднять приоритет приложения. Перешел в Линукс (Rosa6). Использовал и nice и ionice для перевода приоритета приложения повыше... Все едино, примерно через час опять появляется эта ошибка.. Можете подсказать в чем проблема? Приложил примерный исходник класса для запуска е502.
Понятно. Тогда неплохо было бы где-то написать про последовательность установки пакетов или я просто такого описания не нашел.
Они как-то странно себя ведут в Росе: при попытке установить пишется ошибка, что нет зависящего пакета.. и так по кругу (https://cloud.mail.ru/public/A7Hh/3imJi7CFz)
Пробовал разные пакеты, но самый лучший вариант - просто сборка из исходников..
Спасибо, попробую эти варианты..
Подскажите мне откуда можно загрузить библиотеки для Rosa Fresh 7 (х64). В репозитарии http://download.opensuse.org/repositories/home:/l-card/ есть много вариантов пакетов в формате rpm. Какой надо выбрать?
Спасибо, понятно. Еще вопрос - вызовы чтения/записи цифровых сигналов из разных потоков программы выполняются без проблем? естественно с учетом битовых масок..
В продолжении темы возник вопрос. Вот основной цикл измерений:
X502_StreamsStart(m_dev);
while(m_bRun)
{
X502_Recv(m_dev, (uint32_t*)buffer, 10, 2000);
X502_ProcessAdcData(m_dev, (uint32_t*)buffer, adc_data, (uint32_t*)&adc_size, X502_PROC_FLAGS_VOLT);
app->adc_queue.enqueue(QByteArray((char*)adc_data, sizeof(double) * adc_size));
for(int i = 0; i < 4; i++)
{
app->m_out = i;
X502_AsyncOutDig(m_dev, app->m_out, 0);
X502_AsyncInDig(m_dev, (uint32_t*)&inp_data);
app->inp_data[i] = inp_data;
}
}
X502_StreamsStop(m_dev);на цифровые входы ничего не подается, но inp_data биты 14-й и 15-й стоят в "1". Интересно почему?
Большое спасибо. Это именно то, что мне и нужно. Вопрос можно закрыть.
Замечательно! Тогда последний уточняющий вопрос - вот я задаю список каналов и период получения данных с АЦП. Естественно перечисленные каналы АЦП измеряются с частотой 2 МГц, потом пауза, рассчитанная девайсом на основе заданного периода повторения и т.д. А цифровой ввод? В асинхронном режиме он тоже с паузой обновляется или непрерывно с частотой 2МГц?
Т.е. вопрос наверное можно переформулировать в общем виде так: эта пауза в синхронном режиме между измерениями группы каналов - она вроде как "псевдо-пауза", т.е. измерения все равно идут, только в буфер не заносятся данные? Если это так, тогда все отлично, и асинхронный поток на ввод можно сделать независимым от синхронного..
У меня такая задача: необходим синхронный ввод только данных с АЦП, а ввод/вывод бинарных данных - асинхронный. Судя по описанию режимов работы Е502 в нем не поддерживается асинхронный ввод бинарных данных.. так что если запущен синхронный ввод данных с АЦП, то и бинарные данные будут собираться синхронно.. Но мне нужен вариант немного другой: после получения данных с АЦП сделать ввод/вывод бинарных данных, т.е. требуется два независимых потока: синхронный - с АЦП и асинхронный для цифры. Есть ли возможность это сделать?
Адрес: 117105, Москва, Варшавское шоссе, д. 5, корп. 4
Многоканальный телефон: +7 (495) 785-95-25
Письма и запросы: lcard@lcard.ru
Отдел продаж: sale@lcard.ru
Мы работаем с юридическими и физическими лицами, пожалуйста, прикладывайте реквизиты при оформлении заказа
Техническая поддержка: support@lcard.ru
Время работы: с 9-00 до 19-00 мск