Разработка контроллера системы отопления

Тип работы:
Курсовая
Предмет:
Программирование


Узнать стоимость

Детальная информация о работе

Выдержка из работы

Техническое задание

Необходимо разработать контроллер системы отопления, обеспечивающий многопозиционный контроль температуры и управления 4 ветками отопления и котлом.

Данный контролер обеспечивает интерфейс через восьмиклавишную клавиатуру, чтобы была возможность задать параметры температурных режимов для четырех линий управления, установить часы и таймер и обеспечить функции задания параметров, как по времени, так и по температуре.

Для отображения информации используется двухстрочный 32×2 активный цифробуквенный или графический индикатор обеспечивающий отображение настроек и служебной информации.

Для контроля состояния системы используется 8 датчиков температуры установленных в помещении один на теплоносителе, другой в воздухе и один датчик установлен на бойлере для контроля температуры основного теплоносителя (в контурах температура может быть меньше) всего используется 9 датчиков температуры с диапазоном от 0 до 100єС.

Для управления обогревателями или другими устройствами используются 4мощных высоковольтных силовых ключа. Эти ключи должны управлять или циркуляционными насосами контуров отопления или электрическими обогревателями или электрическими тёплыми полами.

Для связи с компьютером рекомендовано использоватьUSB-порт или RS485.

Желательно чтобы система имела несколько режимов управления: автоматический (установки по умолчанию), пользовательский с привязкой по времени, экономный (минимальная температура для присутствия человека) и последний «антизаморозка» (теплоноситель +5єC).

Введение

В данной курсовой работе выполняется разработка системы управления отоплением. Использование микроконтроллера в данной системе значительно упростит управление температурой в помещении и позволит пользователю произвести гибкую настройку температуры. Современные системы управления почти все без исключения используют различные микропроцессорные комплекты, это значительно расширяет их функциональность, при этом не требуют значительного усложнения аппаратной части и соответственно не удорожает устройство, обеспечивая необходимый уровень функций.

В целом, применение и разработка микроконтроллерных систем управления является уже насущной необходимостью для обеспечения управления сложной техникой.

1. Описание функциональной схемы

T1, T2… T9 — цифровые датчики применяемые для контроля температур в контурах системы.

БУДТ — контакты дополнительной клавиатуры для управления из конкретных комнат.

К1, К2 … К5 — высоковольтные ключи для управления отопителями или циркуляционными насосоми и котлом.

ФПЗУ — внешнее запоминающее устройство (FLASH — память).

БК — блок клавиатуры на 8 клавиш.

ЖКИ — жидкокристаллический индикатор, необходимый для отображения параметров работы системы.

2. Разработка принципиальной схемы

2.1 Выбор контроллера

Для обеспечения использования наиболее подходящего контроллера оптимально рассмотреть несколько различных контроллеров, удовлетворяющих следующим требованиям:

· 8-ми разрядный,

· с низким энергопотреблением,

· наличие статичного режима,

· гарвардская архитектура,

Мною были выбраны контроллеры следующих серий: AVR (ATiny2313), PIC (16C745), MK-51 (AT89C51). В каждой серии выбирается примерно аналогичных по характеристикам контроллеры сравниваются их параметры и оценивается на сколько они подходят для оценивания конкретной задачи. Информация о выбранных микроконтроллерах для удобства представлена в таблице, наглядно показывающей различия между ними:

AVR (ATiny2313)

PIC (16C745)

MK-51 (AT89С51)

ПЗУ (память программ)

2 Кб

8 Кб

4 Кб

Таймеры/счетчики

1(8 разрядов)

1(16 разрядов)

2(16 разрядов)

2(16 разрядов)

Число портов ввода/вывода

18

22

32

Питание

2,7−5,5

2,0−5,5

4,0−5,5

Архитектура

RISC

RISC

CISC

Тактовая частота

20МГц

24МГц

24МГц

Режим экономии энергии

Idle, Power-down, Standby

Sleep

Idle, Power-down

Память данных

128 байт

256 байт

128 байт

Стоимость

50 руб.

300 руб.

50

AVR-микроконтроллер фирмы Атмел — это 8-разрядные RISC микроконтроллер для встраиваемых приложений. Они привлекают внимание наилучшим соотношением показателей быстродействие/энергопотребление, удобными режимами программирования, доступностью программно-аппаратных средств поддержки и широкой номенклатурой выпускаемых кристаллов. Микроконтроллеры обычно поставляются со стертыми встроенными FLASH и EEPROM блоками памяти (содержимое всех ячеек = $FF), готовыми к программированию. Улучшенная RISC (enhanced RISC) архитектура AVR-микроконтроллеров объединяет в себе комплекс решений, направленных на повышение быстродействия микропроцессорного ядра AVR. Арифметико-логическое устройство (ALU), в котором выполняются все вычислительные операции, имеет доступ к 32-м оперативным регистрам, объединенным в регистровый файл. Выборка содержимого регистров, выполнение операции и запись результата обратно в регистровый файл выполняются за один машинный цикл. Большинство встраиваемых микроконтроллеров имеют только один такой регистр, непосредственно доступный ALU, — аккумулятор, что требует включения в программу дополнительных команд его загрузки и считывания. В качестве контроллера рассмотрим ATiny2313, представляющий собой 8-битовый микроконтроллер, имеющий, следующие характеристики: построен на основе расширенной RISC-архитектуры; 2К загружаемой флэш-памяти; 32 рабочих регистра; 2 таймера/счетчика; 128 байтов EEPROM; 15 линий ввода/вывода общего назначения; внешние и внутренние прерывания; встроенный последовательный порт.

Альтернативой может быть контроллер другой серии например PIC 16С745. PIC16F84 — это 8-pазpядные микpоконтpоллеpы с RISC аpхитектуpой, производимые фирмой MicrochipTechnology. Это семейство микpоконтpоллеpов отличается низким энеpгопотpеблением и высокой скоростью. Микpоконтpоллеpы имеют встроенное ЭППЗУ пpогpамм, ОЗУ данных и выпускаются в 20 выводных корпусах. Память данных (ОЗУ) имеет pазpядность 8 бит, память пpогpамм (ППЗУ) для PIC16C84 14. Использование Гаpваpдскойаpхитектуpы позволяет достичь высокой скорости выполнения битовых, байтовых и pегистpовых операций.

