|
|||||||
АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция |
Программа работы. 1. Разработать программу генерации модельного радиолокационного сигнала в среде Visual C++ для модуля ГСПФ-052 и создать exe-модуль1. Разработать программу генерации модельного радиолокационного сигнала в среде Visual C++ для модуля ГСПФ-052 и создать exe-модуль. 2. Разработать программу регистрации модельного сигнала с помощью модуля LA-н10M6PCI и выполнения цифровой обработки. 3. Исследовать зависимость точности измерения времени задержки от количества точек, количества периодов сигнала, количества накоплений, уровня шума, отношения частоты дискретизации к частоте отсчетов и внутренних параметров алгоритма для трех упомянутых выше методов цифровой обработки.
Указания к выполнению лабораторной работы
1. При выполнении п.п.1 и 2 программы изучить техническое описание модулей ГСПФ-052 и LA-н10M6PCI, примеры программирования, приведенные в приложении. 2. При выполнении п.3. Программы составить программы цифровой обработки двумя способами: по максимуму модельного сигнала, комбинированным корреляционным.
Содержание отчета
1. Задание к работе. 2. Тексты разработанных программ. 3. Графический экран разработанного пользовательского интерфейса. 4. Результаты исследования зависимости точности измерения времени задержки от количества точек, количества периодов сигнала, количества накоплений, уровня шума, отношения частоты дискретизации к частоте отсчетов и внутренних параметров алгоритма для двух упомянутых выше методов цифровой обработки. 5. Выводы. ПРИЛОЖЕНИЕ 1. //Программа запускает генерацию сигналов разных частот модуля ГСПФ-052 //и регистрирует отклик с модели объекта с помощью модуля АЦП с памятью //ADC ЛА-н10M6PCI. Программа написана в среде LabWindows/CVI 8.0
#include <ansi_c.h> #include <utility.h> #include <cvirte.h> #include <userint.h> #include "lab4.h"
#include "include/UniDriver.h"
//константы, определяющие работу платы АЦП #define DEVICE_NAME "LAN10PCI" #define BASE_ADDRESS 0x001 #define DRQ_NUMBER 0 #define IRQ_NUMBER 1
#define DATASIZE 1024
int ADCInit (void); int ADCClose(void); int ADCSetting (void); int ADCGetData(double []); int Generator(int, int);
//переменные и функции для работы с платой unsigned int ADCHandle = 0; int ADCBoardPresent = 0;
static int panelHandle;
int ADCInit (void) { //создаем указатель на DLL ADCHandle = UniDriverCreate(DEVICE_NAME); //плата ЛА-н10М6PCI //Задаем базовый адрес канала ПДП и номер прерывания UniDriverSetup(ADCHandle, BASE_ADDRESS, DRQ_NUMBER, IRQ_NUMBER);
if (UniDriverTest(ADCHandle)!= 1) { MessagePopup(" E R R O R!!!", "ADC board doesn't work!"); ADCBoardPresent = 0;
return -1; }
ADCBoardPresent = 1;
return 0; } int ADCClose(void) { UniDriverClose(ADCHandle);
return 0; } //функция устанавливает заданный режим работы АЦП int ADCSetting (void) { int BinSwitch = 0;
int start = 0; int freq = 0; int irq = 0, chanel = 1;
int n = 0, i = 0;
struct UADCParametersMEMORY a;
short DrvData[DATASIZE * 2];
//Установка режима работы АЦП a.m_nType =ADC_MEMORY_TYPE; //Тип платы a.m_nSizeOf = sizeof(a); //Размер структуры
a.m_nStartOf = ADCPARAM_START_PROGRAMM;
//настройка частоты дискретизации a.m_fFreq = 50 * 1000 * 1000; //50 MHz
//установка количества читаемых данных a.m_nBufferSize = DATASIZE;
// размер предистории a.m_nBeforeHistory = 0;
//смещение нулевого канала a.m_nDelta[0] = 0;
//коэффициент усиления нулевого канала a.m_nGain[0] = 1;
//смещение первого канала a.m_nDelta[1] = 0;
//коэффициент усиления первого канала a.m_nGain[1] = 1;
//синхронизация по первому каналу по положительному фронту a.m_nControl = ADC_CONTROL_ESW | ADC_CONTROL_SYNC_CH1 | ADC_CONTROL_SYNC_FRONT;
//уровень синхронизации a.m_nSyncLevel = 0;
//инициализация платы UniDriverInit(ADCHandle, ADC_INIT_MODE_INIT, &a);
return 0; } int ADCGetData(double Signal[]) { short Data[DATASIZE]; int Ready = 0; int tempo = 0, i; double max, min; int maxIndex, minIndex;
tempo = UniDriverStart(ADCHandle);
if (tempo!= 1) { MessagePopup(" E R R O R!!!", "Can't start ADC Board!!"); return -1; }
while (1) { UniDriverGet(ADCHandle, ADC_GET_READY, &Ready); if (Ready == 1) break; }
UniDriverGetData(ADCHandle, ADC_DATA_MODE_DATACH0 | ADC_DATA_MODE_CONVERT2INT16, (char *)Data, DATASIZE, 0);
for (i = 0; i < DATASIZE; i++) Signal[i] = (double)Data[i];
return 0; } int Generator(int command, int Freq) //command = 0 – запуск генератора // = 1 - остановка char str[100];
sprintf(str, "RunGenerator.exe %d %d", command, Freq); //формирование строки-команды LaunchExecutableEx(str, LE_HIDE, NULL);//запуск внешнего exe-модуля
return 0; }
int main (int argc, char *argv[]) { if (InitCVIRTE (0, argv, 0) == 0) return -1; /* out of memory */
if ((panelHandle = LoadPanel (0, "lab4.uir", PANEL)) < 0) return -1;
if (ADCInit()!= -1) //есть АЦП? ADCSetting(); //установка параметров АЦП
DisplayPanel (panelHandle); RunUserInterface (); DiscardPanel (panelHandle); if (ADCBoardPresent == 1) //плата присутствует? ADCClose(); //отключение драйвера return 0; } int CVICALLBACK Quit (int panel, int control, int event, void *callbackData, int eventData1, int eventData2) { switch (event) { case EVENT_COMMIT: QuitUserInterface(0); break; } return 0; } int CVICALLBACK Start (int panel, int control, int event, void *callbackData, int eventData1, int eventData2) { int FrequencyStart, FrequencyStop, FrequencyCurrent; int i; double Signal[DATASIZE];
switch (event) { case EVENT_COMMIT:
GetCtrlVal(panelHandle, PANEL_FREQUENCY_START, &FrequencyStart); //начальная частота GetCtrlVal(panelHandle, PANEL_FREQUENCY_STOP, &FrequencyStop); //конечная частота //Проведем 7 измерений на интервале [FrequencyStart; FrequencyStop] for (i = 0; i < 7; i++) { FrequencyCurrent = FrequencyStart + i*(FrequencyStop - FrequencyStart) / 6.0; Generator (0, FrequencyCurrent); //запуск генератора
SetCtrlVal(panelHandle, PANEL_FREQUENCY_CURRENT, FrequencyCurrent); //текущая частота
ADCGetData(Signal); //получаем сигнал с АЦП DeleteGraphPlot(panelHandle, PANEL_SIGNAL, -1, VAL_IMMEDIATE_DRAW); PlotY(panelHandle, PANEL_SIGNAL, Signal, DATASIZE, VAL_DOUBLE, VAL_THIN_LINE, VAL_SOLID_SQUARE, VAL_SOLID, 1, VAL_BLACK); Beep(); // Звуковой сигнал Generator(1, 0); //остановка генератора } break; } return 0; }
ПРИЛОЖЕНИЕ 2.
// Пример работы с генератором сигналов произвольной формы // Генератор использует стандарный интерфейс IADCDevice //Программа написана в среде Visual C++
#include "stdafx.h" #include <stdlib.h> #include "ADC_Errors.h" #include <windows.h> #include "IDACDevice1.h" #include "DllClient.h" #include "stdio.h" #include "conio.h" #include <math.h>
#define DEVICE_NAME "DACn10PCI" // Название драйвера #define BASE_ADDRESS 0x01 // Адрес устройства #define BUFSIZE (256*1024) // Размер буфера должен быть кратным двум!!!
/* Для DACn10ISA, в качестве базового адреса передаётся базовый адрес (определяемый перемычками на плате). Для DACn10PCI и DACn10USB, в качестве базового адреса передаётся номер платы (устройства). Для платы DACn10PCI номер определяется следующим образом: плата №1 находится в самом верхнем слоте PCI (ближайший к слоту AGP), следующая такая же плата будет иметь №2 и так далее. (Пустые слоты и слоты, занятые платами других типов в нумерации не учитываются.) */ /*-----------------------------------------------------------------------------*/ // Освобождение драйвера void Clear(IADCDevice* pADC, DllClient* pDll) { if(pADC) { pADC->Release(); pADC = NULL; } if(pDll) pDll->Free(); } /*-----------------------------------------------------------------------------*/
int main() // функция возврващает при ошибке 0, иначе 1 { // Буфер данных всегда должен быть кратным двойке!!!
unsigned short DrvData[BUFSIZE]; // массив под буфер
float m_fRealSetupFreq;
DllClient LAxClient;
// Загружаем драйвер IADCDevice* pADC = (IADCDevice*)LAxClient.LoadDriver(_T(DEVICE_NAME), _T("IADCDevice"));
// Установка параметров устройства: базового адреса pADC->Setup(BASE_ADDRESS, 0, 0, 0);
int m_cDACResolution = 0; int m_cDACMaxMem = 0; float m_fOutR = 50.0f; // Соглас. нагрузка!
DACParametersMEMORY a; // DAC_START_LOOP - Циклическое проигрывание // DAC_START_PROGRAMM - Однократное проигрывание // DAC_START_EXT - Внешний старт // DAC_START_FRONT - Внешняя синхронизация по нарастанию // DAC_FREQ_EXT - Внешняя частота // Установление нескольких параметров происходит через "ИЛИ", //a.m_nStartOf = DAC_START_LOOP | DAC_START_EXT | DAC_START_FRONT; a.m_nStartOf = DAC_START_LOOP;
// Частота дискретизации, Гц a.m_fFreq = 100000000; a.m_nAtten = 3; a.m_nFilter = 0; // В m_fRealSetupFreq после вызова ф-ии инициализации параметров будет лежать действ. //установленная частота дискретизации pADC->Init(ADC_INIT_MODE_INIT, &a, &m_fRealSetupFreq);
// Создаём выводимый сигнал. // Сначала весь массив заполняем нулями ZeroMemory(DrvData, BUFSIZE * sizeof(short)); // Потом записываем нарастающий линейно потенциал // При циклическом проигрывании на выходе будет треугольный сигнал амплитудой 10В на нагрузке 1 МОм
unsigned short delta = 0; for (int c = 0; c < BUFSIZE; c++) { DrvData[c] = delta & 0xFFFC; delta = 32766 * (1+sin(c/200.0)); }; //Отсылка данных в плату // DAC_MODEDATA_ASIS - Вывод в ЦАП данных как есть (читайте формат данных ЦАП) // DAC_MODEDATA_14BIT - Данные будут нормализованы внутри драйвера... pADC->GetData(DAC_MODEDATA_ASIS, DrvData, BUFSIZE, 0);
//Начало проигрывания данных в ЦАПе (или начало ожидание синхросигнала) pADC->Start();
// Порядок вызова Init() -> GetData() -> Start() ОБЯЗАТЕЛЕН!!! // GetData() можно вызывать несколько раз! т.е. занесение данных можно произвести за несколько раз! // только не прывышая макс. допустимый размер памяти платы, иначе счетчик будет обнулен.
//Остановка генерации данных //Если не вызвать Stop, то при выходе из программы данные остануться на выходе платы
//pADC->Stop(); Clear(pADC, &LAxClient);
return 1;
Поиск по сайту: |
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.023 сек.) |