Российский производитель и разработчик сертифицированного измерительного оборудования с 1987 года


Частотомер на Е14-140

Вы не вошли.

 Поиск | Регистрация | Вход 

Дмитрий С
22.07.2015 12:47:53
#1

Гость

Частотомер на Е14-140

Добрый день!

Меня интересует возможность создания частотомера прямоугольных и дельта импульсов.

К настоящему моменту сделан генератор прямоугольных импульсов на 555 таймере с перестраиваемой частотой от 2 до 160 Гц. До частоты примерно в 100 Гц импульсы отображаются также как в программе LGraph, но дальнейшее увеличение частоты приводит к соединению соседних импульсов. АЦП запускаю как в примере чтения данных функцией ADC_KADR().

В чем может быть проблема?
Заранее благодарен.

22.07.2015 13:08:33
#2

Инженер-электронщик
Откуда: "Л Кард"
Здесь с 21.04.2014
Сообщений: 4,597

Re: Частотомер на Е14-140

Дмитрий, если Вас интересует поведение оцифрованного сигнала от E14-140 при конкретных программных настройках E14-140 и при конкретном подключении, тогда приведите эти программные настройки и подробную схему подключения, из которой будут понятны электрические свойства измерительной цепи.
Кроме того, приведите технические требования к Вашему частотомеру:
- диапазон измерямых частот.
- минимальная длительность импульса.
- точность измерения частоты.
- количество каналов измерения E14-140.
- диапазон напряжений измеряемого сигнала

Дмитрий С
22.07.2015 15:25:22
#3

Гость

Re: Частотомер на Е14-140

Технические требования к частотомеру:
- диапазон измеряемых частот 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
                {
                 // Отображение считанной информации на график
                }
         }
Дмитрий С
22.07.2015 15:26:55
#4

Гость

Re: Частотомер на Е14-140

Простым языком:
"Надо считывать информация с канала с частотой 2 кГц".

22.07.2015 21:47:40
#5

Инженер-электронщик
Откуда: "Л Кард"
Здесь с 21.04.2014
Сообщений: 4,597

Re: Частотомер на Е14-140

Дмитрий, Ваша постановка задачи вполне реальная, и я так понял, что под LGraph Вы видите то, что ожидаете. По программным вопросам ответит наш программист.

Дмитрий С
23.07.2015 13:56:48
#6

Гость

Re: Частотомер на Е14-140

Спасибо за ответ,
но хотелось бы понять как запрограммировать чтение данных со входа АЦП с нужной частотой.

23.07.2015 16:24:57
#7

Сотрудник "Л Кард"
Здесь с 24.04.2014
Сообщений: 1,534

Re: Частотомер на Е14-140

1. Функция ADC_KADR() рассчитана на достаточно медленный (порядка нескольких десятков  Гц) асинхронный сбор кадра отсчётов. Подробнее смотри руководство программиста п.4.5.7. "Ввод кадра отсчетов с АЦП":
www.lcard.ru/download/e14_140_programmers_guide.pdf
2. Вам нужен синхронный сбор данных. Пример программирования можно найти в каталоге "\Lusbapi\E14-440\Examples\Borland C++ Builder 6.0\ReadData"

Дмитрий С
23.07.2015 19:50:07
#8

Гость

Re: Частотомер на Е14-140

Спасибо большое за совет.
Поставил сбор данных в синхронном режиме и сразу все заработало.

23.07.2015 23:13:04
#9

Инженер-электронщик
Откуда: "Л Кард"
Здесь с 21.04.2014
Сообщений: 4,597

Re: Частотомер на Е14-140

Дмитрий, по поводу вопросов, связанных с созданием частотомера на основе модулей E14-... Вам могут пригодиться следующие статьи с нашего сайта:
http://www.lcard.ru/support/faq/fs_measur_ltr_e14
http://www.lcard.ru/lexicon/pulse_count_problem
http://lcard.ru/download/articles/distortions.pdf
http://lcard.ru/download/e14-140_conn_examples.pdf
http://www.lcard.ru/support/faq/pc_gnd_connect
http://www.lcard.ru/support/faq/program_works_really

Контакты

Адрес: 117105, Москва, Варшавское шоссе, д. 5, корп. 4

Многоканальный телефон:+7 (495) 785-95-25

Письма и запросы: lcard@lcard.ru
Отдел продаж: sale@lcard.ru
Техническая поддержка: support@lcard.ru

Время работы: с 9-00 до 19-00 мск