МК семейства МК-51 используют гарвардскую архитектуру. Классический микроконтроллер семейства 51 и его улучшенная модификация 52 серии имеет следующие данные: целочисленный 8-разрядный CISC-процессор, использование CISK архитектуры позволяет упростить программу за счет поддержки команд умножения и деления; тактовая частота до 80 МГц; командный цикл до 12 тактов; раздельные адресные пространства программ и данных; встроенная память программ объёмом 2−64 кб; встроенное ОЗУ данных объёмом 128б-64Кб; 40 выводов, 32 линии ввода-вывода; два или 4 8/16-разрядных таймера; последовательный порт RS-232; возможность подключения внешней памяти программ и данных, до 64 кб каждая (некоторые модели до 4Мб); режим пониженного энергопотребления.

Различные модификации дополнительно имеют возможность работы с интерфейсами SPI, I2C, USB.

Обоснование выбора контроллера

Для данной задачи — разработки регистратора параметров технологического процесса — микроконтроллер семейства МК-51 является оптимальным, так как сочетает в себе большие возможности управления, необходимые для решения поставленной мной задачи. Кроме того по существенным параметрам: число портов ввода вывода (32), архитектура (CISC) — микроконтроллер MCS-51 АТ89C51 превосходит микроконтроллеры подобных серий других производителей. Кроме того микроконтроллер серии МК-51 не уступает микроконтроллерам AVR и PIC также в таких параметрах как: число таймеров счетчиков (2), тактовая частота (до 24 МГц), режимы экономии энергии (Idle, Power-down). А так же при серийном выпуске данного изделия большую роль будет играть его малая стоимость и высокая надежность работы.

Немаловажен тот факт, что архитектура данного контролера мной изучена в курсе лабораторных работ. А также важно, что у меня имеются средства программирования и средство моделирования элементов программы — лабораторный стенд на ADUC812

Краткие характеристики контроллера MCS-51 АТ89С51:

Для использования в данном устройстве мной был выбран микропроцессор АТ89С51 серии MSC-51.

Он обладает высокими техническими характеристиками:

1. Частота работы от 0 до 24МГц.

2. Объем встроенного флешь ПЗУ — 4КБ.

3. Объем регистрового ОЗУ 128 байт.

4. Два счетчика 16ти разрядных счетчикатаймера.

5. Порт выдерживает нагрузку до 20мА.

6. Число портов ввода вывода 32.

7. Котроллер поставляется в сорокавыводном корпусе.

8. Напряжения питания от 5 В ±20% (номинальное 5В).

2.2 Выбор элементов схемы

Сначала рассмотрим выбор датчиков температуры.

В качестве датчика температуры рассмотрен вариант реализации DS18B20. Для выполнения моего курсового задания необходима точность +/-1, а эти датчики сертифицированы как измерительные приборы и обеспечивают точность до 0.1. Соответственно данный датчик может быть подключен по однопроводной сигнальной линии и передает данные по протоколу IWare. Благодаря обеспечению возможности адресного обращениявозможно использование одной линии связи для всех датчиков.

ДатчикDS18B20 имеет следующие отличительные особенности:

1. Точность ±0. 5 °C от -50°C до +125°C,

2. Разрешение от 9 до 12 бит, которое настраивается пользователем,

3. Передача данных посредством 1-проводного последовательного интерфейса,

4. 64-битный уникальный и неизменяемый серийный номер,

5. Многоточечное считывание,

6. Рабочее напряжение от 3. 0 В до 5. 5 В,

7. Вариант датчика с запиткой с линии данных (DS18B20-PAR),

8. O-92, 150mil 8-контактный SOIC, или 1. 98 мм x 1. 37 мм корпус с шариковыми выводами (±2. 0°C).

Данные в микросхеме DS18B20 считываются через 1-проводную последовательную шину в дополнительном от 9 до 12 битном (программируется пользователем) коде с ценой младшего разряда от 0. 5 °C до 0. 0625 °C. Она является термометром с цифровым вводом/выводом, работающим с точностью ±0. 5 °C.

У каждой микросхемы DS18B20 имеется уникальный и неизменяемый 64-битный серийный номер, используемый как узловой адрес датчика. При этом появляется возможностьсосуществовать множеству микросхем DS18B20 на одной 1 проводной шине. Микросхема DS18B20 может быть локально запитана от 3. 0 В до 5. 5 В или она может быть сконфигурирована таким образом, чтобы быть запитанной посредством 1-проводной линии данных.

Осуществлениепередачи команды начала преобразования и других команд, а также считывания значения измеренной температуры производится с помощью 1-проводного интерфейса (1-WireTM).

Используемый 1-проводным интерфейсом протокол не сложен. В любой момент времени на 1-проводной шине можно выделить устройство-мастер, которым может быть микропроцессор или компьютер, и подчиненное устройство, в нашем случае это микросхема система нагрева и охлаждения.

Мастер всегда выступает инициатором обмена по 1-проводной шине. Обмен с датчиком всегда начинается с процесса инициализации.

Для DS18B20 температура представляется в виде 9-битного значения в дополнительном коде. Поскольку это значение занимает 2 байта, все разряды старшего байта равны знаковому разряду. Дискретность представления температуры составляет 0. 5 °C.

2. 3 Описание принципиальной схемы

Принципиальная схема состоит из следующих узлов:

1)Входные датчики (выбор датчиков был обоснован ранее). Данные датчиков: измеренное значение температуры считывается и по последовательному каналу загружается в контроллер, откуда определяем как температуру теплоносителя, так и температуру воздуха в комнате. Для этого нам и необходимы девять датчиков, которые обеспечивают девять точек контроля. Число датчиков может быть при необходимости расширено.

2)Для подключению к компьютеру используется USB-порт, с преобразователем на схеме FT232RL. Который обеспечивается сложным интерфейсом USB встроенного в контроллер интерфейса UART. Драйвера микросхемы организуют виртуальный COM-порт через который ведется обмен, физически присоединение идет к USB-порту имеющегося во всех современных компьютерах, поэтому он и был выбран. Микросхема сама обеспечивает инициализацию при подключении сложные алгоритмы обмена при этом передавая данные по стандартному последовательному порту.

