Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
АФЭ_уч_пособие_3Б.doc
Скачиваний:
5
Добавлен:
01.03.2025
Размер:
20.94 Mб
Скачать

Высокоскоростные локальные компьютерные системы измерения и управления с интерфейсом isa и pci

Наиболее высокоскоростные системы измерения и управления используют системные интерфейсы PCI (Peripheral Component Interconnect bus) и ISA (Industry Standart Architecture). компьютера IBM PC.

Аппаратная и программная реализация модулей сбора данных и управления на базе интерфейса ISA.

На базе интерфейса ISA выпускаются модули сбора данных и управления (DAQ board), которые могут содержать многоканальный АЦП с памятью, несколько ЦАП, многоразрядный цифровой регистр ввода/вывода, многоканальный таймер. К промышленному компьютеру может быть подключно до 20 таких модулей

Основное назначение интерфейса ISA - организация взаимодействия процессора ЭВМ контроллерами системных внешних устройств через так называемые порты ввода-вывода (ПВВ). Возможные режимы обмена данными с внешними устройствами: синхронный, асинхронный, по прерыванию, по каналу прямого доступа в память ЭВМ. Назначение основных линий интерфейса:

D0-D15 - двусторонняя шина данных.

A0-A19 – шина адреса. Для адресации ПВВ используются только линии А0-А9.

IOR, IOW - линии сигналов сопровождения при операциях чтения/записи через ПВВ. Активный уровень – низкий.

AEN - линия разрешения адреса. Формируется в ЭВМ как признак того, что не происходит обмен по КПДП.

IRQ0-IRQ15 - линии приоритетного запроса на прерывание. Линии прерывания предназначены, в основном, для системных внешних устройств. Несколько линий, например, IRQ10-IRQ12 и IRQ15 обычно являются резервными и могут быть использованы пользователем.

Адресное пространство А0-А9 позволяет адресовать 1024 элемента ПУ. Элементарным адресуемым элементом ПУ является триггерный регистр. Можно записать в регистр байт данных или прочитать содержимое регистра. Однако в число этих адресуемых регистров входят не только регистры устройств пользователя, но и регистры контроллеров системных внешних устройств ЭВМ. Адресное пространство, зарезервированное для адресации устройств пользователя, составляет, по крайней мере 32 адреса, например, от 3А0h до 3ВFh.

Интерфейсная карта ISA для синхронного обмена

Интерфейсная карта ISA может быть унифицирована и не зависеть от функционального назначения ПУ. Она содержит (рис. 36) дешифратор адреса, компаратор адреса, шинный приемопередатчик.

Рис. 36

Компаратор адреса служит для сравнения старших разрядов кода адреса с маской, в приведенном примере - 11101(2) Факт совпадения означает, что адресация производится в пределах адресного поля, зарезервированного для устройств пользователя. Здесь это 3A0h - 3BFh. Действительно, наименьший адрес (его называют базовым) при этом - 11 1010 0000(2), т.е. 3A0h, а наибольший - 11 1011 1111(2), т.е. 3BFh.

Дешифратор адреса служит для расшифровки пяти младших разрядов А0-А4 адреса ПВВ, т.е. адреса одного из 32 регистров устройства пользователя. Сигналы Е0-Е31 могут использоваться в качестве сигналов синхронизации при записи данных в триггерные регистры, в качестве сигналов разрешения чтения при чтении данных из триггерных регистров, а также как сигналы инициализации каких либо действий (например, для запуска АЦП).

Шинный приемопередатчик служит для трансляции данных в двух направлениях, от А к В и от В к А. Направление передачи определяется сигналом DIR (Direction), разрешение передачи - сигналом G (Gate). К линиям В шинного приемопередатчика может быть подключено несколько регистров как для ввода, так и для вывода. Регистры, используемые для ввода, т. е. для чтения данных из ПУ в ЭВМ, должны обязательно быть выполнены на элементах с тремя состояниями выхода (1, 0, отключено).

Сопряжение функциональной части аппаратуры

с интерфейсной картой.

Элементами функциональной части периферийного устройства (ПУ) могут быть цифровые регистры ввода/вывода, аналоговые и цифровые мультиплексоры и демультиплексоры, АЦП, ЦАП, таймеры. Наиболее простое сопряжение функциональной и интерфейсной частей ПУ обеспечивается при выполнении элементов функциональной части ПУ на базе БИС. Простейшим элементом функциональной части ПУ является цифровой регистр (рис. 37).

Рис. 37

Поскольку единственная функция любого интерфейса есть передача данных в цифровой форме от компьютера к какому-либо функциональному элементу аппаратуры или от элемента аппаратуры к компьютеру, структуру любого функционального элемента аппаратуры для программиста представляют как набор программно адресуемых регистров и псевдорегистров.

Примечание. Цифровой регистр ввода должен быть выполнен на логических элементах с тремя состояниями выхода (0, 1, отключено). Это необходимо для того, чтобы иметь возможность подключения к шинному приемопередатчику нескольких регистров ввода параллельно. При чтении выходы всех регистров, кроме адресуемого, устанавливаются в состояние «отключено».

Интерфейс асинхронного обмена и обмена по прерыванию

Контроллер асинхронного обмена и обмена по прерыванию рис. 38 содержит триггер состояния, триггер маски и логику управления.

Рис. 38

Управление контроллером производится сигналами с дешифратора адреса, например, Е0-Е3.

Функции сигналов программного управления:

Е0 - сброс готовности;

Е1 - разрешение запроса на прерывание;

Е2 - запрет запроса на прерывание;

Е3 - опрос готовности.

Факт наступления какого-либо события, например, окончания цикла преобразования АЦП или появление сигнала таймера фиксируется в триггере состояния и предполагает выполнение определенных действий, например, чтение результата преобразования АЦП. Обнаружить состояние триггера готовности можно двумя способами: в режиме ожидания готовности путем периодического опроса триггера состояния и по прерыванию.

Программные средства управления аппаратурой

с интерфейсом ISA

Взаимодействие компьютера с внешними устройствами (мультиплексором, АЦП, ЦАП, цифровым регистром ввода/вывода, таймером и др.) заключается в передаче команд управления и пересылке данных (от компьютера внешнему устройству и, наоборот, от внешнего устройства компьютеру). Во всех случаях взаимодействие происходит в форме пересылки данных из процессора компьютера в цифровой регистр или псевдорегистр внешнего устройства или из регистра внешнего устройства в процессор компьютера.

