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

  • Вид работы:
    Курсовая работа (т)
  • Предмет:
    Информационное обеспечение, программирование
  • Язык:
    Русский
    ,
    Формат файла:
    MS Word
    1,59 Мб
  • Опубликовано:
    2012-10-25
Вы можете узнать стоимость помощи в написании студенческой работы.
Помощь в написании работы, которую точно примут!

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

Введение

Микроконтроллер - микросхема <#"577549.files/image001.gif">

Рис. 1 - Функциональная схема котла:

. Панель управления; 2. Съемная панель отверстия для чистки; 3 Фланец дымохода; 4. Коллектор продуктов сгорания с термостатом дымовых газов; 5. SKKT (система контроля тяги дымохода); 6. Выход ОВ; 7. Подача газа; . Чугунный теплообменник; 9. Вход ОВ; 10. Камера сгорания; 11. Подача вторичного воздуха; 12. Атмосферная горелка; 13. "Вечное пламя"; 14. Подача первичного воздуха; 15. Форсунки горелки; 16. Катушка газовой арматуры; 17. Управление газовой арматурой; 18. Пьезоразжигатель; 19. Кожух котла; 20. Место для датчиков термометра, аварийного и рабочего термостатов

Структурная схема системы управления такого котла будет иметь вид:

Рис. 2 - Структурная схема

 

На схеме:

–   Микроконтроллер - центральное процессорное устройство.

–       Клавиатура - устройство ввода информации.

–       LCD - жидкокристаллический дисплей (устройство вывода информации).

–       Кварц - схема кварцевого тактового генератора.

–       Питание МК - питания микроконтроллера.

–       Питание АЦП - питания встроенного аналого-цифрового преобразователя контроллера.

–       Программатор - устройство для программирования микроконтроллера.

–       Датчик температуры - измеряет температуру жидкости, его основу составляет терморезистор.

–       Концевой датчик - указывает крайнее положение форсунки горелки.

–       Схема усиления управляющего сигнала - схема, выполненная на дискретных компонентах, работающая в ключевом режиме.

–       Драйвера управления асинхронными двигателями - электрическая схема подключения двигателя, основой которой является биполярные транзисторы и симисторы.

–       Драйвера управления шаговым двигателем - электрическая схема подключения двигателя, основой которой является биполярные транзисторы.

2. Выбор элементной базы

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

.1 Концевой датчик

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

Рис. 3 - Концевой датчик L5K13PUM211

Характеристики датчика.

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

·        Степень защиты: IP65.

·        Номинальное напряжение: 240 В, 50 Гц.

·        Номинальный ток: 3 А.

·        Контактная группа: 1 замыкающийся + 1 размыкающийся контакты.

·        Материал корпуса: пластик.

·        Тип привода: кнопочный толкатель.

·        Материал толкателя: металл.

·        Количество кабельных вводов: 1.

·        Габаритные размеры: 94,5×30,0×30,5 мм.

·        Изготовитель: «EMAS», Турция.

.2 Датчик температуры

Датчик ОВЕН дТС3014-Pt1000.B2.50/2 предназначен для измерения температуры воды в контурах нагрева (в защитной гильзе) и измерения температуры воздуха.

Датчик имеет длину погружной части (гильзы) 50 мм и соединительный кабель длиной 2 м.

Чувствительный элемент - Pt1000.

Рис. 3 - Габаритный чертеж термопреобразователя ОВЕН дТС3014

.3 Усилитель сигнала датчика температуры

- это совершенный измерительный усилитель и компенсатор холодного спая термопары на монолитной микросхеме. Он сравнивает эталон точки плавления льда с предварительно калиброванным усилителем, чтобы получить выходной сигнал высокого уровня (10 мВ/°С) непосредственно из сигнала термопары. Расположение ножек микросхемы позволяет использовать ее как линейный усилитель-компенсатор или как контроллер с переключаемым выходным сигналом, используя встроенный или удаленный контроль установки. Может использоваться непосредственно для усиления собственного компенсированного напряжения, таким образом превращая его в автономный преобразователь в градусы Цельсия с выходом низкого сопротивления.включает в себя сигнализацию разрыва термопары, которая срабатывает, если на одном или обоих концах термопары разрывается цепь. Выход сигнализации выполнен в универсальной форме, которая включает в себя управление TTL.может питаться напряжением одной полярности (+5В) и напряжением обоих полярностей при необходимости измерения температуры ниже 0°С. Чтобы минимизировать саморазогрев, разгруженный AD594 обычно потребляет питание 160 мкА, но он также может потреблять ±5 мА в нагруженном состоянии.

Рисунок 4 - Подключение термопары к AD594

содержит кондиционер термопары. При использовании одного питания +5 В изображенного на схеме (рис.4) можно получить точное напряжение на выходе.