3)Схемы сброса и подключения кварцевого резонатора стандартные, рекомендуемые производителем, поэтому не требуют никакого изменения.

4)Для управления всей системой решено использовать восьмиклавишную клавиатуру, которая реализована с помощью специальной микросхемы — шифратора К155ИВ1, которая определяет, какая из клавиш нажата и передает код клавиши всего по трём проводам, что сокращает число необходимых для использования портов.

5)Для отображения нужной пользователю информации о состоянии системы в целом используется двустрочный ЖКИ — индикатор, который обеспечивает возможность отображения как символьных элементов, так и цифровых, что позволяет вводить нужный объём информации с необходимыми комментариями. Такое решение наиболее оптимальное в данном случае для реализации интерфейса с пользователем.

6)Для управления исполнительной частью, например нагревательным элементом — тэном, используется четыре ключевых элемента по 1 наканал: ключ оптосиммисторный, использует оптосиммистор МОС306, но так как он образует ток до 1А, то он управляет более мощным ВТ139. Это позволяет подключать нагрузку до 2 — 3 кВт. Такое управление через электронный ключ позволяет обеспечить необходимые коммутационные параметры. С таким ключевым элементом возможна регулировка скорости вращения циркуляционных насосов, которая производится с помощью импульсной модуляции.

Для управления котлом мы не можем использовать электронные ключи, поэтому решено использовать реле, которое коммутируется транзисторным ключом на полевом транзисторе VT1 и позволяет включать и выключать котел для подогрева воды на требуемую температуру.

7) Для накопления данных используется Flesh ПЗУ последовательного типа AT24C256 по интерфейсу I2C. Данное ПЗУ имеет возможность многократной перезаписи данных и за счет использования последовательного канала задействуются только 2 порта. Это очень удобно, потому что используемый контроллер имеет аппаратно поддерживаемую возможность работы с протоколом I2C, что в свою очередь упрощает программную реализацию устройства. (рис. 2).

/

Рис. 2.3 Схема АТ24С256

контроллер отопление программа схема

Микросхемы EEPROM серии АТ24С256 фирмы Atmel -- недорогие малогабаритные, электрически перепрограммируемые, энергонезависимые запоминающие устройства, с низким энергопотреблением и управлением по шине I2С.

3. Разработка программы управления

3.1 Общий алгоритм работы

При старте системы на ЖКИ отображается время и показания датчиков температуры на данный момент, старт системы осуществляется нажатием клавиши «1». Далее пользователь может выбрать режим нажатием клавиши «2», в системе предусмотрено 4 режима работы (автоматический, пользовательский, экономный и «антизаморозка»), режимы листаются по кругу с 1 по 4. В автоматическом режиме используются параметры, которые заданы по умолчанию, в пользовательском параметры, которые задает сам пользователь, экономный режим — поддержание ночью температуры 20є в спальне, и по 16є в других комнатах, к утру температура возрастает до 23є во всех комнатах, днем если никого нет дома температура понижается во всех комнатах до 16є, режим «антизаморозка» не дает замерзнуть воде в системе, если вода остывает до +3є то включается бойлер, нагрев происходит до +7є затем отключается. При нажатии клавиши «3» пользователь переходит к выбору канала, они листаются по кругу с 1 по 5 (коридор, спальня, кухня, зал, бойлер). Для сохранения параметров заданных пользователем используется клавиша «4». Чтобы увеличить температуру на +1 или уменьшить -1нужно воспользоваться клавишами «5», «6». При нажатии клавиши «7» пользователь может установить часы (+1 час), клавишей «8» установить минуты (+1 мин).

В системе присутствует FLASH ПЗУ для хранения пользовательских настроек.

Пример надписи на ЖКИ:

1

2

:

0

0

:

0

0

К

о

р

и

д

о

р

-

2

1

°

С

п

а

л

ь

н

я

-

2

3

°

К

у

х

н

я

-

2

0

°

З

а

л

-

2

2

°

Б

о

й

л

е

р

-

6

5

°

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

При включении в розетку контроллер производит начальную инициализацию основных переменных и массивов, прерываний и необходимых флагов. устанавливаются выставленные по умолчанию параметры, и система переходит к поддержанию нужной температуры, тока, включая охлаждение когда элементы перегреты и т. д. При старте система по умолчанию выключена и на индикаторе ничего не отображается. После нажатия клавиши «1» система включается в работу, на индикатор выводятся установленные по умолчанию параметры (начально все установлено в 0). Таким образом, реализуется простейший алгоритм настройки.

Мы используем библиотеку 51-го контроллера. Вначале идёт объявление переменных, стандартные счётчики. Для измерения температуры мы выделили байтовые переменные ohlagd. Сначала контроллер посылает сигналы датчикам и получает ответы о том, что датчики готовы к работе с ним. Затем контроллер посылает сигнал конкретному датчику и получает от него измеренное значение температуры. После получения результатов от 2 датчиков температуры и АЦП контроллер сравнивает полученные результаты с параметрами температуры, введёнными пользователем, либо с параметрами, установленными по умолчанию. Если температура в комнате оказывается ниже установленной температуры, то микроконтроллер включает нагревательный элемент. Если температура оказалась выше установленной, то, напротив, посылается сигнал об отключении тэна, а вентилятор продолжает работать, втягивая прохладный воздух до тех пор, пока температура не будет равна установленным параметрам, в этом случае система отключается. Для того чтобы была возможность ввести параметры температуры и времени используются соответствующие клавиши которые отслеживаются по моментам нажатия. Для отработки нажатия клавиатура сканируется много раз в секунду и контролируется изменение кода клавиши. При старте системы первым возможным установленным уровнем является 0о С, после каждого последующего нажатия кнопки «4"(+) температура на дисплее увеличивается на 1о, соответственно после каждого нажатия кнопки «5"(-) температура уменьшается на 1 и как только достигает 0, приращение останавливается.

Так как предусмотрен счетчик времени необходимо установить время, совпадающее с действующим. При введении времени сначала высвечиваются минуты, начиная с 1мин., затем, при нажатии на кнопку «6» параметр увеличивается на 1мин., как только параметр становится равен 60с, то время автоматически переводится в часы и, при нажатии на кнопку «7» время увеличивается на 1 час, после того как параметр становится равен 24ч., он переводится в 0, после этого отсчёт начинается заново.

