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

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


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

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

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

Введение

Общие особенности управляющих микроконтроллеров.

Основные требования, которые потребители предъявляют к управляющим блокам приборов можно сформулировать следующим образом:

низкая стоимость,

высокая надежность,

высокая степень миниатюризации,

малое энергопотребление,

работоспособность в жестких условиях эксплуатации;

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

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

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

Однако можно выделить некоторые черты архитектуры и системы команд, общие для всех современных микроконтроллеров, это:

так называемая Гарвардская архитектура — то есть раздельные области памяти для хранения команд (программы) и данных. Они могут иметь разную разрядность, в системе команд для обращения к ним предусмотрены различные команды и т. д.

интеграция в одном корпусе микросхемы (на одном кристалле) практически всех блоков, характерных для полнофункционального компьютера — процессора, ПЗУ, ОЗУ, устройств ввода-вывода, тактового генератора, контроллера прерываний и т. д. Поэтому в русскоязычной литератур подобные устройства часто называются однокристальные ЭВМ (ОЭВМ).

Микроконтроллеры обычно классифицируют по разрядности обрабатываемых чисел:

четырехразрядные — самые простые и дешевые,

восьмиразрядные — наиболее многочисленная группа (оптимальное сочетание цены и возможностей), к этой группе относятся микроконтроллеры серии MCS-51 (Intel) и совместимые с ними, PIC (Microchip), HC68 (Motorola), Z8 (Zilog) и др.

шестнадцатиразрядные — MCS-96 (intel) и др. — более высокопроизводительные, но более дорогостоящие

тридцатидвухразрядные — обычно являющиеся модификациями универсальных микропроцессоров, например 180 186 или I386EX.

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

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

Основные узлы, а также их функции:

3 датчика температуры — контроль температуры нагрева воды;

датчик давления — контроль давления;

4 клапана — 3 для подачи реагентов, один для регулирования давления в емкости;

электродвигатель — вращение емкости для перемешивания реагентов;

насос для откачки результирующего вещества из емкости;

нагревательный элемент (тэн) — нагрев вещества в емкости;

блок управления тэном- управление тэном;

блок управления насосом;

блок управления клапанами;

блок управления двигателем;

ЖК индикатор;

восьмиклавишная клавиатура.

4 датчика воды — контроль уровня веществ в емкости.

Управление контроллером ведется через восьмиклавишную клавиатуру:

Клавиша выбора «START» — начало работы.

Клавиша «ОТКАЧКА» — для откачки результирующей смеси.

«ДВИГАТЕЛЬ" — включение двигателя после выбора реагентов.

Клавиша для выбора 1-го реагента.

Клавиша для выбора 2-го реагента.

Клавиша для выбора 3-го реагента.

Основные функции:

Управление двигателем для перемешивания реагентов.

Индикация температуры и давления.

Управление клапанами (открытие/закрытие).

Включение/выключение насоса для откачки результирующей смеси.

Управление нагревательным элементом.

Также управление может вестись с удаленного компьютера по RS232 интерфейсу.

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

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

Рис. 1

МК- управляющий микроконтроллер

ДД- датчик давления. Приборный цифровой датчик.

БДТ- блок датчиков температуры. Приборные цифровые датчики.

ДВ — датчик воды. Фиксирует уровень заполнения бака водой.

БК- блок клавиатуры. Специализированная микросхема клавиатурного шифратора. 8 клавиш. Клавиатура предназначена для управления устройством.

LCD — знакосинтезирующий LCD индикатор. Выводит как текст так и цифры.

БУТ — блок управления тэном.

БУМ — блок управления мотором откачки вещества.

БУД — блок управления двигателем.

БУК — блок у правления клапанами подачи реагентов.

Предыдущие 4 блока управляются рптосемисторными ключами. Слаботочный на МОС 306 подключенный через токоограничивающий резистор выполняет ключевую функцию для мощного ключа BT 139, выполняет развязку между низковольтными цепями системы и высоковольтными цепями электрической цепи. Обеспечивает ток до 25А.

БСУК — блок связи с удаленным компьютером.

С клавиатуры задаются клапаны, которые поочередно открываются. По мере наполнения быка, контролируется уровень жидкости, при достижении необходимого уровня, закрываются клапаны. После этого включается двигатель на 5 минут. Далее организуется бесконечный цикл, в котором сначала поочередно опрашиваются датчики температуры, затем сравниваются температуры между ними. Если температуры не равны, то включается двигатель, после отработки которого, температуры сравниваются снова. Если температуры равны, то это значение сравнивается с минимально возможной температурой. Если она температура меньше минимальной, включается тэн и начинается опрос датчика давления и сравнение полученных им данных с максимально возможным значением. Если давление превышает норму, открывается клапан 4. Тэн отключается при достижении значения температуры выше минимальной. Цикл повторяется до тех пор пока температура и давление в емкости не примут допустимые значения. На ЖКИ выводится сообщение соответствующее окончанию цикла, с клавиатуры включается насос для откачки вещества.

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

