Генератор сигнала треугольной формы
Министерство
Науки и Образования Российской Федерации
Новосибирский
Государственный Технический Университет
Факультет
Автоматики и Вычислительной Техники
Кафедра
Систем Сбора и Обработки Данных
Курсовой
проект
По
дисциплине «Микроконтроллеры»
«Генератор
сигнала треугольной формы»
Выполнил: Преподаватель:
Карелин А. Н.
Еленычев С.В.
Группа: АТ-83
Новосибирск
2012
Содержание
Задание
Структурная схема устройства и
пояснения к ней
Описание работы принципиальной схемы
Описание работы программного
обеспечения
Принципиальная схема устройства
Перечень элементов и спецификация
Листинг программы
Список литературы
Задание
Разработать принципиальную схему и программное
обеспечение модуля генератора специальных функций: треугольный сигнал. Для
генерации сигналов используется внутренний ШИМ микроконтроллера. Частота
сигнала задается через последовательный интерфейс RS-232. Полоса частот
выходного треугольного сигнала: 10Гц - 1000Гц. Выходной сигнал -
последовательность ШИМ-сигнала.
Протокол обмена данными. Пример запроса к
разрабатываемому устройству: ":F<пробел>100", где 100' -
частота сигнала, Гц. Пример ответа: "ОК". Данные передаются в
символьном виде (ASCII). Скорость обмена данными 9600 бит/с.
Структурная схема устройства и пояснения к ней
Основой данного устройства является
микроконтроллер D1. Он работает по программе, зашитой
во внутреннюю память программ. Микросхема имеет внутренний тактовый генератор,
работающий от внешнего кварцевого резонатора частотой 8 МГц. Сброс
микроконтроллера происходит автоматически при включении питания.
Преобразователь уровня D2
предназначен для преобразования уровня TTL в уровни RS-232.
Фильтр низких частот (ФНЧ) необходим
для подавления высокой частоты ШИМ-модулятора.
Описание работы принципиальной схемы
В качестве микроконтроллера используется
микросхема AT90S2313.
Она питается от стабилизированного источника питания напряжением +5В,
поступающем на клемму +5V.
Конденсаторы C4, C9
необходимы для подавления помех по питанию, возникающих из-за сопротивления
проводников и источника питания либо приходящих из вне по питанию. При этом C4
гасит высокочастотные помехи, которые не может погасить C9.
Внешняя цепь тактового генератора состоит из
элементов ZQ1, C1,
C2. Конденсаторы
предназначены для более стабильной работы генератора, а их номиналы выбраны
исходя из документации по AT90S2313.
Сигнал TXD
с выхода PD1 подается
на микросхему D2 преобразователя
уровня TTL<->RS-232.
Аналогично сигнал RXD
на вход PD0 подается с
той же микросхемы. Данная микросхема имеет два встроенных преобразователя
напряжения, необходимых для работы преобразователя чтобы получить сигнал ±10В.
Внешняя обвязка С5-С8 предназначена для работы преобразователей. Номиналы C5-C8
выбраны исходя из рекомендации производителя микросхемы.
ФНЧ построен на элементах R1,
C3. Частота среза
для фильтра рассчитывается по формуле:
= 2π/RC
С одной стороны для формирования сигнала
треугольной формы необходимо обеспечить как можно большую частоту среза. С
другой стороны нужно полностью подавить частоту PWM,
равную 8 МГц. Выберем fc равную 1 МГц. Получим RC
= 6.3 мкс.
Выберем С = 0.01мкФ, R
= 620 Ом.
Описание работы программного обеспечения
генератор сигнал резонатор частота
При включении питания происходит сброс
микроконтроллера. При этом он начинает выполнять программу с адреса 0, в
котором стоит команда перехода на код инициализации управляющих регистров.
Вначале инициализируется стек, необходимый для работы прерываний. Потом
устанавливается направление передачи портов PB
и PD. Линии PB3(OC1)
и PD1(TXD)
программируются как выходы. Далее инициализируется таймер-счетчик 1 на работу в
режиме 8-разрядного PWM
с прямым выходом OC1
без предделителя. После установки Timer1
устанавливается Timer0
на работу без предделителя и генерацию прерывания по переполнению. Наконец,
инициализируется UART
на передачу со скоростью 9600 бод. Это достигается включением приемника и
передатчика. Значение регистра скорости выбирается по таблице из фирменной
документации к микроконтроллеру. Для тактовой частоты 8 МГц и скорости передачи
9600 бод оно составляет 51.
После инициализации управляющих регистров
инициализируются внутренние переменные программы. Divide=79,
что соответствует начальной частоте 1000 Гц. T_Dir=4
- увеличение программного счетчика Count
по прерыванию от Timer0
на 4. Наконец, значение Divide
записывается в Count=high(Divide)
и Timer0=low(Divide).
Основная работа происходит в главном цикле
программы. В начале каждого цикла считываются данные из UART
и сравниваются с последовательностью символов ‘:F
‘. При не нахождении данной последовательности происходит вывод в UART
строки ошибки ‘ERROR’
и цикл начинается заново. Если последовательность найдена происходит чтение
числовой строки до <CR>
из UART, преобразование ее
в двоичное представление (16 бит) и запись в переменную Freq.
При вводе строки осуществляется проверка корректности символов (должны быть
цифры) и попадание значения в диапазон 100…1000. При невыполнении этих условий
происходит вывод в UART
строки ошибки ‘ERROR’
и цикл начинается заново. После выполнения проверки в UART
выдается ‘OK’. В конце
цикла вычисляется Divide=K/Freq,
где K - коэффициент,
значение которого вычислим ниже.
Рассмотрим алгоритм работы обработчика
прерывания по переполнению Timer0.
В алгоритме реализована программно-аппаратная задержка на Divide
тактов микроконтроллера. Реализована она следующим образом. Старший байт
значения задержки заносится в программный счетчик Count,
младший в Timer0. При этом
первое прерывание происходит через low(Divide)
тактов, а остальные через 256 тактов (максимальное значение Timer0).
В начале каждого прерывания происходит декремент Count
до возникновения отрицательного значения, при котором значения Count
и Timer0 устанавливаются
заново и происходит коррекция значения компаратора PWM.
Получается, что PWM
корректируется через low(Divide)+256*high(Divide)
= Divide тактов. Компаратор
корректируется следующим образом. Вначале он увеличивается на 4. При достижении
максимального значения 252 компаратор начинает уменьшаться на 4 до 0, потом
вновь увеличиваться и т. д. Это формирует необходимый сигнал треугольной формы.
Полный период сигнала формируется за 2*63=126 изменений компаратора, т. е. за
126*Divide тактов.
Частота сигнала Freq=Fck/(510*Divide).
При Fck=8МГц
получаем Divide=8000000/126/Freq.
Здесь 8000000/126=63492 и есть коэффициент K.
Принципиальная схема устройства
Схема выполнена в системе PCAD
2001.
Наименование
|
Кол.
|
Примечание
|
Конденсаторы
К10-17Б оЖ0.460.172ТУ
|
|
|
К10-17Б
22 пФ
|
2
|
C1,C2
|
К10-17Б
0,01 мкФ
|
1
|
C3
|
К10-17Б
0,47mF
|
1
|
C4
|
Конденсатор
электролитический K50-35 1,0mFx16 В
|
5
|
C5...C9
|
Микросхемы
|
|
|
AT90S2313
|
D1
|
MAX232
|
1
|
D2
|
Резистор
P1-12-0,125 620 Ом АБШК.434110.050ТУ
|
1
|
R1
|
Кварцевый
резонатор РГ07 8 МГц
|
1
|
ZQ1
|
Перечень элементов и спецификация
Листинг программы
.include
"2313def.inc"
.def
Temp=R20
;временный регистр
.def
FreqL=R21
;частота, Hz
.def
FreqH=R22
;
.def Temp1=R23 ;временный регистр для
обработчика прерываний
.def Count=R24 ;внешний счетчик для Timer0
.def ac_tmp=R25 ;временный регистр статуса
.def DivideL=R17 ;начальное значение Timer0
.def DivideH=R18 ;начальное значение Count
.def T_Dir=R19 ;значение изменения компаратора
PWM
.def drem16uL=R15;остаток от деления (временные
переменные)
.def drem16uH=R16
.cseg
.org 0
;Векторы
прерываний
rjmp RESET ; Reset Handler
rjmp EXT_INT0 ; IRQ0 Handler
rjmp EXT_INT1 ; IRQ1 Handler
rjmp TIM_CAPT1 ; Timer1 Capture
Handler
rjmp TIM_COMP1 ; Timer1 Compare
Handler
rjmp TIM_OVF1 ; Timer1 Overflow
Handler
rjmp TIM_OVF0 ; Timer0 Overflow
Handler
rjmp UART_RXC ; UART RX Complete
Handler
rjmp UART_DRE ; UDR Empty Handler
rjmp UART_TXC ; UART TX Complete
Handler
rjmp ANA_COMP ; Analog Comparator
Handler
;Необрабатываемые прерывания_INT0 :_INT1 :
TIM_CAPT1 :_OVF1 :_RXC :_DRE :_TXC
:_COMP :
TIM_COMP1 : reti
;Инициализация:
ldi Temp,RamEnd ;установка стека на конец памяти
out SPL,Temp
ldi Temp,0b00001000 ;установка направления порта
PB
out DDRB,Temp ;PB3 (OC1) - выход, остальные PBx
- входы
ldi Temp,0b00000010 ;установка направления порта
PD
out DDRD,Temp ;PD1 (TXD) - выход, остальные PDx
- входы
ldi Temp,(1<<COM1A1)+(1<<PWM10)
;Timer1 в режиме 8-разрядного PWM,
;OC1 - не
инверсный
out TCCR1A,Temp
ldi
Temp,1 ;установка
частоты Timer1 CLK=CK
out
TCCR1B,Temp
ldi
Temp,1 ;установка
частоты Timer0 CLK=CK
out
TCCR0,Temp
ldi
Temp,(1<<TOIE0)
;разрешение прерывания от Timer0
out
TIMSK,Temp
ldi
Temp,(1<<RXEN)+(1<<TXEN)
;включение приемопередатчика UART
out
UCR,Temp
ldi
Temp,51 ;установка
скорости 9600bps при CK=8MHz
out UBRR,Temp
ldi DivideL, 79 ;устанавливаем начальную частоту
1000Hz
ldi DivideH, 0
mov Count,DivideH ;заносим
в
Count и
Timer0 значение
Divide
out TCNT0,DivideL
sei ;разрешаем
прерывания
;***************************************************************
Loop:
rcall Recv ;чтение из UART последовательности и
сравнение
cpi Temp,':' ;с
':F '
brne Error ;если не та последовательность, то
переход на Error
cpi Temp,'F'
brne Error
rcall Recv
cpi Temp,' '
brne Error
ldi FreqL, 0 ;Freq=0
ldi FreqH, 0:
rcall Recv ;чтение
из
UART символа
cpi Temp,13 ;если прочитан <CR>,
breq InpOk ;то конец ввода
subi Temp,'0' ;если прочитана не цифра,
brcs Error ;то переход на Error
cpi Temp,10
brcc Error
add FreqL,FreqL ;Freq=10*Freq+digit
adc FreqH,FreqH
push FreqH
push FreqL
add FreqL,FreqL
adc FreqH,FreqH
add FreqL,FreqL
adc FreqH,FreqH
add FreqL,Temp
brcc Inpf_1
inc FreqH_1:
pop Temp
add FreqL,Temp
pop Temp
adc FreqH,Temp
cpi FreqH,1024/256 ;если
Freq>1024, то ошибка
brcs Inpf
:
ldi Temp,'E' ;вывод
в
UART строки
'ERROR<CR>'
rcall Trans
ldi Temp,'R'
rcall Trans
ldi Temp,'R'
rcall Trans
ldi Temp,'O'
rcall Trans
ldi Temp,'R'
rcall Trans
ldi Temp,13
rcall Trans
rjmp Loop
:
cpi
FreqH, 0 ;если Freq<10,
то ошибка
brne test1
cpi FreqL,10
brcs Error:
ldi Temp,'O' ;вывод
в
UART строки
'OK<CR>'
rcall Trans
ldi Temp,'K'
rcall Trans
ldi Temp,13
rcall Trans
cli ;запрещаем прерывания на время изменения
Divide
;Вычисляем
Divide=K/Freq
ldi DivideL,0x04 ;K=63492 (для
CK=8MHz)
ldi DivideH,0xF8
u:
clr drem16uL ;очищаем остаток от деления
sub drem16uH,drem16uH
ldi
Temp,17 ;инициализируем счетчик цикловu_1:
rol
DivideL ;сдвигаем влево делимое
rol
DivideH
dec
Temp ;уменьшаем счетчик циклов
breq
d16u_2 ;если деление прошло, переходим на d16u_2
rol
drem16uL ;сдвигаем делимое в остаток
rol
drem16uH
sbc
drem16uH,FreqH
brcc
d16u_3 ;если результат отрицателен,
add
drem16uL,FreqL ;то восстанавливаем остаток
adc
drem16uH,FreqH
clc
;и очищаем перенос для сдвига в результат,
rjmp
d16u_1 u_3:
sec
;иначе устанавливаем перенос для сдвига в результат
rjmp
d16u_1u_2:
neg
DivideL ;корректируем для таймера
;(таймер
считает на увеличение до переполнения)
sei
;разрешаем прерывания
rjmp
Loop
;************
********************************************: ;прием байта из UART
in
Temp,USR ;ожидание готовности байта
bst Temp,RXC
brtc Recv
in Temp,UDR ;сохранение
байта в Temp
ret
:
;передача байта в UART
in
Temp,USR ;ожидание готовности передатчика
bst Temp,UDRE
brtc Trans
out UDR,Temp ;передача
байта из Temp
ret
;*************************************************************
;Обработчик
прерывания от Timer0 (совместно с Count используется
;для
формирования временной задержки)_OVF0:
in
ac_tmp,SREG ;временно сохраняем регистр статуса
subi
Count,1 ;уменьшаем внешний счетчик
brcc
Tim_3 ;0 не достигнут, выходим из обработчика прерывания
mov Count,DivideH ;заносим в
Count и
Timer0 значение
Divide
out TCNT0,DivideL
in Temp1,OCR1AL ;считываем
в Temp1 значение
компаратора PWM
cpi
Temp1,0 ;если компаратор достиг минимума,
brne
Tim_1
ldi
T_Dir,4 ;изменяем направление счета на увеличение_1:
cpi
Temp1,0xFF ;если компаратор достиг максимума,
brne
Tim_2
ldi
T_Dir,-4 ;изменяем направление счета на уменьшение_2:
add
Temp1,T_Dir ;увеличиваем/уменьшаем компаратор
out
OCR1AL,Temp1_3:
out
SREG,ac_tmp ;восстанавливаем регистр статуса
reti
Список
литературы
1) Квеглис
С.В. Микроконтроллеры AVR: Метод. пособие. - Новосибирск: Изд-во НГТУ, 2003.
2) Жеребцов
И.П. Основы электроники. - Л.: Энергоатомиздат, 1985.
) Усатенко
С.Т., Каченюк Т.К., Терехова М.В. Выполнение электрических схем по ЕСКД:
Справочник. - М.: Издательство стандартов, 1992.
4) www.analog.com
<http://www.analog.com>
) <http://sevastianov.simbir.ru>
) <http://kazus.ru>
) <http://www.pcports.ru/articles/avr2.php>
) <http://easyelectronics.ru/avr-uchebnyj-kurs-ispolzovanie-shim.html>