Вначале программы находится блок объявления переменных. В этом блоке регистрам и специальным битам системных регистров присваиваются символьные значения для более удобного обращения к ним. Также описываются и инициализируются вспомогательные управляющие флаги и переменные.

Затем идёт блок инициализации программы. В этом блоке осуществляется первоначальная настройка микроконтроллера.

После сброса происходит инициализация контроллера. Назначается предделитель таймера1. При этом таймер1 устанавливается в TH1=0xFD. Эта константа посчитана для режима SCON=0×50 при частоте кварца 11 000,0952 МГц. Этот предделитель даёт скорость на последовательном порту близкую к стандартной скорости 9600. Также для таймера1 устанавливается второй режим работы, обеспечивающий автоматическую нагрузку предделителя из TH вTL. Таким образом, решается вопрос автоматического задания частоты.

Таймер0 устанавливается в первый режим 16-битного счётчика и в дальнейшем будет использоваться для подсчёта времени. Таймер0 использует обработчик прерывания1 и для его разрешения необходимо установить флаг ET0 в единичное состояние (ET0=1). Для запуска таймера0 TR0 устанавливаем в единицу (TR0=1), одновременно запускаем и таймер1 (TR1=1).

Для обработки прерываний от клавиатуры устанавливаем флаг EX1 в единичное состояние (ЕХ1=1) и разрешаем все прерывания флагом ЕА (ЕА=1).

Для обработки прерываний от последовательного порта устанавливаем ES в единицу (ES=1).

Затем устанавливаем порт Р1 в нулевое состояние (Р1=0, т. е. всё выключено по умолчанию).

Флаг включения onoff устанавливаем в нулевое состояние (flagonoff=0, т. е. он выключен).

Идёт инициализация переменных часов, минут, секунд. Шаг приёма в нулевом состоянии (step=0), команда в нулевом состоянии (komanda=0). Также сбрасываются флаги onoff и flag (flagonoff=0, flag=0).

Устанавливаем порты Р3.2 и Р3.3 в единицу на ввод, как только эти линии будут отпущены в ноль, это сигнализирует о нажатии клавиши.

Далее программа переходит в режим бесконечного цикла, что позволяет выполнить обработку большинства событий в независимом режиме через обработку прерываний.

Рассмотрим обработчики прерываний:

1)Обработчик прерывания клавиатуры interrupt2 (обслуживает внешнее прерывание int1, возникает, когда int1переходит из 1 в о). В данном обработчике с порта Р3. 4, Р3. 5, Р3.7 считывается код клавиши и выполняется его преобразование. Таким образом, определяется, какая клавиша нажата и соответственно, какое действие стоит предпринять, для того чтобы выполнить установку заданных параметров. В обработчике прерываний проверяем, если предыдущее состояние (предыдущая нажатая клавиша) не равно текущему (текущей клавише), то мы обслуживаем момент нажатия. При нажатии нулевой клавиши (клавши включения/выключения) изменяется состояние флага onoff, при нажатии первой клавиши система переходит в ночной режим (минимальная скорость подачи воздуха для наименьшего возникновения шума). Вторая и третья клавиши для регулировки скорости подачи воздуха (+/- соответственно), четвёртая и пятая клавиши для регулировки температуры (+/- соответственно), шестая и седьмая клавиши для регулировки таймера (+/- соответственно). Проверяем соответствующие условия.

2)Обработчик прерывания таймера0 interrupt1. В данном обработчике мы вначале производим перезагрузку таймера/счётчика. Предделитель, загружая константу d8, ef соответственно в старшую и младшую часть TH, TL (TH0=0xd8, TL0=0xef). Что обеспечивает частоту переполнений100 раз в секунду.

Запускается вывод информации на индикатор. При этом переменная flag будет указывать, что будет выводиться на семисегментные индикаторы. Температура для вывода рассчитывается делением на 10 (десятки) или получением остатка от деления на 10 единицы градусов.

Таким образом, в каждом такте обработчика прерывания выводим ранее заполненный массив отображаемых данных, тактируя сигналом l, переводя его в 0, потом в 1.

Далее идёт подсчёт времени. Он ведётся переменной sec100 (она отсчитывает сотые доли секунд), инкрементируя её в каждом прерывании таймера, мы получаем при sec100=1 отсчёт первой секунды. Здесь же мы инкрементируем переменную секунды и проверяем, не равна ли она 60, если да, то обнуляем её, а увеличиваем минуты. Аналогично проверяются и минуты. Также контролируются и часы, но до 24.

Процедура обмена с термометром. В первом такте выполняется сброс линии связи с датчиком температуры в 0 (Р3. 2=0), и удерживается линия связи в нулевом состоянии до следующего переполнения таймера. В следующем такте линия переводится в единичное состояние (Р3. 2=1) и выдерживается пауза в 45 мкс. Затем проверяем линию, что она находится в нулевом состоянии. Это говорит о том, что термометр ответил. Если термометр ответил, выдерживаем паузу в 250 мкс (50 раз повторяя цикл for) и проверяем, что линия сохранила своё состояние в 1 (не закорочена). Это говорит о том, что датчики готовы к обмену.

Далее передаётся команда 0хСС согласно стандарту шины IWare. После чего посылается команда 0×44, запуская конвертирование (измерение температуры цифровым датчиком). Контролируя переменную sec100, когда она равна 77 (т. е. прошло 750 мкс, нужных для измерения температуры), мы выполняем повтор инициализации сбросом и контролем линии и передаём команду 0хb8 (считать данные о температуре). Передав перед этим команду 0хbe и номер конвертированного датчика. Такое действие выполняется 3 раза, считывая температуру с трёх датчиков. Далее принимаем 2 байта: 1й — байт знака температуры, 2й — непосредственно измеренная температура. Таким образом, получаем требуемые значения с температурных датчиков. И, в зависимости от того, меньше ли установленная температура по сравнению с измеренной, включается или выключается тэн.

После инициализации программы следует основной цикл программы. При этом осуществляется проверка управляющих флагов и на основе этой проверки вызываются соответствующие процедуры.