2. 1 Выбор управляющего микроконтроллера

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

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

наличие программного пакета для написания и отладки программы микроконтроллера;

достаточная изученность микроконтроллера.

Для реализации МПС были выбраны 3 контроллера: МК AT89S52, AVR Atmega8 и PIC16F628. Для выполнения выбора подробнее рассмотрим каждый из контроллеров.

AVR (ATmega8)

PIC (16F628)

MK-51 (AT89C52)

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

8 Кб

2 Кб

8 Кб

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

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

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

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

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

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

23

13

32

Питание

4,5−5,5

3,0−5,5

4,0−5,5

Архитектура

RISC

RISC

CISC

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

16МГц

10МГц

24МГц

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

128 байт

68 байт

256 байт

Стоимость

400 руб.

75 руб.

60 руб.

МК ATmega8 имеет следующие отличительные особенности:

8ми-разрядный высокопроизводительный AVR микроконтроллер с малым потреблением RISC архитектура.

130 высокопроизводительных команд, большинство команд выполняется за один тактовый цикл. 32 8ми-разрядных рабочих регистра общего назначения.

Полностью статическая работа.

Приближающаяся к 16 MIPS (при тактовой частоте 16 МГц) производительность

Энергонезависимая память программ и данных

8 Кбайт внутрисистемно программируемой Flash памяти (In-System Self-Programmable Flash)

Обеспечен режим одновременного чтения/записи 512 байт EEPROM

1 Кбайт встроенной SRAM Встроенная периферия:

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

Один 16-разрядный таймер/счетчик с отдельным предварительным делителем и режимами захвата и сравнения

Счетчик реального времени с отдельным генератором

6-канальный аналого-цифровой преобразователь (в корпусе PDIP)

4 канала с 10-разрядной точностью

2 канала с 8-разрядной точностью

Байт-ориентированный 2-проводный последовательный интерфейс

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

Последовательный интерфейс SPI (ведущий/ведомый)

Программируемый сторожевой таймер с отдельным встроенным генератором

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

Специальные микроконтроллерные функции

Встроенный калиброванный RC-генератор

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

Выводы I/O и корпуса

23 программируемые линии ввода/вывода

28-выводной корпус PDIP, 32-выводной корпус TQFP и 32-выводной корпус MLF

Рабочие напряжения — 2,7 — 5,5 В (ATmega8L) 4,5 — 5,5 В (ATmega8)

Рабочая частота — 0 — 8 МГц (ATmega8L) 0 — 16 МГц (ATmega8)

Как видно из приведенных технических характеристик контроллер имеет высокую производительность достаточную программную память и необходимые АЦП и порты. Имеется среда разработки на С. Недостаток отсутствие функций умножения и деления требуют написания специальных подпрограмм необходимых для перевода получаемых значений в цифровой вид и разделения значащих разрядов на сотни единицы и десятки.

Далее рассмотрим следующую серию МК PIC16F628 она имеет следующие основные особенности:

RISC архитектуру и всего 35 простых для изучения инструкции;

Все инструкции исполняются за один такт (400 нс);

Скорость работы: тактовая частота до 10 МГц;

Память программ 2K FLASH;

Память данных ОЗУ (байт) 68

15 аппаратных регистров специального назначения

четыре источника прерывания:

внешний вход RB0/INT

переполнение таймера TMR0

прерывание при изменении сигналов на линии порта B (PORTB< 7:4>)

по завершению записи данных в ЭСППЗУ (EEPROM)

8-разрядный таймер/счетчик;

8-разрядный программируемый предварительный делитель;

1000 циклов записи/стирания FLASH памяти программы.

Периферия:

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

Сильноточные схемы (до 25мА) для управления светодиодами.

Особенности микроконтроллера:

Программирование на плате через последовательный порт (ICSPT)

Таймер включения питания (PWRT) и таймер запуска генератора (OST)

Сброс по падению напряжения питания

Сторожевой таймер (WDT) с собственным встроенным RC-генератором для повышения надежности работы

Широкий рабочий диапазон напряжений питания — от 2,0 В до 6,0В

Низкое потребление энергии:

< 2 мА при 5,0 В, 4,0 МГц

Данный контроллер к сожалению не имеет встроенного АЦП и не имеет команд деления и умножения в остальном он удовлетворяет нашей задаче.

Последним для рассмотрения был выбран МК 51 серии — AT89C52. Этот контроллер имеет встроенный АЦП и по предварительной оценке по параметрам полностью подходит для выполнения поставленной задачи.

Рис. 2 — Контактная группа выводов AT89C52

Рис. 3 — Функциональная блок-схема

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

Совместимость с серией MCS-51 SISC архитектура.

8 кБ флэш-памяти с внутрисхемным программированием (ISP) Со стойкостью ПЗУ программ: 1000 циклов записи/стирания

Рабочий диапазон питания 4. 0…5. 5В

Полностью статическое функционирование: 0 …24 МГц

Внутреннее ОЗУ размером 256x 8

32 программируемые линии ввода-вывода

