Автор работы: Пользователь скрыл имя, 12 Декабря 2013 в 10:40, курсовая работа
Разработать схему регулирования мощности, подаваемой в нагрузку, на основе микроконтроллера AVR Atmega16 с использованием широтно-импульсной модуляции (ШИМ).
Уровень управляющего напряжения регулируется с помощью потенциометра.
Для связи с компьютером использовать интерфейс RS-232.
1. Техническое задание
2. Введение
3. Выбор и обоснование структурной схемы
4. Разработка алгоритма работы микроконтроллера
5. Выбор и обоснование принципиальной схемы
6. Разработка программы для микроконтроллера
7. Заключение
8. Список литературы
LDI wreg3,0b00000110
OUT UCSRC,wreg3
UCSRC.
LDI wreg3,0x11
OUT UBRRL,wreg3
Регистры установки битрейта - UBRRH и UBRRL. В регистре UBRRH доступны биты 0-3 (если в UCSRC URSEL = 0). Регистр UBRRL доступен весь для сохранения восьми младших битов числа. В этих двух регистрах может быть сохранено 12-битное число (От 0 до 4095). Это число вычисляется по следующей формуле:
UBRR = fosc / (X * BAUD) - 1
Здесь X равно 16 при режиме с нормальной скоростью (бит U2X = 0) и 8 в режиме удвоенной скорости (бит U2X = 1), BAUD - нужный битрейт, fosc - частота кварцевого резонатора. По этой формуле легко вычислить значение регистра самостоятельно, но существуют также специальные таблицы наиболее типичных битрейтов и соответствующих значений UBRR.
******************************
sei ;Разрешить прерывания
Команда глобального разрешения прерываний, для того чтобы прерывание от АЦП могло осуществлятся.
******************************
За настройку модуля АЦП отвечают регистры ADCSRA,ADMUX:
ldi wreg, 0b10001011
out ADCSRA, wreg
Настройка битов регистра ADCSRA со след. параметрами:
; ADEN7 = 1 разрешаем АЦП
; ADSC6 = 0 Пока не запускаем
; ADATE5 = 0 одиночное преобразование
; ADIE3 = 1 Разрешаем прерывания
; ADPS2..0 = 0 Делитель частоты на 8
7 бит(ADEN) отвечает за включение модуля АЦП
6 (ADSC)- его установка запускает преобразование
5 (ADATE)- выбор режима работы АЦП
4 (ADIF)- флаг прерывания от компаратора
3(ADIE)- установкой этого бита разрешаем прерывание по завершению преобразования
2,1,0(ADPS2:ADPS0) биты отвечают за частоту преобразования.
ldi wreg, 0b01100101
out ADMUX, wreg
Настройка битов регистра ADMUX со след. параметрами:
; REFS — 0b[01]000101 первые два бита - напряжение со входа AVCC
; ADLAR –0b01[1]00101 следующий бит выравнивание по левому краю
; MUX — 0b010[00101] сигнал на вход идет с 5й ноги.
7 и 6 (REFS1,REFS0) бит отвечают за выбор источника опорного напряжения. Выбираем Eоп = Епит.
5 (ADLAR) бит устанавливаем, для того чтобы результат преобразования 10-разрядного АЦП, который сохраняется в регистрах ADCH и ADCL, выравнивался по левой границе.
4..0(MUX4:MUX0) биты отвечают за выбор входного канала.
******************************
Далее необходимо настроить порты на ввод или вывод. Порт D, где находится выход ШИМ на таймере 1, надо настроить на вывод. Порт A, где находится вход АЦП – на ввод. За режим ввод/вывод, отвечает регистр DDRX, где Х – A,B,C,D – порты. Загрузив в порт DDRD единицы настраиваем порт на вывод. Сбрасывать биты порта A не обязательно, т.к. по умолчанию все порты настроены на ввод.
ldi wreg,0b11111111 ; PortD (OC1A) - на выход
out DDRD,wreg
Настройка порта D на вывод информации.
******************************
Важным моментом является настройка таймера Т1 в режим Fast PWM
ldi wreg, 0b10101001 ; Инициализация ШИМ
out TCCR1A, wreg ; Режим Fast PWM
Регистр TCCR1A:
[1010]1001 – выбор режима работы (нормальный, инверсия, установка при совпадении, сброс при совпадении)
1010[10]01 – биты FOC1A и FОC1B для принудительной установки вых. cигнала
101010[01] – биты WGM11 и WGM10 совместно с 4 и 3 битами TCCR1B выбирают режим работы таймера (нормальный или ШИМ (разные типы)).
ldi wreg, 0b00001001
out TCCR1B, wreg
Регистр TCCR1B:
[0]0001001 – подавитель шума на входе захвата не исп.
0[0]001001 – выбор фронта (0-спад)
00[0]01001 – зарезервирован
000[01]001 – биты WGM13 и WGM12 совместно с 0 и 1 битами TCCR1B выбирают режим работы таймера (нормальный или ШИМ (разные типы)).
00001[001] – выбор источника тактового сигнала предделителя.
******************************
ldi wreg, 0b00000000
out TIMSK, wreg
Т.к. ШИМ вкл. не по прерыванию в TIMSK записаны все «0»
******************************
sbi ADCSRA,6 ;Запуск АЦ преобразования
Команда запуска АЦП – преобразования
******************************
WaitADC: ;Ожидание конца преобразования, затем уход на прерывание
rjmp WaitADC
Зацикливание программы для того, чтобы она ждала завершения преобразования АЦП и только потом уходила на подпрограмму.
******************************
Подпрограмма, которая выполняется по прерыванию (после завершения АЦ преобразования):
ADfinish: ;Программа по прерыванию
in wreg, ADCH ;Результат в регистр wreg
ldi wreg2, 0x00
out OCR1AH, wreg2
out OCR1AL, wreg ;Из wreg в регистр сравнения ШИМ
out UDR, wreg ;Положить из wreg в регистр UDR УСАРТа данные для отправки
sbi ADCSRA,6 ;Запуск АЦ преобразования
reti ;Выход из подпрограммы
Она заносит результат
В итоге на ножке OC1A получается сигнал ШИМ.
******************************
;Программа написана Лебедевым Денисом Олеговичем студентом группы 1А51
;выводит на экран величину ШИМ микроконтроллера, подключенного к компьютеру, в процентах
cseg segment byte public 'CODE'
assume cs :cseg,ds:cseg,es:cseg
org 100h
start proc near
jmp Begin
slova db 'Программа написана Лебедевым Денисом Олеговичем',13,10,0
qwerty db 'на мониторе отображается величина ШИМ в процентах',13,10
sot db ? ; количество сотен
des db ? ; количество десятков
edin db ? ; количество единиц
char db ? ;принимаемый байт
volt db '%',13,10,0
COM dw ? ;адрес СОМ-порта
Begin:
mov dh,01
mov dl,01
call goto ;переместим курсор в точку с координатами 1-ая строка, 1-ый столбец
mov bl,00001111b
mov si,OFFSET slova
call text ;выведем сообщение slova на экран
mov dh,8
mov dl,01
call goto ;переместим курсор в точку с координатами 8-ая строка, 1-ый столбец
mov bl,00001111b
mov si,OFFSET qwerty
call text ;выведем сообщение qwerty на экран
mov dx,1030h
mov COM,dx ;сохраним базовый адрес порта
add dx,3 ;указываем на регистр контроля линии COM+3
mov al,10000000b
out dx,al
dec dx
dec dx ;указываем на старший байт делителя скорости
mov al,0 ;старший байт для 19200 бод
out dx,al
dec dx ;указываем на младший байт делителя скорости
mov al,06h ;константа для скорости 19200 бод
out dx,al
mov al,0
or al,00000011b ;настроим формат передачи данных длина данных 8 бит
add dx,3
out dx,al
dec dx
dec dx ; указываем на регистр разрешения прерываний
mov al,0
out dx,al ; запрещаем прерывания от СОМ-порта
PRIEM:
mov dx,COM
add dx,5
in al,dx ; считаем регистр состояния линии
test al,00000001b
jz WAITPUSH ; проверка: принят ли символ по СОМ-порту
mov dx,COM
in al,dx ; считали принятый байт в AL
mov char,al ;сохраним в char принятый байт
mov dx,0505h ;
call goto ;переместим курсор в точку с координатами 5-ая строка, 5-ый столбец
call DECIMAL ;выведем принятое и преобразованое значение на экран
;*****************************
WAITPUSH:
mov ah,06h ;ввод символа с клавиатуры без ожидания
mov dl,0FFh ;функция 6 прерывания 21h
int 21h
jnz PUSTO ;продолжение если буфер клавиатуры не пуст
jmp PRIEM ;возврат из подпрограммы если пуст
PUSTO:
cmp al,1bh ;если нажата клавиша "Escape"
je QUIT ;то выход из программы
jmp PRIEM
;*****************************
QUIT:
mov ax,4c00h
int 21h
******************************
;**********процедура перемещения курсора в нужную точку*************************
goto proc
mov ah,02
int 10h ;используем функцию 02h прерывания 10h
ret
goto endp
;*****************************
;*********процедура вывода текста на
экран*************************
text proc
gotext:
mov al,[si] ;загружаем в AL адрес символа
cmp al,0 ;сравниваем его с 0
je endtext ;если да, то выйти из процедуры
mov ah,0eh ;
int 10h ;используем функцию 0eh прерывания 10h
inc si ;
jmp gotext ;переходим к следующему символу
endtext:
ret
text endp
;*****************************
;********процедура преобразования принятого
байта*************************
;********из двоичного числа получает
значение в Вольтах***********************
DECIMAL proc
mov al,char
aam 100 ; Делим значение AL на 100, результат в AH и AL
xchg al,ah ; Меняем AL и AH (чтобы сотни были в AL)
shl al,1 ;увеличим в 2 раза
shl al,1
add al,'0' ; Переводим в символьный вид
mov sot,al ;сохраним количество сотен
xchg al,ah ; Меняем AL и AH
aam 10 ; Делим значение AL на 10, результат в AH и AL
xchg al,ah ; Меняем AL и AH (чтобы сначала обработать AH)
shl al,1 ;увеличим в 2 раза
shl al,1
add al,'0' ; Переводим в символьный вид
mov des,al ;сохраним количество десятков
xchg al,ah ; Меняем AL и AH (чтобы сначала обработать AH)
shl al,1 ;увеличим в 2 раза
shl al,1
add al,'0' ; Переводим в символьный вид
mov edin,al ;сохраним количество единиц
;-----------------------------
;------корректируем значения--
mov cx, 3
met:
cmp al,'9'
jna met2
inc des
sub al,10d
mov edin,al ;
loop met
met2:
mov al,des
cmp al,'9'
jna met1
inc sot
sub al,10d
mov des,al ;
loop met2
met1:
;-----------------------------
mov al,sot ;
int 29h ; Выводим сотни на экран
mov al,des ;
int 29h ; Выводим десятки на экран
mov al,edin ;
int 29h ; Выводим единицы на экран
mov al,',' ;
int 29h ; Выводим запятую на экран
mov bl,00001111b
mov si,OFFSET volt
call text
ret
DECIMAL endp
;*****************************
ENDP
cseg ends
end start
Разработанное устройство позволяет регулировать мощность, подаваемую в нагрузку. Благодаря этому можно регулировать скорость вращения ДПТ (вентилятор или т.п.) или же, например, регулировать яркость свечения лампочки. Разработана лишь базовая схема, которую можно усовершенствовать. Возможно вместо переменного резистора использовать другие приборы: термодатчик или датчик давления, нагревательные элементы, но при этом эту схему и программу надо будет незначительно доработать. Также возможна настройка этой схемы на отправку других данных на компьютер или управление ей с помощью компьютера.
; crystal 8MHZ (internal)
; Timer Counter 1
; Fast PWM
.include "m16def.inc"
.def wreg =R31
.def wreg3 =R30
.def wreg2 =R29
;Задаём вектора прерываний
.ORG $0000
rjmp init
.ORG $001C
Информация о работе Регулятор мощности, подаваемой в нагрузку, на основе ШИМ