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


E 14-140 M, Как задать частоту вывода на каналы DAC 1 и DAC 2

Вы не вошли.

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

mash6a
11.05.2014 23:36:29
#1

Гость

E 14-140 M, Как задать частоту вывода на каналы DAC 1 и DAC 2

Здравствуйте!
Приобрела оборудование E14-140М. Работаю с ним несколько дней. Проблем с прогрузкой нет, все работает, и достаточно удобный в работе. Как задавай частоту с которой прибор будет выводить сигналы на каналы DAC1 и DAC2 ? В руководстве пользователя написано не понятно, а подходящих примеров я не нашла. Покажите пожалуйста пример функции установки частоты вывода на delphi. И с какой частотой он выводит по умолчанию, если ее не задать ?

12.05.2014 11:43:00
#2

Сотрудник "Л Кард"
Здесь с 18.04.2014
Сообщений: 810

Re: E 14-140 M, Как задать частоту вывода на каналы DAC 1 и DAC 2

О частоте дискретизации можно говорить только при использовании синхронного (потокового, циклического) вывода.

В руководстве см. описание функции SET_DAC_PARS.
Для работы с ЦАП рекомендую доп. описание http://www.lcard.ru/download/e14_140m_addendum_dac.pdf
В нем параграфы 2.4, 3.1.
Если Вы заполняете DacRate в кГц, то 200.0/N, где N = целое 1..8

"По умолчанию" оставлять некорректно, потому что настройки ЦАП тогда останутся от предыдущего вызова SET_DAC_PARS (даже если это сделала другая программа). При включении модуля, по-моему, RateDiv=0, что соответствует 200 кГц, но делать SET_DAC_PARS все равно обязательно.

mash6a
13.05.2014 23:15:07
#3

Гость

Re: E 14-140 M, Как задать частоту вывода на каналы DAC 1 и DAC 2

Спасибо. У Вас в примере, DacSamle, который для Delphi, нет ни одной строчки в которой  задается частота вывода или я что-то не понимаю ?

