Разработка микропроцессорного устройства
Введение
В настоящее время мы вошли и прочно обосновались в мире
цифровой техники. Цифровая техника заняла очень большое место в жизни человека.
Она используется во всех отраслях промышленности и быта.
Микроконтроллер (МК) - разновидность микропроцессорной
системы, отличающийся тем, что содержит внутри постоянную оперативную память и
многочисленные устройства ввода / вывода, аналоговые и цифровые
преобразователи, последовательные и параллельные каналы передачи информации,
широтно-импульсные модуляторы, генераторы программируемых импульсов, таймеры
реального времени, модули обработки сигналов.
МК выполняются в различных корпусах с различным количеством
выводов, которые не выполняют никаких функций и могут быть только входами или
выходами.
МК классифицируются по разрядности данных: 4-х, 8-ми, 16-ти,
32-х разрядные.
Общие тенденции современных МК - это уменьшение числа внешних
элементов, т.е. на кристалле микросхемы размещают всевозможные нагрузочные
(«подтягивающие») резисторы, конденсаторы, цепи логики и т.п.
Для реализации микропроцессорного устройства измерения высоты
выбираем микроконтроллер (МК) семейства PICmicro компании Microchip PIC16F873.
Для данного МК характерна высокоскоростная архитектура,
позволяющая выполнять все команды за один цикл, кроме инструкций переходов,
выполняемых за два цикла. Всего система команд содержит 35 инструкций.
Под одним циклом понимается четыре такта тактового
генератора. Частота тактового генератора Fosc/4 (максимальная частота 20 МГц).
В микроконтроллере (МК) PIC16F873 память программ и данные
расположены в отдельных блоках и для обращения к ним используются отдельные
шины.
По шине данных передаются восьмиразрядные слова данных, а по
шине команд (программ) четырнадцатиразрядные коды операций.
Все регистры специального назначения отображаются в адресном
пространстве памяти данных, разделенной на четыре банка.
Система команд позволяет использовать любой регистр в любой
команде, используя необходимый режим адресации (прямой, косвенный,
относительный). Регистром косвенной адресации является FSR. Его содержимое
используется как четыре младших разряда адреса (индекса).
1. Анализ технического задания
Взаимосвязь измеряемой высоты с электрическим эквивалентом
имеет вид:
T=k*H
[мс],
где H - высота, км, k=2 мс/км.
Таким образом, измерение высоты сводиться к измерению
длительности прямоугольного импульса.
Определим длительность импульса:
Hmin=0.1 км, Tmin=0.1 км*2 мс/км=0,2
мс.
Hmax=20 км, Tmax=20 км*2 мс/км=40
мс.
Погрешность измерения ΔН=±0.1 км или ΔТ=±0,2 мс.
Измерение длительности импульса легко реализовать на основе
любого микроконтроллера семейства PIC16F87x компании Microchip.
2.
Описание выбранного метода измерения
Основным методом измерения длительности импульса является
метод непосредственного счета, суть которого заключается в том, что берется
некая квантующая частота fk и определяется, сколько периодов ТК
квантующей частоты укладывается в длительность измеряемого импульса. То есть
числовой эквивалент будет иметь вид
.
В нашем случае при квантовании микроконтроллера частотой 4 МГц,
частота квантования таймера составит 1 МГц, погрешность квантования 1 мкс.
Для измерения длительности прямоугольного импульса с помощью
микроконтроллера необходимо отслеживать появление его переднего и заднего
фронтов. Для этого нужно настроить любой порт МК как цифровой вход и
отслеживать момент, когда на нем появится логический «0», а затем логическая
«1» т.е. передний фронт импульса. Как только на входе появится логическая «1»,
необходимо запустить таймер, который будет считать количество отсчетов
постоянной частотой тактирования fk. Далее необходимо постоянно отслеживать появление логического «0»
на входе, т.е. приход заднего фронта импульса. При появлении логического «0» на
входе надо остановить таймер. Затем, зная количество отсчетов можно вычислить
длительность прямоугольного импульса.
Рис. 1. Измерение длительности импульса
Функциональная схема измерителя высоты представлена на рис. 2.
Рис. 2. Функциональная схема
Измеряемый импульс поступает в микроконтроллер (МК) с датчика,
кварцевый резонатор (КР) задает тактовую частоту микроконтроллера.
Микроконтроллер осуществляет измерение длительности импульса и преобразование
полученного числового эквивалента, который после преобразования выдается на
индикацию. Питание микроконтроллера осуществляется от блока питания (БП).
3.
Разработка блока питания
Источник питания необходим преобразования переменного
напряжения 115В, 400 Гц в постоянное напряжение +5В для питания
микроконтроллера и средств индикации. Источник питания состоит из следующих
основных элементов: трансформатора, выпрямителя, стабилизатора напряжения.
Принципиальная электрическая схема источника питания представлена на рис. 3.
Рис. 3. Принципиальная электрическая схема источника питания
импульс электрический микроконтроллер измеритель
Определим токи потребления:
Максимальный ток потребления микроконтроллера - 15 мА.
Максимальный ток потребления ЖК индикатора МТ-10S1-3Y - 1 мА.
Таким образом, общий ток потребления равен Iпотр=16
мА.
По необходимому выходному напряжению (+5 В) и току (2*Iпотр=32
мА) источника питания выбираем стабилизатор напряжения.
В качестве стабилизатора на +5 В выбираем микросхему MC78L05AB со следующими
характеристиками:
Выходное напряжение - +5±0,2 В.
Выходной ток - до 0,1 А.
Рис. 4. Зависимость выходного напряжения от входного
микросхемы MC78L05AB
Для выпрямителя выбираем диодный мост DB156 со следующими
характеристиками:
Максимальное постоянное обратное напряжение: 800 В;
Максимальное импульсное обратное напряжение: 960 В;
Максимальный прямой (выпрямленный за полупериод) ток: 1,5 А;
Максимальный допустимый прямой импульсный ток: 60 А;
Максимальный обратный ток: 10 мкА;
Рабочая частота: 10 кГц;
Максимальное прямое напряжение: 1,1 В при токе Iпр.: 1,5 А;
Рабочая температура: -55…125 ºС.
Выходное напряжение выпрямителя определяется по формуле:
(3.1)
Для получения напряжения +5 В на выходе стабилизатора, его входное
напряжение, после выпрямления переменного напряжения со вторичной обмотки
трансформатора, должно быть порядка 7-7,5 В (рис. 4). Таким образом, необходимое
напряжение вторичной обмотки трансформатора определится из формулы (3.1) как:
=7 В/1,4≈5 В.
С учетом падения напряжения на диодах выпрямительного моста
выберем трансформатор с выходным напряжением 6 В.
Выбираем трансформатор типа ТПК - 0,7-6В со следующими
характеристиками:
Напряжение вторичных обмоток в режиме номинальной нагрузки - 6 В.
Ток номинальной нагрузки - 0,12 А.
Максимальная выходная мощность - 0,7 Вт.
5.
Описание используемых модулей
Для решения поставленной задачи - измерения длительности
прямоугольного импульса напряжения будет использоваться модуль таймера TMR1 и
порт ввода RA1 для получения от датчика измеряемого импульса.
Таймер-счетчик TMR1. 16-ти разрядный, доступный для чтения и
записи. Состоит из двух 8-ми разрядных регистров TMR1H (0Fh) и TMR1L(0Eh). Счет
выполняется в спаренном регистре TMR1, инкрементируя его значение от 0000h до
FFFFh, далее считает сначала.
За работу TMR1 отвечает управляющий регистр Т1CON (регистр
специального назначения, доступен для чтения и записи), который содержит биты:
выбора коэффициента деления предделителя;
включения тактового генератора;
синхронизации внешнего тактового сигнала;
включения модуля TMR1.может работать в одном из 3-х режимов:
- таймера;
синхронного счетчика;
асинхронного счетчика.
PORTА - 6-ти разрядный двунаправленный порт
ввода-вывода. Все каналы его имеют соответствующие биты направления в регистре
TRISА, позволяющие настраивать канал на вход или на выход. Запись «1» в TRISA переводит
соответствующий буфер в 3-е состояние и определяет канал как вход, а запись «0»
определяет соответствующий канал как выход.
PORTB - 8-ми разрядный
двунаправленный порт ввода-вывода. Все каналы его имеют соответствующие биты
направления в регистре TRISB, позволяющие настраивать канал на вход или на выход. Запись
«1» в TRISB
переводит соответствующий буфер в 3-е состояние и определяет канал как вход, а
запись «0» определяет соответствующий канал как выход.
Регистр ADCON1 устанавливает режим работы портов
(цифровой или аналоговый) PORTA. Содержит следующие биты:
Бит 7: ADFM, необходим для формата сохранения 10 - разрядного
результата.
Биты 6-4: не используются.
Биты 3-0: PCFG3: PCFG0 - управляющие биты настройки каналов
АЦП.
Регистр состояния STATUS доступен для чтения /
записи, содержит флаги (признаки) состояния АЛУ, флаги сброса МК и биты
управления банками памяти. Регистр STATUS может быть адресован любой командой,
как и любой другой регистр памяти данных.
6. Разработка и описание электрической
принципиальной схемы устройства
Электрическая принципиальная схема устройства приведена на
рис. 6. С помощью данного микропроцессорного устройства производится измерение
длительности импульса 0,2…40 мс. Сигнал с датчика подается на вывод 3 PORTA RA1 микроконтроллера
PIC16F873. Результаты измерения от МК поступают по 8-разрядной шине на выводы
DB0-DB7 ЖК-индикатора MT-10S1-3Y c выводов канала PORTB микроконтроллера.
Микроконтроллер тактируется генератором, состоящим из
кварцевого резонатора ZQ1 и конденсаторов С5, С6 частотой 4 МГц.
Питание устройства осуществляется от блока питания
напряжением 5В. Включение и выключение питания производится кнопкой S1.
Рис. 5. Принципиальная электрическая схема измерителя высоты
7. Разработка блок-схем алгоритмов работы
устройства и подпрограмм
Блок-схема
алгоритма работы устройства
Основной алгоритм работы устройства измерения высоты содержит
подпрограммы: инициализации МК, инициализации ЖКИ модуля, измерения высоты,
вычисления числового эквивалента, перевода числа из двоичного кода в
двоично-десятичный код, выдачи результатов измерения на индикацию.
Рис. 6. Блок-схема алгоритма работы устройства
Блок-схема алгоритма инициализации микроконтроллера
Подпрограмма инициализации МК включает в себя настройку
используемых портов ввода / вывода, модуля таймера TMR1.
Блок-схема алгоритма инициализации ЖК индикатора
В подпрограмме инициализации ЖКИ осуществляется установка
разрядности интерфейса обмена данными между ЖКИ и МК, включение и очистка
индикатора, перевод в рабочий режим.
Блок-схема
алгоритма паузы 25 мс
Пауза 25 мс осуществляется программно, с учетом того что
частота квантования микроконтроллера составляет Fosc=4 МГц, время
выполнения одной команды составляет Fosc/4, т.е. 1 мкс. Таким
образом, для получения паузы 25 мс выполняется 100 циклов по 250 команд.
Блок-схема алгоритма паузы 50 мкс
Пауза 50 мкс осуществляется программно, аналогично паузе 50
мс. Таким образом, для получения паузы 50 мкс выполняется 50 команд.
Блок-схема
алгоритма паузы 100 мкс
Пауза 100 мкс осуществляется программно, аналогично паузе 50
мс. Таким образом, для получения паузы 100 мкс выполняется 100 команд.
Блок-схема
алгоритма выдача байта в ЖКИ
В данной подпрограмме осуществляется передача необходимых
сигналов на шину управления ЖК индикатором для записи в него байта данных,
согласно временной диаграмме с учетом динамических характеристик.
Блок-схема
алгоритма измерения длительности импульса
Так как взаимосвязь измеряемой высоты с электрическим
эквивалентом осуществляется через длительность импульса напряжения, в данной
подпрограмме осуществляется преобразование длительности импульса напряжения в
числовой код. Для измерения длительности прямоугольного импульса необходимо
отследить момент, когда на входе RА0 PORTА появится логическая «1», т.е. передний фронт
импульса. После этого запускается таймер TMR1, который будет считать
количество отсчетов с постоянной частотой тактирования f=1 МГц. Далее необходимо
постоянно отслеживать появление логического «0» на входе RА0, т.е. приход заднего
фронта импульса. При появлении логического «0» на входе RА0, таймер
останавливается.
Блок-схема
алгоритма вычисления числового эквивалента
Так как числовой эквивалент измеренной длительности импульса
находится в пределах 200…40000, а измеряемая высота в пределах 0,1…20 км, то
для упрощения индикации, вычисление числового эквивалента измеренной высоты
осуществляется делением измеренной длительности импульса на 200.
Блок-схема
алгоритма перевода в 2-10 код
В данной подпрограмме осуществляется преобразование двоичного
числового эквивалента измеренной высоты в три разряда двоично-десятичного кода
- «сотни», «десятки» и «единицы». Преобразования проводим, используя операции
вычитания чисел 100, а затем 10 с подсчётом количества положительных вычитаний.
Блок-схема
алгоритма выдачи результатов на индикацию
В этой подпрограмме необходимо содержимое регистров Nsot, Ndes и Ned, полученное в
подпрограмме десятичной коррекции, отправить сначала в регистр w, далее подпрограммой
определяется код символа.
Затем, содержимое регистра w, передается в PORTB МК, а затем происходит
обмен данными между МК и ЖКИ.
Блок-схема
алгоритма определения кода символа
В данной подпрограмме содержимое регистра w складывается с
содержимым регистра PCL, и при выходе из подпрограммы код индикации
записывается в w.
Заключение
В результате выполнения курсовой работы был разработан
микропроцессорный измеритель высоты с выводом результатов на ЖК индикатор,
удовлетворяющий заданным техническим характеристикам.
Список литературы
1. http://www.microchip.ru
Приложение
ЛИСТИНГ
org 0x0000
goto main
TL equ 0x24
TH equ 0x25
N equ 0x26
N0 equ 0x27
Nsot equ 0x28
Ndes equ 0x29
Ned equ 0x2A
K equ 0x2B
Count equ 0x2C
T1 equ 0x2D
T2 equ 0x2E
;**********************************
; Основная программа
;**********************************
main
call init_mk; инициализация микроконтроллера
call init_lcd; инициализация ЖКИ
start call measure; измерение длительности
импульса
call ekv; вычисление числового эквивалента
call bcd; преобразование числового эквивалента в 2-10 код
movwf Nsot, w; определение достижения 20 км
xorlw 0x02;STATUS, Z; PORTA, 4; замыкание контакта
на землю
btfss STATUS, Z;
bcf PORTA, 4; размыкание контакта на землю
call 25ms; пауза 25 мс.
call indicate; индикация результатов измерения
end.
;**********************************
; Инициализация микроконтроллера
;**********************************
init_mkPORTA;PORTB;0x07ADCON1; выходы PORTA цифровые 0x01;
movwf TRISA; настройка RA0 - на вход, остальные на
выход
clrf TRISB; настройка PORTB на выход
movlw 0x00;
movwf T1CON; настройка модуля TMR1
return
;**********************************
; Инициализация ЖКИ
;**********************************_lcdPORTA, 3;
E=025ms; пауза 25 мс0x30; PORTB; установка 8-ми битного
интерфейса передачи
bcf PORTA, 1; А0=0PORTA, 2; RW=0; пауза 1 мксPORTA, 3;
E=1;; пауза 3 мкс;PORTA, 3;
E=050mks; пауза 50 мксPORTA, 3; E=1;; пауза 3 мкс;PORTA, 3;
E=050mks; пауза 50 мксPORTA, 3; E=1;; пауза 3 мкс;сf PORTA, 3; E=0;; пауза 3 мкс;0x3APORTB;
настройка разрядностиbyte_to_lcd; передача байта в ЖКИ 0x0С
movwf PORTB; включение ЖКИ
call byte_to_lcd; передача байта в ЖКИ
movlw 0x01
movwf PORTB; очистка ЖКИ
call byte_to_lcd; передача байта в ЖКИ
movlw 0x06
movwf PORTB; режим ввода данных
call byte_to_lcd; передача байта в ЖКИ
;**********************************
; Пауза 25 мс
;**********************************
msT1; очистка T1T2; очистка T20x64;T1; T1=100
_1 movlw 0xFA;T2; T2=250
_0 decfsz T2, F; T2=T2-125_0T1, F; T1=T1-125_1
;**********************************
; Пауза 50 мкс
;**********************************
mksT1; очистка T10x32;T1; T1=50
_0 decfsz T1, F; T1=T1-150_0
;**********************************
; Пауза 100 мкс
;**********************************
mksT1; очистка T10x64;T1; T1=64
_0 decfsz T1, F; T1=T1-1 100_0
return
;**********************************
; Передача байта в ЖКИ
;**********************************_to_lcdPORTA,
2; RW=0; пауза 1 мксPORTA, 3;
E=1;; пауза 3 мкс;PORTA, 3;
E=0100mks; пауза 100 мкс
;**********************************
; Измерение длительности импульса
;**********************************
measure
clrf TMR1L; очистка TMR1L
clrf TMR1H; очистка TMR1H
m1 btfss PORTA, 0; входной сигнал равен 1?
goto m1
bsf T1CON, 0; запуск таймера
m2 btfsc PORTA, 0; входной сигнал равен 0?
goto m2
bcf T1CON, 0; остановка таймера
movf TMR1L, w;
movwf TL; пересылка результатов измерения в регистры
movf TMR1H, w;TH;
;**********************************
; Вычисление числового эквивалента
;**********************************
ekv
clrf N; очистка частного
clrf N0; очистка остатка
molvw 0xC8;
movf k, w; делитель=200
movlw 0x10;
movwf count; организация счетчика на 16
ekv2 rlf TL, F; сдвиг делимого влево
rlf TH, F;
rlf N0, F; сдвиг частного влевоk, w;
btfsc STATUS, C; если C=0 восстанавливаем остаток
goto ekv1
addwf N0, F; восстановление остатка
bcf STATUS, C; C=0
ekv1 rlf N, F; сдвиг частного влево
decfsz count, f; продолжать деление, пока не обнулен счетчик
goto ekv2;N0, w; N, F; прибавление остатка к
частному
return
;**********************************
; Перевод в 2-10 код
;**********************************
bcd
clrf Nsot; очистка регистров результата
clrf Ndes;
clrf Ned;
bcd1 movlw 0x64; вычитаем 100 из двоичного числа
subwf N, w;STATUS, C;
goto bcd2Nsot, F; увеличиваем количество сотен на единицуN; сохраняем результат
вычитанияbcd1;
bcd2 movlw 0x0A; вычитаем 10 из
двоичного числа
subwf N, w;STATUS, C; bcd3
incf Ndes, F; увеличиваем количество десяток на единицу
movwf N; сохраняем результат вычитания
goto bcd2;
bcd3 movf N, w;Ned; после вычитаний заносим остаток в единицы
return
;****************************************
; Выдача результатов измерения на индикацию
;****************************************PORTA,
2; RW=0PORTA, 1; A0=1 Nsot, w; кол-во сотен в w
call symbol; определение кода символа
movwf PORTB; w в PORTB
call byte_to_lcd; передача в ЖКИ Ndes, w; кол-во десятков в w
call symbol; определение кода символа
movwf PORTB; w в PORTB
call byte_to_lcd; передача в ЖКИ0x2E; код
точкиPORTB; w в
PORTBbyte_to_lcd; передача в ЖКИ Ned, w; кол-во единиц в w
call symbol; определение кода символа
movwf PORTB; w в PORTB
call byte_to_lcd; передача в ЖКИ
;****************************************
; Определение кода символа
;****************************************PCL, F;
PCL=PCL+w 0x30; символ 0
retlw 0x31; символ 1
retlw 0x32; символ 2
retlw 0x33; символ 3
retlw 0x34; символ 4
retlw 0x35; символ 5
retlw 0x36; символ 6
retlw 0x37; символ 7
retlw 0x38; символ 8
retlw 0x39; символ 9