Программное управление аппаратурой с интерфейсом ISA от ЭВМ может быть выполнено с использованием двух команд пересылки: записи и чтения.

Команды пересылки могут программироваться на ассемблере и на языках высокого уровня.

Ассемблер IBM PC содержит команды IN и OUT для организации обмена данными между процессором и ПВВ.

Форматы команд:

IN<аккумулятор>,<порт>

OUT<порт>,<аккумулятор>

В качестве операнда "аккумулятор" может быть использован оперативный регистр AL или AX, в качестве операнда "порт" - номер порта, имя переменной или регистр DX, в который занесен адрес порта.

Пример фрагмента программы передачи через порт ввода/вывода 300h кода COMMAND и последующего ввода данных в аккумулятор через порт 301h на ассемблере:

mov DX,300h

mov AL,COMMAND

out DX,AL ;вывод данных

mov DX,301h

in AL,DX ;ввод данных

Фрагмент программы на языке C++, выполняющий те же функции, что и приведенный выше фрагмент программы на ассемблере, имеет вид:

_out(0x300, COMMAND);

data = _inp(0x301);

При создании базовых программных средств для работы с аппаратурой, подключенной к компьютеру с помощью интерфейса ISA, обычно создаются библиотеки программных модулей (процедур, функций, макрокоманд). Каждый из программных модулей обеспечивает выполнение одного конкретного действия с определенным элементом аппаратуры. Примером может быть функция включения канала мультиплексора, запуска АЦП.

ЭЛЕМЕНТАРНЫЕ УСТРОЙСТВА СРЕДСТВ ИЗМЕРЕНИЯ И УПРАВЛЕНИЯ

Элементарными устройствами средства измерения и управления являются цифровые регистры ввода/вывода, аналоговые и цифровые мультиплексоры и демультиплексоры, АЦП, ЦАП, таймеры. Наиболее простое сопряжение функциональной и интерфейсной частей ПУ обеспечивается при выполнении элементов функциональной части ПУ на базе БИС

ТС цифрового ввода-вывода

Типичным элементом устройства цифрового ввода-вывода является БИС параллельного программируемого интерфейса БИС ППИ, такой как Intel 8255 рис.40.

Рис. 39

БИС ППИ Intel 8255 представляет собой многорежимное устройство, содержащее три однобайтоваых цифровых регистра ввода/вывода А, В и С. Эти регистры называют также портами А, В и С. Базовая микросхема БИС ППИ Intel 8255 рассчитана на максимально простое подключение к микропроцессору Intel 8088, используемому в IBM PC/XT.

БИС ППИ Intel 8255 содержит три 8-разрядных порта ввода/вывода: А, В и С и один 8-разрядный адресуемый регистр управления.

Назначение управляющих и информационных входов:

D0…D7 - линии ввода/вывода данных (сопряжение с микропроцессором или ЭВМ);

А0,А1 - входы кода адреса регистров ППИ. 00 - регистр А, 01 - регистр В, 10 - регистр С, 11 - регистр управления;

RD - вход разрешения ввода (из ППИ в ЭВМ). Активный уровень - низкий.

WR - вход разрешения вывода (из ЭВМ в ППИ). Активный уровень - низкий.

CS - выбор кристалла. Низкий уровень на входе CS разрешает работу D0…D7. При высоком уровне на входе CS линии D0...D7 находятся в 3-м состоянии (отключено).

PA0…PA7 - линии данных порта А;

PВ0…PВ7 - линии данных порта В;

PС0…PA3 - линии данных порта С (нижний);

PС4…PA7 - линии данных порта С (верхний);

RESET - сброс всех регистров ППИ, установка всех портов на ввод.

Режим работы каждого из портов А, В и С, в том числе направление передачи данных, определяется управляющим словом, заносимым в регистр управления. Формат управляющего слова приведен ниже в таблице 11.

Основные режимы работы БИС ППИ.

Режим 0. Ввод/вывод общего типа. Регистры А, В, С верхний, С нижний программируются независимо друг от друга на ввод или вывод. Основной режим обмена - синхронный.

Режим 1. Стробируемый однонаправленный ввод/вывод. Основной режим обмена - асинхронный.

Режим 2. Стробируемый двунаправленный ввод/вывод по каналу А.

Табл. 11

Бит

Функция, режим, флаг

D0

Функция порта С нижний. 1- ввод. 0 - вывод

D1

Функция порта В. 1-ввод. 0 - вывод

D2

Режим порта В. 0 - режим 0, 1 - режим 1

D3

Функция порта С верхний. 1 - ввод, 0 - вывод

D4

Функция порта А. 1 - ввод, 0 - вывод

D6, D5

Режим порта А. 00 - режим 0, 01 - режим 1, 10 - режим 2

D7

Флаг режима. 1 - установка режимов портов А, В, С; 0 - сброс/установка разрядов порта С

Пример управляющего слова режима (режим 0, Порт А - на ввод, В - на вывод):

D7

D6

D5

D4

D3

D2

D1

D0

1

0

0

1

x

0

0

x

Более подробная информация о режимах работы БИС ППИ имеется в справочных руководствах.

Схема подключения БИС ППИ к линиям интерфейса ISA IBM PC приведена на рис. 39. Для адресации регистров ППИ для определенности использованы линии Е16…Е19, что соответствует использованию портов ввода/вывода 3В0h…3В3h (или Base+16…Base+19, где Base - базовый адрес 3A0h) интерфейса ISA.

Ниже приведен фрагмент программы вывода слова данных data через порт А.

_out(Base+19, 0x80); {назначение порта А на вывод}

_out(Base+16, data);

ТС ввода аналоговых сигналов

Аналоговые мультиплексоры

Рис. 40

Аналоговые мультиплексоры могут быть выполнены с использованием электромеханических или герконовых реле или электронных бесконтактных ключей. Электронные бесконтактные мультиплексоры в интегральном исполнении имеют обычно кодовое управление номером включаемого канала.

Типичным примером интегрального аналогового мультиплексора является БИС 590КН1 (рис.40).

Буферный регистр RG служит для хранения кода включаемого канала. Фрагмент программы включения канала М:

_out(Base+4, M)

АЦП

