Источник: Подборка статей на сайте www.vibration.ru , в разделе "Основы"
http://www.vibration.ru/obrab_signalow.shtml

ОБРАБОТКА АНАЛОГОВЫХ СИГНАЛОВ НА IBM PC

Медведев С.Ю., к.ф.-м..н.

Шинная архитектура IBM PC.

   Успех персонального компьютера IBM PC был обусловлен в большой степени его открытой архитектурой, позволяющей, с одной стороны, расширять функциональные возможности машины, добавляя новые модули (дополнительную память. адаптеры внешних устройств и т.п.), а с другой стороны, гарантирующей широкому кругу пользователей и производителей оборудования работоспособность выпускаемых ими устройств на любом IBM-совместимом компьютере. Такую возможность предоставляет так называемая шинная архитектура компьютера. Шина представляет собой набор общих для всех компонентов компьютера проводников с фиксированным назначением сигналов.
   Упрощенное представление шины компьютера показано на рис.1.

Рис.1. Упрощенное представление шины компьютера.

   Унифицированная система соединений позволяет любому компоненту (и, что особенно важно, новому компоненту) взаимодействовать с любым другим компонентом. Новые компоненты соединяются с шиной через слоты (разъемы) расширения. Подробнее о шинах компьютера можно прочитать, например, в [1,2].    Первая шина, разработанная IBM была 8-ми разрядной, т.е. по ней за один цикл передавались 8 двоичных разрядов (или один байт) данных. Позднее IBM и другие производители выпустили новые РС с другими конфигурациями шин. До сих пор наиболее популярной остается шина промышленной стандартной архитектуры (Industry Standard Architecture - ISA), разработанная фирмой IBM для персонального компьютера IBM PC/AT (поэтому эту шину часто называют AT-bus). ISA имеет 16-битовую шину данных, тактовую частоту 8 МГц и рассчитана на 98-контактный слот расширения. С появлением современных быстродействующих 32-х и 64-разрядных процессоров и скоростных жестких дисков стандартная шина стала "узким местом", ограничивающим производительность ЭВМ. Были разработаны 32-разрядные шины (MicroChannel Architecture - MCA, применяемая в IBM PS/2, и Extended Industry Standard Architecture - EISA). Однако, с появлением так называемых локальных шин, вопрос о конфигурации основной шины ввода/вывода потерял свою остроту, поскольку процессор и системная память смогли "общаться" с дисплейными адаптерами и контроллерами дисков с высокой скоростью на основной частоте синхронизации системы (обычно 25 или 33 Мгц) с разрядностью передаваемых одновременно данных, равной разрядности процессора. На основной шине остались относительно медленные устройства ввода/вывода, например, модемы, мышь, принтеры, звуковые платы и т.п.
   Как говорилось выше, шины компьютера предназначены для подключения адаптеров внешних устройств. Такими устройствами могут быть, например, аналого-цифровой и цифро-аналоговый преобразователи, с помощью которых можно превратить ЭВМ в систему обработки аналоговых сигналов или систему управления неким внешним объектом. Однако, если не требуется высокая скорость ввода/вывода сигналов, то вовсе не обязательно разрабатывать адаптер, подключаемый к одной из шин компьютера. Задача решается гораздо проще, если подключить нужное устройство к одному из так называемых портов компьютера: параллельному или последовательному (как следует из названия, они различаются способами передачи цифровых данных: параллельно - 8 бит сразу, или последовательно - по одному биту друг за другом).

Рис. 2. Структура компьютера с локальной шиной.