Можно использовать любое удобное напряжение от +5 В до +30 В, при этом возникают ошибки, связанные с самонагревом, более низкое значение которой соответствует более низкому уровню напряжения. В случае одиночного питания +5 В подключается на ножку 11, а «земля» - на ножку 7 (для обеспечения питания) и на ножку 4 (общий сигнал). Термопара подключается к ножкам 1 и 14, либо непосредственно в месте измерения, либо через проводники, соответствующие типу термопары. В случае, когда сигнализация не используется, ножку 13 необходимо подключить на «землю». Калиброванный выходной сигнал с ножки 8 вместе с выходом ножки 9 позволяет получить номинальную температурную характеристику в 10 В/°С для передачи.действует как два дифференциальных усилителя. Выходные сигналы суммируются и используются для управления повышающим усилителем, как показано на рисунке 5.

Рисунок 5 - AD594

При нормальном режиме работы выходы главного усилителя, на ножке 9, подключены к цепи обратной связи на ножке 8. Сигналы термопары, подключенные к буферу выходного уровня на ножках 1 и 14, усиливаются в блоке G дифференциального усилителя и дальше усиливаются в блоке А главного усилителя. Выход главного усилителя подключен ко второму уровню дифференцирования путем обратной связи. На этом уровне сигнал обратной связи усиливается и тоже подается на вход главного усилителя через суммирующую цепь. Из-за инверсии усилитель в обратной цепи приводит к снижению дифференциального сигнала до маленького значения. Два дифференциальных усилителя G сделаны таким образом, чтобы соответствовать друг другу и иметь одинаковый коэффициент усиления. В результате сигнал обратной связи, который подается на правый дифференциальный усилитель будет в точности соответствовать входному сигналу термопары, когда дифференциальный сигнал был снижен до нуля. Цепь обратной связи настроена таким образом, что эффективное усиление на выходе, на ножках 8 и 9 соответствует напряжению в 10 мВ на °С возбуждения термопары. В добавление к сигналу обратной связи на правый дифференциальный усилитель подается напряжение компенсации холодного спая. Компенсацией является дифференциальное напряжение, пропорциональное температуре чипа по Цельсию. Этот сигнал влияет на дифференциальный вход таким образом, что выходной сигнал усилителя должен регулировать возвратным сигналом входа, который равен напряжению термопары. Компенсационный сигнал подается через встроенные резисторы таким образом, что влияние на главный выход тоже равно 10 мВ/°С. В результате компенсационное напряжение добавляется к эффективному напряжению термопары как сигнал, прямо пропорциональный разнице между 0°С и температурой чипа. Если температура холодного спая термопары соответствует температуре AD594, выходной сигнал чипа будет соответствовать читаемому сигналу, который получен путем усиления сигнала термопары погруженной в ледяную ванну. AD594 также содержит в себе детектор разрыва цепи входа, который открывает транзистор сигнализации. Этот транзистор фактически является токоограниченным выходным буфером, но в пределе может быть использован как переключающий транзистор для операций включения и выключения внешней сигнализации. Цепь компенсации «ледяной» точки обладает напряжением, позволяющим получить как положительные, так и отрицательные температурные коэффициенты. Эти напряжения могут использоваться вместе с внешними резисторами для изменения точки плавления льда и калибровки AD594. Резистор обратной связи подключен таким образом, что значение его сопротивления может быть увеличено последовательным подключением резистора, или уменьшено подключением внешнего резистора на ножках 5 и 9.

2.4 Клапан регулирующий шаровой с электроприводом

Область применения. Регулирующий шаровой клапан устанавливается на трубопроводах и дает возможность полностью или частично перекрывать поток рабочей среды. Используется для регулирования расхода рабочей среды.

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

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

Материалы. Корпус: нержавеющая сталь. Уплотнение: PTFE.

Рабочая температура: 0°С…+185°С.

Рабочее давление: 0,0...1,6 MПa.

Присоединение: Резьбовое ½" ¾" 1" 1¼" 1½" 2" ДУ, мм: 15 20 25 32 40 50

Питание: ~220В, выводной провод 1 м.

Время открытия/закрытия: 5...6 (10...15) с или 30 с.

Применение: Упаковочная промышленность, пивоварение, пищевая промышленность, химические системы и смесительное оборудование, линии водоподготовки.

Рис. 6 - Клапан регулирующий шаровой LD-15 с электроприводом

Рис. 7 - Схема подключения электропривода

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

.5 Схема подключения асинхронных двигателей клапанов

