АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

Программа работы. 1. Разработать программу генерации модельного радиолокационного сигнала в среде Visual C++ для модуля ГСПФ-052 и создать exe-модуль

Читайте также:
  1. I. КУРСОВЫЕ РАБОТЫ
  2. I. ОБЩИЕ УКАЗАНИЯ К ВЫПОЛНЕНИЮ КУРСОВОЙ РАБОТЫ
  3. I. РАБОЧАЯ ПРОГРАММА
  4. II. ДИПЛОМНЫЕ РАБОТЫ
  5. II. МЕТОДИЧЕСКИЕ УКАЗАНИЯ ДЛЯ ВЫПОЛНЕНИЯ САМОСТОЯТЕЛЬНОЙ РАБОТЫ
  6. II. ТРЕБОВАНИЯ К ОФОРМЛЕНИЮ КУРСОВОЙ РАБОТЫ
  7. III. Задания для самостоятельной работы по изучаемой теме.
  8. III. Задания для самостоятельной работы по изучаемой теме.
  9. III. Задания для самостоятельной работы по изучаемой теме.
  10. III. Задания для самостоятельной работы по изучаемой теме.
  11. III. Задания для самостоятельной работы по изучаемой теме.
  12. III. Задания для самостоятельной работы по изучаемой теме.

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;

 


1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 |

Поиск по сайту:



Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.022 сек.)