- •Эрни Каспер Программирование на языке Ассемблера для микроконтроллеров семейства i8051
- •1.Что нужно знать программисту о микроконтроллерах семейства i8051
- •1.1.Общие сведения об архитектуре i8051
- •1.2.Правила записи команд микроконтроллера семейства i8051 на Ассемблере
- •1.3.Форматы и способы адресации данных
- •1.4.Форматы и способы адресации команд
- •1.5.Команды пересылки информации
- •1.6.Команды поразрядной обработки информации
- •1.7.Команды арифметических операций
- •1.8.Управляющие команды
- •2.Директивы ассемблера для микроконтроллеров семейства i8051
- •2.1.Общие понятия о процессах трансляции и компоновки
- •2.2.Обработка имен транслятором и компоновщиком
- •2.3.Директивы резервирования памяти и инициализации данных
- •2.4.Использование выражений в операндах
- •2.5.Директивы условной трансляции
- •2.6.Директивы подстановок
- •2.7.Директивы управления вводом и выводом
- •Глава 3.
- •3.Кросс-средства фирмы 2500 a.D. Software, Inc. Для семейства i8051
- •Глава 4
- •4.Программирование арифметических действий
- •4.1.Кодирование информации в микроконтроллере
- •4.2.Арифметические действия с большими числами
- •4.3.Арифметические действия с отрицательными числами
- •4.4.Контроль точности при программировании арифметических операций
- •Глава 5
- •5.Программирование вычисления функций
- •5.1.Возведение в квадрат и извлечение квадратного корня
- •5.2.Переход от десятичной системы счисления к двоичной и обратно
- •5.3.Вычисление функций при помощи таблиц
- •5.4.Вычисление обратной функции по таблице прямой функции
- •5.5.Компенсация систематических погрешностей при помощи таблиц
- •Глава 6
- •6.Программирование фильтрации сигналов
- •6.1.Особенности цифровой фильтрации сигналов
- •6.2.Программирование простейших фильтров нижних частот
- •6.3.Программирование фильтра для оценки параметров сигнала
- •6.4.Программирование медианного фильтра
- •Глава 7
- •7.Программирование взаимодействия с внешними устройствами
- •7.1.Общие вопросы взаимодействия
- •7.2.Порядок выполнения прерываний в микроконтроллерах семейства i8051.
- •7.3.Синхронизация работы программы внешним или внутренним сигналом
- •7.4.Программирование приема информации от датчиков
- •7.5.Программирование выдачи команд на исполнительные устройства
- •7.6.Программирование ввода и вывода информации для пользователя
- •8.Несколько рекомендаций о стиле программирования
- •8.1.Стиль программирования и использование ресурсов
- •8.2.Оформление исходного текста программы
- •8.3.Системы обозначений, выражения и простые подстановки
- •8.4.Применение подпрограмм и сложных текстовых подстановок
6.2.Программирование простейших фильтров нижних частот
Фильтры нижних частот позволяют снизить уровень высокочастотных помех и существенно улучшить отношение сигнал/шум, если мощность шума в полосе частот сигнала достаточно мала. Рассмотрим программирование цифрового фильтра, являющегося аналогом фильтра нижних частот на RC цепочке. Обозначив набор входных сигналов через X(N), а выходных — через Y(N) (здесь N — номер отсчета по времени), запишем рекуррентное соотношение фильтра:
Y(N) = (1 - К) * Y(N-l) + К * X(N),
где коэффициент 0 < К < 1 должен быть выбран по желаемой постоянной времени с учетом периода обращения Т к программе фильтрации. Простой проверкой при помощи калькулятора несложно убедиться в том, что при постоянном значении входного сигнала X(N) выходной сигнал Y(N) независимо от его начального значения стремится к величине входного. Если при некотором ненулевом значении выходного сигнала постоянно подавать на вход нулевой входной сигнал, то множество значений выходного сигнала образует убывающую геометрическую прогрессию со знаменателем
К = 1 • - exp(-T/(R*C)) .
Для уменьшения количества умножений целесообразно привести рекуррентное соотношение фильтрации к виду
Y(N) = Y(N-l) + К * (X(N) - Y(N-l)).
Поскольку коэффициент фильтра положительный и не превышает единицы, то в дальнейшем предполагается, что запятая фиксируется перед 7 битом старшего байта коэффициента. При положительных сигналах и допустимости однобайтового представления сигналов и коэффициента программа фильтрации очень проста:
CLR С ; подготовка к вычитанию
MOV A, x ; загрузка вх. сигнала
SUBB А, у ; вычитание предыдущего вых. сигнала
MOV F0, С ; запоминание знака разности
JNC dp ; переход по положительной разности
CPL А ; вычисление обратного кода
INC А ; получение модуля разности
dp: MOV В, k ; загрузка коэффициента
MUL АВ ; вычисление произведения
JNB А.7, nc ; переход, если мл. байт < 1/2
INC В ; добавление 1 в старший байт
пс: MOV А, у ; загрузка предыдущего вых. сигнала
JNB F0, роs ; по положительному приращению
CLR С ; подготовка к вычитанию
SUBB А, В ; вычитание модуля приращения
SJMP str ; на запоминание вых. сигнала
pos: ADD А, В ; добавление модуля приращения
str: MOV у, А ; запоминание вых. сигнала
Как видно из текста программы, для ее работы используется одна ячейка ОЗУ, в которой между обращениями к программе должно сохраняться значение выходного сигнала фильтра. При необходимости работы с отрицательными значениями сигналов и/или многобайтового представления сигналов и коэффициента необходимо использовать соответствующие приемы программирования, описанные ранее. В соответствии с масштабом коэффициента для вычисления выходного сигнала используется старший байт произведения. Для уменьшения погрешностей вычисления старший байт увеличивается на 1 в том случае, если старший разряд младшего байта произведения равен 1 (округление).
Фильтр нижних частот с одним инерционным элементом называется фильтром первого порядка. Он имеет крутизну частотной характеристики вне полосы пропускания 3 дб на октаву. Приведем пример программирования фильтра нижних частот второго порядка, имеющего два инерционных элемента и крутизну 6 дб на октаву. Разумеется, улучшение характеристик фильтра достигается за счет усложнения алгоритма обработки. Рекуррентное соотношение для выходного сигнала содержит два коэффициента и два предыдущих отсчета сигнала. Для упрощения вычислений целесообразно записать это соотношение так, чтобы кроме предыдущего выходного сигнала запоминать и предыдущее его приращение:
Y(N) = Y(N-l) + Kl * (X(N) - Y(N-l)) * + K2 * (Y(N-l) - Y(N-2))
Если выбрать граничную частоту полосы пропускания этого фильтра по уровню 3 дб, соответствующую тому же значению произведения RC, что и в предыдущем случае, то выбор коэффициентов задается следующими формулами:
Kl = 1 - 2 * exp(-0,7*T/RC) * cos(0,7*T/RC) + exp(-1,4*T/RC) K2 - exp(-l,4*T/RC)
Предполагая, что сигналы положительные однобайтовые и приращение выходного сигнала не превышает 127, можно хранить приращение в виде числа со знаком в ячейке dy.
MOV A, dy ; предыдущее приращения вых. сигнала
CLR FQ
JNB А.7, dyp ; по положительному приращению
SETB F0 ; запоминание знака приращения
CPL А
INC A ; вычисление модуля
dyp: MOV В, k2 ; загрузка второго коэффициента
MUL АВ ; вычисление произведения
JNB А.7, nc2 ; переход, если мл. байт < 1/2
INC В ; добавление 1 в старший байт
nc2: MOV А, B ; запоминание модуля произведения
JNB F0, рр ; по положительному приращению
CPL А
INC А ; вычисление дополнительного кода
pp: MOV dy, А ; временное запоминание произведения
CLR С ; подготовка к вычитанию
MOV A, x ; загрузка вх, сигнала
SUBB А, у ; вычитание предыдущего вых. сигнала
MOV F0, С ; запоминание знака разности
JHC dp ; переход по положительной разности
CPL A
INC A ; вычисление модуля разности
dp: MOV В, kl ; загрузка первого коэффициента
MUL АВ ; вычисление произведения
JNB А.7, ncl ; переход, если мл. байт < 1/2
INC В ; добавление 1 в старший байт
ncl: MOV А, В ; для вычисления приращения
JNB F0, pos ; по положительному приращению
CPL A
INC А ; вычисление дополнительного кода
pos: ADD A, dy ; вычисление приращения
MOV dy, A ; запоминание приращения
ADD А, у ; добавление предыдущего вых. сигнала
MOV у, А ; запоминание вых. сигнала
Более сложные программы фильтрации могут быть построены с использованием линий задержки, запоминающих большее количество предыдущих входных или выходных сигналов.