Параллельный порт PC

   Параллельный порт, пожалуй, один из немногих (если не единственный) компонент персонального компьютера, который не претерпел изменений за 15 лет существования ПЭВМ.
   Изначально параллельный порт был предназначен для передачи данных на принтер, с чем он успешно справляется и по сей день. Порт передает сразу полный байт (8 битов) данных, представляющих собой код одного из печатаемых символов, поскольку каждый бит передается по отдельному проводу кабеля, соединяющего параллельный порт с принтером. С точки зрения программиста стандартный порт принтера IBM-совместимого компьютера представляет собой 3 восьмиразрядных (байтовых) порта ввода-вывода с отличающимися друг от друга на единицу адресами: порт (или регистр) данных, порт состояния принтера и, наконец, порт управления принтером. Рассмотрим назначение указанных портов ввода-вывода и отдельно каждого бита данных, записываемого или считываемого из них.

   Порт данных принтера (табл. 1.) имеет один из стандартных адресов: 278h, 378h или 3bch (h обозначает шестнадцатеричное число).

Таблица 1. Формат порта данных принтера.

Бит
Контакт разъема
Название
Назначение
0
2
DP0
мл.разряд
1
3
DP1
данные
2
4
DP2
данные
3
5
DP3
данные
4
6
DP4
данные
5
7
DP5
данные
6
8
DP6
данные
7
9
DP7
ст.разряд

   После записи данных в порт соответствующие логические уровни сразу появятся на контактах разъема для подключения принтера (смотри табл.1). Однако, принтер не примет данные до тех пор, пока не обнаружит стробирующий сигнал STB, представляющий собой импульс с активным низким уровнем ( ----|_|---- ). Для формирования сигнала STB на разъеме параллельного порта необходимо записать в младший разряд регистра (порта) управления, имеющего адрес на два больший адреса регистра данных, сначала единицу (на контакте появится нулевой логический уровень), а затем ноль (на контакте появится напряжение, соответствующее логической единице, т.е. 2.4 - 5 вольт). Таким образом, для печати любого символа необходима последовательность из трех операций: записи кода символа в порт данных, записи единицы в младший бит регистра управления и, наконец, записи туда же нуля (подробнее о программировании портов IBM PC см. в [3]). Эту последовательность можно реализовать, записав следующий фрагмент программы ( ch - код символа, DP - адрес регистра данных параллельного порта, CTL - адрес регистра управления, CTL=DP +2 )

outportb(DP, ch);
outportb(CTL,inportb(CTL)|1);
outportb(CTL,inportb(CTL)&0xfe);

   Здесь используются функции записи байта в порт outportb(addr,data) и чтения байта из порта inportb(addr). Для обеспечения изменения только одного бита в регистре управления используются логические побитовые операции или ( | ) и и ( & ) предыдущего содержимого регистра с константами, содержащими в младшем бите единицу и ноль. Результатом операции или с единицей будет единица, операции и с нулем - нуль.
   Нулевой и остальные биты регистра управления принтером отвечают за формирование сигналов, представленных в табл. 2.
   Биты 5 - 7 не используются.
   Для обеспечения "обратной связи" - ввода в компьютер информации о состоянии принтера, предназначен регистр состояния порта принтера. Его адрес на единицу больше адреса регистра данных.
Формат регистра представлен в табл.3.
   Наличие входных линий параллельного порта компьютера позволяет организовать через него не только вывод, но и ввод в компьютер цифровой или преобразованной в цифровую форму аналоговой информации. Более высокая скорость ввода/вывода данных по сравнению с последовательным портом и простота схемных решений объясняют растущую популярность использования параллельного порта для подключения таких устройств, как внешние накопители на магнитной ленте и жесткие диски, дисководы CD-ROM, сетевые адаптеры и звуковые платы (об усовершенствованных параллельных портах EPP и ECP можно прочитать, например, в [8]).
   Для вывода сигналов из ЭВМ достаточно зафиксировать данные, передаваемые через порт принтера, в регистре, выходы которого подсоединены к входам цифро-аналогового преобразователя (см. рис.3.). Для записи данных в регистр используется сигнал STB.

Таблица 2. Формат регистра управления принтером.