Три 16-разрядных таймера-счетчика

Восемь источников прерываний

Полнодуплексный канал последовательной связи на УАПП

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

Учитывая все вышесказанное окончательно было решено использовать контроллер 51 серии как наиболее доступный и подходящий по параметрам.

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

Выбраны интеллектуальные цифровые датчики температуры, сейчас наиболее распространены 2 типа датчиков. Один с четырех проводным подключением по шине I2C, второй по шине 2−3-х проводной ware (3-х проводная шина когда дополнительно 3-я используется для питания датчика).

В результате анализа рынка было выяснено что датчик I2C более дорог по сравнению с датчиком IWare — 50 -70 руб., в качестве датчиков было решено использовать датчики IWare DS1820 или его модификацию. Для более детального понимания рассмотрим архитектуру датчика и его работу более подробно.

DS1820 — калиброванный цифровой термометр. Диапазон измеряемых температур от -55°C до +125°C. Абсолютная погрешность преобразования меньше ±0,5°C в диапазоне контролируемых температур -0°C до +70°C. Результирующее значение температуры считывается, как девятиразрядное слово и с помощью специальной программной обработки позволяет достигнуть разрешающей способности преобразования 0,01°C.

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

Температура

Выходной код (Binary)

Выходной код (Hex)

Ст. байт

Мл. байт

+125°C

0000 0000

1111 1010

00FAh

+25°C

0000 0000

0011 0010

0032h

+0. 5°C

0000 0000

0000 0001

0001h

0°C

0000 0000

0000 0000

0000h

-0. 5°C

1111 1111

1111 1111

FFFFh

-25°C

1111 1111

1100 1110

FFCEh

-55°C

1111 1111

1001 0010

FF92h

Типовое время полного преобразования 750 мс. Энергонезависимая память температурных установок микросхемы обеспечивает запись произвольных значений верхнего и нижнего контрольных порогов. Термометр имеет индивидуальный 64-разрядный регистрационный номер (групповой код 010Н) и обеспечивает возможность работы без внешнего источника энергии, только за счет питания 1-Wire-линии (вариант двухпроводного подключения с ограниченным числом датчиков до 5 и расстоянием до 3−5м). В трехпроводном подключении питание микросхемы через отдельный внешний вывод 4,5 В до 5,5 В. Термометр размещается в транзисторном корпусе PR-35. Линия прерывания int 0 для подключения датчика температуры. Для обеспечения требуемого тока в данной линии установлен резистор сопротивлением 5Ком который необходим на шине IWare.

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

Рис. 4 — Условное графическое обозначение ИМС К155ИВ1

Электрические параметры

1

Номинальное напряжение питания

5 В 5%

2

Выходное напряжение низкого уровня

0,4 В

3

Выходное напряжение высокого уровня

2,4 В

4

Входной ток низкого уровня по входу 10 по входам 1−5,11−13

— 1,6 мА — 3,2 мА

5

Входной ток высокого уровня по входу 10 по входам 1−5,11−13

0,04 мА 0,08 мА

6

Входной пробивной ток

1 мА

7

Ток потребления

60 мА

8

Потребляемая статическая мощность

330 мВт

9

Среднее время задержки распространения

21 нс

Для вывода информации используется знакосинтезирующий LCD индикатор. Выводит информацию в двух строках. Для управления им используется две дополнительные шины RS — выбор команды, E — стробирующая запись данных в индикатор.

GND- потенциал общего провода («земли»);

E- линия стробирования/синхронизации;

RS- линия выбора регистра;

RW- линия выбора операции;

CS- Chip Select;

DB (0−7) — линия данных Рис 4 — условное гр графическое обозначение ЖКИ

Рис. 5

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

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

Рис. 6 — Технические характеристики

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

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

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

Схемы управления тэном, двигатель, клапаном и мотором откачки подключаются к портам микроконтроллера и представляют собой слаботочные оптоэлектронные семисторные ключи MOC306 (коммутируемый ток до 1А). Эти ключи управляют далее более мощными семисторами ВТ139 (с током коммутации до 25А или 5КВт) к которым непосредственно и подключены тэн, двигатель, клапан и мотор откачки.

Связь микроконтроллера с персональным компьютером должна осуществляться по последовательному каналу RS-232. Для этого необходимо использовать микросхему MAX232. Технические характеристики MAX232: скорость (макс.) 0. 12 МБод, ESD защита 2кВ, Tx 2шт, VCCот 4.5 до 5. 5 В, Rx 2шт, ICC 10мА, TA от -40 до 85 °C, Корпус DIP-16 SOIC-16 SOIC-16-Wide.

Рис. 7 — Контактная группа выводов MAX232

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

3. 1 Разработка алгоритма программы

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

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

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

В программе заданы обработчики прерываний от таймера, от внешнего источника, последовательного порта. Данные подпрограммы выполняются только при возникновении прерывания. Обработчик прерывания от таймера 0 выполняет подсчет времени. Обработчик прерывания от внешнего источника (клавиатуры) выполняет выбор реагентов, первоначальное включение двигателя и включение насоса. Обработчик прерывания от последовательного порта считывает информацию (команды), помещенную в буфер. Более подробное описание обработчиков приведено ниже.