АЦП по структурному построению и техническим характеристикам весьма многообразны. Однако перечень информационных и управляющих сигналов для любой разновидности АЦП один и тот же. Поэтому способ информационного сопряжения АЦП с линиями интерфейса почти не зависит от особенностей структурного построения. Типичным примером интегрального АЦП является АЦП на БИС К1108ПВ2 (рис. 41).

Рис. 41

БИС К1108ПВ2 представляет собой 12-разрядный АЦП поразрядного уравновешивания. Он имеет следующие информационные и управляющие входы:

ST - вход запуска;

ERD - вход разрешения считывания;

D0…D11 - цифровые выходы (с тремя состояниями). Выходной код сохраняется в триггерном регистре.

FS - выход разряда переполнения. Сохраняется в триггерном регистре;

RAD - выход сигнала готовности. Вырабатывается в импульсной форме в конце цикла преобразования.

Для программного управления работой АЦП на рис. 41 использованы сигналы Е5 … Е7 для определенности. Сигналом Е7 производится программный запуск АЦП.

Фрагмент программы запуска АЦП и чтения результата преобразования:

_out(Base+7, 0);

datalo=_inp(base+5);

datalo=_inp(base+6);

data=datalo+(datahi << 8)

ТС вывода аналоговых сигналов. ЦАП

ЦАП по структурному построению и техническим характеристикам весьма многообразны. Однако перечень информационных и управляющих сигналов для любой разновидности ЦАП один и тот же. Поэтому способ информационного сопряжения ЦАП с линиями интерфейса почти не зависит от особенностей структурного построения. Типичным примером интегрального ЦАП является БИС К1108ПА1 (рис. 42).

Рис. 42

БИС ЦАП К1108ПА1 представляет собой 12-разрядный ЦАП с токовым выходом, рассчитанный на подключение операционного усилителя на выходе.

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

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

Назначение информационных и управляющих входов:

DI0…DI11 - входы цифрового кода;

IOUT - токовый выход ЦАП;

R-1….R-5 - выводы прецизионных резисторов.

Фрагмент программы передачи кода в ЦАП:

_out(Base+8, data & 0xff);

_out(Base+9, (data>>8) & 0xff);

ТС временной синхронизации. Таймер.

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

Основным элементом таймера является счетчик с предустановкой, работающий на вычитание. Типичным примером аппаратной реализации таймера является БИС Intel 8253 (рис. 43).

Рис. 43

Intel 8253 - интервальный программируемый таймер (ПТ) - содержит три адресуемых регистра-счетчика: СТ0, СТ1 и СТ2, и регистр управления RGR. Каждый из регистров-счетчиков имеет счетный вход (CLK), вход разрешения счета (GATE) и выход (OUT). Выход одного счетчика может быть соединен с входом другого. Адресация регистров-счетчиков и регистра управления производится кодом субадреса A0 и А1. Сигналы на входах RD и WR определяют режим обращения к регистрам (чтение или запись). Вход CS (выбор кристалла) является входом разрешения работы ПТ. Таймер КР580ВИ53 является многорежимным устройством. Режим работы определяется управляющим словом, заносимым в регистр режима. Формат управляющего слова приведен в табл. 12.

Табл. 12

Бит

Функция

D0

Способ кодирования

0 - двоичный

1 - двоично-десятичный

D3…D1

Режим

000 - режим 0

001 - режим 1

010 - режим 2 (делитель частоты)

011 - режим 3

100 - режим 4

101 режим 5

D5…D4

Способ обращения

00 - запись показаний счетчика в буферный регистр

01 - чтение/запись только младшего байта

10 - чтение/запись только старшего байта

11 - чтение/запись сначала младшего, затем старшего байта

D7…D6

Выбор счетчика

00 - выбор счетчика СТ0

01 - выбор счетчика СТ1

10 - выбор счетчика СТ2

Пример слова режима. для установки режима :

  • способ кодирования кода времени - двоичный;

  • режим 2 для всех счетчиков;

  • способ загрузки всех счетчиков - двумя байтами.

Этим установкам режима соответствуют коды режима 34h, 74h и B4h для СТ0, СТ1 и СТ2 соответственно.

Регистр режима - трехбайтовый, содержит три однобайтовых подрегистра. Каждый подрегистр соответствует одному каналу таймера. Доступ к подрегистрам - последовательный.

Для работы ПТ необходима подача сигнала внешнего тактового генератора. Для БИС Intel 8253 частота следования импульсов должна быть не более 2 МГц. При подключении БИС ПТ к линиям интерфейса ISA IBM PC в качестве тактового сигнала может быть использован BCLK/4, имеющий частоту 1,193182 МГц. Удобнее использовать для этой цели кварцевый генератор импульсов с частотой 1,000000 МГц.

ПТ на БИС Intel 8253 может быть использован как одно-, двух-, или трехканальный таймер. На рис.6.6 показан пример использования ПТ как двухканального таймера. Первый канал содержит счетчики СТ0 и СТ1, второй - счетчик СТ2.

Пример кодирования времени 1 сек таймера .

При частоте тактового сигнала на входе таймера 1 МГц необходимый коэффициент деления частоты равен 1 000 000. Используя один счетчик таймера можно коэффициент деления от 2 до 65536. Поэтому необходимо использовать два счетчика таймера. Коэффициенты деления К1 и К2 счетчиков таймера необходимо выбрать так, чтобы К1*К2=1 000 000, например, К1=50 000, К2=20 или К1=1000, К2=1000.

Пример программирования:

_out (Base+19, KR); /*Задание режима. Например, для задания режима 0*/

/*назначения порта А на ввод, порта В, С - на вывод KR=0x90*/

_out (Base+16,data); /*Вывод байта данных через порт А*/

_out (Base+17,data); /*Вывод байта данных через порт В*/

_out (Base+18,data); /*Вывод байта данных через порт С*/

data=_inp(Base+16); /*Ввод байта данных через порт А*/

data=_inp(Base+17); /*Ввод байта данных через порт B*/

data=_inp(Base+18); /*Ввод байта данных через порт C*/

Программирование модулей измерения и управления с интерфейсом ISA

Для сопряжения компьютера с объектом управления может быть использована имеющаяся в готовом виде аппаратура со встроенными интерфейсными узлами:

