Автор работы: Пользователь скрыл имя, 24 Июля 2013 в 10:33, курсовая работа
В данной курсовой работе представлен проект системы регулирования температуры позаданным нелинейным законам с помощью микроконтроллера ATTINY 461, фирмы Atmel[1].
Целью данной курсовой работы является разработка системы регулирования температуры по нелинейным законам.
Основной задачей курсовой работы является – закрепление навыков работы с микроконтроллерами посредством разработки устройства, использующего микроконтроллер в качестве базового управляющего элемента.
//.def T_bcd1 = r20
//.def T_bcd0 = r21
//.def Tlow = r22
//.def Thigh = r23
//.def K = r24
//.equ WORK_MODE = ; ; режим работы контроллера: 0-регулирование, 1-настройка
//.equ
;=============================
; объявим переменные в памяти данных
.dseg
keyb_char: .BYTE 1
ADC_VALUE: .BYTE 1
TSensorLow_L: .BYTE 1
TSensorLow_H: .BYTE 1
TSensorHigh_L: .Byte 1
TSensorHigh_H: .Byte 1
TRegulatorLow_L: .BYTE 1
TRegulatorLow_H: .BYTE 1
TRegulatorHigh_L: .Byte 1
TRegulatorHigh_H: .Byte 1
T_ADC_L: .Byte 1
T_ADC_H: .Byte 1
TL: .Byte 1
TH: .Byte 1
HeaterEnabled: .Byte 1
FreezerEnabled: .Byte 1
//KL: .BYTE 1
//KH: .BYTE 1
//OffsetL: .BYTE 1
//OffsetH: .BYTE 1
buf: .BYTE 16
STR: .BYTE 10
;=============================
;
;=============================
; объявим переменные
в энергонезависимой памяти
.eseg
; температуры в
абсолютных значениях (
; нижняя температурная граница датчика
ee_TSensorLow_H: .BYTE 1
ee_TSensorLow_L: .BYTE 1
ee_TSensorLow_PosNeg: .BYTE 1
; верхняя температурная граница датчика
ee_TSensorHigh_H: .BYTE 1
ee_TSensorHigh_L: .BYTE 1
ee_TSensorHigh_PosNeg: .BYTE
; температура - нижний порог, при котором включается морозильник
ee_TRegulatorLow_H: .BYTE 1
ee_TRegulatorLow_L: .BYTE 1
ee_TRegulatorLow_PosNeg: .
; температура - верзний порог, при котором включается нагреватель
ee_TRegulatorHigh_H: .BYTE 1
ee_TRegulatorHigh_L: .BYTE 1
ee_TRegulatorHigh_PosNeg: .
; все те же параметры, только приведенные в еденицах показаний АЦП (8 бит)
; а также коэфициент приведения и смещение
; нижняя температурная граница регулятора, при которой включаем морозильник
ee_TLow: .BYTE 1
; верхняя температурная граница регулятора, при которой включаем нагреватель
ee_THigh: .BYTE 1
; коэфициент приведения температуры в цельсиях к показаниям АЦП в еденицах (8 бит)
ee_KH: .BYTE 1
ee_KL: .BYTE 1
; смещение нуля градусов цельсия в показания АЦП в еденицаз (8 бит)
ee_OffsetH: .BYTE 1
ee_OffsetL: .BYTE 1
;=============================
;
;=============================
.cseg ; CODE segment.
;=============================
;Векторпрерываний
.org 0
rjmpinit;Reset
reti ;INT 0
reti ;PinChange - прерываниееслинапортуВсменился
reti ;СовпадениеАТаймера/
reti ;Совпадение B Таймера/Счетчика Т1
reti ;Timer 1
reti ;Timer 0
reti ;start usi
reti ;usiovf
reti ;EEPROM ready
reti ;Analog Comparator
rjmp ADC_COMPLETE_INT;
;=============================
;
;=============================
; объявим константы (в памяти программ)
s_enter_t_sensor: .DB "
s_high: .DB "high: _____", 0
s_low: .DB "low: _____", 0
s_enter_t_regulator: .DB "
s_fixed: .DB " fixed", 0
s_neg_or_pos: .DB "Pos[0] or Neg[1]:", 0
s_configuring_device1: .DB "
s_configuring_device2: .DB "
s_configured_ok1: .DB "| configured |",0
s_configured_ok2: .DB "| succesfully |",0
s_heater: .DB "Heater enabled",0
s_freezer: .DB "Freezer enabled",0
s_null: .DB "
;=============================
;=============================
.include "hd44780.asm" ; Подключениебиблиотекидля
; работы с дисплеем.
.include "keyboard.asm" ; Подключение библиотеки для
; работы с клавиатурой
.include "mltpy.asm" ; подпрограммы умножения 8-и и 16-ти битных беззнаковых целых
.include "eeprom_utils.asm"
.include "dialogs.asm"
.include "str_utils.asm"
;=============================
;-----------------------------
; инициализация работы контроллера
init:
;Инициализациястека
ldi r16,low(RAMend)
out SPL,r16
;Инициализация дисплея
rcalllcd_init
;инициализация клавиатуры
rcallkeyboard_init
;устанавливаем вывод,
где подключен нагреватель,
sbi DDR_HEATER, PIN_HEATER
;устанавливаем вывод,
где подключен морозильник,
sbi DDR_FREEZER, PIN_FREEZER
;читаем из EEPROM параметры реулирования
rcall read_configs
;инициализация АЦП и его запуск
rcall ADC_INIT
;разрешаем прерывания
sei
;переходим к основной программе
rjmp main
;-----------------------------
;
;-----------------------------
read_configs:
rcall read_TSL
rcall read_TSH
rcall read_TRL
rcall read_TRH
/*
* $TODO("добавить проверку на то, что параметры не заданы, и вывести диалог")
*/
ret
;-----------------------------
;
;-----------------------------
;основной код программы
main:
;переходим в режим
;контроллер проснется либо от АЦП, либо от нажатия на клавиатуру
//sleep
rcall screen_update
ldi r16, 10
rcall WaitMiliseconds
; будем ждать, пока ползьватель продержит какое-то количество времени нажатой клавишу #
rcall keyb_read_char
cpi keyb_read_result, '#'
brne main
;увеличиваем счетчик
inc r2
mov r16, r2
cpi r16, 2
brne main
;достаточно подержал - выводим ему меню конфигурирования
rcall configure
rjmp main
;-----------------------------
;
;-----------------------------
screen_update:
LDS r19, TH
LDS r18, TL
ldi ZL, LOW(buf<< 1)
ldi ZH, HIGH(buf<< 1)
rcall sint16tostr
ldi r16, 0
rcall LCD_SetAddressDD
WRITE_STRING_FROM_DATA buf
WRITE_CHAR 223
WRITE_CHAR 'C'
; выводим состояние
ldi r16, 0x40
rcall LCD_SetAddressDD
LDS r16, HeaterEnabled
cpi r16, 0
breq screen_update1
WRITE_STRING_FROM_CODE s_
rjmp exit_screen_update
screen_update1:
LDS r16, FreezerEnabled
cpi r16, 0
breq screen_update2
WRITE_STRING_FROM_CODE s_
rjmp exit_screen_update
screen_update2:
WRITE_STRING_FROM_CODE s_null
exit_screen_update:
ret
;-----------------------------
;
;-----------------------------
configure:
cli
/*
$TODO("выключить нагреватель и холодильник")
*/
LCD_CLEAR
WRITE_STRING_FROM_CODE s_
ldi r16, 0x40
rcall LCD_SetAddressDD
WRITE_STRING_FROM_CODE s_
ldi r16, 250
rcall WaitMiliseconds
rcall show_dialog_TSensorLow_
LCD_CLEAR
rcall indicate_ee_TSensorLow
ldi r16, 250
rcall WaitMiliseconds
ldi r16, 250
rcall WaitMiliseconds
rcall show_dialog_TSensorHigh_
LCD_CLEAR
rcall indicate_ee_TSensorHigh
ldi r16, 250
rcall WaitMiliseconds
ldi r16, 250
rcall WaitMiliseconds
rcall show_dialog_
LCD_CLEAR
rcall indicate_ee_
ldi r16, 250
rcall WaitMiliseconds
ldi r16, 250
rcall WaitMiliseconds
rcall show_dialog_
LCD_CLEAR
rcall indicate_ee_
ldi r16, 250
rcall WaitMiliseconds
ldi r16, 250
rcall WaitMiliseconds
LCD_CLEAR
WRITE_STRING_FROM_CODE s_
ldi r16, 0x40
rcall LCD_SetAddressDD
WRITE_STRING_FROM_CODE s_
ldi r16, 250
rcall WaitMiliseconds
rcall read_configs
rcall ADC_INIT
sei
ret
;-----------------------------
;
;-----------------------------
calc_temperature:
#define ADC_VALUEL ZL
#define ADC_VALUEH ZH
; сохраним то, что изменим мы
push ADC_VALUEL
push ADC_VALUEH
push XL
push XH
push YL
push YH
; сохраняем то, что изменит подпрограмма умножения
push r16
push r17
push r18
push r19
push r20
push r21
push r22
; ADC_VALUE = T
LDS ADC_VALUEL, T_ADC_L
LDS ADC_VALUEH, T_ADC_H
LSR ADC_VALUEH ;
ROR ADC_VALUEL ;Rd(7)=C, Rd(n)=Rd(n+1), C=Rd(0)
LSR ADC_VALUEH
ROR ADC_VALUEL
STS TL, ADC_VALUEL
STS TH, ADC_VALUEH
; X = TDL
LDS XL, TSensorLow_L
LDS XH, TSensorLow_H
; Y = TDH
LDS YL, TSensorHigh_L
LDS YH, TSensorHigh_H
; Y = TDH-TDL
sub YL, XL
sbc YH, XH
; Z = ADC_VALUE*(TDH-TDL) / 256; ADC_VALUE*(TDH-TDL)>0
mov mc16uL, ADC_VALUEL
mov mc16uH, ADC_VALUEH
mov mp16uL, YL
mov mp16uH, YH
rcall mpy16u
mov ZL, m16u1 ;так осуществляем деление на 256 - сдвиг на 8 бит
mov ZH, m16u2
; X = t = TDL + ADC_VALUE*(TDH-TDL) / 256 = X + ZL
add XL, ZL
adc XH, ZH
; созраняем посчитанные значения
STS TL, XL
STS TH, XH
; восстановим прежние значения регистров
pop r22
pop r21
pop r20
pop r19
pop r18
pop r17
pop r16
pop YH
pop YL
pop XH
pop XL
pop ADC_VALUEH
pop ADC_VALUEL
ret
;-----------------------------
;
;-----------------------------
; читаем TSL
read_TSL:
EE_READ ee_TSensorLow_H
mov XH, EE_DATA
EE_READ ee_TSensorLow_L
mov XL, EE_DATA
;читаем, отрицательное ли TDL
EE_READ ee_TSensorLow_PosNeg
cpi EE_DATA, 1
brne read_TSL_exit; уходим, если положительное
; инвертируем
mov ng1l, XL
mov ng1h, XH
rcall ng16
mov XL, ng1l
mov XH, ng1h
read_TSL_exit:
STS TSensorLow_L, XL
STS TSensorLow_H, XH
ret
;-----------------------------
;
;-----------------------------
read_TSH:
;Y = TDH
EE_READ ee_TSensorHigh_H
mov YH, EE_DATA
Информация о работе Регуляторы температуры по нелинейным законам