Так же выводиться время начала и окончания процесса.

Структура программы

В программе можно выделить следующие блоки:

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

Обработчик прерывания от таймера 0. Выполняет подсчет времени (минут).

Обработчик прерывания от внешнего источника INT0. Для реализации клавиатуры, имеющей 6 клавиши: старт, открытие клапана 1,2,3, насос, двигатель.

Блок установки режимов таймеров и необходимых регистров.

Блок инициализации последовательного порта приема-передачи, с помощью которого реализован канал RS-232.

Блок анализа и реализации команд, принятых от персонального компьютера.

Блок считывания температуры и давления с датчиков и приведение этих значений к допустимым.

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

Разработанный алгоритм представлен в графическом виде на рисунке 8.

Рис. 8 — Графическое представление алгоритма программы

3. 2 Описание программы

Основная часть программы находится в файле main.c. Процедуры работы с датчиками температуры и давления размещены в других файлах. Для корректной работы вначале программы подключены необходимые файлы, стандартные библиотеки, объявляем переменные.

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

Обработчик прерывания от последовательного порта (void sint (void) interrupt 4). Выполняет считывание байта информации из буфера последовательного порта в переменную rs232, которая затем анализируется в цикле основной процедуры.

Обработчик прерывания от таймера 0 (void timer0(void) interrupt 1). Выполняет подсчет времени. Для данного таймера установлен 1 режим работы, для которого коэффициент пересчета составляет 216 (65 536). Необходимо рассчитать количество переполнений, которые произойдут за 1 секунду. Один машинный цикл при частоте тактового генератора 12МГц составляет 1мс, то есть переполнение произойдет через 0,65 536 секунды (65 536/106). Таким образом, одна секунда это 15,2587 переполнений (1/0,65 536). В программе необходимо контролировать 4800 переполнений.

Обработчик прерывания от внешнего источника INT0 (void int0(void) interrupt 0). Реализует клавиатуру. По нажатию на кнопку ее код выставляется на порты Р3. 4, P3.5 и Р3.6. В программе анализируется этот код: если код равен 111 (1 клавиша), то происходит сброс значений введенных СС клавиатуры, если 110,101,100 (2, 3, 4 клавиша) — открываются клапаны 1,2,3 соответственно. При коде равном 011 (5 клавиша) происходит включение насоса. При коде равном 010 (6 клавиша) происходит включение двигателя. Действие соответствующее клавише отображается на ЖКИ.

Следующие блоки расположены в теле основной процедуры (void main ()).

Блок установки режимов таймеров и регистров. В регистр TMOD помещается значение 0xA9 (первый режим для таймера 0, второй режим для таймера 1). Устанавливаются флаги разрешения прерывания от таймеров ЕТ0 и ЕТ1, а также от внешнего источника EX0. Затем производится программный запуск таймера TR0=1.

Блок инициализации последовательного порта приема-передачи (com_initialize ()). Заключается в том, что устанавливается в регистр управления энергопотреблением (PCON) значение 0×80 (1000 2). То есть устанавливается двойная скорость передачи последовательного канала. Последовательный порт работает под управлением таймера 1. Задаются начальные значения таймера TH1=0xF9 и TL1=0xF9, высчитанные по формуле 256 — (12 000 / (192 * 9600)) = 24 910 = 0xF916, где 9600 бод — необходимая скорость передачи, 12 000Гц — частота тактового генератора, 256 — коэффициент пересчета таймера 1 во 2 режиме. Также необходимо установить флаг ES — разрешение прерывания от последовательного приемо-передатчика, и установить в регистр управления работой приемо-передатчиков (SCON) значение 0×50 (10 100 002), 4 бит — разрешение приема, 6,7 — номер режима (первый).

Остальные подпрограммы выполняются в бесконечном цикле.

Блок анализа и реализации команд, принятых от персонального компьютера. Включает проверку 6 типов команд: 0×01, 0×02, 0×03, 0×04, 0×05, 0×06. Команда 0×01 -сброс. Производится сброс предыдущих команд. Команда 0×02, 0×03, 0×04 — открытие клапанов 1,2,3. Команда 0×05 — запуск насоса. Команда 0×06 — запуск двигателя.