Процедура обработки прерываний осуществляет проверку источника прерывания (таймер или клавиатура), осуществляет контроль состояния датчиков и устанавливает соответствующие флаги управления, ежесекундно инкрементирует текущее время, следит за состоянием клавиатуры

3.3 Описание используемых интерфейсов

Интерфейс IWARE

Инициализация производится в следующей последовательности:

1. Формируется импульс сброса не менее 480мкс

2. Далее линия отпускается и через некоторое время не более 60мкс она закорачивается самим датчиком это как сигнал готовности к обмену.

3. Далее следует выполнить передачу команды и адреса конкретного датчика установленного на шине.

Рис. 2.4 Временная диаграмма инициализации

После того, как мастер обнаружил ответ, он может передать датчику одну из команд. Передача ведётся путём формирования мастером специальных временных интервалов (timeslots). Каждый временной интервал служит для передачи одного бита. Первым передаётся младший бит. Интервал начинается импульсом низкого уровня, длительность которого лежит в пределах 1 — 15 мкс. Поскольку переход из единицы в ноль менее чувствителен к ёмкости шины (он формируется открытым транзистором, в то время как переход из ноля в единицу формируется подтягивающим резистором), именно этот переход используют 1-проводные устройства для синхронизации с мастером. В подчиненном устройстве запускается схема временной задержки, которая определяет момент считывания данных. Номинальное значение задержки равно 30 мкс, однако, оно может колебаться в пределах 15 — 60 мкс. За импульсом низкого уровня следует передаваемый бит. Он должен удерживаться мастером на шине в течение 60 — 120 мкс от начала интервала. Временной интервал завершается переводом шины в состояние высокого уровня на время не менее 1 мкс. Длительность интервала зависит от собственной емкости линии определяемой длинной. Так как в моем устройстве датчики находятся на большом расстоянии от контроллера, то рекомендуется не мене 15мкс.

Рис 2.5 Временная диаграмма передачи одного бита

Первой командой, которую должен передать мастер для DS18B20 после инициализации, является одна из команд реализуемых устройством функций.

При приеме данных от подчиненного устройства временные интервалы для принимаемых битов тоже формирует мастер. Интервал начинается импульсом низкого уровня длительностью 15 мкс. Затем контроллер отпускает шину и если через 30мкс он считывает 0, то этот бит удерживает термометр, иначе считывается 1. Таким способом, последовательно тактируя каждый бит, контроллер считывает все требуемые ему данные. Прием байта начинается с младшего бита.

Рассмотрим особенности протокола обмена. Вначалепосле проведения процедуры инициализации передается команда на выполнение определенных функций. Так как на линии подключено три термометра, то можно выполнить запуск измерения температуры сразу для всех термометров и чтобы исключить обмен номерами передаем команду пропустить передачу номера 0xCC. Далее посылаем команду Convert T — 0×44. Это сразу в трех микросхемах термометров запускает измерение и преобразование в цифровой вид температуры. Далее необходимо сформировать задержку от 500 до 750мкс (зависит от конкретного типа микросхемы, поэтому выбираем наибольший интервал). Далее процедура сброса повторяется и теперь для выборки измеренной температуры необходимо передать команду 0xCD после чего передается номер конкретного термометра. а далее посылаем команду ReadScratchpad — BEh. Первый байт содержит знак, если температура «+», то он заполнен 0-ми, если «-», то 11 111 111-ми. Если температура отрицательна, то значение температуры передается в инверсном дополнительном коде, что требует преобразования температуры.

ИнтерфейсI2C

Данный интерфейс используется для сохранения результатов на ФПЗУ, т.к. он не реализован аппаратно, его надо реализовать программно. Для этого используется процедура I2C, имеющая в качестве атрибутов младшую и старшую часть начального адреса считанного блока. Процедура выполняет все шаги для выполнения обмена по данному интерфейсу:

1) Старт бита

2) Посылка префикс адреса

Сигналы START и STOP

Переход линии SDA из ВЫСОКОГО состояния в НИЗКОЕ, в то время как SCL находится в ВЫСОКОМ состоянии означает START. Переход линии SDA из НИЗКОГО состояния в ВЫСОКОЕ при SCL в ВЫСОКОМ состоянии означает STOP. Сигналы СТАРТ и СТОП всегда вырабатываются ведущим. Считается, что шина занята после сигнала СТАРТ. Шина считается освободившейся через определенное время после сигнала СТОП.

Определение сигналов СТАРТ и СТОП устройствами, подключенными к шине достаточно легко, если в них встроены необходимые цепи. Однако микроконтроллеры без таковых цепей должны осуществлять считывание значения линии SDA как минимум дважды за период синхронизации для того, чтобы определить переход состояния.

Рис 2.6 Сигналы START и STOP

Формат байта

Каждый байт, передаваемый по линии SDA, должен состоять из 8 бит. Количество байт, передаваемых за один сеанс связи неограниченно. Каждый байт должен оканчиваться битом подтверждения. Данные передаются, начиная с наиболее значащего бита (Рис. 2. 7). Если приёмник не может принять еще один целый байт, пока он не выполнит какую-либо другую функцию (например, обслужит внутреннее прерывание), он может удерживать линию SCL в НИЗКОМ состоянии, переводя передатчик в состояние ожидания. Пересылка данных продолжается, когда приёмник будет готов к следующему байту и отпустит линию SCL.

В некоторых случаях, необходимо использовать другой формат данных (например, CBUS). Посылка, которая передается с таким адресом, может быть закончена выдачей сигнала СТОП, даже если это происходит во время передачи байта. В этом случае подтверждение не генерируется.

Рис 2.7 Пересылка данных по шине I2C

1. Сигнал СТАРТ

2. Старший разряд байта

3. Сигнал подтверждения от приёмника

4. Прием байта завершен. Прерывание внутри приемника

5. Синхролиния удерживается в низком состоянии, пока обслуживается прерывание

6. Сигнал подтверждения от приемника

7. Сигнал СТОП

Подтверждение

Подтверждение при передаче данных обязательно. Соответствующий испульс синхронизации генерируется ведущим. Передатчик отпускает (ВЫСОКОЕ) линию SDA в течение синхроимпульса подтверждения. Приёмник должен удерживать линию SDA в течение ВЫСОКОГО состояния синхроимпульса подтверждения в стабильно НИЗКОМ состоянии (рис. 8). Конечно, время установки и удержания также должны быть приняты во внимание (Электрические и временные параметры).

