- •1. Задание на курсовой проект. Требования к структуре и содержанию пояснительной записки
- •Пример построения имитационной модели мпс
- •Пример построения функциональной схемы мпс
- •Пример разработки программного обеспечения мпс
- •Пояснения к выполнению вариантов заданий
- •Формирование сигнала с помощью цап.
- •Цифровой фильтр.
- •6. Справочные материалы
Цифровой фильтр.
Необходимо реализовать цифровой ФНЧ с бесконечной импульсной характеристикой (БИХ-фильтр). Структура БИХ-фильтра второго порядка приведена на рисунке 5.16.
Рис.5.16 – Структура БИХ-фильтра 2-го порядка
Рекомендации по реализации задания:
Рассчитать коэффициенты фильтра с помощью программы ciirf1.0.
На вход АЦП подать синусоидальный сигнал амплитудой 1 вольт и смещением 2 вольта.
Циклически выполнять аналого-цифровое преобразование исходного сигнала, цифровую обработку сигнала согласно структуры фильтра (рис.5.16) и выдавать результат фильтрации на ЦАП.
Обеспечить заданную частоту дискретизации.
Задавая различные частоты входного сигнала снять и построить АЧХ фильтра, сравнить с расчетной АЧХ.
Уровень выходного сигнала измерять осциллографом.
Пример программной реализации ФНЧ Баттерворта с частотой среза 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
Таблица перевода чисел в разные системы исчисления.
Табл. 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 |
Таблица скоростей 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 |
Используется либо комментарий, либо блоки с разъяснением переходов |
СПИСОК РЕКОМЕНДОВАННОЙ ЛИТЕРАТУРЫ
Бродин В.Б., Шагурин И.И. Микроконтроллеры. Архитектура, программирование, интерфейс.–М.: Издательство ЭКОМ, 1999.–400с.
Микушин А.В. Занимательно о микроконтроллерах. – СПб.: БХВ-Петербург, 2006. – 432 с.: ил.
Сташин В.В. и др. Проектирование цифровых устройств на однокристальных микроконтроллерах/ В.В.Сташин, А.В.Урусов, О.Ф.Мологонцева.–М.: Энергоатомиздат, 1990. – 224с.
Николайчук О.И. Системы малой автоматизации/ О.И.Николайчук – М.: СОЛОН-Пресс, 2003. 256с.
ГОСТ 19.003-80 “Единая система программной документации. Схемы алгоритмов и программ. Обозначения условные графические”.
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);
}