Технические требования к частотомеру:
- диапазон измеряемых частот 1...1000 Гц (Частота дискретизации нужна как минимум 2 кГц);
- Длительность импульса (Ти) и задержка между импульсами (Тз) равны:
f = 1 Гц, Ти =~ 0.5 c, Тз =~ 0.5 c
f = 10 Гц, Ти =~ 0.05 c, Тз =~ 0.05 c
f = 50 Гц, Ти =~ 0.01 c, Тз =~ 9.63*10^-3 c
f = 100 Гц, Ти =~ 5.4*10^-3 c, Тз =~ 4.7*10^-3 c
и т.д. при 1 кГц задержка между импульсами мала ~ (1/10)*Ти.
- точность измерения частоты:
+/- 10 Гц при f = 1 кГц
- количество каналов измерения E14-140 :
Пока использую 1 канал в обычном режиме.
- диапазон напряжений измеряемого сигнала:
0...7 В.
Подключение Е14-140 производится непосредственно к выходу генератора импульсов без каких-либо цепей согласования.
Программный код (С++ Builder) Инициализация АЦП:
// проверим версию используемой библиотеки Lusbapi.dll
if((DllVersion = GetDllVersion()) != CURRENT_VERSION_LUSBAPI)
{
Form1->Memo1->Lines->Add("Lusbapi.dll Version --> Error!!!");
Form1->Memo1->Lines->Add("Current: "+IntToStr((int)DllVersion >> 0x10)+"."
+IntToStr((int)DllVersion & 0xFFFF)+".");
Form1->Memo1->Lines->Add("Required: "+IntToStr(CURRENT_VERSION_LUSBAPI >> 0x10)+"."
+IntToStr(CURRENT_VERSION_LUSBAPI & 0xFFFF)+".");
}
else
{
Form1->Memo1->Lines->Add("Lusbapi.dll Version --> OK");
Form1->Memo1->Lines->Add("Current: "+IntToStr((int)DllVersion >> 0x10)+"."
+IntToStr((int)DllVersion & 0xFFFF)+".");
Form1->Memo1->Lines->Add("Required: "+IntToStr(CURRENT_VERSION_LUSBAPI >> 0x10)+"."
+IntToStr(CURRENT_VERSION_LUSBAPI & 0xFFFF)+".");
// Memo1->Lines->Add("");
}
// попробуем получить указатель на интерфейс
pModule = static_cast<ILE140 *>(CreateLInstance("e140"));
if(!pModule) Form1->Memo1->Lines->Add("Module Interface --> Bad");
else Form1->Memo1->Lines->Add("Module Interface --> OK");
// попробуем обнаружить модуль E14-140 в первых MAX_VIRTUAL_SLOTS_QUANTITY_LUSBAPI виртуальных слотах
WORD i;
for(i = 0x0; i < MAX_VIRTUAL_SLOTS_QUANTITY_LUSBAPI; i++) if(pModule->OpenLDevice(i)) break;
// что-нибудь обнаружили?
if(i == MAX_VIRTUAL_SLOTS_QUANTITY_LUSBAPI)
Form1->Memo1->Lines->Add("Can't find any module E14-140 in first 127 virtual slots!");
else Form1->Memo1->Lines->Add("OpenLDevice("+IntToStr(i)+") --> OK");
// попробуем прочитать дескриптор устройства
ModuleHandle = pModule->GetModuleHandle();
if(ModuleHandle == INVALID_HANDLE_VALUE)
Form1->Memo1->Lines->Add("GetModuleHandle() --> Bad");
else Form1->Memo1->Lines->Add("GetModuleHandle() --> OK");
// прочитаем название модуля в обнаруженном виртуальном слоте
if(!pModule->GetModuleName(ModuleName))
Form1->Memo1->Lines->Add("GetModuleName() --> Bad");
else Form1->Memo1->Lines->Add("GetModuleName() --> OK");
// проверим, что это 'E14-140'
AnsiString MN = ModuleName;
if(strcmp(ModuleName, "E140")) Form1->Memo1->Lines->Add("The module is not 'E14-140'");
else Form1->Memo1->Lines->Add("The module is 'E14-140' Name: " + MN);
// попробуем получить скорость работы шины USB
if(!pModule->GetUsbSpeed(&UsbSpeed))
Form1->Memo1->Lines->Add("GetUsbSpeed() --> Bad");
else Form1->Memo1->Lines->Add("GetUsbSpeed() --> OK");
// теперь отобразим скорость работы шины USB
AnsiString SP = UsbSpeed ? "High-Speed Mode (480 Mbit/s)" : "Full-Speed Mode (12 Mbit/s)";
Form1->Memo1->Lines->Add("USB is " + SP);
// получим информацию из ППЗУ модуля
if(!pModule->GET_MODULE_DESCRIPTION(&ModuleDescription))
Form1->Memo1->Lines->Add("GET_MODULE_DESCRIPTION() --> Bad");
else Form1->Memo1->Lines->Add("GET_MODULE_DESCRIPTION() --> OK");
// получим текущие параметры работы АЦП
if(!pModule->GET_ADC_PARS(&ap)) Form1->Memo1->Lines->Add("GET_ADC_PARS() --> Bad");
else Form1->Memo1->Lines->Add("GET_ADC_PARS() --> OK");
// установим желаемые параметры работы АЦП
ap.ClkSource = INT_ADC_CLOCK_E140; // внутренний запуск АЦП
ap.EnableClkOutput = ADC_CLOCK_TRANS_DISABLED_E140; // без трансляции тактовых импульсо АЦП
ap.InputMode = NO_SYNC_E140; // без синхронизации ввода данных
ap.ChannelsQuantity = 0xA; // 10 активных канала
// формируем управляющую таблицу
for(i = 0x0; i < ap.ChannelsQuantity; i++)
ap.ControlTable[i] = (WORD)(i | (ADC_INPUT_RANGE_10000mV_E140 << 0xA));
ap.AdcRate = 100.0; // частота работы АЦП в кГц
ap.InterKadrDelay = 0.0; // межкадровая задержка в мс
// передадим требуемые параметры работы АЦП в модуль
if(!pModule->SET_ADC_PARS(&ap)) Form1->Memo1->Lines->Add("SET_ADC_PARS() --> Bad");
else Form1->Memo1->Lines->Add("SET_ADC_PARS() --> OK");
// отобразим параметры сбора данных модуля на экране монитора
Form1->Memo1->Lines->Add("");
AnsiString SN = (char*)ModuleDescription.Module.SerialNumber;
Form1->Memo1->Lines->Add("Module E14-140 (S/N) is ready ... " + SN);
Form1->Memo1->Lines->Add(" Module Info:");
AnsiString R = (char)ModuleDescription.Module.Revision;
Form1->Memo1->Lines->Add(" Module Revision is " + R);
AnsiString VV = (char*)ModuleDescription.Mcu.Version.Version;
AnsiString VD = (char*)ModuleDescription.Mcu.Version.Date;
Form1->Memo1->Lines->Add(" MCU Driver Version is " + VV + " (" + VD +")");
Form1->Memo1->Lines->Add("Adc parameters:");
Form1->Memo1->Lines->Add(" ChannelsQuantity = " + IntToStr(ap.ChannelsQuantity));
Form1->Memo1->Lines->Add(" AdcRate = "+FloatToStr(ap.AdcRate) +"kHz");
Form1->Memo1->Lines->Add(" InterKadrDelay ="+ FloatToStr(ap.InterKadrDelay)+"ms");
Form1->Memo1->Lines->Add(" KadrRate = "+FloatToStr(ap.KadrRate)+"kHz");
Form1->Memo1->Lines->Add("");
// остановим работу АЦП и одновременно сбросим USB-канал чтения данных
if(!pModule->STOP_ADC()) Form1->Memo1->Lines->Add("Module->STOP_ADC() --> Bad");
else Form1->Memo1->Lines->Add("Module->STOP_ADC() --> OK");
Программный код чтения:
SHORT Data[0xA];
while (1)
{
if (!pModule->ADC_KADR(Form1->Data2))
{
Form1->Memo1->Lines->Add("Module->ADC_KADR(Data) --> Bad");
}
else
{
// Отображение считанной информации на график
}
}