Plug-in Data Acquisition Boards (DAQ boards) и Data Acquisition & Control Cards (DA&C cards) - встраиваемые в компьютер платы сбора данных . DAQ boards содержат, как правило, аналоговый мультиплексор на 4 - 64 канала, усилитель с программно устанавливаемым дискретно, в диапазоне от 1 до 1000, коэффициентом усиления, быстродействующий 12-разрядный АЦП с памятью на 16 - 512 слов, одно-, двухканальный ЦАП с памятью до 2 кслов, 32 - 48-разрядный таймер. в компьютер может быть установлено до 5 модулей DAQ boards.

Ниже приведена функциональная схема простейшей многофункциональной платы сбора данных (DAQ board) рис. 44 и пример программы автоматизации измерений.

DAQ board рис.44, 45 содержит:

  • АЦП (К1108ПВ2) с входным усилителем с восьмиканальным мультиплексором на входе;

  • ЦАП (бис К1108ПА1);

  • цифровой регистр ввода/вывода (БИС ППИ Intel 8255);

  • программируемый таймер (БИС Intel 8253)

  • регистр режима

Рис. 44

Рис. 45

Таблица адресуемых регистров

I/O register adress

Табл. 13

Address

Read

Write

Base +0

-

триггер сотояния, сброс

+1

-

триггер маски, установка (разрешение прерывания)

+2

-

триггер маски, сброс (запрет прерывания)

+3

триггер состояния, опрос

-

+4

-

мультиплексор, код номера канала

+5

АЦП, мл. байт

-

+6

АЦП, ст. байт

-

+7

-

АЦП, запуск

+8

-

ЦАП, мл. байт

+9

ЦАП, ст. байт

+10

-

регистр режима

+11

-

пт, регистр запуска

+12

ПТ, счетчик 0

ПТ, счетчик 0

+13

ПТ, счетчик 1

ПТ, счетчик 1

+14

ПТ, счетчик 2

ПТ, счетчик 2

+15

-

ПТ регистр управления

+16

ППИ, порт а

ППИ, порт а

+17

ППИ, порт в

ППИ, порт в

+18

ППИ, порт с

ППИ, порт с

+19

-

ППИ, регистр управления

Формат данных в регистрах.

1. Триггер состояния, сброс

(WRITE) Base+0

Bit 7

Bit 0

x

x

x

x

x

x

x

x

2. Триггер маски, установка (разрешение прерывания)

(WRITE) Base+1

Bit 7

Bit 0

x

x

x

x

x

x

x

x

3. Триггер маски, сброс (запрет прерывания)

(WRITE) Base+2

Bit 7

Bit 0

x

x

x

x

x

x

x

x

4. Мультиплексор, номер канала

(WRITE) Base+4

Bit 7

Bit 0

x

x

x

x

х

D2

D1

D0

АЦП регистр данных (READ) Base+5

Bit 7

Bit 0

D7

D0

Base+6 Ст. байт и разряд переполнения

Bit 7

Bit 0

FS

D11

D10

D9

D8

6. АЦП, регистр программного запуска

(WRITE) Base+7

Bit 7

Bit 0

x

x

x

x

x

x

x

x

7. ЦАП

(WRITE) Base+8 Мл. байт

Bit 7

Bit 0

D7

D0

(WRITE) Base+9 Ст. байт

Bit 7

Bit 0

x

x

x

x

D11

D10

D9

D8

8. Регистр режима

(WRITE) Base+10

Bit 7

Bit 0

x

x

x

x

D3

D2

D1

D0

Источник сигнала готовности и запроса на прерывание

Режим запуска АЦП

D3

D2

D1

D0

Конец преобразования АЦП

Программный

1

0

0

1

Конец преобразования АЦП

от таймера

1

0

1

0

Таймер

Программный

0

1

0

1

Таймер

от таймера

0

1

1

0

ПТ (Таймер)

(WRITE ) Base+11 Регистр запуска

Bit 7

Bit 0

х

х

х

х

х

х

х

х

(WRITE / READ) Base+12 Счетчик 0

Bit 7

Bit 0

D7

D0

(WRITE / READ) Base+13 Счетчик 1

Bit 7

Bit 0

D7

D0

(WRITE / READ) Base+14 Счетчик 2

Bit 7

Bit 0

D7

D0

(WRITE ) Base+15 Регистр управления

Bit 7

Bit 0

D7

D0

ППИ

(WRITE / READ) Base+16 ПОРТ А

Bit 7

Bit 0

D7

D0

(WRITE / READ) Base+17 ПОРТ В

Bit 7

Bit 0

D7

D0

(WRITE / READ) Base+18 ПОРТ С

Bit 7

Bit 0

D7

D0

(WRITE ) Base+19 Регистр управления

Bit 7

Bit 0

D7

D0

Программирование основных функций DAQ board

Программирование элементарных функций устройств

ЦАП

Передача числа data в ЦАП.

_out(Base+8, data & 0xff);

_out(Base+9, (data>>8) & 0xff);

АЦП

Программный запуск

_out(Base+7, 0)

Проверка готовности

do {

stat = _inp(Base+3)

}