Бит
Контакт разъема
Название
Назначение
0
1
STB
1 стробирует данные
1
14
Auto LF
1 заставляет принтер автоматически переводить строку после приема символа возврата каретки.
2
16
Init
0 вызывает сброс (инициализацию) принтера.
3
17
SLCT
1 "выбирает" (логически подсоединяет) принтер.
4
Внутренний сигнал
IRQ Enable
1 разрешает порту принтера генерацию аппаратного прерывания

Таблица 3. Формат регистра состояния порта принтера

Бит регистра состояния

Контакт разъема
Название
Назначение
3
15
ERR
0 - принтер сигнализирует об ошибке
4
13
SEL
1 - принтер "выбран"
5
12
PO
1 - нет бумаги
6
10
ACK
0 - готов к приему следующ. символа
7 (инвертирован по отношению к сигналу на контакте разъема)
11
BSY
0 - занят или отключен

   Листинг функции dac_out(), обеспечивающей вывод данных через параллельный порт на цифро-аналоговый преобразователь, приведен в приложении 1.

Рис.3. Фрагмент принципиальной схемы, содержащий цифро-аналоговый преобразователь с выходным усилителем и НЧ-фильтром.


   Для ввода данных через стандартный параллельный порт потребуются дополнительные операции, поскольку входных линий всего пять. Двоичные данные с числом разрядов больше пяти должны вводиться по частям: по четыре - пять разрядов. Так, в примере, рассматриваемом в настоящей статье, ввод восьмиразрядного кода, полученного в результате аналого-цифрового преобразования, предлагается осуществить по частям: четыре младших разряда, затем четыре старших (смотри фрагмент принципиальной схемы на рис.4 и листинг программы i_o.c в приложении 1). Передача разных данных (DO2-DO5 и DO6-DO9) по одним и тем же линиям ( SEL, PO, ACK, ERR ) возможна благодаря применению в качестве буферных регистров схем с так называемым "третьим" или Z-состоянием, в котором выходные выводы отключены, и логический уровень на них определяется внешним сигналом. Выходной каскад микросхем представляет собой два последовательно соединенных n-p-n транзистора (смотри рис.5, подробнее в [4]). Выходной логический уровень определяется состоянием транзисторов VT1 и VT2 (табл. 4).
   Выход микросхем находится в Z-состоянии, если логический уровень на входе "разрешение выхода" - OE пассивный, т.е. запрещающий выход. Выходы микросхем 555ИР15 включаются, если на входе OE микросхемы присутствует логический ноль ( т.е. активным является низкий логический уровень ). Таким образом, если младший бит DP0, записанный в регистр данных параллельного порта, равен нулю, разрешена выдача младших четырех бит DO2-DO5 кода АЦП. Если единице - старших бит DO6-DO9 (в рассматриваемом примере используются восемь старших разрядов десятиразрядного АЦП КР1113ПВ1). И та, и другая четверка бит при чтении регистра состояния принтера оказывается в битах DS3-DS6 (см. рис.6).
   Как видно из рисунка, для восстановления восьмиразрядного числа необходимо после чтения из регистра состояния параллельного порта младших 4 бит сдвинуть результат вправо на 3 разряда. После чтения старших 4 бит результат нужно сдвинуть влево на 1 разряд.
   Кратко обсудим временную диаграмму, отображающую работу аналого-цифрового преобразователя     КР1113ПВ1 (подробнее см. в [5]).
   Цикл работы АЦП начинается с приходом сигнала сброса длительностью не менее 2 микросекунд на вход B&C (blank&conversion). При этом выходы данных DO0 - DO9 переходят в третье состояние а сигнал готовности DR принимает высокий (пассивный) уровень. Преобразование аналогового сигнала в цифровую форму начинается сразу после окончания импульса сброса и занимает не более 30 микросекунд. В течение всего этого времени напряжение на аналоговом входе АЦП IN (см. рис.4) для получения правильного результата должно поддерживаться постоянным, что обеспечивается специальной микросхемой - устройством выборки/хранения U1КР1100СК2. Во время преобразования выходы данных остаются в Z-, а сигнал готовности - в высоком состоянии. Когда преобразование завершено (АЦП работает по алгоритму последовательного приближения, см. в [5]), сигнал готовности DR устанавливается в активное низкое состояние, а на выходах DO0-DO9 появляется результат - цифровой эквивалент напряжения на входе АЦП. Данные DO0-DO9 будут присутствовать на выходах АЦП до прихода следующего импульса сброса на вход B&C. Если к этому моменту времени данные не считаны каким-либо внешним устройством, результат преобразования будет утерян. В схеме на рис.4 для фиксации данных используются регистры U3,U4 КР555ИР15.