Блок считывания температуры с датчика. Все сеансы приема данных с датчика начинаются подачей в линию сигнала обнуления RESET (init_18s20()). В переменную D (на линию DQ датчика) устанавливается значение 0, которое удерживается 500 мкс. Затем в эту же переменную записывается 1 (70 мкс). В ответ датчик должен выдать в линию сигнал наличия (Presence) длительностью 60… 240 мкс. В программе после вывода сигнала reset проверяется наличие сигнала наличия. Затем устанавливается задержка в 120 мкс. Затем передаются управляющие команды 0xCC и 0×44 для начала измерения температуры (write_18s20(0xcc); write_18s20(0×44)). Для этого организован цикл от 0 до 7, выставляется в переменную D логический 0, удерживается 15 мкс. Затем выставляется младший бит команды, выполняется задержка длительностью 60 мкс (передача каждого бита длится 60 мкс), производится циклический сдвиг команды вправо. Таким образом, при следующих проходах будут выставлены остальные биты команды. Далее посылаются команды для начала считывания температуры с датчика 0хСС и 0хВЕ (write_18s20(0xcc); write_18s20(0xbe)). После этого производится непосредственно чтение данных, выставленных датчиком на шину (read_18s20()). Снова организуется цикл от 0 до 7, в котором на шину выставляется ноль, делается задержка в 15 мкс, затем единица (45 мкс), после которой датчик выставляет младший бит температуры на DQ. То есть необходимо считать значение переменной D и поместить его в бит CY регистра признаков PSW, затем выполнить сдвиг переменной вправо для того, чтобы туда автоматически записался бит, хранимый в CY. Снова сделать задержку 80 мкс. Таким образом, по окончанию цикла в переменной будет значение температуры.

Блок считывания давления с датчика. Дачтчик постоянно передает на линию данные. В переменную D (на линию DQ датчика) устанавливается значение 0, которое удерживается 500 мкс. Затем в эту же переменную записывается 1 (70 мкс). Затем устанавливается задержка в 120 мкс. После этого производится непосредственно чтение данных, выставленных датчиком на шину (read_18s20()). Снова организуется цикл от 0 до 7, в котором на шину выставляется ноль, делается задержка в 15 мкс, затем единица (45 мкс), после которой датчик выставляет младший бит температуры на DQ. То есть необходимо считать значение переменной D и поместить его в бит CY регистра признаков PSW, затем выполнить сдвиг переменной вправо для того, чтобы туда автоматически записался бит, хранимый в CY. Снова сделать задержку 80 мкс. Таким образом, по окончанию цикла в переменной будет значение давления.

В Цикле постоянно ведется сравнение температур и давления с минимальными и максимальными значениями соответственно, и регулирование полученных данных посредством запуска двигателя, тэна и клапана.

Листинги программ с комментариями приведены в приложении 2.

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

Интерфейс 1 Ware

Протокол 1 WIRE определяет структуру сообщений, которая используется и распознаётся устройствами, подключёнными к однопроводному интерфейсу.

Он описывает способ запроса устройством (ведущим) доступа к другим устройствам (ведомым) и способ ответа на запросы. Обмен сообщениями по линии связи возможен при наличии в сети одного ведущего устройства и одного или нескольких ведомых устройств. Сообщения могут быть нескольких видов: — инициализация линии; - команды доступа к ПЗУ; - команды доступа к памяти; - команды чтения данных. Обмен сообщениями по 1 WIRE начинается с инициализирующей последовательности, состоящей из импульса сброса, передаваемой ведущим и ответным импульсом присутствия. Появление импульса присутствия является признаком наличия в линии одного или нескольких ведомых устройств. После получения импульса присутствия ведущий может отправить одну из следующих команд доступа к ПЗУ: — Команда чтения ПЗУ [33h]. Эта команда позволяет прочитать идентификатор устройства, 48 битный серийный номер и контрольную сумму. Эта команда может быть использована только при наличии одного ведомого на линии во избежание коллизий при одновременном ответе нескольких устройств. — Команда совпадения ПЗУ [55h]. Эта команда, за которой следует 64 битный уникальный код устройства, позволяет ведущему получить доступ к конкретному устройству при наличии нескольких устройств на линии. — Команда пропуска ПЗУ [CCh]. Команда применима только в том случае, если на линии присутствует только одно устройство и обеспечивает доступ к нему без передачи уникального серийного номера. — Команда поиска ПЗУ [F0h]. Эта команда используется для определения серийных номеров всех устройств 1 WIRE После команды выбора ПЗУ в линию связи может быть передана одна из следующих команд транспортного уровня: — Команда чтения регистра статуса [20h]. Установленный в единицу 5 бит ответного сообщения указывает на готовность нового результата давления, ещё не прочитанного ведущим. Бит 5 сбрасывается в 0 при чтении результата. — Чтение значения давления [03h]. Ответное сообщение преобразователей содержит три информационных байта и CRC. Первый байт содержит старшую часть давления в двоично-десятичном виде; второй — младшую часть; третий байт имеет следующую структуру: D7 — знак числа (0 — положительное, 1 — отрицательное); D6… D4 — положение десятичной точки в числе, представленном 1 и 2 информационными байтами; D3 — резерв; D2… D0 — размерность полученной величины (0 — кПа, 1 — МПа, 2 — кГс/см2, 3 — % от верхнего предела измерений).

Вычисление контрольной суммы:

Прием байта начинается с младшего бита. Вначале идет байт кода семейства. За кодом семейства идет 6 байт серийного номера, начиная с младшего. Затем идет байт контрольной суммы (CRC). В вычислении байта контрольной суммы принимают участие первые 7 байт, или 56 передаваемых бит. Для вычисления используется следующий полином:

