Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
МУ_КП_МУИС.doc
Скачиваний:
0
Добавлен:
15.11.2019
Размер:
4.33 Mб
Скачать
    1. Цифровой фильтр.

Необходимо реализовать цифровой ФНЧ с бесконечной импульсной характеристикой (БИХ-фильтр). Структура БИХ-фильтра второго порядка приведена на рисунке 5.16.

Рис.5.16 – Структура БИХ-фильтра 2-го порядка

Рекомендации по реализации задания:

  1. Рассчитать коэффициенты фильтра с помощью программы ciirf1.0.

  2. На вход АЦП подать синусоидальный сигнал амплитудой 1 вольт и смещением 2 вольта.

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

  4. Обеспечить заданную частоту дискретизации.

  5. Задавая различные частоты входного сигнала снять и построить АЧХ фильтра, сравнить с расчетной АЧХ.

  6. Уровень выходного сигнала измерять осциллографом.

Пример программной реализации ФНЧ Баттерворта с частотой среза 1 Гц и частотой дискретизации 100 Гц.

//ФНЧ, Fd=100 Гц, Fc=1 Гц

#define a0 0.000945

#define a1 0.001889

#define a2 0.000945

#define b1 -1.911200

#define b2 0.914976

//Массивы цифрового фильтра

long x[3],y[3];

//Реализация БИХ-фильтра

while(1)

{

kodADC=ConvADC();

x[2]=x[1];

x[1]=x[0];

x[0]=kodADC;

y[2]=y[1];

y[1]=y[0];

y[0]=(a0*x[0]+a1*x[1]+a2*x[2]-b1*y[1]-b2*y[2]);

delay_ms(3);//Для корректировки частоты дискретизации

DAC(y[0]>>4);//Формируем выходной сигнал с помощью ЦАП

P3_5=!P3_5;//Для измерения частоты дискретизации

}

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

Рис.5.17 – Сигнал на выходе ЦАП при частоте исходного сигнала 0,5 Гц

Рис.5.18 – Сигнал на выходе ЦАП при частоте исходного сигнала 2 Гц

6. Справочные материалы

6.1. Программируемый периферийный адаптер i8255.

Программируемый периферийный адаптер (ППА) i8255 (отечественный аналог КР580ВВ55) представляет собой три канала ввода/вывода A, B и C по 8 бит каждый. Существует три режима работы микросхемы. В режиме 0 три упомянутых канала могут быть независимо друг от друга запрограммированы на ввод или вывод информации. Режим 1 позволяет передавать информацию по каналам A и B, используя отдельные биты канала C для управления обменом данными. В режиме 2 канал A приобретает свойство двунаправленной шины, управляемой опять же отдельными битами канала C. Кроме того, возможны установка и сброс отдельных битов канала C. Микросхема выпускается в 40-выводном DIP-корпусе.

Условное графическое обозначение (УГО) ППА приведено на рис.6.1, 14.

Рис.6.1 - УГО ППА

Рис.6.2 - УГО ППА в Proteus

Основные особенности микросхемы:

  • 3 канала ввода/вывода, 8 бит каждый;

  • 3 режима работы (0 – статический ввод/вывод, 1 – тактируемый ввод/вывод, 2 – двунаправленный ввод/вывод);

  • раздельное программирование каждого канала на ввод или вывод.

ППА структурно разбит на две группы (A и B). Группа A включает в себя канал A и старшую тетраду канала C. Группа B состоит из канала B и младшей тетрады канала C. Доступ к каналам ввода/вывода и регистру управления осуществляется с помощью логики чтения-записи в соответствии с табл. 6.1.

Табл.6.1 - Доступ к каналам ввода/вывода и регистру управляющего слова

A1

A0

/RD

/WR

/CS

 

0

0

0

1

0

Шина данных <- канал A

0

1

0

1

0

Шина данных <- канал B

1

0

0

1

0

Шина данных <- канал C