Обычно, приёмник, который был адресован, обязан генерировать подтверждение после каждого принятого байта, исключая те случаи, когда посылка начинается с адреса CBUS (см. Совместимость с CBUS).

В том случае, когда ведомый-приёмник не может подтвердить свой адрес (например, когда он выполняет в данный момент какие-либо функции реального времени), линия данных должна быть оставлена в ВЫСОКОМ состоянии. После этого ведущий может выдать сигнал СТОП для прерывания пересылки данных.

Если ведомый-приёмник подтвердил свой адрес, но через некоторое время больше не может принимать данные, ведущий также должен прервать пересылку. Для этого ведомый не подтверждает следующий байт, оставляет линию данных в ВЫСОКОМ состоянии и ведущий генерирует сигнал СТОП.

Если в пересылке участвует ведущий-приёмник, то он должен сообщить об окончании передачи ведомому-передатчику путем не подтверждения последнего байта. Ведомый-передатчик должен освободить линию данных для того, чтобы позволить ведущему выдать сигнал СТОП или повторить сигнал СТАРТ.

Рис 2.8 Подтверждение

1. Данные, переданные передатчиком

2. Данные, переданные приёмником

3. SCL от ведущего

4. Сигнал СТАРТ

5. Синхроимпульс подтверждения

Заключение

Поставленная задача была реализована, разработана функциональная схема. После анализа функциональной схемы рассмотрение множества разработок и отдельных электронных узлов была разработана схема контроллера управления системой отопления, которая реализует поставленную задачу на аппаратном уровне. При схемотехнической реализации блока был произведен выбор наиболее оптимального контроллера для решения задачи.

Вторым этапом реализации проекта стало написание программной части, которая обеспечивает управление оборудованием по заданному алгоритму. Для реализации функций обмена с температурными датчиками был изучен протокол IWare, который и был далее реализован в виде части программного кода. Для реализации функций обмена с FLASH ПЗУ был изучен протокол I2C, который также был реализован в виде части программного кода. Также было выполнено описание программы и представлен её код.

Результат проекта представлен в виде отчета имеющего два приложения: листинг программы и принципиальная схема.

Приложение 1

Схема устройства

Приложение 2

Листинг программы

#include< reg51. h>

#include< stdlib. h>

sbit iware=P32;

sbit RS=P25; /*data komand for LCD*/

sbit E=P26; /*synhr LCD*/

sbit SCL=P34; /*ey 4−8*/

sbit SDA=P35;

sbit power1=P34;

sbit power2=P35;

sbit power3=P36;

sbit power4=P37;

sbit kotel=P27;

sbit strob=P23;

//номера датчиков

unsigned char const dat1[]={0xDD, 0×05, 0xEC, 0×67, 0x3D, 0×34, 0xb9, 0×11 };

unsigned char const dat2[]={0xDD, 0×05, 0xEC, 0xAD, 0×35, 0xb9, 0xF9, 0×32 };

unsigned char const dat3[]={0xDD, 0×05, 0×45, 0×20, 0×99, 0xb5, 0xF9, 0×42 };

unsigned char const dat4[]={0×55, 0×00, 0×05, 0×45, 0×20, 0×99, 0x3f, 0×02 };

unsigned char const dat5[]={0xDD, 0×05, 0xEC, 0×67, 0x3D, 0×34, 0xb9, 0×11 };

unsigned char const dat6[]={0xDD, 0×05, 0xEC, 0xAD, 0×35, 0xb9, 0xF9, 0×32 };

unsigned char const dat7[]={0xDD, 0×05, 0×45, 0×20, 0×99, 0xb5, 0xF9, 0×42 };

unsigned char const dat8[]={0×55, 0×00, 0×05, 0×45, 0×20, 0×99, 0x3f, 0×02 };

unsigned char const dat9[]={0xDD, 0×05, 0×45, 0×20, 0×99, 0xb5, 0xF9, 0×42 };

unsigned char const str1[]={0×31, 0×32, 0x3A, 0×30, 0×30, 0x3A, 0×30, 0×30, 0×40, 0x4B, 0x6 °F, 0×70, 0xB8, 0xE0, 0x6 °F, 0×70, 0x2D, 0x }; //умолчание

unsigned char const str2[]={0xDD, 0×05, 0×45, 0×20, 0×99, 0xb5, 0xF9, 0×42 }; //умолчание

unsigned char const str3[]={0×50, 0×65, 0xB6, 0xB8, 0xBC}; //режим

unsigned char const str4[]={0×41, 0xB3, 0xBF, 0x6 °F, 0xBC, 0×61, 0xBF, 0xB8, 0xC0, 0×65, 0×63, 0xBA, 0xB8, B9 }; //автоматический

unsigned char const str5[]={0xA8, 0x6 °F, 0xBB, 0xC4, 0xB7, 0x6 °F, 0xB3, 0×61, 0xBF, 0×65, 0xBB, 0xC4, 0×63, 0xBA, 0xB9, 0xB8 }; //пользовательский

unsigned char const str6[]={0xС5, 0xBA, 0x6 °F, 0xBD, 0x6 °F, 0xBC, 0xB8, 0xC0, 0xBD, 0xC3, 0xB9 }; //экономичный

unsigned char const str7[]={0×41, 0xBD, 0xBF, 0xB8, 0xB7, 0×61, 0xBC, 0x6 °F, 0×70, 0x6 °F, 0xB7, 0xBA, 0×61 }; //антизаморозка

unsigned char seksot, sekt, min, hour; //shethiki vremeni for kontrol time work unsigned char key, dop_key1,dop_key2;

unsigned char i, j, k, pp, n, s, dlo, regim, adrh, adrl, nz;

unsigned int tis, dd;

unsigned char iw;

bit fon_off, ff, rwi2c;

unsigned char const lcdini[]={8,0x3C, 4,0x0D, 1};

unsigned char lcd1[]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 };

unsigned char lcd2[]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 };

unsigned char dat[]= {0,0,0,0,0,0,0,0,0}; //for iware T s datch