CRC = X8+X5+X4+1

После вычисления контрольной суммы мастер должен сравнить получившееся значение с переданной CRC. Если эти значения совпадают, значит прием данных прошел без ошибок. Можно также вычислить контрольную сумму для всех 64 принятых бит, тогда результат должен быть равен нулю. Блок-схема алгоритма вычисления контрольной суммы показана на рис. 9. Алгоритм использует операции сдвига и «исключающего или». Квадратиками показаны биты переменной, которая используется для вычисления CRC. Перед вычислением её необходимо обнулить, а затем на вход алгоритма нужно последовательно подать 56 принятых бит в том порядке, в котором они были приняты. В результате переменная будет содержать значение CRC.

Интерфейс RS 232

Интерфейс RS-232-C соединяет два устройства. Линия передачи первого устройства соединяется с линией приема второго и наоборот (полный дуплекс) Для управления соединенными устройствами используется программное подтверждение (введение в поток передаваемых данных соответствующих управляющих символов). Возможна организация аппаратного подтверждения путем организации дополнительных RS-232 линий для обеспечения функций определения статуса и управления.

Порядок обмена по интерфейсу RS-232C

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

Направление

Описание

Контакт (25-контактный разъем)

Контакт (9-контактный разъем)

DCD

IN

Carrie Detect (Определение несущей)

8

1

RXD

IN

Receive Data (Принимаемые данные)

3

2

TXD

OUT

Transmit Data (Передаваемые данные)

2

3

DTR

OUT

Data Terminal Ready (Готовность терминала)

20

4

GND

-

System Ground (Корпус системы)

7

5

DSR

IN

Data Set Ready (Готовность данных)

6

6

RTS

OUT

Request to Send (Запрос на отправку)

4

7

CTS

IN

Clear to Send (Готовность приема)

5

8

RI

IN

Ring Indicator (Индикатор)

22

9

Интерфейс RS-232C предназначен для подключения к компьютеру стандартных внешних устройств (принтера, сканера, модема, мыши и др.), а также для связи компьютеров между собой. Основными преимуществами использования RS-232C являются возможность передачи на значительно большие расстояния и гораздо более простой соединительный кабель. В то же время работать с ним несколько сложнее. Данные в RS-232C передаются в последовательном коде побайтно. Каждый байт обрамляется стартовым и стоповыми битами. Данные могут передаваться как в одну, так и в другую сторону (дуплексный режим).

Компьютер имеет 25-контактный (DB25P) или 9-контактный (DB9P) разъем для подключения RS-232C. Назначение контактов разъема приведено в таблице.

Назначение сигналов следующее. FG — защитное заземление (экран). -TxD — данные, передаваемые компьютером в последовательном коде (логика отрицательная). -RxD — данные, принимаемые компьютером в последовательном коде (логика отрицательная). RTS — сигнал запроса передачи. Активен во все время передачи. CTS — сигнал сброса (очистки) для передачи. Активен во все время передачи. Говорит о готовности приемника. DSR — готовность данных. Используется для задания режима модема. SG — сигнальное заземление, нулевой провод. DCD — обнаружение несущей данных (детектирование принимаемого сигнала). DTR — готовность выходных данных. RI — индикатор вызова. Говорит о приеме модемом сигнала вызова по телефонной сети.

Рис. 9 — Формат данных RS-232C

Приложение 1

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

Приложение 2

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

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

#include < REGS53. H>

#include < dmd331. c>

sbit but1=P34;

sbit but2=P35;

sbit but3=P36;

sbit k1=P14;

sbit k2=P14;

sbit k3=P15;

sbit k4=P16;

sbit nasos=P10;

sbit ten=P11;

sbit dvig=P12;

sbit electrod1=P27;

sbit electrod2=P26;

sbit electrod3=P25;

sbit electrod4=P24;

int davlenie;

int temp[]; //для хранения 3-х значений температур

int j=0; //для организации цикла обращения к термометрам

int nom_urovnya=0;

char nomer_texta=0;

char nachat_process=0;

char flag=1;

unsigned char rs=0;

int sec, min, hour, nach_hour, nach_min, konec_hour, konec_min; //переменные, в которых храняться значения секунд, минут и часов

char kod[]={0×30,0×31,0×32,0×33,0×34,0×35,0×36,0×37,0×38,0×39}; //коды цифр 0. 9

void timer2(void) interrupt 5//прерывание таймера2 для подсчета времени

{

int i;

i++; //по каждому прерыванию (переполнению) переменная i наращивается

if (i==16)//как только i станет равным 16, значит прошла 1 секунда (1 машин цыкл=1мкс, т. е. за одно переполнение пройдет 65 536мкс (0. 65 536сек). неоходимо 15ю. 25 переполнения для одной секунды

{

sec++; //наращевание секунд

i=0;

TH2=0xBD; //задаем начальные значения TH2 и TL2.

TL2=0xC6; //0,258 791 — это 16 954 машин цыклов. 65 536−16 954 = 48 582. 48582(10)=BDC6(16)

}

if (sec==60){min++; sec=0; }//если кол-во сек=60, мин увеличив-ся на 1

if (min==60){hour++; min=0; }//если кол-во мин=60, часы увеличив-ся на 1

if (hour==24)hour=0; //если кол-во=24, обнуляем.

}

