Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
КР моя.docx
Скачиваний:
11
Добавлен:
21.09.2019
Размер:
496.13 Кб
Скачать

3. Разработка алгоритма работы устройства

Нужен текст, по которому можно будет потом восстановить иллюстрацию.

Рисунок 2. Блок-схема алгоритма работы системы

4. Разработка программы реализации цифрового фильтра

4.1 Математическая модель цифрового фильтра

Для реализации цифрового эквивалента передаточной функции перейдем от непрерывной передаточной функции к разностному уравнению. Непрерывная передаточная функция имеет вид:

От передаточной функции перейдем к дифференциальному уравнению:

Так как , то:

,где коэффициенты вычисляются по следующим формулам:

- это время выполнения одного цикла программы и вывода одного текущего значения . Выберем интервал дискретизаци.

при Δt=100мс: b1=0.9346; a0=0.1144

4.2 Разработка программы цифрового фильтра-подпункт не может называться так же как пункт.

Так как микроконтроллер может работать только с целыми числами, то будем рассматривать у вещественного числа отдельно целую часть и дробную. Для операций с целой и дробной части будем используются 16-битовые регистры. Максимальные значения целой и дробной части составляют по 4 знака, что обеспечивает достаточно высокую точность вычислений. В результате выполнения программы в порт выводится только целая чаcть Y, но все вычисления проводятся с дробными значениями.

Рисунок 3 – Блок схема алгоритма программы, реализующей цифровой эквивалент передаточной функции

Выполнение операции умножения.

Операнды и результат хранятся в 16 битных регистрах:

1 операнд: RW1.RW0

2 операнд: RW3.RW2

Результат: RW4.RW5

Так как коэффициенты –дробные числа с целой частью равной 0, то в RW1 всегда записываем 0 и при умножении ей пренебрежем.

Рисунок 4 – Блок-схема алгоритма операции умножения

Текст программы, реализующий цифровой эквивалент передаточной функции

.PROGRAM KURSOVAYA // Имя програмного модуля

#include C:\Mb90V590.h // включение заголовочного файла

.EXPORT _main // Объявление общедоступным имени программы

.SECTION DATA_MAIN, DATA, ALIGN=2 // Сегмент данных

A1 .RES.W 1

B .RES.W 1

P .RES.W 1

P1 .RES.W 1

P2 .RES.W 1

Y1 .RES.W 1

Y2 .RES.W 1

YN .RES.W 1

XN .RES.W 1

.SECTION CODE_MAIN, CODE, ALIGN=2; // Сегмент кода

_main: // Начало программы

// ЗАПИСЬ НАЧАЛЬНЫХ ЗНАЧЕНИЙ ПЕРЕМЕННЫХ

MOVW A1,#1144

MOVW B,# 9346

MOVW YN,#00

MOVW Y1,#00

MOVW Y2,#00

MOVW XN,#00

// НАСТРОЙКА ПОРТОВ НА ВЫВОД

MOV DDR8,#H'FF

MOV PDR8,#00

// НАСТРОЙКА РАБОТЫ АЦП

MOV ADCS0,#H'00

MOV ADCS1,#H'00

MOV ADCR1,#H'E8

MOV ADER,#H'FF

// НАСТРОЙКА ТАЙМЕРА НА ОТСЧЕТ 100 мс

MOVL A,#50000

MOVL TMRLR0,A

MOV TMCSR0,#H'0413

// ВЫПОЛНЕНИЕ АНАЛОГОВО-ЦИФРОВОГО ПРЕОБРАЗОВАНИЯ

M2: SETB ADCS1:1 // Установка бита запуска АЦП

WBTC ADCS1:7 // Ожидание конца преобразования

CLRB ADCS1:6 // Обнуление флага прерывания

MOV A,ADCR0 // Запись результата

MOV XN,A

// ВЫЧИСЛЕНИЕ ПРОИЗВЕДЕНИЯ Y[n-1]*B

MOVW RW1, #00

MOVW RW0,B

MOVW RW3,Y1

MOVW RW2,Y2

CALL PROIZ // Вызов подпрограммы умножения

MOVW P1,RW4 // Запись целой части результата

MOVW P2,RW5 // Запись дробной части результата

// ВЫЧИСЛЕНИЕ ПРОИЗВЕДЕНИЯ X[n]*A1

MOVW RW3,XN

MOVW RW2,#0

MOVW RW1,#0

MOVW RW0,A1

CALL PROIZ // Вызов подпрограммы умножения

// ВЫЧИСЛЕНИЕ ЗНАЧЕНИЯ Y[n]=Y[n-1]*B+X[n]*A1

// ПЕРВОЕ СЛАГАЕМОЕ ЗАПИСАНО В ПЕРЕМЕННЫХ Р1(целая часть), Р2(дробная часть);

// ВТОРОЕ СЛАГАЕМОЕ ЗАПИСАНО В РЕГИСТРАХ RW4(целая часть), RW5(дробная часть);

MOVW A,P1

ADDW A,RW4 // Суммирование целых частей

MOVW RW4,A // Запись целой части результата

MOVW A,P2

ADDW A,RW5 // Суммирование дробных частей

MOVW RW5,A

MOVW A,#9999

CMPW A,RW5

BHS M1 // Переход, если 9999>=RW5

INCW RW4 // Иначе, RW4=RW4+1 и

MOVW A,RW5

MOVW RW5,#10000

SUBW A,RW5

MOVW RW5,A // RW5=RW5-10000

M1: MOVW YN,RW4 // Запись результата

//ВЫВОД Y[n] НА ДАННОМ ШАГЕ

MOVW A,RW4

MOVw PDR8,A

// ПЕРЕПРИСВАИВАНИЕ ЗНАЧЕНИЙ ПЕРЕМЕННЫХ: Y[n-1]=Y[n]

MOVW A,RW4

MOVW Y1,A

MOVW A,RW5

MOVW Y2,A

// ЗАДЕРЖКА

WBTS TMCSR0:2

CLRB TMCSR0:2

JMP M2

// ПОДПРОГРАММА УМНОЖЕНИЯ RW1.RW0 НА RW3.RW2, РЕЗУЛЬТАТ В RW4.RW5

PROIZ:

MOVW A,RW3

MULW A,RW0 // Умножение RW3*RW0

MOVW P,#10000

DIVW A,P // А=А/Р (А-частное, Р-остаток)

MOVW RW4,A

MOVW RW5,P

MOVW A,RW2

MULW A,RW0 // Умножение RW2*RW0

MOVW P,#10000

DIVW A,P // А=А/Р (А-частное, Р-остаток)

ADDW A,RW5

MOVW RW5,A // RW5=RW5+A

MOVW A,#9999

CMPW A,RW5

BHS L1 // Переход, если 9999>RW5

INCW RW4 // Иначе, RW4=RW4+1 и

MOVW A,RW5

MOVW RW5,#10000

SUBW A,RW5

MOVW RW5,A // RW5=RW5-10000

L1: RET

.END