//******************************************************************************
//					  	О С Н О В Н А Я    П Р О Г Р А М М А
//******************************************************************************
begin
	// инициализация дескрипторов ввода и вывода
	InitConsoleHandles();
	// очистим экран дисплея
	ClearScreen();

	// проверим версию используемой DLL библиотеки
	DllVersion := GetDllVersion;
	if DllVersion <> CURRENT_VERSION_LUSBAPI then
		begin
			Str := 'Неверная версия DLL библиотеки Lusbapi.dll! ' + #10#13 +
						'           Текущая: ' + IntToStr(DllVersion shr 16) +  '.' + IntToStr(DllVersion and $FFFF) + '.' +
						' Требуется: ' + IntToStr(CURRENT_VERSION_LUSBAPI shr 16) + '.' + IntToStr(CURRENT_VERSION_LUSBAPI and $FFFF) + '.';
			AbortProgram(Str);
		end
	else WriteLn(' DLL Version --> OK');

	// попробуем получить указатель на интерфейс для модуля E14-140
	pModule := CreateLInstance(pCHAR('e140'));
	if pModule = nil then AbortProgram('Не могу найти интерфейс модуля E14-140!')
	else WriteLn(' Module Interface --> OK');

	// попробуем обнаружить модуль E14-140 в первых MAX_VIRTUAL_SLOTS_QUANTITY_LUSBAPI виртуальных слотах
	for i := 0 to (MAX_VIRTUAL_SLOTS_QUANTITY_LUSBAPI-1) do if pModule.OpenLDevice(i) then break;
	// что-нибудь обнаружили?
	if i = MAX_VIRTUAL_SLOTS_QUANTITY_LUSBAPI then AbortProgram('Не удалось обнаружить модуль E14-140 в первых 127 виртуальных слотах!')
	else WriteLn(Format(' OpenLDevice(%u) --> OK', [i]));

	// получим идентификатор устройства
	ModuleHandle := pModule.GetModuleHandle();
	if ModuleHandle = INVALID_HANDLE_VALUE then AbortProgram('Не удалось получить дескриптор устройства!')
	else WriteLn(' GetModuleHandle() --> OK');

	// прочитаем название модуля в текущем виртуальном слоте
	ModuleName := '0123456';
	if not pModule.GetModuleName(pCHAR(ModuleName)) then AbortProgram('Не могу прочитать название модуля!')
	else WriteLn(' GetModuleName() --> OK');
	// проверим, что это модуль E14-140
	if Boolean(AnsiCompareStr(ModuleName, 'E140')) then AbortProgram('Обнаруженный модуль не является E14-140!')
	else WriteLn(' The module is ''E14-140''');

	// попробуем получить скорость работы шины USB
	if not pModule.GetUsbSpeed(@UsbSpeed) then AbortProgram(' Не могу определить скорость работы шины USB')
	else WriteLn(' GetUsbSpeed() --> OK\n');
	// теперь отобразим скорость работы шины USB
	if UsbSpeed = USB11_LUSBAPI then Str := 'Full-Speed Mode (12 Mbit/s)' else Str := 'High-Speed Mode (480 Mbit/s)';
	WriteLn(Format('   USB is in %s', [Str]));

	// теперь получим номер версии загруженного драйвера DSP
	if not pModule.GET_MODULE_DESCRIPTION(@ModuleDescription) then AbortProgram('Не могу получить информацию о модуле!')
	else WriteLn(' GET_MODULE_DESCRIPTION() --> OK');

	// проверим есть ли на модуле ЦАП
	if ModuleDescription.Dac.Active = BOOL(DAC_INACCESSIBLED_E140) then AbortProgram(' DAC is absent on this module E14-140!');

	// отобразим параметры работы модуля по вводу данных на экране монитора
	WriteLn('');
	Write  (' Module E14-140 (S/N ', StrPas(@ModuleDescription.Module.SerialNumber)); WriteLn(') is ready ... ');
	WriteLn('   Module Info:');
	WriteLn(Format('     Module  Revision   is ''%1.1s''', [StrPas(@ModuleDescription.Module.Revision)]));
	WriteLn(Format('     MCU Driver Version is %s (%s)', [StrPas(@ModuleDescription.Mcu.Version.Version), StrPas(@ModuleDescription.Mcu.Version.Date)]));
	// вставим пустую строчку
	Write(#10#13);
	WriteLn('   Now SINUS signal is on the first DAC channel and ');
	WriteLn('      -SINUS signal is on the second DAC channel.');
	WriteLn('      (Press ESC key to terminate the program)');

	// Цикл перманетной работы функции DAC_SAMPLE().
	// При этом на первом канале ЦАП будет выводится синус,
	// а на втором канале ЦАП будет выводится -синус.
	// Т.е. сигналы на каналах ЦАП будут выводится в противофазе ;)
	Flag := 0;
	CurrentTime := 0.0;
	DacSampleCounter := 0;
	while true do
	   begin
			DacSample0 := Round(2000.0*sin(2.0*PI*2.5*CurrentTime));
			DacSample1 := Round(-DacSample0);
			CurrentTime := CurrentTime + 1.0/500;//125.0;

			// выведем очередной отсчёт на первый канал ЦАП
			if not pModule.DAC_SAMPLE(@DacSample0, 0) then begin WriteLn(#10#13' DAC_SAMPLE(0, ) -> Bad!'); break; end
			// выведем очередной отсчёт на второй канал ЦАП
			else if not pModule.DAC_SAMPLE(@DacSample1, 1) then begin WriteLn(#10#13' DAC_SAMPLE(0, ) -> Bad!'); break; end
			// выходим из цикла по нажатию клавиши ESC
			else if IsEscKeyPressed() then break;

			// изредка моргнём строчкой с точками
			Inc(DacSampleCounter);
			if not BOOL(DacSampleCounter mod 50) then
			   begin
					Flag := Flag xor $1;
					if BOOL(Flag) then Write('                                             ')
					else Write(' ............................................');
					Write(#13);
				end;
		end;

	// две пустые строчки
	Write(#10#13#10#13);

	// посмотрим были ли ошибки при сборе данных
	AbortProgram(' ', false);
	// завершение приложения
	exit;
end.
15.05.2014 11:15:32
#4

Сотрудник "Л Кард"
Здесь с 18.04.2014
Сообщений: 810

Re: E 14-140 M, Как задать частоту вывода на каналы DAC 1 и DAC 2

mash6a пишет:

Спасибо. У Вас в примере, DacSamle, который для Delphi, нет ни одной строчки в которой  задается частота вывода

Собственно, поэтому я и написал:

Александр Е пишет:

О частоте дискретизации можно говорить только при использовании синхронного (потокового, циклического) вывода.

Пример, который Вы смотрите, использует однократный вывод на ЦАП, там нет частоты дискретизации. То, что он назван "синусом"... ну, это не всерьез smile Моменты вывода отсчетов зависят от того, когда компьютер выдаст команды в USB.

Этот пример совместим со старым E14-140 (не -M), у которого только такой вывод на ЦАП и был, однократный.
Функция DAC_SAMPLE просто устанавливает уровень на выходе без привязки ко времени: как команда пройдет по USB и выполнится, так и устанавливает. Для настоящего синтеза сигналов заданной формы это не годится.

А в потоковом режиме ЦАП работает с настоящим цифровым сигналом, аналогично тому, как сделан потоковый ввод с АЦП, только данные не читаются, а пишутся. И функция DAC_SAMPLE при этом не используется совсем.
АЦП: SET_ADC_PARS - START_ADC - ReadFile ReadFile... - STOP_ADC.
ЦАП: SET_DAC_PARS - START_DAC - WriteFile WriteFile... - STOP_DAC.
Посмотрите по ссылке, котрую я дал выше, расширенное описание работы с ЦАП E14-140-M.