1

1

0

1

0

Данные не определены

0

0

1

0

0

Шина данных -> канал A

0

1

1

0

0

Шина данных -> канал B

1

0

1

0

0

Шина данных -> канал C

1

1

1

0

0

Шина данных -> регистр управления

X

Х

Х

Х

1

Шина данных в высокоомном состоянии

Назначение этих и остальных выводов микросхемы приведено в табл.6.2.

Табл.6.2 - Назначение выводов

D0…D7

Двунаправленная шина данных. Предназначена для передачи и приема данных процессором, а также передачи управляющих команд и слова состояния

/CS

Chip Select. Выбор микросхемы. Низкий уровень инициирует обмен между процессором и ППА

/RD

Read. Чтение. Низкий уровень на этом входе позволяет ППА передать данные или слово состояния процессору

/WR

Write. Запись. Низкий уровень на этом входе позволяет ППА принять данные или управляющую команду

RESET

Reset. Сброс. Высокий уровень на этом входе сбрасывает все внутренние регистры, включая регистры управления, переключает все каналы (A, B, C) в режим 0, одновременно переводя их в режим ввода (только при /RD = 0 и /WR = 0)

A0, A1

Адресные входы. Выбор канала. Позволяют выбрать один из каналов (A, B, C) или регистры управляющего слова и состояния (в зависимости от сигналов на входах /RD и /WR, см. табл. 2)

PA0…PA7

Канал A

PB0…PB7

Канал B

PC0…PC7

Канал C

Режим работы и направление передачи для каждого канала задается с помощью записи управляющего слова в регистр управления в соответствии с табл.6.3.

Табл.6.3 - Формат управляющего слова для выбора режима работы

D7

D6

D5

D4

D3

D2

D1

D0

Флаг управления 1 = выбор режима

Группа A

Группа В

 

Выбор режима: 00 = режим 0 01 = режим 1 1х = режим 2

Канал A: 1 = ввод 0 = вывод

Старшая тетрада канала C: 1 = ввод 0 = вывод

Выбор режима: 0 = режим 0 1 = режим 1

Канал B: 1 = ввод 0 = вывод

Младшая тетрада канала C: 1 = ввод 0 = вывод

6.2. Стандартные функции ввода/вывода Си.

Простейшими функциями ввода/вывода в языке С являются getchar() и putchar(), которые предназначены для посимвольного обмена данными (обе объявлены в стандартном библиотечном файле stdio.h). Функция getchar() возвращает символ, принятый от UART, а функция putchar(), наоборот, выводит символ. Все остальные стандартные функции ввода-вывода базируются на них.

Функции puts () и printf () используют функцию putchar() для вывода посимвольно строки в UART, назначенным последним. Предположим, у нас есть определение строки, предназначенной для вывода через последовательный интерфейс:

char s[6] = "12345";

Вызов функции puts() для вывода этой строки выглядит просто как puts(s);.

Функция printf () несколько сложнее, поскольку позволяет применить фор­матированный вывод. Она имеет следующий синтаксис вызова:

printf("Строка, в которую подставляются переменные ", переменная 1, переменная 2, .... ) ;

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

с – вывод параметра в виде символа ASCII;

d – вывод параметра в виде целого числа;

е – вывод параметра в экспоненциальном формате;

f – вывод параметра в виде вещественного числа;

ld – вывод параметра в виде длинного целого со знаком;

lu – вывод параметра в виде беззнакового длинного целого;

Lx –вывод параметра в виде беззнакового длинного целого в шестнадцатеричном представлении, используя нижний регистр символов;

LX –вывод параметра в виде беззнакового длинного целого в шестнадца-теричном представлении, используя верхний регистр символов;

s – вывод параметра в виде строки;

u – вывод параметра в виде беззнакового целого;

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

X – вывод параметра в виде беззнакового целого в шестнадцатеричном представлении, используя верхний регистр символов;

