Меню
+7 (495) 785-95-25
sale@lcard.ru
sale@lcard.ru
Страницы 1
1. Попробуйте задействовать немного переделанный штатный консольный пример AdcKadr, в котором используется подключение с общей землей для первых 4-х каналов.
2. Не забудьте объединить ножки AGND(3) и GND32(21) на внешнем аналоговом разъёме модуля. Тогда на ножки X1(37), X2(36), X3(35) и X4(34) можно подавать постоянные сигналы в диапазоне ±2.5 В.
Да все заработало, спасибо вам огромное, я так понимаю что бы задействовать остальные порты нужно всего лишь менять данный показатель в коде:
#define CHANNELS_QUANTITY (0x4)
1. В штатном примере AdcKadr сбор данных идёт с первых 4-х каналов АЦП. Все каналы сконфигурированы по дифференциальной схеме подключения входных сигналов.
2. В штатном примере AdcSample сбор данных идёт с первых 2-х каналов АЦП. Причём 1-ый канал использует дифференциальное подключение входных сигналов, а 2-ой канал - просто аппаратно заземлён.
3. Чтобы более тщательно проанализировать Вашу ситуацию, нам необходимо получить от Вас как можно более полную информацию о схеме подключения сигналов к внешнему разъёму модуля E14-140M. Опишите, как можно подробнее, какой именно сигнал приходит на каждую из задействованных ножек внешнего разъёма.
Переговорил с инженером, в общем основываясь на этом документе: https://www.lcard.ru/download/e14-140_conn_examples.pdf страница 2 "Подключение к входу АЦП однофазного источника напряжения" в таблице пункт 1.1. Просто нужен метод чтобы отдельно значение с каждого входа в режиме 1.1 получить. Не инвертирующие входы х1 х2 х3..........
Добрый день, хочу получить данные с каналов попробовали эти программы: AdcKadr, почему то не считывает и во все, числа со всех каналов, просто уходят в отрицательное значение и все, а вот AdcSample работает, но правда считывается только один канал, на второй он не реагирует хотя LGraph все видит и нормально анализирует, подключаем прям в соседний, предполагаю что ошибка кроется где то здесь, но не как могу понять:
while(!kbhit())
{
if(!pModule->ADC_SAMPLE(&AdcSample1, (WORD)(0x00 | (0x0 << 4) | (InputRangeIndex << 6)))) { printf("\n\n ADC_SAMPLE(, 0) --> Bad\n"); break; }
else if(!pModule->ADC_SAMPLE(&AdcSample2, (WORD)(0x01 | (0x1 << 4) | (InputRangeIndex << 6)))) { printf("\n\n ADC_SAMPLE(, 1) --> Bad\n"); break; }
printf(" AdcSample Data (ADC code): %5d %5d\r", AdcSample1, AdcSample2);
}
Модуль E14-140M.
1. Штатный пример ReadData осуществляет потоковый сбор данных на частоте 400 кГц. Уверены, что вам необходимо выводить на экран каждую секунду по 400000 отсчётов?
2. Может быть под Вашу задачу больше подойдёт более медленный однократный сбор данных: Borland C++ 5.02\AdcSample или Borland C++ 5.02\AdcKadr.
Добрый день, попробовали эти программы, проблема решилась частично, AdcKadr, почему то не считывает и во все, числа со всех каналов, просто уходят в отрицательное значение и все, а вот AdcSample работает, но правда считывается только один канал, на второй он не реагирует хотя LGraph все видит и нормально анализирует, подключаем прям в соседний, предполагаю что ошибка кроется где то здесь, но не как могу понять:
while(!kbhit())
{
if(!pModule->ADC_SAMPLE(&AdcSample1, (WORD)(0x00 | (0x0 << 4) | (InputRangeIndex << 6)))) { printf("\n\n ADC_SAMPLE(, 0) --> Bad\n"); break; }
else if(!pModule->ADC_SAMPLE(&AdcSample2, (WORD)(0x01 | (0x1 << 4) | (InputRangeIndex << 6)))) { printf("\n\n ADC_SAMPLE(, 1) --> Bad\n"); break; }
printf(" AdcSample Data (ADC code): %5d %5d\r", AdcSample1, AdcSample2);
}
Ну канал куда поступают данные на АЦП, а с него на компьютер, на примере как это выводит LGraph, только там выдается график, а нам просто бы числовые значения считать, прошу прощения если не понятно, я бы мог прислать схему подключения и фото в реале, только не понял как у вас на форуме выкладывать картинки. По сути мне нужно то что у вас в одном из примере ReadData:
/ Поток, в котором осуществляется сбор данных
//------------------------------------------------------------------------
DWORD WINAPI ServiceReadThread(PVOID /*Context*/)
{
WORD i;
WORD RequestNumber;
DWORD FileBytesWritten;
// массив OVERLAPPED структур из двух элементов
OVERLAPPED ReadOv[2];
// массив структур с параметрами запроса на ввод/вывод данных
IO_REQUEST_LUSBAPI IoReq[2];
// остановим работу АЦП и одновременно сбросим USB-канал чтения данных
if (!pModule->STOP_ADC()) { ReadThreadErrorNumber = 0x1; IsReadThreadComplete = true; return 0x0; }
// формируем необходимые для сбора данных структуры
for (i = 0x0; i < 0x2; i++)
{
// инициализация структуры типа OVERLAPPED
ZeroMemory(&ReadOv[i], sizeof(OVERLAPPED));
// создаём событие для асинхронного запроса
ReadOv[i].hEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
// формируем структуру IoReq
IoReq[i].Buffer = ReadBuffer + i * DataStep;
IoReq[i].NumberOfWordsToPass = DataStep;
IoReq[i].NumberOfWordsPassed = 0x0;
IoReq[i].Overlapped = &ReadOv[i];
IoReq[i].TimeOut = (DWORD)(DataStep / ap.AdcRate + 1000);
}
// делаем предварительный запрос на ввод данных
RequestNumber = 0x0;
if (!pModule->ReadData(&IoReq[RequestNumber])) { CloseHandle(ReadOv[0].hEvent); CloseHandle(ReadOv[1].hEvent); ReadThreadErrorNumber = 0x2; IsReadThreadComplete = true; return 0x0; }
// запустим АЦП
if (pModule->START_ADC())
{
// цикл сбора данных
for (i = 0x1; i < NDataBlock; i++)
{
// сделаем запрос на очередную порцию данных
RequestNumber ^= 0x1;
if (!pModule->ReadData(&IoReq[RequestNumber])) { ReadThreadErrorNumber = 0x2; break; }
if (ReadThreadErrorNumber) break;
// ждём завершения операции сбора предыдущей порции данных
if (!WaitingForRequestCompleted(IoReq[RequestNumber ^ 0x1].Overlapped)) break;
// if(WaitForSingleObject(ReadOv[RequestNumber^0x1].hEvent, IoReq[RequestNumber^0x1].TimeOut) == WAIT_TIMEOUT) { ReadThreadErrorNumber = 0x3; break; }
if (ReadThreadErrorNumber) break;
// запишем полученную порцию данных в файл
if (!WriteFile(hFile, // handle to file to write to
IoReq[RequestNumber ^ 0x1].Buffer, // pointer to data to write to file
2 * DataStep, // number of bytes to write
&FileBytesWritten, // pointer to number of bytes written
NULL // pointer to structure needed for overlapped I/O
)) {
ReadThreadErrorNumber = 0x4; break;
}
if (ReadThreadErrorNumber) break;
else if (_kbhit()) { ReadThreadErrorNumber = 0x5; break; }
else Sleep(20);
Counter++;
}
// последняя порция данных
if (!ReadThreadErrorNumber)
{
RequestNumber ^= 0x1;
// ждём окончания операции сбора последней порции данных
if (!WaitingForRequestCompleted(IoReq[RequestNumber ^ 0x1].Overlapped)) ReadThreadErrorNumber = 0x3;
// if(WaitForSingleObject(ReadOv[RequestNumber^0x1].hEvent, IoReq[RequestNumber^0x1].TimeOut) == WAIT_TIMEOUT) ReadThreadErrorNumber = 0x3;
// запишем последнюю порцию данных в файл
if (!WriteFile(hFile, // handle to file to write to
IoReq[RequestNumber ^ 0x1].Buffer, // pointer to data to write to file
2 * DataStep, // number of bytes to write
&FileBytesWritten, // pointer to number of bytes written
NULL // pointer to structure needed for overlapped I/O
)) ReadThreadErrorNumber = 0x4;
Counter++;
}
}
else { ReadThreadErrorNumber = 0x6; }
// остановим работу АЦП
if (!pModule->STOP_ADC()) ReadThreadErrorNumber = 0x1;
// прервём возможно незавершённый асинхронный запрос на приём данных
if (!CancelIo(ModuleHandle)) { ReadThreadErrorNumber = 0x7; }
// освободим все идентификаторы событий
for (i = 0x0; i < 0x2; i++) CloseHandle(ReadOv[i].hEvent);
// небольшая задержка
Sleep(100);
// установим флажок завершения работы потока сбора данных
IsReadThreadComplete = true;
// теперь можно спокойно выходить из потока
return 0x0;
}
Только вместо вывода в файл в функцию printf в числовом виде.
Добрый день, сейчас в организации разбираемся с модулем E14-140M, хотим написать свою программу на C++, вроде все понятно, и драйвер и примеры все работают, но т.к. опыта с вашем устройством нет, хотелось бы уточнить, нет ли простого примера программы, которая просто бы опрашивала 1(или какой-нибудь еще порт), и выводила на экран числа, нам пока хватило бы, для дальнейшей работы. Из документации например скелет программы заработал, но вот нормально считать порт не получается. Спасибо.
Страницы 1
Адрес: 117105, Москва, Варшавское шоссе, д. 5, корп. 4, стр. 2
Многоканальный телефон:
+7 (495) 785-95-25
Отдел продаж: sale@lcard.ru
Техническая поддержка: support@lcard.ru
Время работы: с 9-00 до 19-00 мск