unsigned char chas[]= {0,0,0,0,0,0,0,0,0};

unsigned char min[]= {0,0,0,0,0,0,0,0,0};

unsigned char t[]= {45,25,45,25,45,25,45,25,55};

unsigned char const te[]= {35,20,35,20,35,20,35,18,45};

unsigned char t[]= {45,25,45,25,45,25,45,25,45};

void delay (void char t) {for (dd=0; dd<t;dd++)} //timeuot na 5*t mks

void resetiw (void)

{fok=0;

if (iware) //start proc

{ iware=0; delay (100); //timeout 500mks

iware=1; delay (14); //timeout 70 mks

if (!iware)

{delay (86); //500mks

if (iware) {fok=1; }

} } }

void readiw (void) //чтение IWare

{unsigned char pp, nn;

pp=0; for (nn=0; nn<8;nn++)

{ iware=0; delay (3); //start obmena bit

iware=1; delay (6); //+30мкс для чтения

CY=iware; pp=pp>1;

delay (14); iware=1;

delay (3); }iw=pp; //сохранение результата

}

void writeiw (void char t) //read IWare

{unsigned char pp, nn;

pp=t; for (nn=0;nn<8;nn++)

{ iware=0; delay (3);

pp=pp> 1; iware=CY;

delay (20); iware=1;

delay (3);} }

void uart (void) interrupt 5 using 2

{ if (RI)

{ if (SBUF==0xff){ fon_off=1; }

if (SBUF==0){fon_off=0;} }

if (TI) {TI=0;

if (++step< 12)

SBUF=dat[step];

}

}

void readkey (void) interrupt 3 //INT1

{key=P2& 0×07;

if (key==0) onsystem=~onsystem;

}

void I2C (unsigned char adrh, adrl)

{

sda=1; scl=1; sda=0; sda=0; scl=0; scl=0; //старт обмена

pp=0xa0; //indeks flach pzu

if (rwi2c) pp=pp+1; //set reginm read

for (i=0; i<8;i++)

{ scl=0; pp=pp>>1; sda=CY; scl=1;scl=1;scl=1;}

sda=1;

while (sda) // read ACK

{ scl=0; scl=0;scl=0;scl=1;scl=1;scl=1;}

pp=adrh;

for (i=0; i<8;i++)

{ scl=0; pp=pp>>1; sda=CY; scl=1;scl=1;scl=1;}

sda=1;

while (sda) //read ACK

{ scl=0; scl=0;scl=0;scl=1;scl=1;scl=1;}

pp=adrl; adresl=adresl+8; if (CY) adresh++; //avtoinkrement adresa

for (i=0; i<8;i++)

{ scl=0; pp=pp>>1; sda=CY; scl=1;scl=1;scl=1;}

sda=1;

while (sda) // read ACK

{ scl=0; scl=0;scl=0;scl=1;scl=1;scl=1;}

if (rwi2c)

{

for (j=0; j<8;j++) //regim read

{ pp=0;

for (i=0; i<8;i++)

{ scl=0; scl=0;scl=0;scl=1;CY=sda;pp=pp>>1;scl=1;}

while (sda) //write ACK

{ scl=0; sda=0;scl=0;scl=1;scl=1;scl=1;scl=0;}

} }else {

for (j=0; j<8;j++)

{ pp=dat[j];

for (i=0; i<8;i++)

{ scl=0; pp=pp>>1; sda=CY; scl=1;scl=1;scl=1;}

sda=1;

while (sda) //read ACK

{ scl=0; scl=0;scl=0;scl=1;scl=1;scl=1;}

} }}

void timer0 (void) interrupt 1 using 2 /*Function interrupt timer0*/