% – вывод знака процента.

Количество спецификаций должно совпадать с количеством переменных. При этом первая встретившаяся спецификация соответствует первой переменной в списке, вторая – второй и т.д.

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

8 – восемь знаков;

08 – восемь знаков с дополнением ведущими нулями; 8.2 – восемь знаков, два знака после десятичной точки. Примеры использования спецификаций форматирования:

int n=123;

char с = '$';

float f=23.5;

char str[] = "Hello";

printf("n = %d, str = %s", n, str); //n = 123, str = Hello

printf("n = %d : 0x%04X", n, n); //n = 123:0x007B

printf("Salary = %c%8.2f", c, f); //Salary = $23.50

    1. Таблица перевода чисел в разные системы исчисления.

Табл. 6.4 – Перевод чисел в разные системы исчисления

Десятичная

Шестнадцатиричная

Двоичная

0

0

0

0

0

0

1

1

0

0

0

1

2

2

0

0

1

0

3

3

0

0

1

1

4

4

0

1

0

0

5

5

0

1

0

1

6

6

0

1

1

0

7

7

0

1

1

1

8

8

1

0

0

0

9

9

1

0

0

1

10

A

1

0

1

0

11

B

1

0

1

1

12

C

1

1

0

0

13

D

1

1

0

1

14

E

1

1

1

0

15

F

1

1

1

1

    1. Таблица скоростей UART.

При синхронизации последовательного порта от Таймера 1, работающего в режиме автоперезагрузки, скорость обмена определяется по формуле:

Скорость = (2SMOD*Fosc)/(32*12*[256 – TH]),

где (ТН) – содержимое регистра ТН1 в десятичном представлении; SMOD – старший бит регистра PCON (бит удвоения скорости UART). В таблице 6.5 приведены результаты расчета значений TH1 для стандартного ряда скоростей UART при частоте тактового генератора Fosc=7,37 МГц. Для бесперебойного обмена по UART необходимо, чтобы погрешность установки скорости не превышала 3%.

Табл. 6.5 – Таблица скоростей UART

Fosc

7,37E+06

V, Бод

smod

TH1

TH1окр

Vp, Бод

%

110

0

81,52

81

109,7

-0,30

300

0

192,02

192

299,9

-0,04

1200

0

240,01

240

1199,5

-0,04

2400

0

248,00

248

2399,1

-0,04

4800

0

252,00

252

4798,2

-0,04

9600

0

254,00

254

9596,4

-0,04

19200

0

255,00

255

19192,7

-0,04

38400

0

255,50

255

19192,7

-50,02

57600

0

255,67

255

19192,7

-66,68

300

1

128,05

128

299,9

-0,04

1200

1

224,01

224

1199,5

-0,04

2400

1

240,01

240

2399,1

-0,04

4800

1

248,00

248

4798,2

-0,04

9600

1

252,00

252

9596,4

-0,04

19200

1

254,00

254

19192,7

-0,04

38400

1

255,00

255

38385,4

-0,04

57600

1

255,33

255

38385,4

-33,36

6.5. Задание периода переполнения таймера.

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

Табл. 6.6 – Зависимость периода переполнения таймера от начального значения в счетном регистре THx в режимах 1 и 2

Fosc

7,37E+06

dt

1,63E-06

mode 1

mode 2

THx

Tпер, мс

THx

Tпер, мкс

0

106,7

0

416,8

50

85,9

50

335,4

100

65,0

100

254,0

150

44,2

150

172,6

200

23,3

200

91,2

250

2,5

250

9,8

Формула расчета периода переполнения таймеров в режиме mode=1 (16 разрядов)

Т = –0,4168·ТНх+106,7 (мс)

Формула расчета периода переполнения таймеров в режиме mode=2 (8 разрядов)

Т = –1,628·ТНх+416,8 (мкс)

Рис. 6.3 – Зависимость периода переполнения от ТН в режиме 1

