
НОВОСИБИРСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ
ФАКУЛЬТЕТ АВТОМАТИКИ И ВЫЧИСЛИТЕЛЬНОЙ ТЕХНИКИ
Кафедра Систем Сбора и Обработки Данных
Дисциплина «Микроконтроллеры»
Курсовая работа
Преобразователь частоты входного сигнала в длительность импульса выходного сигнала
Группа: АТ-53
Вариант: 5
Студент: Ездакова Е.А.
Преподаватель: Еленычев С,В.
Новосибирск, 2008
Задание:
Разработать на базе МК AT90S2313 преобразователь частоты входного сигнала в длительность импульса выходного сигнала (ШИМ). Параметры входного сигнала: прямоугольный сигнал (максимальное значение 5В, минимальное 0В) с полосой частот 10 – 100Гц. Выходной сигнал: прямоугольный сигнал с постоянным периодом Т = 0.01с, длительность импульса t пропорциональна частоте входного сигнала: отношение t/T = 0.1 соответствует частоте входного сигнала 10Гц, отношение t/T = 0.9 соответствует 100Гц. Отношение t/T сохранять в ОЗУ контроллера. Приведенная относительная погрешность не хуже 0.5%. Результат измерения (кроме выходного сигнала) выводить через интерфейс RS-232, протокол обмена данными разработать самостоятельно.
Введение:
Тенденции современной техники таковы, что микропроцессорные устройства находят все более широкое применение, на российском рынке в настоящее время известен 8-разрядный микроконтроллеры фирмы Atmel AT90S2313, на примере которого выполнен курсовой проект с целью ознакомления с приемами и особенностями проектирования изделий (в данном случае ШИМ) с использованием микроконтроллеров и программ для них.
Содержание работы:
3.1. Найдем зависимость длительности выходного импульса от частоты входного сигнала:
3.2. Используем таймер-счетчик TC1 для формирования прерываний по входу захвата
для измерения периода входного сигнала:
СК |
СК/256 |
|
|
|
|
8 МГц |
31250 Гц |
32 мкс |
2,097152 мкс |
|
|
Приведенная относительная погрешность
не хуже 0.5.
3.3. Используем таймер-счетчик TC0 для формирования прерываний по переполнению с частотой синхронизации 1/8 от тактовой частоты микроконтроллера (1 МГц).
При постоянном периоде выходного сигнала Т = 0.01 с:
|
t/T |
|
СК |
СК/8 |
|
|
|
|
10 Гц |
0.1 |
0.001 с |
8 МГц |
1 МГц |
1 мкс |
256 мкс |
|
|
100 Гц |
0.9 |
0.009 с |
Приведенная относительная погрешность
не хуже 0.5%.
Выбор элементной базы. Описание работы принципиальной схемы.
Возьмем Микроконтроллер At90S2313, повесим на него кварцевый резонатор для тактирования, на вход Vcc емкость для избежания перепадов напряжения питания,
на RESET – ФНЧ.
На вход захвата таймера1 ICP – будем подавать входной сигнал и измерять с помощью функции входного захвата таймера1 его период (частоту),
а с выхода PB4 будем снимать выходной сигнал, длительность импульса которого будем формировать с помощью функции переполнения таймера0.
Описание работы программного обеспечения (с блок-схемами алгоритмов):
Программное обеспечение для функционирования системы разработано на языке Ассемблера МК AT90S2313. Программное обеспечение отлажено и проверено в среде AVRStudio (в режиме симулятора).
Блок-схема работы программы для измерения периода входного сигнала:
Блок-схема алгоритма получения длительности импульса выходного сигнала:
Перейдем от
к
Блок схема работы программы для формирования выходного сигнала:
Программа для вычисления периода входного сигнала:
.INCLUDE "C:\Program Files\Atmel\AVR Tools\AvrAssembler\Appnotes\2313def.inc"
.DSEG
.ORG 0x60
flag : .byte 1
.CSEG
.ORG 0x0000
Таблица векторов прерываний
rjmp Reset
rjmp CAPT_T1
Reset:
;Настройка указателя стека
ldi r16, 0x7F
out SPL, r16
;Инициализация переменной значением 0х00
ldi r17, 0x00
sts flag, r17
; Настройка линии PD6 как входа
ldi r17, 0x3f
out DDRD, r17
;Выбор фронта сигнала захвата Бит 6 - ICES1=1 нарастающий,
;выбор делителя системной частоты 256
ldi r17, 0x44 ;01000100
out TCCR1B, r17
;Разрешение прерывания по входу захвата: Бит 3 - TICIE1-установлен
ldi r17, 0x08 ;00001000
out TIMSK, r17
sei
clr r16 clr r17 clr r18 clr r19 clr r20
rjmp pc; ожидание прерывания
Обработчик прерывания по входу захвата Timer1 считает период сигнала
CAPT_T1:
;flag=0 момент t1
ldi r17, 0x00
lds r0, flag
cp r0, r17
brne m1
in r16,TCNT1L
in r16, TCNT1H
out ICR1H, r16
out ICR1L, r16
ldi r17,ICR1L
ldi r18, ICR1H
;flag=1 момент t2
m1:
in r16, TCNT1L
in r16, TCNT1H
out ICR1H, r16
out ICR1L, r16
ldi r19,ICR1L
ldi r20, ICR1H
; период сигнала t2-t1
sub r19, r17
sbc r20, r18
reti
Программа для вычисления длительности импульса выходного сигнала :
.DSEG
.ORG 0x60
.CSEG
.ORG 0x00
;Таблица векторов прерываний
rjmp main
main: настройка стека
ldi r17,$80
out SPL,r17
ldi r17,$80
out SREG,r17
cicl:
ldi r17,$01
out OCR1AH,r17
ldi r17,$FF
out OCR1AL,r17
ldi r16,$79 ; r16:r17 = 889 - делимое
ldi r17,$03
ldi r18,$32 ;r18:r19 = период входного сигнала делитель
ldi r19,$02
rcall div16
rjmp cicl
div16:
;r16 - делимое (мл.) r17 - делимое (ст.)
;r18 - делитель (мл.) r19 - делитель (ст.)
;r20 - счетчик операций сдвига
;r17, r16 – частное ;r22, r21 - остаток
clr r22
clr r21
ldi r20,17
div_1: rol r16
rol r17
dec r20
brne div_2
ret
div_2: rol r21
rol r22
sub r21,r18
sbc r22,r19
brcc div_3
;Если остаток меньше делителя
add r21,r18
adc r22,r19
clc
rjmp div_1
Если остаток больше делителя
div_3: sec;
rjmp div_1 ret
Программа для формирования выходного сигнала:
.INCLUDE "C:\Program Files\Atmel\AVR Tools\AvrAssembler\Appnotes\2313def.inc"
.EQU N=39 ; число переполнений таймера, соответствующее 0.01 с
.DEF Counter = r18
.DSEG ;определение сегмента данных
.ORG 0x60
tau: .BYTE 1
.CSEG ; определение сегмента кода
.ORG 0x0000
;;;;;;;;;;;;;;;;;;;;Таблица векторов прерываний
rjmp Reset
rjmp T0_OVF ;формирование выходного сигнала
;;;;;;;;;;;;;;;;;;;;;Инициализация (настройка) используемой периферии
Reset:
;Настройка указателя стека
ldi r16, 0x7F
out SPL, r16
;Настройка линии РВ4 порта В на вывод
ldi r17, 0x10
out DDRB, r17
clr r16 ;занести 0 в счетчик Timer0
out TCNT0,r16
;Включение таймера 0 и выбор коэффициета деления системной частоты 1/8
ldi r16, 0x02
out TCCR0, r16
;Разрешение прерывания по переполнению таймера 0
ldi r17, 0x02
out TIMSK, r17
clr Counter ; обнулить счетчик переполнений
sei ; глобальное разрешение прерываний
;;;;;;;;;;;;;;;;;;;;;;Основная программа
Main:
;Настройка на передний фронт выходного сигнала
in r17, PORTB
ldi r16, 0x10
or r17,r16
out PORTB, r17 ; включаем линию порта PB4
clr r16 ;занести 0 в счетчик Timer0
out TCNT0,r16
rcall T0_OVF ;разрешаем прерывание по переполнению
rjmp Main
;;;;;;;;Обработчик прерывания по переполнению Timer0 формирует выходной сигнал
T0_OVF:
in r16,SREG; сохранение в стеке регистра статуса
push r16
m1:
inc Counter ; увеличить счетчик переполнений
;Формируем задний фронт выходного сигнала
cpi Counter, tau
brlo m1
brne m1
in r17, PORTB
ldi r16, 0xEF
and r17,r16
out PORTB ,r17 ; сброс линии порта PB4 как выхода
;Формируем весь период выходного сигнала
cpi Counter,N
brlo m1
brne end
ldi r16, 0x10
or r17,r16
out PORTB, r17 ; включение линии порта PB4 как выхода
clr Counter ; сброс счетчика таймера
end:
pop r16 ; восстановление из стека регитсра статуса
out SREG,r16
reti