{

TH0=0xFC; TL0=0×65; //perepolnen 1000

if (++tis==1000)

{tis=0; if (++sek==60)

{sek=0;

{if (min< min[1])&&(chas<chas[1])

{if (t[1]> dat[1])power1=1 else power1=0; //proverka vozduh

if (t[2]< dat[2])power1=0;} //teplonositel

{if (min< min[3])&&(chas<chas[3])

{if (t[3]> dat[3])power2=1 else power2=0; //proverka vozduh

if (t[4]< dat[4])power2=0;} //teplonositel

if (min< min[1])&&(chas<chas[1])

{if (t[1]> dat[1])power1=1 else power1=0; //proverka vozduh

if (t[2]< dat[2])power1=0;} //teplonositel

if (min< min[1])&&(chas<chas[1])

{if (t[1]< dat[1])power1=1 else power1=0; //proverka vozduh

if (t[2]> dat[2])power1=0;} //teplonositel

if (min< min[1])&&(chas<chas[1])

{if ((t[9]-10)> dat[9])kotel=1 else kotel=0; //proverka vozduh

if ((t[9]+5)< dat[9])kotel=0;} //teplonositel

for (j=0; j<4;j++)

{if (min==min[j*2+1])& &(chas==chas[j*2+1])

{rwi2c=1;

i2c (adresh, adrsl); for (j=0;j<9;j++)chas[j]=dat[j];

i2c (adresh, adrsl); for (j=0;j<9;j++)min[j]=dat[j];

i2c (adresh, adrsl); for (j=0;j<9;j++)t[j]=dat[j];

}

}

if (++min==60)

{min=0; if (++hour==24){hour=0;

}}}

lcd1[0]=hour/10+0×30; lcd1[1]=hour%10+0×30; lcd1[2]=0x2d; //вывод времени

lcd1[3]=min/10+0×30; lcd1[4]=min%10+0×30; lcd1[5]=0x2d;

lcd1[6]=sek/10+0×30; lcd1[7]=sec%10+0×30;

lcd1[10]=t[1]/10+0×30; lcd1[11]=t[1]%10+0×30; lcd1[10]=0x2d;

if (--dlo< 1)&&(fon_off)

{for (j=9; j<32;j++) {lcd1[j]=str1[j]; dlo=1;} //восстановление стандартной строки

lcd1[17]=t[1]/10+0×30; lcd1[18]=t[1]%10+0×30;

lcd1[30]=t[3]/10+0×30; lcd1[31]=t[3]%10+0×30;

lcd1[17]=t[5]/10+0×30; lcd1[18]=t[5]%10+0×30;

lcd1[30]=t[7]/10+0×30; lcd1[31]=t[7]%10+0×30;

lcd1[7]=t[9]/10+0×30; lcd1[8]=t[9]%10+0×30;

lcd1[30]=t[3]/10+0×30; lcd1[31]=t[3]%100+0×30;

}

}

if (tis< 5){e=0; rs=0; P0=lcdini[tis];e=1;} // send LCD

else if (tis< 37){e=0; rs=1; P0=lcd1[tis-5];e=1;}

else if (tis< 45){e=0; rs=1; P0=0×20;e=1;}

else if (tis< 77){e=0; rs=1; P0=lcd2[tis-45];e=1;}

// сканирование дополнительной клавиатуры

strob=0; dop_key1=P0;strob=1;

if !(dop_key1==dop_key2)

{ if (dop_key1==0x7F)t[0]++;

if (dop_key1==0xAF)t[0]--;

if (dop_key1==0xDF)t[2]++;

if (dop_key1==0xEF)t[2]--;

if (dop_key1==0xF7)t[4]++;

if (dop_key1==0xFA)t[4]--;

if (dop_key1==0xFD)t[6]++;

if (dop_key1==0xFE)t[6]--;

dop_key2==dop_key1;

}} /*end Function interrupt timer0*/

void ini (void)

{SCON=0×50; //obmen 8bit takt for timer1

TH1=0xDC //for 11. 0592MGc COM-9600

TH0=0×00 /set temer 20 000 Gc*/

TMOD=0×22; /*2 regim reload timer*/

ET0=1; /*enable interrupt timer0*/

PT0=0; /*priority = 0*/

EA=1; /*enable interrupt*/

ES=1; //последовательный порт

EX1=1; //внешнее прерывание (считывается клавиатура)

TR0=1; /*start timet0*/

TR1=1; }

void main (void)

{ init ();

while (1)

{

if (fraboti){

for (j=0; j<32;j++)

{lcd1[j]=str1[j];

lcd2[j]=str2[j];

}

if (key=2)

{for (j=9; j<14;j++)

{lcd1[j]=str3[j]; }

regim++; }

if (regim==5) regim=1;

lcd1[15]=regim+0×30;

if (regim==1)

{for (j=17; j<31;j++) {lcd1[j]=str4[j];} t[0]=20; t[1]=45;t[2]=22;t[3]=45;t[4]=22;t[5]=45;t[6]=20;t[7]=45;t[8]=65;}

if (regim==2)

{for (j=17; j<33;j++) {lcd1[j]=str5[j];} }

if (regim==3)

{for (j=17; j<28;j++) {lcd1[j]=str6[j]; }t[0]=16;t[1]=35;t[2]=18;t[3]=35;t[4]=22;t[5]=45;t[6]=20;t[7]=45;t[8]=65;}

if (regim==4)

{for (j=17; j<30;j++) {lcd1[j]=str7[j]; }t[0]=1;t[1]=5;t[2]=2;t[3]=5;t[4]=2;t[5]=5;t[6]=2;t[7]=5;t[8]=15;}

if (key=3)

{for (j=9; j<14;j++)

{lcd1[j]=str8[j]; }

kanal++;

if (kanal==9) kanal=1;

lcd1[15]=kanal+0×30;

if (kanal==1) {for (j=17; j<24;j++)

{lcd1[j]=str9[j]; }

lcd1[25]=0×54; lcd1[27]=t[kanal]/10+0×30;lcd1[28]=t[kanal]%10+0×30;}

if (kanal==2) for (j=17; j<24;j++) {lcd1[j]=str10[j]; }

if (kanal==3) for (j=17; j<22;j++) {lcd1[j]=str11[j]; }

if (kanal==4) for (j=17; j<20;j++) {lcd1[j]=str12[j]; }

if (kanal==5) for (j=17; j<23;j++) {lcd1[j]=str13[j]; }

if (kanal==6) for (j=17; j<24;j++) {lcd1[j]=str10[j]; }

if (kanal==7) for (j=17; j<22;j++) {lcd1[j]=str11[j]; }

if (kanal==8) for (j=17; j<20;j++) {lcd1[j]=str12[j]; }

if (kanal==9) for (j=17; j<23;j++) {lcd1[j]=str13[j]; }

}

if (key=4) { //сохранение настроек

rwi2c=1; adresh=(24*nz)>>8;adresl=(24*nz);if (++nz=10)nz=0;

for (j=0; j<9;j++)dat[j]=chas[j];i2c (adresh, adrsl);

for (j=0; j<9;j++)dat[j]=min[j];i2c (adresh, adrsl);

for (j=0; j<9;j++)dat[j]=t[j]};i2c (adresh, adrsl);

if (key=5) {t[kanal]++; lcd1[30]=t[kanal]/10+0×30;lcd1[31]=t[kanal]%10+0×30;}

if (key=6) {t[kanal]--; lcd1[30]=t[kanal]/10+0×30;lcd1[31]=t[kanal]%10+0×30;}

if (key=7) {if (++chas[n]==24)chas[n]=0; lcd1[30]=chas[n]/10+0×30;lcd1[31]=chas[n]%10+0×30;}

if (key=8) {if (++min[n]=60) min[n]=0; lcd1[31]=min[n]/10+0×30;lcd[31]=min[n]%10+0×30;}

}

resetiw;

if (fok)

{writeiw (0xCC); //пропустить передачу кода

writeiw (0×44); //запустить оцифровку

while (sotsek< 75); //переполнение таймера

resetiw ();

writeiw (0×55); //работать по адресу

for (j=0; j<8;j++)

{

writeiw (dat1[j]);

}

writeiw (0xb8); //считываем температуру

readiw ();

if (iw==0xff){ readiw (); t[1]=0×80+(~iw+1)> >1;} //если температура отрицательная

else {readiw (); t[1]=iw> >1} //если температура положительная

dat[j]=iw;

}

writeiw (dat2[j]);

}

writeiw (0xb8); //считываем температуру

readiw ();

if (iw==0xff){ readiw (); t[1]=0×80+(~iw+1)> >1;} //если температура отрицательная

else {readiw (); t[1]=iw> >1} //если температура положительная

dat[j]=iw;

}

ПоказатьСвернуть
Заполнить форму текущей работой