while ((stat &1) != 1

Чтение результата преобразования

datalo=_inp(Base+5);

datahi=_inp(Base+6);

data=datalo+(datahi << 8);

Мультиплексор

Включение канала М

_out(Base+4, M);

Таймер

Загрузка кода режима (способ кодирования кода времени - двоичный, режим 2 (делитель частоты) для всех счетчиков, способ загрузки всех счетчиков - двумя байтами)

_out(Base+15, 0x34);

_out(Base+15, 0x74);

_out(Base+15, 0xB4);

Загрузка кода времени (в СТ0 и СТ1)

_out(Base+12, dt1 & 0xFF);

_out(Base+12, (dt1 >> 8) & 0xFF);

_out(Base+13, dt2 & 0xFF);

_out(Base+13, (dt2 >> 8) & 0xFF);

Запуск таймера

_out(Base+11, 7);

ППИ

Задание режима

_out(Base+19, 0xKR);

Пример. Для задания режима 0, назначения порта А на ввод, а порта В и С - на вывод KR=0x90.

Вывод байта данных

_out(Base+16, data); /*через порт А*/

_out(Base+17, data); /*через порт В*/

_out(Base+18, data); /*через порт С*/

Ввод байта данных

data = _inp(Base+16);/*через порт А*/

data = _inp(Base+17);/*через порт B*/

data = _inp(Base+18);/*через порт C*/

Регистр режима

Задание режима (работы с АЦП и таймером)

_out(Base+10, 0xKR1);

Пример. Для задания режима: запуск АЦП - программный, источник сигнала готовности и запроса на прерывание - таймер,- KR1=5.

Библиотека функций для работы с DAQ board

Функция 1: set_mode

Функция устанавливает режим работы с АЦП и таймером

Прототип:

int set_mode(int Regim)

Параметры:

Regim - код режима: 5, 6, 9, 10

5 - готовность от таймера, запуск АЦП программный;

6 - готовность от таймера, запуск АЦП от таймера;

9 - готовность от АЦП, запуск АЦП программный;

10 - готовность от таймера, запуск АЦП от таймера;

Возвращаемое значение:

0 - если нет ошибки установки кода режима

1 - если есть ошибка установки кода режима

Пример:

err=set_mode(5)

Функция 2: set_mux_chan

Функция устанавливает номер включенного канала мультиплексора

Прототип:

int set_mux_chan (int Chan)

Параметры:

Chan - номер канала, 0..15.

Возвращаемое значение:

0 - если нет ошибки установки кода канала

2 - если есть ошибка установки кода канала

Пример:

err=set_ mux_chan (14)

Функция 3 : adc_start

Функция обеспечивает программный запуск АЦП

Прототип:

adc_start(void)

Пример:

adc_start ()

Функция 4: get_ready

Функция обеспечивает проверку готовности (АЦП, таймера и др.)

Прототип:

int get_ready(int Timeout)

Возвращаемое значение:

0 - если нет таймаута;

3 - если есть таймаут.

Функция 5: adc_read

Функция обеспечивает чтение результата преобразования АЦП.

Прототип:

int adc_read(int*data)

Возвращаемое значение:

0 - если нет переполнения;

4 - если есть переполнение.

Пример:

err=adc_read(&data)

Функция 6: dac_out

Функция выводит код в ЦАП

Прототип:

int dac_out(int data)

Параметры:

data - слово данных.

Тексты программных модулей библиотеки.

В программных модулях библиотеки обычно предусматривается контроль ошибок и выход из модуля по ошибкам задания исходных данных и по тайм-ауту.

#define Base 0x3A5

int set_mode(int regim)

{

if ((regim = = 5) || ((regim = = 6) || ((regim = = 9) || ((regim = = 10) )

{

_out(Base+10, regim); return 0;

}

return 1;

}

int set_mux_chan(int chan)

{

if ((chan >15) || (chan <0)) {

return 2;

}

_out(Base+4, chan);

return 0;

}

int get_ready(int Timeout )

{

t=0;

do

{

t++;

if (t>Timeout) return 3; }

while ((_inp (Base+3) & 1) != 1);

return 0;

}

int adc_read(*data)

{

int data_lo,data_hi;

data_lo=_inp(Base+5);

data_hi=_inp(Base+6);

if (data_hi & 0x10) /*бит 5 установлен в 1 - переполнение*/

{

return 4;

}

*data = (data_lo+(data_hi<<8));

return 0;

}

int dac_out(int data)

{

_out(Base+8, (data & 0xFF));

_out(Base+9, ((data>>8) & 0xFF));

return 0;

)

void adc_start()

{

_out(Base+7, 0);

}

Примеры программ

Пример 1.

/************************************************************/

/* Программа обеспечивает ввод 100 значений аналогового сигнала */

/*по всем 8 каналам мультиплексора. Запуск АЦП - программный, */

/*частота опроса - 100 Гц, */

/*************************************************************/

#include <conio.h>

#include <windows.h>

int i,j,r1,r2,status;

int data[100][8];

main()

{

_outp(Base+10,9); /* Установка кода режима 1001 регистра режима */

/* Запуск АЦП - программный, условие готовности - от АЦП */

for (i=0;i<100;i++)

{

for(j=0;j<7;j++)

{

_out(Base+4,j); /* Включение j-го канала мультиплексора */

_out(Base+0,0); /* Сброс готовности АЦП */

_out(Base+7,0); /* Запуск АЦП */

status=0;

while (status != 1) status = _inp(0x3A5) & 1;

r1=_inp(Base+5); {Чтение мл. байта вых. кода АЦП}

r2=_inp(Base+6); {Чтение ст. байта вых. кода АЦП}

data[i][j]=r1+(r2 << 8); {Формирование элемента выходного массива данных}

}

Sleep(10);

}

}

Пример 2.

/******************************************************************/

/* Программа обеспечивает вывод 4096 значений пилообразного */

/*аналогового сигнала длительностью 4096 мсек */

/******************************************************************/

#include <conio.h>

#include <windows.h>

int i;

main()

{

for (i=0;i<4096;i++)

{

_out(Base+,(i & 0x00ff); /*Вывод младшего байта числа i*/

_out(Base+9,(i & 0xff00) >> 8; /*Вывод старшего байта числа i*/

Sleep(1);

}

}

Пример 3.

/*******************************************************************/

/* Программа обеспечивает ввод цифрового кода через порт А ППИ и вывод */

/* в прерывистом режиме этого же кода через порт С ППИ */

/*******************************************************************/

#include <conio.h>

#include <windows.h>

int data;

main()

{

_out(Base+19,90):=90; {Установка режима ППИ. Порт А - на ввод, }

{ порт В, С - на вывод}

for(;;)

{

data:=_inp(Base+16); /*Ввод цифрового кода через порт А ППИ*/

_out(Base+18,data); /*Вывод data через порт С ППИ*/

Sleep(10);

_out(Base+18,0); /*Сброс кода в регистре порта С ППИ*/

Sleep(10);

}

Пример 4.

/*******************************************************************/

/* Функция обеспечивает загрузку кода времени KDT и запуск */

/*интервального таймера */

/*******************************************************************/

void InitTimer (void)

{

/*Установка режима 2 таймера (делитель частоты)*/

_out(Base+15,0x34); /*Загрузка управл. слова для СТ0*/

_out(Base+15,0x74); /*Загрузка управл. слова для СТ1*/

_out(Base+15,0x0B4); /*Загрузка управл. слова для СТ2*/

/*Загрузка кода времени в счетчики СТ0 и СТ1*/

_out (Base+12,0x0E8); /*Загрузка мл. байта кода 1000 в СТ0 */

_out (Base+12,0x03); /*Загрузка ст. байта кода 1000 в СТ0 */

_out(Base+13,KDT); /*Загрузка мл. байта кода KDT в СТ1 */

_out(Base+13,0); /*Загрузка ст. байта кода KDT в СТ1 */

/*Запуск таймера*/

_out(Base+11,3);

}

Контрольные вопросы и задачи

  1. Входы порта А ППИ соединены с выходами 8-разрядного тумблерного регистра. Составить программу ввода в ЭВМ аналогового сигнала с частотой 1 Гц по каналу М мультиплексора. Код номера канала читать с трех младших разрядов тумблерного регистра.

  2. Входы порта А ППИ соединены с выходами 8-разрядного тумблерного регистра. Составить программу регистрации в ЭВМ с помощью АЦП аналогового сигнала с периодичностью 1 сек. Останов регистрации - при включении тумблера D0.

  3. Составить программу ввода данных по 8 каналам. Интервал дискретности измерений - 10 мс задавать с помощью таймера, количество отсчетов - 10000.

  4. Составить программу формирования и вывода с помощью имеющихся в составе модуля ЦАП сигнала управления Y=1+Cos(t)B, где t-время в мс. Количество точек за период синусоидального сигнала – 628. Считать, что масштаб преобразования ЦАП – 1мВ/ед. кода.

Лабораторная работа. Высокоскоростные системы сбора данных и управления с интерфейсом ISA

Целью лабораторной работы является изучение методики проектирования на языке С библиотек функций для работы с аппаратурой, подключенной к компьютеру с помощью интерфейса ISA, создания программ реального времени автоматизации эксперимента, сеpвисной части пpогpамм, включающей сpедства гpафического пользовательского интеpфейса и математической обpаботки, разработки виртуальных приборов.

Структура лабораторной установки

IBM PC

ADC-402

Генератор Г5-75

0-10 кГц

Генератор Г3-110

0-1,99999999 МГц

Рис. 46

Модуль быстродействующего двухканального АЦП с памятью ADC-402

Функциональное назначение

Модуль быстродействующего АЦП с памятью ADC-402 предназначен для регистрации и ввода в IBM PC/AT -совместимый компьютер аналоговых сигналов синхронно по двум каналам.

Адресaция регистров модуля ADC-402

Обмен данными между модулем ADC-402 и компьютером происходит через порты ввода/вывода. В адресном пространстве портов ввода/вывода компьютера модуль использует 9 адресов. Начальный, базовый, адрес (BASE) устанавливается переключателями на плате.

В таблицах адреса портов указаны относительно базового адреса. Абсолютный адрес портов вычисляется как сумма базового адреса и адреса из таблицы 14. Адреса портов в таблице приведены в гексокоде.

Табл. 14

Адрес

Запись

Чтение

0

Регистр данных ЦАП калибровки 4

ОЗУ канала I

1

Регистр данных ЦАП компаратора5

ОЗУ канала II

2

Регистр статуса №1

Регистр статуса №1

3

Регистр статуса №2

Регистр статуса №2

4

Не используется

Регистр статуса №3

5,6,7

Не используется

Не используется

8

ППИ, регистр данных, порт A

ППИ, регистр данных, порт А

9

ППИ, регистр данных, порт В

ППИ, регистр данных, порт B

10

ППИ, регистр данных, порт С

ППИ, регистр данных, порт C

11

ППИ, регистр управления

ППИ, запрещенный адрес для чтения

12-15

Не используется

Не используется

Ввод/вывод аналоговых сигналов

Модуль ADC-402 предоставляет возможность программно задавать режим калибровки или регистрации, устанавливать способ синхронизации при регистрации, задавать частоту дискретизации и объем выборки при регистрации.

Формат данных в регистре статуса №1. (BASE+2) Табл. 15

Бит

Запись

Чтение

0

программный старт, последовательная запись

0-1-0

контроль

1

программный сброс блокировки регистрации,

последовательная запись 0-1-0

контроль

2

программный сброс счетчика адреса ОЗУ,

последовательная запись 0-1-0

контроль

3

режим входа АЦП : 1 - биполярный, 0 – униполярный

контроль

4-5

выбор источника запуска , бит 0

контроль

6-7

Выбор аналогового входа

контроль

Формат данных в разрядах 6, 7 регистра статуса №1. Выбор аналогового входа.

Табл. 16

Бит 7

Бит 6

Назначение

0

0

аналоговый вход 0

0

1

аналоговый вход 1

1

0

контроль характеристики преобразователей

1

1

замыкание входов преобразователей на землю

Формат данных в разрядах 4, 5 регистра статуса №1.Выбор источника запуска.

Табл. 17

Бит 5

Бит 4

Назначение

0

0

Старт от внешнего источника синхронизации, по отрицательному фронту (спаду) входного сигнала

0

1

Программный старт

1

0

Старт от внутреннего компаратора

1

1

Старт от внешнего источника через оптронную развязку

Формат данных в регистре статуса №2. (BASE+3)

Табл. 18

Бит

Запись

Чтение

0-2

Выбор частоты дискретизации

Контроль

3-5

Размер выборки

Контроль

6-7

Выбор источника синхронизации от компаратора, бит 0

Контроль

Формат данных в разрядах 0, 1, 2 регистра статуса №2.

Выбор частоты дискретизации Табл. 19

Бит 2

Бит 1

Бит 0

Назначение

0

0

0

40 МГц

0

0

1

20 МГц

0

1

0

10 МГц

0

1

1

5 МГц

1

0

0

2,5 МГц

1

0

1

1,25 МГц

1

1

0

0,625 МГц

1

1

1

Внешний источник частоты дискретизации

Формат данных в разрядах 5, 4, 3 регистра статуса №2.

Размер выборки.

Табл. 20

Бит 5

Бит 4

Бит 3

Назначение

0

0

0

0,5 Кб

0

0

1

1 Кб

0

1

0

2 Кб

0

1

1

4 Кб

1

0

0

8 Кб

1

0

1

16 Кб

1

1

0

32 Кб

1

1

1

64 Кб

Формат данных в разрядах 7, 6 регистра статуса №2.

Выбор источника синхронизации от компаратора.

Табл. 21

Бит 7

Бит 6

Назначение

0

0

Внутренняя, от канала А

1

0

Внутренняя, от канала В

0

1

Внешняя, DB-37/10, -5…+5В

1

1

Внешняя, DB-37/10, 0…+5В

Формат данных в регистре статуса №3. (BASE+4)

Табл. 22

Бит

Чтение

0

Флаг готовности (регистрация закончилась)

1

Флаг текущего состояния (0-идет регистрация, 1-не идет регистрация)

2

Аналоговый сигнал канала I превышал установленный диапазон во время регистрации

3

Аналоговый сигнал канала II превышал установленный диапазон во время регистрации

4-7

Не используются, всегда 0

Программа работы

1. Разработка библиотечных функций для работы с модулем ADC-402, подключенным к компьютеру с помощью интерфейса ISA.

2. Разработка программ реального времени для автоматизации измерения эхо-сигналов спектрометра, накопления и обработки.

3. Измерение времени выполнения операций ввода/вывода и основных функций разработанного виртуального прибора.

4. Разработка виртуальных приборов на базе лабораторной установки.

Указания к выполнению лабораторной работы

1. При выполнении п.1 программы изучить техническое описание модуля ADC-402, таблицу основных адресуемых регистров табл. 14, формат данных в регистрах, приведенные в табл. 15-21, составить следующие функции для работы с модулем ADC-402:

1.1 Функция 1: set_freq

Функция устанавливает частоту отсчетов модуля ADC-402 при регистрации.

1.2. Функция 2: set_numbsamp

Функция устанавливает размер выборки (количество отсчетов в одной выборке по каждому каналу).

1.3. Функция 3: set_sinch_comp

Функция устанавливает вид синхронизации момента начала регистрации с использованием компаратора модуля ADC-402.

1.4. Функция 4: progr_start

Функция выполняет программный запуск регистрации по каналам А(С) и В(D) одновременно.

1.5. Функция 5: reset_cnt_ram

Функция выполняет программный сброс счетчика адреса ОЗУ модуля ADC-402. Функцию необходимо использовать после окончания регистрации перед чтением данных из ОЗУ модуля ADC-402.

1.6. Функция 6: reset_inhibit_start

Функция выполняет программное снятие блокировки регистрации. Блокировка регистрации в модуле ADC-402 автоматически устанавливается после начала регистрации (старта) для того, чтобы исключить возвожность повторного старта в течение цикла регистрации.

1.7. Функция 7: set_adc_sign

Функция устанавливает диапазон входного сигнала АЦП - однополярный, от 0 до +2.048В, или двухполярный, от -1.024В до +1.024В .

1.8. Функция 8: set_inp_select

Функция обеспечивает выбор источников аналоговых сигналов, подключаемого к входам АЦП1 и АЦП2 . На вход каждого из АЦП могут быть подключены один из двух источников аналогового сигнала. Для этого предусмотрены входы аналоговых сигналов А, В, С, Д. Кроме этого, с целью проведения калибровки АЦП, к их входам могут быть подключены вместо выходов источников регистрируемых сигналов выходы калибровочного ЦАП или входы АЦП могут быть подключены к аналоговой земле.

1.9. Функция 9: set_start

Функция обеспечивает выбор источника сигнала синхронизации для запуска регистрации по двум каналам одновременно.

1.10.Функция 10: get_ready

Функция обеспечивает опрос готовности модуля ADC-402 . Если возвращаемое значение равно 0 - значит модуль ADC-402 занят регистрацией, если возвращаемое функцией значение равно 1 - значит регистрация закончилась и можно выполнять чтение данных из ОЗУ ADC-402 в IBM PC.

При выполнении п.2 программы изучить принципиальную схему и схему соединений приборов, входящих в состав лабораторной установки и инструкцию по эксплуатации, обратив особое внимание на порядок подготовки установки к работе, порядок включения и отключения. Внимание! Несоблюдение правил включения и отключения может привести к выходу из строя компьютера и модуля ADC-402! При отладке программы автоматизации измерения эхо-сигналов спектрометра использовать в качестве имитатора эхо-сигнала спектрометра генератор сигналов низкочастотный прецизионный Г3-110, в качестве источника запускающих импульсов - генератор импульсов точной амплитуды Г5-75. Частоту синусоидального сигнала установить в диапазоне 100кГц-1,99 МГц, амплитуду - не более 1В. Частоту запускающих импульсов установить не более 1 кГц, амплитуду 3,5-4,0В. полярность - положительную.

Рекомендуемые параметры настройки генератора Г5-75: Т=15,0; D=00,5; τ=0.01; K=2; U=3,5; Nchan=0. Параметры сигналов контролировать с помощью осциллографа С1-64.

Внимание! Включать питание генераторов сигналов и устанавливать параметры сигналов нужно только отключив выходы генераторов от входов модуля ADC-402. Несоблюдение этих условий может привести к выходу из строя компьютера и модуля ADC-402!

2. При выполнении п.2 программы дополнить программу регистрации эхо-сигналов спектрометра, разработанную по п. 2, включив в нее выполнение быстрого преобразование Фурье (БПФ) и отображение полученного спектра в дополнительном графическом окне на панели пользовательского интерфейса. Произвести тестирование разработанной программы, выполнив несколько измерений сигналов имитатора эхо-сигналов частот в диапазоне частот от 100кГц до 1,99 МГц. Оценить точность автоматического определения частоты при различных значениях амплитуды измеряемого сигнала и отношения сигнал/шум.

3. Измерение времени выполнения элементарных операций ввода/вывода и фрагментов программы на языке C/C++ производить с помощью следующего программного модуля:

#include <stdio.h> #include <stdlib.h> #include <time.h>

int main( void ) {    long    i = 600000000L;    clock_t start, finish;    double  duration;      start = clock();

for (i=0;i<1000000;i++)

/* Здесь нужно записать текст фрагмента программы */

  finish = clock();    duration = (double)(finish - start) / CLOCKS_PER_SEC;

   printf( "Duration is %f mksec\n", duration ); }

4. При выполнении п.3 программы разработать на базе лабораторной установки один из виртуальных приборов:

Двухканальный цифровой компьютерный осциллограф;

Двухканальный коррелятор;

Компьютерный анализатор спектра.

Содержание отчета

  1. Задание к работе.

  2. Тексты разработанных библиотечных модулей.

  3. Текст прикладной программы регистрации и обработки данных.

  4. Графический экран разработанного пользовательского интерфейса.

  5. Результаты измерения времени выполнения основных операций ввода/вывода.

  6. Выводы.

Программирование аппаратуры измерения и управления, подключенной к шине PCI

Особенность работы с аппаратурой, подключенной к шине PCI, по сравнению с ISA заключается в том, что:

  • единицей обмена является не 8-16 разрядное слово, а 16-32 разрядное слово;

  • адреса регистров, через которые производится доступ к отдельным устройствам на плате DAQ board, устанавливаются не пользователем, а системой BIOS, автоматически. Поэтому базовые адреса регистров необходимо определять программным путем чтением параметров конфигурационного пространства.

Табл. 23

Пример программирования функций управления для платы сбора данных и управления PCI-1002 LU/S с интерфейсом PCI

Модуль PCI-1002 LU/S содержит многоканальный АЦП, двухканальный ЦАП, регистр цифрового ввода/вывода, многоканальный таймер.

Фрагмент программы сбора данных

//Программа обеспечивает сбор данных с 16 датчиков

//и сохранение их в файле. Используется модуль PCI-1002 LU/S

//Периодичность циклов опроса задается таймером

// Инициализация драйвера PCI-1002

wInitialCode=P100X_DriverInit(&wTotalBoard);

//Задание номера активной платы PCI-1002

wBoardToActive = 0;

P100X_ActiveBoard(wBoardToActive);

//Чтение параметров конфигурации (базовых адресов) платы PCI-1002 wRetVal=P100X_GetConfigAddressSpace(wBoardToActive, &wAddrTimer, &wAddrDio, &wAddrAd);

//Задание активного канала и кода коэффициента усиления

wChannelToActive=0; //нач.уст. номера канала 0

wGainCode=0; //код 0 соответствует коэф. усил. 1, диапазон +/-10В

wRetVal=P100X_SetChConfig(wChannelToActive,wGainCode);

//Задание масштаба представления выходных данных

fScale=10.0F;

for(i=0; i<16; i++)

{

wChannelToActive=i;

wRetVal=P100X_SetChConfig(wChannelToActive,wGainCode); /*запись кода канала*/

Delay(0.001); //Задержка на время установки канала

outp(wAddrTimer+0x1c,01); //Запуск АЦП

while(1) /*цикл ожидания готовности АЦП*/

{

if( ((inpw(wAddrTimer+0x10))&0x01)==1) //A/D ready?

break;

}

datapoints[i]=(((inpw(wAddrTimer+0x30)) & 0x0fff)-2048.0F)/2048*10.0; //Чтение результата

}

P100X_DriverClose(); //Закрытие драйвера

Лабораторная работа. Высокоскоростные системы сбора данных и управления с интерфейсом PCI

Реализация систем реального времени цифровой обработки сигналов необходима при создании автономных устройств, таких, например, как электромагнитно-акустические (ЭМА) толщиномеры. Задача разработки состоит в создании эффективных алгоритмов обработки сигналов, которые, с одной стороны, обеспечивают высокую точность определения измеряемой величины (например,толщины металла), и, с другой стороны, обладают той степенью сложности, которая позволяет реализовать устройство цифровой обработки и весь прибор в целом в виде компактного устройства. Дополнительную сложность разработки алгоритмов и программ и выбора технических средств для их аппаратной реализации вызывают высокие требования к скорости обработки данных. В случае с ЭМА-толщиномером необходимая скорость оцифровки данных составляет около 100 МГц. Необходимость в создании быстродействующих устройств цифровой обработки сигналов возникает и в ряде других случаев, например, при решении задачи обработки спутниковых ЛЧМ-сигналов и эхо-сигналов спектрометров.

В ЭМА-толщиномерах6, используется принцип измерения времени прохождения ультразвукового импульса, порождаемого радиоимпульсом, через металлическое изделие.

Источник радиоимпульса помещается у одной поверхности металлического изделия, и регистрируется т.н. донный сигнал, отраженный от другой поверхности. По времени задержки отраженного сигнала от зондирующего определяется толщина металла. При коррозии металлических изделий отраженный сигнал оказывается значительно зашумлен (см. рис. 47), что приводит к уменьшению точности определения временной задержки и, следовательно, к уменьшению точности определения толщины металла.

Рис. 47

Целью лабораторной работы является изучение методики работы с аппаратурой измерения и управления, подключенной к компьютеру с помощью интерфейса PCI, создания программ создания модельных зашумленных сигналов в реальном времени, их регистрации и цифровой обработки, сеpвисной части пpогpамм, включающей сpедства гpафического пользовательского интеpфейса, разработки виртуальных приборов.

Схема лабораторной установки

Рис. 48

Генератор сигналов произвольной формы воспроизводит модельные зашумленные донные сигналы (отраженные радиоимпульсы) с частотой несущей 1-5 МГц или реально полученные с помощью ЭМА-толщиномера и записанные в файле. Модуль АЦП с памятью LA-н10M6PCI, имеющий частоту отсчетов 100 МГц, регистрирует эти сигналы и передает в ПК IBM PC для цифровой обработки. Основная задача цифровой обработки заключается в измерении интервала времени от момента формирования зондирующего радиоимпульса (начала запуска) до первого донного сигнала или между двумя соседними донными сигналами с максимально высокой точностью.

В лабораторных работах анализируются три возможных алгоритма измерения момента прихода донного сигнала: по максимуму амплитуды, по периоду автокорреляции и комбинированный корреляционный. Первые два алгоритма известны и применяются на практике. Третий способ измерения временных интервалов между двумя радиоимпульсами разработан на кафедре ИУС ФТК7.

Экранная форма виртуального прибора

На рис. 49 и рис. 50 приведены примеры экранной формы виртуального прибора и результатов цифровой обработки модельного незашумленного и зашумленного радиолокационного эхо-сигнала идентичного реальному, созданные в среде LabWindows/CVI 8.0. Входными параметрами являются: несущая частота эхо-сигнала (Frequency), количество точек (Number of Point), начальный сдвиг (Shift initial), количество накоплений (Accumulation Quantity), уровень шума. Выходными являются: величина сдвига, определенная тремя способами (Method 1 - Method 3).

Рис. 49

Рис. 50

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

Программа работы

  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;