void timer0(void) interrupt 1//прерывание таймера 0 для подсчета времени

{

int i;

i++;

if (i==4800)//5 минут

{TR0=0;

dvig=0;

}

}

void int0(void) interrupt 0 //прерывание от внешнего источника int0 (клавиатура)

{

if (but1==1 & & but2==1 & & but3==1)start ();

if (but1==1 & & but2==1 & & but3==0)

{

nom_urovnya++;

k1=1; // открытие клапана 1

nomer_texta=1;

vivod_lcd (nomer_texta);

kontrol_elc (nom_urovnya);

vivod_lcd (6); //pusto

}

if (but1==1 & & but2==0 & & but3==1)

{

nom_urovnya++;

k2=1; //открытие клапана 2

nomer_texta=2;

vivod_lcd (nomer_texta);

kontrol_elc (nom_urovnya);

vivod_lcd (6); // пустая строка

}

if (but1==1 & & but2==0 & & but3==0)

{

nom_urovnya++;

k3=1; //открытие клапана 3

nomer_texta=3;

vivod_lcd (nomer_texta);

kontrol_elc (nom_urovnya);

vivod_lcd (6);

}

if (but1==0 & & but2==1 & & but3==1)//насос

{

nasos=1; //запуск насоса

nomer_texta=4;

vivod_lcd (nomer_texta);

flag=1;

while (flag)

{

if (electrod1==0) {nasos=0; flag=0}

}

vivod_lcd (6);

}

if (but1==0 & & but2==1 & & but3==0)//двигатель

{

dvig=1; //запуск двигателя

nomer_texta=5;

vivod_lcd (nomer_texta);

TR0=1; //запуск таймера

vivod_lcd (6);

nachat_process=1;

}

}

void sint (void) interrupt 4//прерывание последовательного порта (RS-232)

{

if (RI){

rs=SBUF; //помещаем в переменную rs232 то, что лежит в буфере

}

RI=0; //флаг прерывания приемника устанавливаем в 0

}

void kontrol_elc (nom_urovnya)//проверка уровня

{flag=1;

while (flag){

if (nom_urovnya==1 & & electrod2==1){k1=0; k2=0;k3=0; flag=0};

if (nom_urovnya==2 & & electrod3==1){k1=0; k2=0;k3=0; flag=0};

if (nom_urovnya==3 & & electrod4==1){k1=0; k2=0;k3=0; flag=0};

}

}

void vivod_lcd (nomer_texta)//вывод на LCD

{

#define rw P3. 6

#define rs P3. 7

unsigned char init[]={0×08,0x3c, 0×06,0x0f, 0×01};

unsigned char i; /*counter*/

unsigned int j, k;

unsigned char text;

if (nomer_texta==1) text[]={0,0×52,0×45,0×41,0×47,0×45,0x4E, 0×54,0×31}; //реагент 1

if (nomer_texta==2) text[]={0,0×52,0×45,0×41,0×47,0×45,0x4E, 0×54,0×32}; //реагент 2

if (nomer_texta==3) text[]={0,0×52,0×45,0×41,0×47,0×45,0x4E, 0×54,0×33}; //реагент 3

if (nomer_texta==4) text[]={0,0x5 °F, 0x4E, 0×41,0×53,0x4 °F, 0×53,0x5 °F, 0x5F}; //насос

if (nomer_texta==5) text[]={0,0×44,0×56,0×49,0×47,0×41,0×54,0×45,0x4C}; //двигатель

if (nomer_texta==6) text[]={0,0x5 °F, 0x5 °F, 0x5 °F, 0x5 °F, 0x5 °F, 0x5 °F, 0x5 °F, 0x5F}; //_______

if (nomer_texta==7) text[]={0,0x5 °F, 0×50,0×52,0x4 °F, 0×43,0×45,0×53,0×53}; //процесс

i=0;

while (i< 5)

{

rs=0; rw=1;

while ((out & 0×80) ≠0); //ожидание готовности

rs=0; rw=0; //установка командного режима

out=init[i]; //инициализация

i++;

}

i=0;

while (i< 8)

{rs=0; rw=1;

while ((out & 0×80) ≠0); //ожидание готовности

rs=1; rw=0; //установка режима приема данных

out=text[i]; //запись данных

i++;

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

for (k=0; k<12 000;k++);

}

}

void start ()//включение и обнуление

{

nom_urovnya =0;

}

void main ()