В схеме используется даже не тиристор, а мощный семистор TC106-10. Этот семистор позволяет коммутировать нагрузку до 10 ампер. Для справки: семистор отличается от тиристора тем, что он работает с обоими полупериодами переменного напряжения, то есть, в открытом состоянии он пропускает как положительную, так и отрицательную полуволны. Для гальванической развязки цепей микроконтроллера и силовых цепей нагрузки используется оптодинистор АОУ103Б. Для того, что бы не создавать лишней нагрузки на выход микроконтроллера для управления светодиодом фотодинистора используется ключ на транзисторе КТ361. Что бы отключить нагрузку от источника питания 220В микроконтроллер должен выставить на своем выходе (в данном случае на выходе PB4 сигнал логической единицы. При этом ключ VT1 закрывается, ток через светодиод фотодинистора не течет, и семистор тоже закрыт. Когда нужно включить нагрузку, микроконтроллер устанавливает на своем выходе логический ноль. Транзистор VT1 открывается, светодиод фотодинистора зажигается и освещает динистор. Динистор начинает открываться в каждом полупериоде напряжения. Через диодный мостик, обозначенный, как VD1 динистор подключен к управляющему электроду семистора VS1. Поэтому в каждом полупериоде семистор тоже открывается и на нагрузку поступает полное напряжение питания. Диодный мостик VD1 необходим потому, что динистр может работать лишь в одном направлении. Он открывается только тогда, когда на его верхнем по схеме выводе плюс а на нижнем минус. В обратном направление динистор не открывается. Если подключить динистор к семистору напрямую, то и семистор тоже сможет пропускать лишь одну из полуволн питающего напряжения. В качестве мостика VD1 можно применить любой маломощный мостик либо составить его из четырех диодов КД522Б. Светодиод HL1 служит просто для индикации включения нагрузки.

2.6 Шаговый двигатель

Для закрытия/открытия форсунки газовой горелки выберем шаговый двигатель FL42STH33-0316A.

Таблица 1 - Основные технические характеристики двигателя

Наименование

Значение

Угловой шаг

1.8°

Погрешность углового шага

±5% (полный шаг, без нагрузки)

Погрешность сопротивления

±10%

Погрешность индуктивности

±20%

Повышение температуры

80°C Max.(рабочий ток, 2 фазы)

Рабочая температура

-20°C ~ +50°C

Сопротивление изоляции

100MΩMin. ,500VDC

Диэлектрическая проницаемость

500VAC for one minute

Радиальное биение вала

0.02Max. (450 g-load)

Осевое биение вала

0.08Max. (450 g-load)

Напряжение питания

12В

Ток

0,31А

Сопротивление

38,5 Ом

Крутящий момент

1,6 Кг*См

Количество выводов

6

Момент инерции

35 г*см2

Вес

0,22 кг

Длина

34 мм


Рис. 9 - Эскиз шагового двигателя

2.7 Схема подключения шагового двигателя

К выходам микроконтроллера подключается драйвер - силовые ключи коммутирующие обмотки шагового двигателя. Драйвер состоит из 4х транзисторов КТ 972.

Рис. 10 - Схема подключения шагового двигателя

Диоды можно использовать любые с допустимым импульсным током 200мА. (BAS21)

.8 Клавиатура

Ввод информации будем производить с матричной 12-клавишной клавиатуры, имеющей 4 линии строк и три линии столбцов.

Рис. 11 - Клавиатура

Все вертикальные линии матрицы подключены через резисторы к источнику питания +5 В.

Устанавливая по очереди на каждой из вертикальных линий уровень напряжения, соответствующий логическому 0, опрашивается состояние горизонтальных линий. Если ни одна клавиша не нажата, уровень напряжения на всех горизонтальных линиях соответствует логической 1 (т.к. все эти линии подключены к источнику питания +5 В через резисторы).

Если оператор нажмет на какую-либо клавишу, то соответствующая вертикальная и горизонтальная линии окажутся замкнутыми. Когда на этой вертикальной линии процессор установит значение логического 0, то уровень напряжения на горизонтальной линии также будет соответствовать логическому 0.

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

.9 LСD - дисплей

Рис.12 - Дисплей

Жидкокристалический модуль MT-10S1 состоит из БИС контроллера управления и ЖК панели. Контроллер управления КБ1013ВГ6, производства ОАО «АНГСТРЕМ», аналогичен HD44780 фирмы HITACHI и KS0066 фирмы SAMSUNG.

Модуль выпускается со светодиодной подсветкой. Внешний вид приведен на рисунке 12. Модуль позволяет отображать 1 строку из 10 символов. Символы отображаются на матрице 5*8 точек между символами имеются интервалы шириной в одну отображаемую точку. Каждому отображаемому на ЖКИ символу соответствует его код в ячейке ОЗУ модуля. Модуль содержит два вида памяти - кодов отображаемых символов и пользовательского знакогенератора, а также логику для управления ЖК панелью.

Модуль позволяет:

• модуль имеет программно-переключаемые две страницы встроенного знакогенератора (языки: русский, украинский, белорусский, казахский и английский).

• работать как по 8-ми, так и по 4-х битной шине данных

• принимать команды с шины данных;

• записывать данные в ОЗУ с шины данных;

• читать данные из ОЗУ на шину данных;

• читать статус состояния на шину данных;

• запоминать до 8-ми изображений символов, заданных пользователем;

• управлять подсветкой.

микроконтроллер архитектура котел датчик

2.10 Газовая горелка

Для подогрева жидкости выберем газовую горелку CRONO 4G-8G 15G-20G

Рис. 13 - Газовая горелка

. Реле давления воздуха; ;2. 6-ти шрырьковая вилка для подключения газового мультиблока; 3. Автомат горения; 4. Кнопка разблокировки горелки со световым сигнализатором блокировки; 5. Крепежный фланец с теплоизоляционной прокладкой; 6. Винт регулировки воздушной заслонки; 7. Держатель головки горелки; 8. Штуцер для присоединения реле давления воздуха; 9. Электродвигатель

Таблица  - Технические характеристики горелки

2.11 Микроконтроллер

Выбор микроконтроллера завис от количества задействованных ножек. Для наших целей выберем микроконтроллер фирмы Atmel AtMega103.

Отличительные особенности:

·        Основан на AVR® RISC архитектуре;

·              AVR® - высокая производительность и RISC архитектура с низким энергопотреблением;

·              120/ 121 мощных инструкций - большинство выполняются за один такт;

·              32 х 8 рабочих регистров общего назначения + регистры управления периферией;

·              Производительность, вплоть до 6 MIPS при 6 МГц;

·              Память данных и энергонезависимая память:

·              64/128 Кбайт Flash- программная память с поддержкой внутрисистемного программирования;

·              ресурс: 1000 циклов запись/ стирание;

·              4 Кбайт встроенной SRAM;

·              2К/4К байт EEPROM с поддержкой внутрисистемного программирования;

·              Ресурс: 100 000 циклов записи/ стирания;

·              Программируемая блокировка для безопасности содержимого Flash и EEPROM;

·              Периферия:

·              Встроенный аналоговый компаратор;

·              Программируемый следящий таймер с встроенным генератором;

·              Программируемый последовательный UART;

·              Ведущий/ ведомый SPI- последовательный интерфейс;

·              Контроллер реального времени (RTC) с выделенным тактовым генератором;

·              Два 8-ми разрядных таймера/ счетчика с отдельным предварительным делителем частоты;

·              Расширенная система с 16-ти разрядным таймером/ счетчиком с отдельным; предварительным делителем частоты режимами сравнения и захвата, а также с 8-ми, 9-ти и 10-ти разрядным ШИМ;

·              Программируемый следящий таймер с встроенным тактовым генератором;

·              8-ми канальный, 10-ти разрядный АЦП;

·              Специализированные функции микроконтроллера:

·              Режимы пониженного энергопотребления:

·              Покоя (Idle), экономичный (Power Save) и отключения (Power Down);

·              Программно- выбираемая частота тактового генератора;

·              Внешние и внутренние источники прерывания;

·              Спецификации:

·              Микромощная, высокоскоростная CMOS технология;

·              Полностью статический режим работы;

·              Потребляемая мощность при 4 МГц, 3 В, 25°С:

·              Активный режим: 5.5 мА;

·              Режим покоя: 1.6 мА;

·              Режим отключения: <1 мкА;

·              Функции I/O и корпуса:

·              32 программируемые линии I/O, 8 выходных линий, 8 входных линий;

·              корпус 64-pin TQFP;

·              Напряжение питания: от 2.7 В до 3.6 В

·              Диапазон тактовых частот: от 0 до 4 МГц

Рис. 14 - Расположение выводов

/103 является 8-ми разрядным CMOS микроконтроллером с низким уровнем энергопотребления, основанным на AVR RISC архитектуре. Благодаря выполнению высокопроизводительных инструкций за один период тактового сигнала, ATmega603/103 достигает производительности, приближающейся к уровню 1 MIPS на МГц, обеспечивая разработчику возможность оптимизировать уровень энергопотребления в соответствии с необходимой вычислительной производительностью.

Ядро AVR, основанное на усовершенствованной RISC архитектуре, содержит мощный набор инструкций и 32 рабочих регистра общего назначения. Все 32 регистра напрямую подключены к арифметико - логическому устройству (АЛУ), что обеспечивает доступ к двум независимым регистрам при выполнении одной инструкции за один такт. В результате, данная архитектура имеет более высокую эффективность кода, при повышении пропускной способности, вплоть до 10 раз, по сравнению со стандартными микроконтроллерами CISC./103 имеет: 64/128 Кбайт Flash - памяти с поддержкой внутрисистемного программирования, 2К/4К байт EEPROM, 4Кбайт SRAM, 32 линии I/O общего назначения, 8 выходных линий, 8 входных линий, 32 рабочих регистра общего назначения, контроллер реального времени (RTC), 4 универсальных таймера/ счетчика с режимами сравнения и ШИМ, UART, программируемый следящий таймер с встроенным тактовым генератором, SPI- последовательный порт, а также, три программно выбираемых режима экономии энергопотребления. Режим ожидания «Idle Mode» останавливает CPU, но позволяет функционировать SRAM, таймеру/ счетчикам, порту SPI и системе прерываний. Режим экономии энергопотребления «Power Down» сохраняет содержимое регистров, но останавливает тактовый генератор, отключая все остальные функции микроконтроллера, вплоть до следующего внешнего прерывания, или до аппаратной инициализации. В режиме экономии энергопотребления (Power Save) тактовый генератор таймера продолжает функционировать, позволяя пользователю поддерживать контроль времени в то время, как все остальные функции микроконтроллера отключены.

Устройство производится с применением технологи энергонезависимой памяти с высокой плотностью размещения, разработанной в корпорации Atmel. Встроенная Flash - память обеспечивает возможность перепрограммирования программного кода в составе системы посредством последовательного интерфейса, или с помощью стандартного программатора энергонезависимой памяти. Благодаря совмещению усовершенствованного 8-ми разрядного RISC CPU с Flash- памятью с поддержкой внутрисистемного программирования на одном кристалле получился высокопроизводительный микроконтроллер ATmega603/103, обеспечивающий гибкое и экономически- высокоэффективное решение для многих приложений встраиваемых систем управления.ATmega603/103 поддерживается полным набором программ и пакетов для разработки, включая: компиляторы С, макроассемблеры, отладчики/ симуляторы программ, внутрисхемные эмуляторы и наборы для макетирования.

. Разработка программы

Алгоритм программы управления представлен на рисунке 15.

Рис. 15 - Алгоритм

Заключение

В ходе данного курсового проекта была разработана система управления отопительного котла. Была выбрана элементная база, разработан алгоритм и программа управления системой. Программа написана для микроконтроллеров фирмы Atmel с архитектурой AVR на языке Assembler. Чертежи выполнены с помощью САПР, элементарная база представлена в пояснительной записке.

Список литературы

1.   Мортон Д. Микроконтроллеры AVR. Вводный курс. 2006

2.       Голубцов М.С. Микроконтроллеры AVR от простого к сложному.2003

.        Баранов В.Н. Применение микроконтроллеров AVR.Схемы, алгоритмы, программы.2004

Приложение А

Код основной программы

.include "m103def.inc"

.include "LCD4_macro.inc"

;*****************************************************************************

.cseg

.org 0

INT00                            ; External Interrupt Request 0INT01                      ; External Interrupt Request 1

.equ DT =PF0 ; вход датчика температуры

.equ   PC0                      =PC0          ;

.equ   PC1                      =PC1          ;

.equ   PC2                      =PC2          ;

.equ   PC3                      =PC3          ; Шаговый двигатель

.equ   PC4                      =PC4          ; открытие входного клапана

.equ   PC5                      =PC5          ; закрытие входного клапана

.equ   PC6                      =PC6          ; открытие выходного клапана

.equ   PC7                      =PC7          ; закрытие выходного клапана

;--------------------------------------------------------------------------------------

; ТАБЛИЦА ВЕКТОРОВ ПРЕРЫВАНИЙ

:RESET ;переход на RESET при срабатывании прерывания INT00 (кнопка "СТОП"):can1, 0b00000001 ;запрещаем прерывание

out     EIMSK, can1 ;INT01 ("ПУСК"). EIMSK - регистр масок внешних прерываний

;*********************************************************

;MAIN

:

; устанавливаем вершину стека

; RAMEND - конец памяти SRAM

ldi r16,LOW(RAMEND)

out SPL,r16r16,HIGH(RAMEND)SPH,r16

ldi r16, 1<<TOIE0          ; r16=TOIE0TIMSK, r16         ; разрешаем прерывание по переполнению таймера-счётчика 0port_init                ; инициализация портов                           ; разрешаем использование прерываний

rcall KeyReadKeyboard_LCD ; инициализация дисплея

WR_DDADR 0 ; Указатель на начало видео памяти (ячейка с координатми 0,0)DATA_WR ; Вывод значения на экранCUR_R    ; сдвиг курсора вправо

rcall KeyReadKeyboardDATA_WR ; Вывод значения на экран

; опрашиваем кнопку пуск:PINA, 5          ; пропустить следующую команду, если кнопка нажатаPUSKPORTC, 6 ; открываем выходной клапанPORTC, 4 ; открываем входной клапанWait15s ;

cbi PORTC, 4;OPEN_SHD ; открытие форсунки

rcall Wait15s ;DATA_RD ; считываем температуру с экранаCMP ; сравниваем температуру

;*************************************************************

; ПОДПРОГРАММА ИНИЦИАЛИЗАЦИИ ПОРТОВ_init:

; ножки PA4-PA5 на ввод, остальные на вывод

ldi      r16, 0b11001111   DDRA, r16  r16, 0b00110000   PORTC, r16

; ножки порта С на вывод              r16

out              PORTC, r16

; ножки PD0-PD7 на ввод               r16              DDRD, r16

;ножки PЕ2-PЕ4 на вывод               r16, 0b11100011             PORTD, r16

ret

;*********************************************************:

;проверяет нажатие клавиши в клавиатуре возвращает номер клавиши в случае нажатия

;иначе возвращает -1 (255) также -1 возвращается в случае, если в прошлый раз была ;нажате та же кнопка возвращаемое значение - переменная Key

;блок проверки строки (всего их 4)R17,PinD ; читаем порт DKeyTest ;вызываем программу проверки

;программа возвращает номер кнопки: 0..2

;или -1 - если нет нажатых кнопок

R17,0 ;загружаем код текущей строкиR18,255 ;если ничего не нажато - идем дальшеSetKey ;иначе - переходим на обработку

;конец 0-го блока

R17,PinD

rcall KeyTestR17,3R18,255SetKey

R17,PinDKeyTestR17,6R18,255SetKeyR17,PinDKeyTestR17,9R18,255SetKey

R17,0

SetKey:R17,R18 ;прибавляем номер кнопки к коду строчкиR18,Key ;грузим код кнопки, прочитанный в прошлый разR18,0b00001111 ;"чистим" его по маскеR17,R18 ;если в прошлый разEndKeyRead ;была нажата не та же кнопка, выходим

R17,0b10000000 ;иначе - пишем флажок "повтор":Key,R17 ;сохраняем код кнопки в ОЗУ

;выходим

;*********************************************************

KeyTest:R17,0b01110000 ;обрезаем по маскеR18,0b01110000R17,R18 ;инвертируем биты по маскеNoButtons ;если все нули (нет нажатых), переходим по метке

R18,0 ;инициализируем счетчик

R17,0b00010000 ;проверяем 0-ю кнопкуEndKeyTest ;нажато - выходR18 ;иначе - инкремент счетчика

R17,0b00100000 ;проверка 2 кнопкиEndKeyTestR18

R17,0b01000000 ;проверка 3 кнопкиEndKeyTest

:R18,255 ;если ничего не нажато - возвращаем 255

: ret

;*********************************************************:

;запускает выполнение операции, закрепленной за кнопкой

R17,Key ;загружаем переменную KeyR18,R17 ;проверяем на наличие флажкаR18,0b10000000 ;"повтор" или -1EndKeyboard ;если повтор или -1 - выходим

ZH,High(KeysLUT*2) ;загружаем таблицуZL,Low (KeysLUT*2) ;истинности (клавиша -> значение)

R18,0 ;смещаемся на номер клавиши

add ZL,R17ZH,R18

lpm ;загружаем значение элементаR17,R0

lds R18,Digit+1Digit+2,R18R18,DigitDigit+1,R18

sts Digit,R17 ;пишем в млад. разряд индикатора текущее значение

EndKeyboard: ret

;*********************************************************:

.db 1,2,3,4,5,6,7,8,9,10,0,11 ;массив (таблица истинности клавиатуры)

;**********************************************************

;подрограмма опроса датчика:

; ADEN - разрешаем работу АЦП

; ADSC - начало преобразованияr22, DT ; АЦП для датчика температурыADMUX, r22

; опрос датчика:

ldi r22,1<<ADEN|1<<ADSC

out ADCSRA, r22

; ожидание завершения преобразования ADC

rADC:ADCSRA, ADSCrADC

 PINA, 4                                 ; опрос кнопки стопEND      ; перейти на END, если нажата

; сравниваем текущую температуру

in r22, ADCL

cp R17, r22eq ADC                 ; продолжаем, если равныR17, r22lo CLOSE    ;переход, если меньше

;OPEN

sbi PORTC,4 ;открытие входного клапана

rcall Wait1sPORTC,4: PORTC,5 ;закрытие входного клапана

rcall Wait1s

cbi PORTC,5

ret

;--------------------------------------------------------------------------------------

; ПОДПРОГРАММА ЗАДЕРЖКИ в 1 сек

Wait1s:r28, 20 r29, 255s_mid:r30, 255s_in:r30Wait1s_inr29 Wait1s_mid r28 Wait1s_out

;--------------------------------------------------------------------------------------

; ПОДПРОГРАММА ЗАДЕРЖКИ в 15 сек

Wait15s:

ldi r28, 230 s_out:r29, 255

sbic PINA, 4                                     ; опрос кнопки стопEND                ; перейти на END, если нажата

Wait15s_mid:r30, 255

Wait15s_in:r30Wait15s_in r29 Wait15s_midr28 Wait15s_out

ret

;--------------------------------------------------------------------------------------

; ПОДПРОГРАММА ЗАДЕРЖКИ в 1 мкс

Wait1mks:r28, 5 mks_out:r29, 255mks_mid:r29Wait1mks_midr28Wait1mks_out

;***************************************************************************

; открытие форсунки

OPEN_SHD:

ldi r1, 0b00000001r2, 0b00000011r3, 0b00000010r4, 0b00000110r5, 0b00000100r6, 0b00001100r7, 0b00001000r8, 0b00001001_R:

sbic PIND, 7                            ; опрос концевого датчика

rjmp STOP_SHD                     ; перейти на STOP_SHD, если нажат

out PORTC, r1 ; Крутим двигатель вправо

out PORTC, r2PORTC, r3PORTC, r4PORTC, r5PORTC, r6PORTC, r7PORTC, r8Wait1mks ; задержка между шагомSHD_R_SHD:

;************************************************************

; закрытие форсунки

CLOSE_SHD:

ldi r1, 0b00001001r2, 0b00000100r3, 0b00001100r4, 0b00000100r5, 0b00000110r6, 0b00000010r7, 0b00000011r8, 0b00000001_L:

out PORTC, r1 ; Крутим двигатель влево

out PORTC, r2PORTC, r3PORTC, r4PORTC, r5PORTC, r6PORTC, r7PORTC, r8Wait1mks ; задержка между шагомSHD_L

;**********************************************************: CLOSE_SHD ; закрываем форсунку

sbi PORTC, 7; закрываем выходной клапанPORTC, 5; закрываем входной клапан

rjump Reset;

.include "LCD4.asm"

Приложение Б

Программа управление дисплеем

LCD4.asm

;===========LCD Define ======================================================

.equ DATA_PORT = PORTA ; LCD Data Port

.equ DATA_PIN   = PINA

.equ DATA_DDR = DDRA

.equ CMD_PORT = PORTE   ; LCD Control Port

.equ CMD_PIN = PINE

.equ CMD_DDR = DDRE

.equ E = 4

.equ RW = 3

.equ RS = 2

.equ SPEED = 14  ; 14 для XTAL=16MHz, 10 для XTAL=8MHz,

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

;===========LCD Proc ========================================================: CBI CMD_PORT,RS  ; Выставляем нужные уровни на

; управляющих выводахCMD_PORT,RW ; Порты на выходCMD_PORT,E   ; И сразу же выставляются на 1CMD_DDR,RSCMD_DDR,RWCMD_DDR,E

PortIn; Порт данных на вход

;==========================================================================:         CLI   ; Ожидание флага занятости контроллера дисплеяPortIn    ; Порты на вход

CMD_PORT,RS  ; Идет Команда!

SBI CMD_PORT,RW   ; Чтение!

:         SBI CMD_PORT,E       ; Поднять строб  LCD_Delay          ; Подождать

R16,DATA_PIN   ; Считать байт

PUSH R16  ; Сохранить его в стек. Дело в том, что у нас R16

; убивается в LCD_Delay

CMD_PORT,E ;Бросить строб - первый цикл (старший полубайт)       LCD_Delay          ; Подождем маленько

CMD_PORT,E              ; Поднимем строб        LCD_Delay          ; ПодождемCMD_PORT,E                ; Опустим строб - нужно для

; пропуска второго полубайта        LCD_Delay          ; Задержка сноваR16             ; А теперь достаем сныканый байт - в нем наш флаг.R16,0x80          ; Продавливаем по маске. Есть флаг?BusyLoop            ; Если нет, то переход

:         SEI             ; Разрешаем прерывания.

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

; Запись команды в дисплей. Код команды в R17_WR:     CLI                                ; Запрет прерываний      BusyWait              ; Ждем готовности

CMD_PORT,RS           ; Идет команда!WR_END                         ; Переход на запись

;-----------------------------------------------------------------------------------------

; Запись данных в дисплей. Код данных в R17_WR: CLI                                ; Запрет прерываний         BusyWait              ; Ждем готовности

CMD_PORT,RS           ; Идут данные!

WR_END:  CBI CMD_PORT,RW            ; Запись!

SBI CMD_PORT,E                 ; Поднять строб

PortOut                          ; Порт настроить на выход!R17                        ; Сохраним данные которые будем выводить в стекеR17,0xF0             ; Отдавим по маске данным младшую тетраду.

R16,DATA_PORT        ; Возьмем из порта данных старое значениеR16,0x0F                ; Отдавим ему старшую тетраду

R16                      ; Сохраним результа в стеке. Пригодится

R16,R17     ; Склеим младшую тетраду из порта со старшей тетрадой данных

DATA_PORT,R16        ; Выдадим этого мутанта в порт.

         LCD_Delay          ; ПодождемCMD_PORT,E              ; Бросим строб вниз - данные ушли в индикатор

         LCD_Delay          ; ПодождемCMD_PORT,E              ; Поднимем стробR16                     ; Достанем из стека младшую тетраду из портаR17                     ; И данные которые мы выводим

R17                      ; Поменяем тетрады местами у байта данныхR17,0xF0               ; Отдавим младшую тетраду

R16,R17                        ; Склеим младшую тетраду из

; порта с старшей тетрадой данных (бывшая младшая)

OUT DATA_PORT,R16         ; Выдадим в порт

         LCD_Delay          ; ПодождемCMD_Port,E                 ; Бросим строб

RCALL       PortIn         ; Порт вернем в прежнее состояние - на вход                                                ; Разрешим прерывания                                                       ; Возврат

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

; Чтение команды из дисплея. Результат в R17_RD:  CLI                                         ; Запрет прерыванийBusyWait          ; Ждем контроллерCMD_PORT,RS                ; Команда!RD_END                         ; Идем на чтение

;-----------------------------------------------------------------------------------------

; Чтение команды из дисплея. Результат в R17_RD:  CLI                                ; Запрет прерываний         BusyWait              ; Ждем контроллер

SBI CMD_PORT,RS              ; Данные!_END:  SBI CMD_PORT,RW   ; Чтение!

SBI CMD_PORT,E                 ; Поднимаем строб       LCD_Delay          ; ЖдемR17,DATA_PIN ; Читаем из порта байтCMD_PORT,E               ; Бросем строб вниз

R17,0xF0             ; Отдавливаем ему младшую тетрадуR17                           ; Обмениваем тетрады местами

         LCD_Delay          ; ЖдемCMD_PORT,E   ; Поднимаем стробR16,R17 ; Прячем старшую тетраду в R16

R17,DATA_PIN   ; Берем еще один байтCMD_PORT,E              ; Бросаем строб

R17,0xF0             ; Отдавливаем младшую тетрадуR17,R16        ; Склеиваем результат с старшим байтомR17                       ; Разорваичаем байт. Т.к. первой

; выходила старшая тетрада

                                       ; разрешаем прерывания                                  ; Возврат.

;==========================================================================:                   IN R16,DATA_DDR      ; Данные из DDR в регистрR16,0x0F                ; Отдавливаем старшую тетраду - нам нужно

; сохранить младшую и обнулить старшуюDATA_DDR,R16       ; Выдаем результат в порт.

R16,DATA_PORT        ; Берем данные из портаR16,0xF0            ; Выставляем все биты старшей тетрады,не трогая младшую

OUT DATA_PORT,R16         ; Выдаем в порт

RET

;==========================================================================:         IN      R16,DATA_DDR ; Данные из ДДР в регистрR16,0xF0       ; Выставляем все биты старшей тетрады, не

; трогая младшуюDATA_DDR,R16 ; Выдаем данные в порт

;==========================================================================_Delay:         LDI R16,SPEED   ; Задержка на несколько тактов. Для того чтобы

; дисплей_loop:             DEC R16              ; Успевал обрабатывать данные

BRNE L_loop

_macro.inc

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

; LCD InitLCD_CLR = 0 ; DB0: clear displayLCD_HOME = 1 ; DB1: return to home position

LCD_ENTRY_MODE = 2 ; DB2: set entry modeLCD_ENTRY_INC = 1 ; DB1: incrementLCD_ENTRY_SHIFT = 0 ; DB2: shift

LCD_ON = 3 ; DB3: turn lcd/cursor onLCD_ON_DISPLAY = 2 ; DB2: turn display onLCD_ON_CURSOR = 1 ; DB1: turn cursor onLCD_ON_BLINK = 0 ; DB0: blinking cursor

LCD_MOVE = 4 ; DB4: move cursor/displayLCD_MOVE_DISP = 3 ; DB3: move display (0-> move cursor)LCD_MOVE_RIGHT = 2 ; DB2: move right (0-> left)

LCD_F = 5 ; DB5: function setLCD_F_8B = 4 ; DB4: set 8BIT mode (0->4BIT mode)LCD_F_2L = 3 ; DB3: two lines (0->one line)LCD_F_10D = 2 ; DB2: 5x10 font (0->5x7 font)LCD_CGRAM = 6 ; DB6: set CG RAM addressLCD_DDRAM = 7 ; DB7: set DD RAM address

SCR_L = 0b00011000    ; Сдвиг экрана влево

equ SCR_R = 0b00011100      ; Сдвиг экрана вправоCUR_L = 0b00010000    ; Сдвиг курсора влевоCUR_R = 0b00010100        ; Сдвиг курсора вправо

; Init ConfigINIT_LCD                               ; нициализация LCD

RCALL       InitHW                                             ; Настроить контрольный порт

         LCD_DELAY                                   ; Подождать_CMD (1<<LCD_F)|(0<<LCD_F_8B)                   ;Выдать функции в порт.

Так как на 4

; байтах нельзя передать сразу второй байт

WR_CMD (1<<LCD_CLR)   ;0x01_CMD (1<<LCD_ENTRY_MODE)|(1<<LCD_ENTRY_INC)

x06_CMD (1<<LCD_ON)|(1<<LCD_ON_DISPLAY)|(0<<LCD_ON_CURSOR)|(0<<LCD_ON_BLINK)

;0x0C_CMD (1<<LCD_HOME)

.ENDM

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

;Write Data

.MACRO WR_DATAR17,@0DATA_WR

.ENDM

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

;Write CMD

.MACRO WR_CMDR17,@0  CMD_WR

.ENDM

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

; Read Data

.MACRO RD_DATA    DATA_RD

.ENDM

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

; Read CMD

.MACRO RD_CMD      CMD_RD

.ENDM

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

;Set COORD

;Syntax LCD_COORD X,Y

.MACRO LCD_COORDR17,(1<<LCD_DDRAM)|(@0+0x40*@1)CMD_WR

.ENDM

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

;Shift SCREEN/CURSOR

.MACRO SHIFTR17,@0        CMD_WR

.ENDM

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

;LCD Clear

.MACRO LCDCLRR17,(1<<LCD_CLR)   CMD_WR

.ENDM

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

;Write CGRAM

.MACRO WR_CGADRR17,(1<<LCD_CGRAM)|(@0)          CMD_WR

.ENDM

;Write DDRAM

.MACRO WR_DDADRR17,(1<<LCD_DDRAM)|(@0) CMD_WR

Похожие работы на - Разработка системы управления отопительного котла

 

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