Рис.4. Фрагмент принципиальной схемы лабораторной установки, содержащий устройство выборки/хранения (U1), аналого-цифровой преобразователь (U2) и буферные четырехразрядные регистры (U3,4).


Рис.5. Выходной каскад TTL-микросхемы.


Таблица 4. Логический уровень выходного каскада.

VT1
VT2
Выход
Открыт
Закрыт
1
Закрыт
Открыт
0
Закрыт
Закрыт
Z


Рис.6. Ввод восьмиразрядных данных через параллельный порт.

Рис.7. Диаграмма работы АЦП КР1113ПВ1.

Дискретизация и квантование сигнала

   При обсуждении аналого-цифрового преобразования и цифровой обработки сигналов невозможно обойти стороной анализ явлений дискретизации и квантования и их воздействие на спектр сигналов (подробнее см. в [6,7]). Операцию дискретизации мы описали в предыдущей статье "Преобразование Фурье и классический цифровой спектральный анализ", теперь поговорим о квантовании.
   Цифровой сигнал описывается квантованной дискретной функцией xk(nT), т.е. функцией, принимающей лишь ряд дискретных значений h1, h2, ... , hM - так называемых "уровней квантования".    Последовательность xk(nT) можно представить как результат преобразования последовательности x(nT) функцией квантования ФM(x) (cм. рис.8):
   xk(nT)= ФM[x(nT)].
   Число уровней квантования M = 2N, где N - число двоичных разрядов (бит) в представлении сигнала.
   Цифровой сигнал тем точнее представляет соответствующий дискретный сигнал, чем больше уровней квантования и, соответственно, разрядов цифрового представления данных. В настоящей статье рассматриваются 8-разрядные данные, обеспечивающие 256 уровней квантования. Разность между квантованным и неквантованным сигналом e(nT)=xk(nT) - x(nT) называется шумом квантования. Если записать последнее выражение как xk(nT)=x(nT)+e(nT), то станет ясно, что в любой цифровой системе обрабатывается не "чистый" дискретный сигнал, а его смесь с шумом квантования.
   Шум квантования равномерно распределен в интервале [0,h] (h=hn-hn-1 - шаг квантования), его дисперсия равна h2/12.    Шум квантования некоррелирован с сигналом и имеет постоянную спектральную плотность. Поэтому график типичного спектра гармонического сигнала, преобразованного с помощью АЦП в цифровую форму имеет вид, изображенный на рис.9. Относительный уровень шумового пьедестала спектра определяется, естественно, разрядностью цифрового представления сигнала. Отношение сигнал/шум определяется как частное от деления мощности сигнальной компоненты спектра на сумму мощностей шумовых компонент спектра (равную дисперсии шума квантования) в полосе частот от нуля до половины частоты выборки.
   В приложении 1 приведены примеры программ, позволяющих осуществить ввод и вывод аналогового сигнала с помощью простейших схем, изображенных на рис.3,4.

Рис. 8. Функция квантования

Рис.9. График спектра гармонического сигнала, преобразованного с помощью АЦП в цифровую форму. (Длина выборки выбрана кратной периоду сигнала для устранения явления "растекания спектра", обусловленного взвешиванием).



