Регуляторы температуры по нелинейным законам

Автор работы: Пользователь скрыл имя, 24 Июля 2013 в 10:33, курсовая работа

Описание работы

В данной курсовой работе представлен проект системы регулирования температуры позаданным нелинейным законам с помощью микроконтроллера ATTINY 461, фирмы Atmel[1].
Целью данной курсовой работы является разработка системы регулирования температуры по нелинейным законам.
Основной задачей курсовой работы является – закрепление навыков работы с микроконтроллерами посредством разработки устройства, использующего микроконтроллер в качестве базового управляющего элемента.

Файлы: 1 файл

Курсач основная часть (Восстановлен).docx

— 1,009.42 Кб (Скачать файл)

//.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 1

; температура - нижний  порог, при котором включается  морозильник

ee_TRegulatorLow_H:   .BYTE 1

ee_TRegulatorLow_L:   .BYTE 1

ee_TRegulatorLow_PosNeg: .BYTE 1

; температура - верзний порог, при котором включается нагреватель

ee_TRegulatorHigh_H:  .BYTE 1

ee_TRegulatorHigh_L:  .BYTE 1

ee_TRegulatorHigh_PosNeg: .BYTE 1

; все те же  параметры, только приведенные  в еденицах показаний АЦП (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    ;СовпадениеАТаймера/СчетчикаТ1

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  "Enter sensor t", 223,  0

s_high:      .DB  "high: _____", 0

s_low:      .DB  "low:  _____", 0

s_enter_t_regulator:  .DB  "Enter t", 223, "regulator",  0

s_fixed:     .DB  " fixed", 0

s_neg_or_pos:    .DB  "Pos[0] or Neg[1]:", 0

s_configuring_device1:  .DB  "| configuring  |",0

s_configuring_device2:  .DB  "|    device    |",0

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  "                ",0

;======================================================

 

;======================================================

.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_heater

rjmp exit_screen_update

 

screen_update1:

LDS r16, FreezerEnabled

cpi r16, 0

breq screen_update2

WRITE_STRING_FROM_CODE s_freezer

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_configuring_device1

ldi r16, 0x40

rcall LCD_SetAddressDD

WRITE_STRING_FROM_CODE s_configuring_device2

ldi r16, 250

rcall WaitMiliseconds

 

rcall show_dialog_TSensorLow_and_write_ee

LCD_CLEAR

rcall indicate_ee_TSensorLow

ldi r16, 250

rcall WaitMiliseconds

ldi r16, 250

rcall WaitMiliseconds

 

rcall show_dialog_TSensorHigh_and_write_ee

LCD_CLEAR

rcall indicate_ee_TSensorHigh

ldi r16, 250

rcall WaitMiliseconds

ldi r16, 250

rcall WaitMiliseconds

 

rcall show_dialog_TRegulatorLow_and_write_ee

LCD_CLEAR

rcall indicate_ee_TRegulatorLow

ldi r16, 250

rcall WaitMiliseconds

ldi r16, 250

rcall WaitMiliseconds

 

rcall show_dialog_TRegulatorHigh_and_write_ee

LCD_CLEAR

rcall indicate_ee_TRegulatorHigh

ldi r16, 250

rcall WaitMiliseconds

ldi r16, 250

rcall WaitMiliseconds

 

LCD_CLEAR

WRITE_STRING_FROM_CODE s_configured_ok1

ldi r16, 0x40

rcall LCD_SetAddressDD

WRITE_STRING_FROM_CODE s_configured_ok1

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 ;логическийсдвиг (C=Rd(0))

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

Информация о работе Регуляторы температуры по нелинейным законам