{

// УСТАНОВКА РЕЖИМОВ ТАЙМЕРОВ И РЕГИСТРОВ

TMOD=0xA9; // первый режим для t0, второй режим для t1 — работа с rs-232

T2MOD=0×03; // установка таймера 2

TH0=0×00;

TL0=0×00;

TH2=0xBD; // первое переполнение 48 582,

TL2=0xC6; //другие 15 переполнений произойдут с коэф. пересчета 65 536

ET0=1; //разрешение прерывания от таймера 0

ET1=1; // разрешение прерывания от таймера 1

ET2=1; // разрешение прерывания от таймера 2

EA=1; //разрешение всех прерываний

EX0=1; //разрешение прерывания от от внешнего источника 0 (клавиатура)

TR0 = 1; //будет в main программный запуск таймера 0 (режим 1)

TR2 = 1;

//rs232

PCON = 0×80; // 80(16)=1 000 0000(2) — двойная скорость передачи последовательного канала

TH1 = 0xF9; //необходимая скорость передачи 9600bod. 12KHz — частота тактового генератора

TL1 = 0xF9; //(256 — (12 000 / (192 * 9600)))=249. 249(10)=f9(16)

ES = 1; // разрешение прерывания от последовательного приемо-передатчика

SCON = 0×50; //101 0000(2). 4 бит — разрешение приема; 6,7 — номер режима (первый)

TR1 = 1; //будет в main программный запуск таймера 1 (режим 2)

PX0 = 1;

PS = 0;

while (1)

{

if (nachat_process==1)

{

char kod_datchika;

vivod_lcd (7);

nach_min=min;

nach_hour=hour;

//опрос температуры

izm_temp:

init_18s20(); //посылка сигнала RESET, подтверждение наличия датчика

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

{

if (j==1) kod_datchika=0xD1;

if (j==2) kod_datchika=0xD2;

if (j==3) kod_datchika=0xD3;

write_18s20(kod_datchika); //посылка управляющих команд для начала

write_18s20(0×44); //измерение температуры

init_18s20();

write_18s20(kod_datchika); // посылка управляющих команд для начала

write_18s20(0xbe); //считывание температуры

temp[j]=read_18s20(); //процедура считывания температуры

}

if (temp[1]≠temp[2]≠temp[3])

{

dvig=1;

nomer_texta=5;

vivod_lcd (nomer_texta);

TR0=1; //запуск таймера

vivod_lcd (6);

izm_temp;

}

else

{

if (temp[1]< 0×14)

{

ten=1;

//опрос давления

while (davlenie> 0x0A)

{

init_dmd ();

davlenie=read_dmd ();

k4=1; //открыть клапан4

}

k4=0;

}

izm_temp;

else

{

ten=0;

//опрос давления

while (davlenie> 0x0A)

{

init_dmd ();

davlenie=read_dmd ();

k4=1;

}

k4=0; nachat_process=0;

}

}

konec_hour=hour;

konec_min=min;

x=nach_hour/10; //делим часы на 10

frc_part = modf (x, & int_part);//дробная часть (еденицы) frc_part, целая (десятки) в int_part

y=nach_min/10;

frc_party = modf (x, & int_party);

x1=konec_hour/10; //делим часы окончания на 10

frc_part1 = modf (x, & int_part1);

y1=konec_min/10;

frc_party1 = modf (x, & int_party1);

cifra[2]=0x3A; // «: «

cifra[5]=0x2D; // «-»

cifra[8]=0x3A;

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

{

if (int_part==i) cifra[0]=kod[i];

if (frc_part==i) cifra[1]=kod[i];

if (int_party==i) cifra[3]=kod[i];

if (frc_party==i) cifra[4]=kod[i];

if (int_part1==i) cifra[6]=kod[i];

if (frc_part1==i) cifra[7]=kod[i];

if (int_party1==i) cifra[9]=kod[i];

if (frc_party1==i) cifra[10]=kod[i];

}

vivod_lcd (cifra[]);

}

if (rs=0×01) {start (); }//1 команда

if (rs=0×02)// 2 команда

{

nom_urovnya++;

k1=1; //открыть клапан

nomer_texta=1;

vivod_lcd (nomer_texta);

kontrol_elc (nom_urovnya);

vivod_lcd (6); //пусто

}

if (rs=0×03)//3 команда

{

nom_urovnya++;

k3=1; //открытие клапана

nomer_texta=3;

vivod_lcd (nomer_texta);

kontrol_elc (nom_urovnya);

vivod_lcd (6); //pusto

}

if (rs=0×04)

{

nom_urovnya++;

k3=1; //открытие клапана

nomer_texta=3;

vivod_lcd (nomer_texta);

kontrol_elc (nom_urovnya);

vivod_lcd (6); //пустая строка

}

if (rs=0×05)

{

nasos=1; //запуск насоса

nomer_texta=4;

vivod_lcd (nomer_texta);

flag=1;

while (flag)

{

if (electrod1==0) {nasos=0; flag=0}

}

vivod_lcd (6); //пусто

}

if (rs=0×06)

{

dvig=1; //запуск двигателя

nomer_texta=5;

vivod_lcd (nomer_texta);

TR0=1; //запуск таймера

vivod_lcd (6); //пусто

nachat_process=1;

}

}

}

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