П Р И Л О Ж Е Н И Е 1

Листинги программ.

   Программа ввода/вывода сигналов I_O.C.

#include <dos.h>
#define DP 0x378
#define STA DP+1
#define CLA DP+2
 
void main()
{
int i,Ndata;
unsigned char adc,adc_low,adc_high;
unsigned char array[512];
Ndata=512;
 

/* цикл ввода сигнала */
 

for(i=0;i<Ndata; i++ )
{
 
while((inportb(STA)&0x80)==0); /* пока АЦП не готов, ничего не делаем */
outportb(DP,0); /* разрешаем выдачу младшего полубайта */
adc_low=( inportb(STA)&0x78 ) >> 3; /* вводим младший полубайт,выделяем нужные биты иставим их "на место" */
outportb(DP,1);  /* разрешаем выдачу старшего полубайта */
adc_high=( inportb(STA)&0x78 ) << 1; /* вводим старший полубайт,выделяем нужные биты иставим их "на место" */
adc=adc_low|adc_high; /* объединяем младший и старший полубайты */
array[i]=adc; /* заполняем элемент массива */

dac_out(adc);
/* вывод сигнала */
  /* АЦП может быть все еще готов! Если перейдем в начало цикла, то введем еще раз те же данные! Поэтому ... */
while((inportb(STA)&0x80)!=0); /* пока АЦП готов, ничего не делаем    */
} /* конец цикла ввода сигнала */
/* Массив array заполнен выборками сигнала */  

}
/* конец функции main() */

/* функция вывода данных на ЦАП */
 

void dac_out(byte data) {
 
outportb(DP,data); /* запись выборки в регистр данных порта принтера */
outportb(CLA, inportb(CLA)|1 );
/* формирование строба STB */
outportb(CLA, inportb(CLA)&0xfe ); /* снятие строба */
/* теперь данные записаны в регистр ЦАП */
}  

      
   Программа генерации сигналов GENERAT.C.

#include <dos.h> /* включение файла с используемыми функциями */
void main()
{
int i,Ndata;
byte array[512];
float freq=10;
Ndata=512;
 
for(i=0;i<Ndata;i++)
array[i]=(byte)(127*cos(2* M_PI*freq*i/Ndata)+1.);
/* заполнение массива одним периодом сигнала */

/* цикл вывода сигнала */
 
for(;;)
for(i=0;i<Ndata; i++ )
{
/* сигнал готовности АЦП используется для задания частоты вывода данных */
while((inportb(STA)&0x80)==0);
while((inportb(STA)&0x80)!=0);
/* пока АЦП не готов, ничего не делаем */
/* пока АЦП готов, ничего не делаем */
dac_out(array[i]);  
}
/* конец цикла вывода сигнала */
}  

 


Л и т е р а т у р а

1. Питер Нортон, Кори Сандлер, Том Баджет, Персональный компьютер изнутри. М.: Бином, 1995.
2. Левкин Г.Н., Левкина В.Е. Введение в схемотехнику ПЭВМ IBM AT. М.:МПИ, 1991.
3. Джордейн. Справочник программиста персонального компьютера IBM PC.
4. Ред. Якубовский С.В. Аналоговые и цифровые интегральные схемы. М.:Радио и связь, 1985.
5. Федорков Б.Г., Телец В.А. Микросхемы ЦАП и АЦП. М.:Энегроатомиздат, 1990.
6. Рабинер Л., Гоулд Б. Теория и применение цифровой обработки сигналов. М.:Мир, 1978.
7. Марпл-мл. С.Л. Цифровой спектральный анализ и его приложения: Пер. с англ. -М.: Мир, 1990.
8. Кенуорси К. Параллельный порт учится новым фокусам. Мир ПК, 7-8, 1995.

Источник: Подборка статей на сайте www.vibration.ru , в разделе "Основы"
http://www.vibration.ru/obrab_signalow.shtml