Рис. 6.4 – Зависимость периода переполнения от ТН в режиме 2

6.6. Правила оформления блок-схем.

Основные символы, используемые в блок-схемах в соответствии с ГОСТ 19.003-80 “Единая система программной документации. Схемы алгоритмов и программ. Обозначения условные графические”

Символ

Обозначение*

Назначение

1

2

3

1.Пуск-останов

Начало, конец, прерывание процесса обработки данных или выполнения программы

2.Ввод-вывод

Ввод или вывод данных неза­висимо от типа устройства

3.Процесс

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

4.Решение

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

5.Модификация

Заголовок цикла

6.Предопределенный про­цесс

Использование ранее созданных и отдельно опи­санных алгорит-мов, программ, стан-дартных программ из БСП

7.Документ

Ввод-вывод данных, носителем которых служит бу­мага

8.Перфокарта

Ввод-вывод данных, носителем которых служит перфокарта

9.Магнитная лента

Ввод-вывод данных, носителем которых служит магнитная лента

10. Магнитный диск

Ввод-вывод данных, носите­лем которых служит магнит­ный диск

11.Линии потока

Указание последовательности связей между символами

12.Соединитель

Указатель при разрыве линии потока схемы алгоритма

13.Межстраничный соедини­тель

Пояснения, формулы и т.д. в схеме

14.Комментарий

Пояснения, формулы и т.д.

*Размер a выбирается из ряда 10,15,20 мм. Допускается увеличивать размер a на число, кратно 5. Размер b равен l,5a.

Правила применения символов в блок схемах

Фрагмент схемы

Содержание обозначения

Правила применения

1

2

3

10,11,12 – по­рядковые но­мера символов в схеме

Порядковый номер проставляют слева в верхней части сим­волов в разрыве его контура

1

2

3

Комментарий

Применяется, если поясне-ния не поме­щаются внут-ри сим­вола. Комментарий помещается в сво­бодном месте схемы алгоритма на дан­ном листе и соеди­няется пунктиром с поясняемым симво­лом

Соединитель А - буква

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

Межстранич-ный соедини-тель. Первая строка межс-траничного со-единителя оп­ределяет номер листа схемы, вторая – коор­динату симво-ла (по­рядко-вый номер на схеме)

Связываемые линией потока символы находятся на разных листах

1

2

3

Проверка условия при количестве исходов от 4 до 13

Возле отво-димой линии ука­зываются условия пере-хода и адреса блочных сим-волов, на которые переходят в ка­ждом конкретном случае

Проверка условия при количестве исходов более 13

Используется либо коммен­тарий, либо блоки с разъяс­нением переходов

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

  1. Бродин В.Б., Шагурин И.И. Микроконтроллеры. Архитектура, программирование, интерфейс.–М.: Издательство ЭКОМ, 1999.–400с.

  2. Микушин А.В. Занимательно о микроконтроллерах. – СПб.: БХВ-Петербург, 2006. – 432 с.: ил.

  3. Сташин В.В. и др. Проектирование цифровых устройств на однокристальных микроконтроллерах/ В.В.Сташин, А.В.Урусов, О.Ф.Мологонцева.–М.: Энергоатомиздат, 1990. – 224с.

  4. Николайчук О.И. Системы малой автоматизации/ О.И.Николайчук – М.: СОЛОН-Пресс, 2003. 256с.

  5. ГОСТ 19.003-80 “Единая система программной документации. Схемы алгоритмов и программ. Обозначения условные графические”.

  6. http://www.gaw.ru

ПРИЛОЖЕНИЕ А

Листинг программы для тестирования МПС

#include<reg51.h>

#include<stdio.h>

#define Fosc 7.37e+6

//Регистры ППА

at 0x4000 unsigned char xdata PA;

at 0x4001 unsigned char xdata PB;

at 0x4002 unsigned char xdata PC;

at 0x4003 unsigned char xdata RUS;

