1. Операционная система Windows 7 x64
2. Версия драйвера 6.0.2.5 от 20.12.2011
3. Пример ПО:
#include <stdio.h>
#include <conio.h>
#include <iostream>
#include "Lusbapi.h"
#include <cstring>
#include <iomanip>
#define CHANNELS_QUANTITY (0x4)
// аварийный выход из программы
void AbortProgram(char *ErrorString, bool AbortionFlag = true);
// версия библиотеки
DWORD DllVersion;
// указатель на интерфейс модуля
ILE440 *pModule;
// дескриптор устройства
HANDLE ModuleHandle;
// название модуля
char ModuleName[7];
// скорость работы шины USB
BYTE UsbSpeed;
// структура с полной информацией о модуле
MODULE_DESCRIPTION_E440 ModuleDescription;
// структура параметров работы АЦП модуля
ADC_PARS_E440 ap;
// отсчёты АЦП
SHORT AdcSample1, AdcSample2, AdcSample3, AdcSample4;
// индекс входного диапазона напряжения
const WORD InputRangeIndex = ADC_INPUT_RANGE_2500mV_E440;
//------------------------------------------------------------------------
// основная программа
//------------------------------------------------------------------------
int main()
{
//------------------------------------------------------------------------
WORD i;
// зачистим экран монитора
printf(" *********************************\n");
printf(" Module E14-440 \n");
printf(" Console example AdcSample stream \n");
printf(" *********************************\n\n");
// проверим версию используемой библиотеки Lusbapi.dll
if((DllVersion = GetDllVersion()) != CURRENT_VERSION_LUSBAPI)
{
char String[128];
sprintf(String, " Lusbapi.dll Version Error!!!\n Current: %1u.%1u. Required: %1u.%1u",
DllVersion >> 0x10, DllVersion & 0xFFFF,
CURRENT_VERSION_LUSBAPI >> 0x10, CURRENT_VERSION_LUSBAPI & 0xFFFF);
AbortProgram(String);
}
else printf(" Lusbapi.dll Version --> OK\n");
// попробуем получить указатель на интерфейс
pModule = static_cast<ILE440 *>(CreateLInstance("e440"));
if(!pModule) AbortProgram(" Module Interface --> Bad\n");
else printf(" Module Interface --> OK\n");
// попробуем обнаружить модуль E14-440 в первых MAX_VIRTUAL_SLOTS_QUANTITY_LUSBAPI виртуальных слотах
for(i = 0x0; i < MAX_VIRTUAL_SLOTS_QUANTITY_LUSBAPI; i++) if(pModule->OpenLDevice(i)) break;
// что-нибудь обнаружили?
if(i == MAX_VIRTUAL_SLOTS_QUANTITY_LUSBAPI) AbortProgram(" Can't find any module E14-440 in first 127 virtual slots!\n");
else printf(" OpenLDevice(%u) --> OK\n", i);
// попробуем прочитать дескриптор устройства
ModuleHandle = pModule->GetModuleHandle();
if(ModuleHandle == INVALID_HANDLE_VALUE) AbortProgram(" GetModuleHandle() --> Bad\n");
else printf(" GetModuleHandle() --> OK\n");
// прочитаем название модуля в обнаруженном виртуальном слоте
if(!pModule->GetModuleName(ModuleName)) AbortProgram(" GetModuleName() --> Bad\n");
else printf(" GetModuleName() --> OK\n");
// проверим, что это 'E14-440'
if(strcmp(ModuleName, "E440")) AbortProgram(" The module is not 'E14-440'\n");
else printf(" The module is 'E14-440'\n");
// попробуем получить скорость работы шины USB
if(!pModule->GetUsbSpeed(&UsbSpeed)) AbortProgram(" GetUsbSpeed() --> Bad\n");
else printf(" GetUsbSpeed() --> OK\n");
// теперь отобразим скорость работы шины USB
printf(" USB is in %s\n", UsbSpeed ? "High-Speed Mode (480 Mbit/s)" : "Full-Speed Mode (12 Mbit/s)");
// код LBIOS'а возьмём из соответствующего ресурса штатной DLL библиотеки
if(!pModule->LOAD_MODULE()) AbortProgram(" LOAD_MODULE() --> Bad\n");
else printf(" LOAD_MODULE() --> OK\n");
// проверим загрузку модуля
if(!pModule->TEST_MODULE()) AbortProgram(" TEST_MODULE() --> Bad\n");
else printf(" TEST_MODULE() --> OK\n");
// получим информацию из ППЗУ модуля
if(!pModule->GET_MODULE_DESCRIPTION(&ModuleDescription)) AbortProgram(" GET_MODULE_DESCRIPTION() --> Bad\n");
else printf(" GET_MODULE_DESCRIPTION() --> OK\n");
// получим текущие параметры работы АЦП
if(!pModule->GET_ADC_PARS(&ap)) AbortProgram(" GET_ADC_PARS() --> Bad\n");
else printf(" GET_ADC_PARS() --> OK\n");
// установим желаемые параметры работы АЦП
ap.IsCorrectionEnabled = true; // разрешим корректировку данных на уровне драйвера DSP
ap.InputMode = NO_SYNC_E440; // обычный сбор данных безо всякой синхронизации ввода
ap.ChannelsQuantity = CHANNELS_QUANTITY;// четыре активных канала
// формируем управляющую таблицу
for(i = 0x0; i < ap.ChannelsQuantity; i++)
ap.ControlTable[i] = (WORD)(i | (InputRangeIndex << 0x6));
ap.AdcRate = 100.0; // частота работы АЦП в кГц
ap.InterKadrDelay = 0.0; // межкадровая задержка в мс
ap.AdcFifoBaseAddress = 0x0; // базовый адрес FIFO буфера АЦП в DSP модуля
ap.AdcFifoLength = MAX_ADC_FIFO_SIZE_E440; // длина FIFO буфера АЦП в DSP модуля
// будем использовать фирменные калибровочные коэффициенты, которые храняться в ППЗУ модуля
for(i = 0x0; i < ADC_CALIBR_COEFS_QUANTITY_E440; i++)
{
ap.AdcOffsetCoefs[i] = ModuleDescription.Adc.OffsetCalibration[i];
ap.AdcScaleCoefs[i] = ModuleDescription.Adc.ScaleCalibration[i];
}
// передадим требуемые параметры работы АЦП в модуль
if(!pModule->SET_ADC_PARS(&ap)) AbortProgram(" SET_ADC_PARS() --> Bad\n");
else printf(" SET_ADC_PARS() --> OK\n");
// отобразим параметры модуля на экране монитора
printf(" \n\n");
printf(" Module E14-440 (S/N %s) is ready ... \n", ModuleDescription.Module.SerialNumber);
printf(" Module Info:\n");
printf(" Module Revision is '%c'\n", ModuleDescription.Module.Revision);
printf(" AVR Driver Version is %s (%s)\n", ModuleDescription.Mcu.Version.Version, ModuleDescription.Mcu.Version.Date);
printf(" LBIOS Version is %s (%s)\n", ModuleDescription.Dsp.Version.Version, ModuleDescription.Dsp.Version.Date);
printf(" Adc parameters:\n");
printf(" Data Correction is %s\n", ap.IsCorrectionEnabled ? "enabled" : "disabled");
printf(" Input Range = %6.2f Volt\n", ADC_INPUT_RANGES_E440[InputRangeIndex]);
printf("\n Press any key if you want to terminate this program...\n");
// цикл перманентного выполнения функции ADC_SAMPLE и
// отображения полученных данных на экране диплея
printf("\n\n");
printf(" ADC Channel: 1 2 3 4\n");
while(!kbhit())
{
if(!pModule->ADC_SAMPLE(&AdcSample1, (WORD)(0x00 | (InputRangeIndex << 6))))
{
printf("\n\n ADC_SAMPLE(, 0) --> Bad\n");
break;
}
else if(!pModule->ADC_SAMPLE(&AdcSample2, (WORD)(0x01 | (InputRangeIndex << 6))))
{
printf("\n\n ADC_SAMPLE(, 1) --> Bad\n");
break;
}
else if(!pModule->ADC_SAMPLE(&AdcSample3, (WORD)(0x02 | (InputRangeIndex << 6))))
{
printf("\n\n ADC_SAMPLE(, 2) --> Bad\n");
break;
}
else if(!pModule->ADC_SAMPLE(&AdcSample4, (WORD)(0x03 | (InputRangeIndex << 6))))
{
printf("\n\n ADC_SAMPLE(, 3) --> Bad\n");
break;
}
printf(" AdcSample Data (ADC code): %5d %5d %5d %5d\r", AdcSample1, AdcSample2,AdcSample3,AdcSample4);
}
// освободим интерфейс модуля
printf("\n\n");
AbortProgram(" The program was completed successfully!!!\n", false);
//------------------------------------------------------------------------
return 0;
}
//------------------------------------------------------------------------
// аварийное завершение программы
//------------------------------------------------------------------------
void AbortProgram(char *ErrorString, bool AbortionFlag)
{
// подчищаем интерфейс модуля
if(pModule)
{
// освободим интерфейс модуля
if(!pModule->ReleaseLInstance()) printf(" ReleaseLInstance() --> Bad\n");
else printf(" ReleaseLInstance() --> OK\n");
// обнулим указатель на интерфейс модуля
pModule = NULL;
}
// выводим текст сообщения
if(ErrorString) printf(ErrorString);
// прочистим очередь клавиатуры
if(kbhit()) { while(kbhit()) getch(); }
// если нужно - аварийное завершаем программу
if(AbortionFlag) exit(0x1);
// или спокойно выходим из функции
else return;
}