Генератор сигнала треугольной формы

  • Вид работы:
    Дипломная (ВКР)
  • Предмет:
    Информатика, ВТ, телекоммуникации
  • Язык:
    Русский
    ,
    Формат файла:
    MS Word
    288,34 kb
  • Опубликовано:
    2012-01-19
Вы можете узнать стоимость помощи в написании студенческой работы.
Помощь в написании работы, которую точно примут!

Генератор сигнала треугольной формы

Министерство Науки и Образования Российской Федерации

Новосибирский Государственный Технический Университет

Факультет Автоматики и Вычислительной Техники

Кафедра Систем Сбора и Обработки Данных








Курсовой проект

По дисциплине «Микроконтроллеры»

«Генератор сигнала треугольной формы»

Выполнил:                                                                  Преподаватель:

Карелин А. Н.                                                   Еленычев С.В.

Группа: АТ-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>

Похожие работы на - Генератор сигнала треугольной формы

 

Не нашли материал для своей работы?
Поможем написать уникальную работу
Без плагиата!