//Сигналы АЦП

sbit HOLD = 0xB3;

sbit CLK = 0xB4;

//Сигнал ЦAП

sbit LE = 0xB2;

char n;//Указатель разряда

unsigned char buf[6];//Буфер индикатора

unsigned char scan=0xFE;

//Массив ячеек ОЗУ

at 0x0000 unsigned char xdata RAM[8192];

//Обработчик прерываний от Т0 ************************************************************

void timer_0() interrupt 1

{

P1=0xFF;//Потушили

PC=(n << 4);//Выбрали знакоместо

P1=~buf[n];//Выдаем на инф. шину очередной символ

n++;//указатель на следующее знакоместо

if (n==6) n=0; //закольцевали

}

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

unsigned char Decoder(char Sim)

{

unsigned char kod;

switch (Sim)

{

case 0: kod=0x3F; break;

case 1: kod=0x06; break;

case 2: kod=0x5B; break;

case 3: kod=0x4F; break;

case 4: kod=0x66; break;

case 5: kod=0x6D; break;

case 6: kod=0x7C; break;

case 7: kod=0x07; break;

case 8: kod=0x7F; break;

case 9: kod=0x6F; break;

}

return (kod);

}

//Функция задержки в мс ******************************************************************

void delay_ms(unsigned short t)

{

long N,y;

N=(long)t*7;//Формула получена эмпирически

for (y=1; y<=N; y++);

}

//Функция опроса АЦП *********************************************************

unsigned short ConvADC()

{

unsigned short kodADC;

HOLD=1; delay_ms(1);

CLK=1; delay_ms(1);

CLK=0; delay_ms(1);

HOLD=0; delay_ms(1);

kodADC=(PC & 0x0F);//Прочитали старший байт кода АЦП

kodADC=((kodADC<<8) | PA);//Добавили младший байт

return(kodADC);

}

//Функция инициализации UART *************************************************************

void initUART(unsigned short BAUD)

{

TH1=256-Fosc/384/BAUD;//Настройка скорости

TMOD=0x20;//Настройка таймера для UART

SCON=0x50;//Настройка UART

TR1=1;//Пуск Т1

TI=1;//Без этого не работают стандартные функции ввода-вывода

}

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

void DAC(unsigned char kodDAC)

{

PB=kodDAC;

LE=1;

LE=0;

}

//Тест ОЗУ *******************************************************************************

void testRAM()

{

short i;

bit error=0;

for(i=0;i<=8191;i++) RAM[i]='Q';

for(i=0;i<=8191;i++) if (RAM[i]!='Q') error=1;

if (error==1) printf("test RAM error\n");

else printf("test RAM ok\n");

}

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

void main()

{

unsigned short kodADC;

//Начальная установка сигналов управления АЦП

HOLD=0;

CLK=0;

//Начальная установка сигнала управления ЦАП

LE=0;

//Настройка ППА

RUS=0b10010001;//Настройка ППА_1: РА-ввод, РВ-вывод, младшая тетрада РС-ввод, старшая-вывод

//Настройка таймера и системы прерываний

TMOD=0x02;//Т0 8 разрядов

ET0=1;//Разрешили прерывания от Т0

EA=1;//сняли блокировку прерываний

TR0=1;//запустили индикацию

//Выдали на индикацию символы 123456

buf[0]=Decoder(1);

buf[1]=Decoder(2);

buf[2]=Decoder(3);

buf[3]=Decoder(4);

buf[4]=Decoder(5);

buf[5]=Decoder(6);

//Инициализация UART

initUART(1200);

printf("Start\n");//Выдали сообщение по UART

testRAM();//Тест ОЗУ

DAC(255/3);//Сформировали сигнал на выходе ЦАП Uоп/3

kodADC=ConvADC();//Однократное АЦ-преобразование

printf("kodADC=%u\n",kodADC);//Выдали результат АЦ-преобразования по UART

while(1);

}