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

СОДЕРЖАНИЕ

ВВЕДЕНИЕ

1. ПОСТАНОВКА ЗАДАЧИ

1.1 Описание предметной области

1.1.1 Вступление

1.1.2 Постановка задачи

1.1.3 Сформулируем требования к ПТС

1.1.4 Функциональные требования

1.1.5 Требования качества и надежности

1.1.6 Аналоги устройства

1.1.7 Используемые для решения задачи инструменты

2. Решение задачи

2.1 Решение

2.2 Основные формулы расчёта искомых параметров

2.2.1 Определим ёмкость конденсатора

2.2.2 Определим ёмкостное сопротивление

2.2.3 Определим полное комплексное сопротивление

3. Спецификация

4. Структура программного средства

5. Руководство по использованию устройства

Заключение

Список использованных источников

Приложение 1

Приложение 2

ВВЕДЕНИЕ

Темой данного дипломного проекта является «создание анализатора качества ГСМ». Для создания и разработки данного прибора существуют различные причины, одна из них: использование прибора человеком, который не разбирается в данной области, для определения состояния качества той или иной продукции в жидком агрегатном состоянии (в частности ГСМ). Всё что остаётся проделать: ввести эталонные данные в устройство, для проверки отклонения от него. Ориентируясь на не специалиста – вывод сообщения, либо сигнальное предупреждение об отклонении от допустимых значений. Данное устройство может найти применение в организациях занимающихся эксплуатацией различных видов техники. Ограничение накладывается на температурный режим, стерильность измерения и герметичность прибора, последнее, из списка которого мною может быть учтено.В процессе выполнения проекта мной проделаны следующие виды работ:

Изучена новая предметная область – платы Arduino и Arduino-совместимые.

Найдены, изучены и проанализированы существующие аналогичные методы измерения и анализа качества ГСМ, в том числе метод интегрирования временных интервалов, циклов зарядки-разрядки конденсаторов;

Рассмотрен и выбран за основу вариант контроля качества ГСМ методом измерения ёмкости, диэлектрической проницаемости вещества и удельного сопротивления;

Изучена линейка микроконтроллеров фирмы Atmel;

Проанализированы возможные способы реализации устройства;

Разработан вариант конструкции и электронной части устройства;

Известны анализаторы с пользой оптических элементов, СИД(светодиод)(трёх диапазонов: ближний УФ, видимый спектр, ближний ИК спектр), где анализ состояния вещества ведётся по спектру поглощения оптического диапазона СИД. Недостаток данного способа исследования: относительно сложная система по конструкторской части, электронной и специальных требований к объёму и спектру пропускания корпуса и материала (кристаллический кварц) сосуда, в котором происходит исследование материала. У каждого вещества есть своя диэлектрическая проницаемость (е), удельное сопротивление(Rуд), угол диэлектрических потерь(tgц). Наличие примесей в веществе резко сказываются на данных параметрах. Для этого был разработан датчик в виде плоского конденсатора, устройство измерения данных параметров на базе микроконтроллера. Работа проводилась под операционной системой MSWindows XP/Windows 7. В работе также использовалась Arduino 022(may 2012) и язык программирования Assembler.

1. ПОСТАНОВКА ЗАДАЧИ

1.1 Описание предметной области

1.1.1 Вступление

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

1.1.2 Постановка задачи

Задача, поставленная передо мной, научным руководителем,

сводилась к следующему:

Изучить предметную область. В том числе методы измерения электрической ёмкости.

Найти и изучить аналогичные устройства. В том числе спектрометр – анализатор веществ на базе СИД, измеритель ёмкости и ЭПС конденсатора на базе МК, разработка принципиальной электрической схемы, расчёт параметров схемы и изготовления макета устройства.

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

Выбрать компоненты ПТС. В том числе управляющий микроконтроллер, устройство индикации, устройство съёма данных со щупа, устройство сбрасывания для цикличности измерений, автономность работы прибора без подключения к электрической сети, либо ПК.

Разработка и реализация частей ПТС и ПС микроконтроллера.

октанометр конденсатор сопротивление

1.1.3 Сформулируем требования к ПТС

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

Программная часть не должна превышать 14кБ.

Программный код должен быть написан на языке С используя программную оболочку и компилятор Arduino, либо Assembler используя программную оболочку и компилятор AVRstudio 4.

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

Техническая компонента проекта имеет требование: определение угла диэлектрических потерь, удельное сопротивление, температурный режим: от -10 до 85?С(градусов Цельсия),область измерения ёмкости от 500пФ(5 *10-10Фарад) и до 67,5нФ(6,75 * 10-8 Фарад),выходное напряжение от батареи не менее 5 и не более 9 вольт.

Устройство должно иметь малые габаритные параметры.

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

Анализатор качества нельзя использовать во взрывоопасных помещениях;

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

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

1.1.4 Функциональные требования

Бесперебойность работы устройства.

Снятие сигнала со щупа и обработка его в МК.

Запоминание всего массива данных в энергонезависимую память.

Вывод полученной с АЦП и переработанной в МК информации на графический ЖК-дисплей в процентном соотношении чистого и измеряемого ГСМ.

1.1.5 Требования качества и надежности

Показатель надежности:

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

1.1.6 Аналог и устройства

У разработанного устройства существуют несколько аналогов:

Измеритель ёмкости и ЭПС (эквивалентным последовательным сопротивлением конденсатора) и ёмкости конденсатора;

Октанометр;

Анализатор качества на основе СИД;

Принцип работы измерителя ёмкости основан на определении двух параметров – ЭПС и ёмкости измеряемого конденсатора. У каждого вещества, находящегося в стабильном жидком агрегатном состоянии при условии, что оно не реагирует с воздухом и щупами, либо минимально (для того, чтобы данные реакции не мешали процессу определения качества вещества) можно определить три изменяющихся параметра: уголдиэлектрических потерь, электроёмкость, удельное сопротивление. В данном аналоге измеряются только два параметра: ёмкость конденсатора или вещества, которое при определённых условиях одно и тоже: эквивалентное последовательное сопротивление конденсатора. К двум контактам, которые крепятся на измеряемый конденсатор: от МК (микроконтроллера) поступает команда на зарядку измеряемого конденсатора, далее сигнал от заряженного конденсатора переходит обратно, где он обрабатывается – высчитываются измеряемые параметры; после чего идёт команда разрядки измеряемого конденсатора. Все обработанные данные и переведённые в процентное отношение поступает на вывод устройства индикации (ЖКИ дисплей).

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

Анализатор качества на базе СИД или кварцевый спектрометроснован на трёх диапазонах: ультрафиолетовый, инфракрасный, видимый. Эти три диапазона испускает СИД. Основная проблема создания – измерительная химическая посуда должна состоять не из стекла, а из специально очищенного кварца, что весьма не дёшево. Основной параметр, измеряемый данным устройством – длина волны излучаемого света из СИД на колбу с измеряемым веществом.

1.1.7 Используемые для решения задачи инструменты

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

Комплект SeeeduinoV2.21 (ATmega168);

Графический ЖК-дисплей WG1602J-YYB-CTK;

Микроконтроллер ATtuny2313;

Щуп измерений.

Щуп измерительный состоит из: 2 медных пластин (обкладок конденсатора) с присадками от окисления, от них исходящих проводов в изоляционной трубке из ПВХ (поливинилхлорид) (либо другого пластика),подсоединённых к узлу измерения и сброса.

Графический ЖК-дисплей WG1602J-YYB-CTK 2-строчный состоит из матрицы 128х64 пикселей. Подобный дисплей позволяет выводить информацию в графическом виде. В моём случае для простоты исследования и использования устройства необходимо выводить информацию в виде процентных соотношений, либо чётких параметров.

ATtiny2313 имеет следующие особенности: 2кБ встроенной программируемой flash-памяти программ,128 байт EEPROM, 128 байт SRAM, 18 общих линий ввода – вывода общего назначения

Программное обеспечение: Arduino 0.22, компилятор для Assembler – AVRstudio4, MicrosoftWord/Point, P-CAD 2006.Программа«Arduino» выбрано не случайно, потому как Seeeduino работает только с таким компилятором-отладчиком. На этапе разработки возникла необходимость использования разведённой платы SeeeduinoV2.21 (ATmega 168). Seeeduino является Arduino совместимой платой. Плата имеет микроконтроллер Atmega168 с 16 КБ программируемой Flash-памятью, и 1024Б EEPROM-памяти. Также на плате присутствует I2C порт, 14 цифровых входов/выходов и 6 ШИМ выводов. Тактовая частота 18МГц. На основе Seeeduino V2.21 был создан отладочный стенд для макетирования всех процессов. Для более упрощённой работы был выбран МК Attiny2313.

2. РЕШЕНИЕ ЗАДАЧИ

2.1 Решение

Для решения поставленной задачи была изучена функциональная схема аналогичного устройства – прототип «Измерение ёмкости и ЭПС конденсатора» (см. рис 1.). Для разрабатываемого устройства была разработана функциональная блок-схема (см. рис. 2).

Принципиальная схема «измеритель емкости и ЭПС конденсаторов»

Рис. 1 – Принципиальная схема «измеритель емкости и ЭПС конденсаторов»

Компараторы DA1.1-DA1.2 служат для определения интервала времени: t1,t2.

В процессе работы над проектом были составлены необходимые требования: диапазон измерения ёмкости конденсатора от 500пФ до 67.5нФ, следовательно, необходимо переделывать часть схемы с биполярными транзисторами, по причине того, что управляющие токи не соответствуют необходимому требованию измерений ёмкости. Для простоты и удобства создания устройства и пользования его был заменён Attiny2313 на Atmega168. В процессе разработки проекта – были устранены некоторые узлы в схеме: узел питания и com-порт. Представленный аналог работает следующим образом: измеряются два интервала времени t1, и t2, в течение которых напряжение между обкладками конденсатора при его зарядке неизменным током I достигает значений соответственно U и U2. Все эти величины значения связаны с параметрами конденсатора следующим образом:

U1=I(Rэп+t1/C);U2=I(Rэп+t2/c).

Зная их, можно независимо вычислить емкость и ЭПС конденсатора

Тактовый генератор микроконтроллера работает с внешним кварцевым резонатором ZQ1.Это обеспечивает необходимую точность программного измерения интервалов времени. Уточним, какие выводы за что отвечают:

1. PDO и PD4 – выходы управления генераторами соответственно большого (Iб=7,69 мА) и малого (IМ=0,513 мА) тока зарядки измеряемого конденсатора;

2. PD1 – выход передатчика (TXD) модуля USART, обеспечивающего связь с компьютером;

3. PD2 и РDЗ – входы запросов прерывания;

4. PD5 – выход управления транзистором VT3, разряжающим измеряемый конденсатор;

5. PD6 – вход сигнала от кнопки SB3;

6. РВО – выход сигнала управления питанием;

7. РВ1 – инвертирующий вход встроенного в микроконтроллер аналогового компаратора;

8. РВ2-РВ7-выходы сигналов управления ЖКИ HG1. Не инвертирующий вход аналогового компаратора программно подключен к встроенному в микроконтроллер источнику образцового напряжения 1,0… 1,2 В. Модуль USART программа настраивает на работу в асинхронном режиме со скоростью 9600 бит/спри восьми информационных и одном стоповом разряде без контроля четности. Информация пересылается только в направлении от прибора к компьютеру. Узел питания прибора состоит из аккумуляторной батареи GB1, гнезда XS1 для подключения внешнего источника питания, транзисторов VT4 и VT5. интегрального стабилизатора DA2, кнопок SB1 (включение прибора) и SB2(его выключение), а также связанных с этими элементами резисторов и конденсаторов. Подаваемое на вход РВ1 микроконтроллера напряжение с выхода резистивного делителя R16R17 предназначено для программного контроля напряжения питания.

Диоды VD3, VD4 служат для защиты прибора от повреждения в случае подключения к нему для измерения, заряженного конденсатора. Компараторы DA1.1 и DA1.2 сравнивают напряжение на измеряемом конденсаторе с заданными делителем из резисторов R6, R9, R10 пороговыми значениями U1 и U2. Подстроенным резистором R19 регулируют контрастность изображения на табло ЖКИ, а резистор R20 ограничивает ток в цепи его подсветки. Выключателем SA2 подсветку включают и выключают. Кнопка SB3 – внесение поправки в результаты измерения и ее исключение, переход в режим отладки. Транзисторный оптрон U1 согласует уровни сигналов микроконтроллера и СОМ-порта компьютера, одновременно обеспечивая их гальваническую развязку. Для питания этого узла со стороны компьютера используется импульсное напряжение на линии TXD СОМ-порта. Это напряжение выпрямляет диод VD5 и сглаживает конденсатор С9. Резистор R18 – коллекторная нагрузка фототранзистора оптрона. При разомкнутом выключателе SA1 связь с компьютером отсутствует. Для снижения погрешности малые значения емкости (0.1… 150 мкФ) измеряют при малом токе зарядки (IM). Генератор этого тока собран на элементах VT2, VD2, R2, R4 Он включен при низком логическом уровне напряжения на выходе PD0 микроконтроллера. Измерение ЭПС при таком токе оказывается недостаточно точным за счет влияния утечки тока через диод VD3 и входные цепи компараторов DA1.1, DA1.2. По этой причине ЭПС конденсаторов любой емкости измеряется при увеличенном токе зарядки (Iб), генератор которого состоит из элементов VT1, VD1, R1, R3 и включается низким уровнем на выходе PD4 микроконтроллера. Стоит отметить, что на результат измерения емкости эта утечка влияет значительно меньше. Однако, чтобы предотвратить раннее переполнение программного счетчика времени, емкость более 150 мкФ измеряется при токе зарядки Iб. Включают прибор нажатием на кнопку SB 1, при этом с выхода стабилизатора DA2 напряжение питания поступает на микроконтроллер DD1. Он начинает работать и по окончании предварительных операций устанавливает на выводе 12 низкий логический уровень. Транзистор VT4 открывается, что приводит и к открыванию полевого транзистора VT5. Зашунтировав кнопку SB1, он удерживает прибор включенным и после ее отпускания. Для выключения прибора нажимают на кнопку SB2. Закрывшийся транзистор VT5 разомкнет минусовую цепь батареи GB1 или подключенного к гнезду XS1 внешнего источника питания. Кнопку следует удерживать нажатой не менее 0,5 с, пока не разрядятся конденсаторы узла питания. Выключение происходит автоматически, без нажатия на кнопку SB2 при одном из следующих условий (в скобках указано время, в течение которого условие должно оставаться выполненным): – к гнездам XS2, XS3 не подключен измеряемый конденсатор (4,5 мин); – напряжение питания микроконтроллера упало ниже 5В (2…4 мин); – гнезда XS2, XS3 замкнуты или емкость подключенного к ним конденсатора превышает верхний предел измерения (50 с). На результат измерения (особенно малых значений емкости) оказывают влияние такие факторы, как задержка переключения транзистора VT3, сопротивление его канала в открытом состоянии, емкость между стоком и истоком, а также задержка срабатывания компараторов DA1.1, DA1.2.

Вернёмся к решению поставленной задачи по созданию анализатора качества ГСМ и рассмотрим функциональную блок-схему решения поставленной задачи (см. Рис. 3).Функциональная блок-схема решения задачи

Рис. 2

2.2 Основные формулы расчёта искомых параметров

Для определения необходимых измеряемых значений существует формулы-связки:

Ёмкость конденсатора:

C = = = ;

Z=v (Rэ2+Xc2).

2.2.1 Определим ёмкость конденсатора

Произведём расчётные данные по определению ёмкости конденсатора с размерами обкладок:h(высота контактов датчика погружённого в жидкость), d (расстояние между обкладками датчика),S(площадь обкладки) в вакууме, воздухе и в эталонном масле.D=0,2см,S=2см2, е0(диэлектрическая постоянная вакуума):е0 ? 8,85 х 10-12Ф/м, е = еr(относительная диэлектрическая проницаемость измеряемого вещества): е = Сх (ёмкость тестового конденсатора)/ С0 (ёмкость конденсатора в вакууме).

Итак, в вакууме величина ёмкости конденсатора:

В воздухе(сухом):(((8,85 х 10-10Ф/см) *1,00025(е-r(воздуха)) * 2см) / 0,2)=8,85нФ.

Расчёт ёмкости трансформаторного масла: ((8,85 * 10-10 Ф/см) *2,2(еr)* 2см) / 0,2)=19,48нФ.

2.2.2 Определим ёмкостное сопротивление

Возьмём 2р = 6,28;Частота сигнала f=1/(3RC);

R=(1/180+1/32+1/5,1+1/2+1/2)=(1/41280)=2,42*10-5Ом;

Для воздуха(сухого):T=3*R*C (время заряда 95% С) =3*2,42*10-5Ом*8,85*10-9Ф=7,26*10-5*8,85*10-9=0,64*10-12с=0,64пс(пикоcекунда).

f=1/T=1/0,64=1,55Гц.

Xc(воздух)=1/(6,28*1,55*0,00000000885)=0,0000000861459Ом.

Для трансформаторного масла:

T=3*R*C (время заряда 95% С) = 3*2,42*10-5Ом*19,47*10-9Ф=1,42*10-12с=1,42пс (пикосекунда).

f=1/T=1/(1,42*10-12)=706394034531Гц.

Xc(трансформаторное масло)=1/(6,28*19,47*10-9)=0,0000001222716 Ом.

2.2.3 Определим полное комплексное сопротивление

Для воздуха:

Z= v (Rэ2+Xc2) =v ((2,42)2*10-10Ом) + ((0,00000008614592) = 0,0000000861459Ом.

Тангенс угла диэлектрических потерь воздуха:

tgц=R/Xc=(2,42*10-5Ом)/(0,0000000861459Ом)=2,8*10-6;

Для трансформаторного масла:

Z= v (Rэ2+Xc2) =v ((2,42)2*10-10Ом)+((0,00000012227162)=0,0000242Ом.

Тангенс угла диэлектрических потерь масла:

tgц=R/Xc=(2,42*10-5Ом)/(0,0000001222716Ом)=2*10-5;

По-простому перевод всех измеряемых значений переводится в %, относительно эталонным значениям. Для проверки составим таблицу (см.табл. 1).

Таблица.1

Параметры

трансформаторное масло

воздух(сухой)

Ёмкость (C)

19,48нФ

8,85нФ

Ёмкостное сопротивление (Xc)

0,0000001222716 Ом

0,0000000861459Ом

Полное компл. сопротивление (Z)

0,0000242 Ом

0,0000000861459Ом

Тангенс угла диэл. потерь (tgц)

2*10-5

2,8*10-6

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

1) Ёмкость: 8,85нФ = 100% 0,085нФ = 1% => 19,48нФ / 0,085нФ = 229,17 %(в сравнении с эталоном)

2) Ёмкостное сопротивление:0,0000000861459Ом=100% 0,000000000861459Ом=1% =>0,0000001222716 Ом = 142%(в сравнении с эталоном).

3) Полное комплексное сопротивление: 0,0000000861459Ом=100% 0,000000000861459Ом=1% =>0,0000242 Ом = 28092%

4) Тангенс угла диэлектрических потерь: 2,8*10-6= 100% 2,8*10-8=1% =>2*10-5 = 714,28%.

2.2.4 Вид общей (принципиальной) схемы

Данная схема (см. рис. 3) является основоположной при создании анализатора качества ГСМ и в ней мы имеем:

1) Щуп, опускаемый в измеряемое вещество(XS3:1,XS3:2);

2) Транзистор (VT3)используемый для сброса заряда накопленного в измеряемом веществе, которое используется какизмеряемый конденсатор;

3) Ключ (K1), используемый для включения/выключения устройства;

4) Кварцевый генератор(ZQ)с частотой выдачи импульса 18МГц для создания тактовой температурно-частотной характеристики;

5) ЖКИ индикатор (WH1602J),необходимый как устройство наглядной индикации параметров, которые измеряются;

6) МК Attiny2313, необходимый для анализа, контроля и вывода параметров на ЖКИ;

7) Узел, содержащий в себе два полевых транзистора (VT2, VT3) является генератором тока. Необходим для зарядки измеряемого конденсатора двумя различными временными параметрами и параметрами разницы напряжений;

8) Стабилизатор напряжения(LM78L05), необходим для переводаиз +9В и стабилизации напряжения номиналом в +5В.

Рис. 3

3. Спецификация

Спецификация элементов схемы:

Обозначение.

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

Кол-во.

R1

Резистор17 Ом

1

R2

Резистор 10КОм

1

R3

Резистор100 Ом

1

R6,R7

Резистор2КОм

2

R5

Резистор 82КОм

1

R4

Резистор 22КОм

1

R8

Резистор180Ом

1

R9

Резистор5.1КОм

1

R11,R12,R13

Резистор3 КОм

3

R15

Резистор1.1КОм

1

R16

Резистор1.3 КОм

1

VT3

Полевой транзистор IRF530

1

DA2

Стабилизатор LM78L05

1

XS3:1

Ввод щупа

1

XS3:2

Ввод щупа

1

VT1,VT2

BSS110

2

VD3,VD4

Диод 2n4007

2

DA2:B,DA3:A

Логическое= = LM393N

2

K1

Ключ (кнопка)

1

L1

Катушка индуктивности 10мкГн

1

C1,C2

Конденсатор 33мкФ

2

C3

Конденсатор 1пФ

1

С4,С8,С9,С10

Конденсатор 0,1мкФ

4

С1,С2

Конденсатор 100мкФ

2

С6,С7

Конденсатор 22пФ

2

ZQ

Кварцевый генератор 18МГц

1

Attiny2313

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

1

VR1

Переменный резистор 10к

1

LCD1

Алфавитно-цифровой ЖК-модуль WH1602J

1

4. Структура программного средства

Структура взаимодействия модулей ПТС (см. Рис. 4)

Рис. 4

Руководство по использованию устройства

Последовательность действий для правильной работы устройства:

Подключить устройство к батарее.

Залить испытуемое вещество на высоту 2 см в измерительный сосуд.

Вставить щуп измерения в измерительное вещество.

Включить кнопку питания(K1).

Получить результат с дисплея.

Вытащить и очистить от остатков жидкости измерительные щупы.

Выключить питание.

При необходимости повторить процедуру.

Заключение

Поставленная передо мной задача создания и разработки малогабаритного анализатора качества ГСМ выполнена на уровне пробной версии устройства. Выполнены все предъявляемые ПТС требования.Для решения этой задачи были проделаны следующие виды работ:

Изучены отладочная плата Seeeduino и язык программирования Arduino, C, Assembler.

Найден, изучен и проанализирован имеющийся аналог устройство измерения ЭПС и ёмкости конденсатора.

Составлено техническое задание.

Составлены требования к ПС и ПТС, функциональные требования и требования к качеству разрабатываемого устройства.

Разработан алгоритм управляющей части ПТС.

Проведён анализ проделанной работы.

Создаваемое устройство более простое в использовании, надёжное и относительно недорогое. Аппаратная компонента разработанного ПТС реализована на микроконтроллере фирмы AtmelAttiny2313 и графическом ЖК-дисплее. Программная компонента устройства написана на языке Assembler. Объём программы не более 2КБ.

Данное устройство может быть использовано для анализа качества ГСМ и любой другой жидкости при предварительной доработке.

В дальнейшем возможна разработка компьютерного интерфейса.

Благодарю за огромный вклад и помощь своего научного руководителя: Коняева Сергея Ивановича.

Список использованных источников

1. Измеритель емкости и ЭПС конденсаторов / В. Келехсашвили / Журнал «Радио».-2010г,- выпуск 6-7 – стр.19-21.

2. Мактас М.Я. «8 уроков по P-CAD 2001»М.: СОЛОН-Пресс,2003 – стр.1-110.

3. У. Титце, К. Шенк Полупроводниковая схемотехника: справочное руководство» М.: МИР,1982 – стр. 56-65.

4. Описание ЖК-дисплея wp602J-datasheet.-4c.

Приложение 1

Аналог разрабатываемого устройства спектрометр-анализатор

Известен спектрометр – анализатор веществ фирмы Brimrose [Бюллетень “AOTFSPECTROSCOPY”, – фирма Brimrose, March, 1993]. Схема, которая представлена на рисунке.

Рис. 4

Где:

1 – источник широкополосного излучения;

2 – оптическая система доставки широкополосного излучения;

3 – акустооптическая ячейка;

4 – генератор высокой частоты;

5 – светоделительная пластина;

6 – опорный канал узкополосного излучения;

7 – сигнальный канал узкополосного излучения;

8 – фотоприемник опорного канала узкополосного излучения;

9 – фотоприемник сигнального канала узкополосного излучения;

10- анализируемое вещество;

11 – световод;

12 – блок обработки и индикации;

13 – собирающие линзы;

14 – светоделительная пластина;

15 – дифференциальный усилитель.

Этот спектрометр-анализатор работает следующим образом. От источника широкополосного излучения (1) излучение посредством оптической системы доставки широкополосного излучения (2) поступает в акустооптическую ячейку (3), которая выделяет из всего спектра названного излучения узкополосное излучение (излучение в узком спектральном диапазоне). Названный узкий спектральный диапазон формируется с помощью генератора высокой частоты (4) и зависит от частоты подаваемого им сигнала на акустооптическую ячейку (3). Полученное узкополосное оптическое излучение, вышедшее из акустооптической ячейки далее разделяется посредством светоделительной пластинки (14), на два пучка, первый из которых (6), направляется по опорному каналу узкополосного излучения на фотоприемник опорного канала (8), а второй направляется по сигнальному каналу узкополосного излучения (7), через световод (11), на анализируемое вещество (10) и далее возвращается через световод (11) и поступает на фотоприемник сигнального канала узкополосного излучения (9). Фотоприемники (8) и (9) преобразуют оптические сигналы в электрические, которые поступают на входы дифференциального усилителя и сравниваются по величине. Разность этих сигналов интерпретируется как функция поглощения (пропускания) веществом оптического сигнала с заданной длиной волны, которая в свою очередь, жестко связана с частотой генератора поступающей на акустооптическую ячейку. Перестраивая с помощью генератора высокой частоты (4) длину волны выделяемого акустооптической ячейкой узкополосного излучения, получают соответствующую спектральную функцию пропускания, или поглощения, т.е. зависимость изменения амплитуды напряжения на выходе дифференциального усилителя пропорционального изменению оптического сигнала на входе фотоприемника (9) во всем спектральном диапазоне длин оптических волн, в котором проводится измерение спектра поглощения (пропускания) анализируемого вещества.Полученная спектрограмма обрабатывается в электронном блоке обработки и индикации (12) и сравнивается со спектрограммой эталонного образца исследуемого вещества, хранящейся в памяти этого блока.

Приложение 2

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

.defsotye = R0;Число сотых долей (1)

.defdesyatye = R1;Число десятых долей (2)

.defedinicy = R2;Число единиц (3)

.defdesyatki = R3;Число десятков (4)

.defsotni = R4;Число сотен тысяч (5)

.deftyshi = R5;Число тысяч (6)

.defdes_tysh= R6;Число десятков тысяч (7)

.defa1 = R7;1-й байт переменной a (младший байт)

.defa2 = R8;2-й байт переменной a

.defa3 = R9;3-й байт переменной a

.defb1 = R10;1-й байт переменной b (младший байт)

.defb2 = R11;2-й байт переменной b

.defb3 = R12;3-й байт переменной b

.defc1 = R13;1-й байт переменной c (младший байт)

.defc2 = R14;2-й байт переменной c

.defc3 = R15;3-й байт переменной c

;——————————————————–

.defc4 = R16;4-й байт переменной c

.deftemp = R17;Определение главного рабочего регистра

.deftemp2 = R18;Определение второго рабочего регистра

.deflcd= R19;Определение регистра для обращения к LCD

.defz1 = R20;1-й байт переменной z (младший байт)

.defz2 = R21;2-й байт переменной z

.defz3 = R22;3-й байт переменной z

.defz4 = R23;4-й байт переменной z

.defk_del= R24;Регистр поправки коеффициента деления таймера

.deftok_zar= R25;Регистр величины тока заряда

.defautoff= R28;Регистр счётчика автовыключения (он же YL)

.defautoff2= R29;Регистр предела измерения в Фарадах (он же YH)

;——————————————————–

.equconst1b = 8548;Константа перевода результата в ёмкость для большего тока (32768)

.equconst1m = 9124;Константа перевода результата в ёмкость для малого тока (524288)

.equconst2 = 2051;Константа 100*U1/Ib

.equconst3 = 3967;Константа 100*U2/Ib

.equconst4 = 129;Константа для задания скорости USART (9600 бит/с)

.equESRmax=2001;Порог максимального значения ESR (20,00 Ом)

.equporog1 = 32700;Порог переключения на младший предел (по U2)

.equporog2 = 15001;Порог переключения на малый ток (150 мкФ)

.equporog3 = 2001;Порог переключения предела на малом токе (20 мкФ)

.equd20m = 65535;Значение длительности паузы (~20мс при 20МГц) (тактов-9)/6

.equd3m = 9999;Значение длительности паузы (~3мс при 20МГц) (тактов-9)/6

.equd40u = 235;Значение длительности паузы (~40мкс при 20МГц) (тактов-4)/3

.equd1u=6;Значение длительности паузы (~1мкс при 20МГц) (тактов-4)/3

.equRS = 2;

.equE = 3;

;————————Начало программного кода

.cseg

.org0;установка текущего адреса на ноль

;————————Переопределение векторов прерываний

start:rjmpinit;Переход на начало программы

rjmpcom_U1;Внешнее прерывание 0

rjmpcom_U2;Внешнее прерывание 1

reti;Таймер/счётчик 1, захват

reti;Таймер/счётчик 1, совпадение, канал А

rjmpovtim1;Таймер/счётчик 1, прерывание по переполнению

reti;Таймер/счётчик 0, прерывание по переполнению

reti;Прерывание USART приём завершён

reti;Прерывание USART регистр данных пуст

reti;Прерывание USART передача завершена

reti;Прерывание по компаратору

reti;Прерывание по изменению на любом контакте

reti;Таймер/счётчик 1, совпадение, канал В

reti;Таймер/счётчик 0, совпадение, канал В

reti;Таймер/счётчик 0, совпадение, канал А

reti;USI готовность к старту

reti;USI переполнение

reti;EEPROM готовность

reti;Переполнение охранного таймера

;———————–Модуль инициализации

init:

;———————–Инициализация стека

lditemp, RAMEND;Выбор адреса внешнего стека

outSPL, temp;Запись его в регистр стека

;———————–Инициализация портов ВВ

lditemp,0b00000100;PA2 на вывод, PA0, PA1 на ввод

outDDRA,temp;

lditemp,0b00000100;Устанавливаем PA2, отключаем резисторы на PA0, PA1

outPORTA,temp;

lditemp,0b11111101;PB0, PB2…PB7 навывод, PB1 наввод

outDDRB,temp;

lditemp,0b00000000;Обнуляем PB1…PB7, устанавливаем PB1 ивключаемрезисторна PB0

outPORTB,temp;

lditemp,0b00110011;PD0, PD1, PD4…PD5 навывод, PD2, PD3, PD6 наввод

outDDRD,temp;

lditemp,0b01111111;Устанавливаем PD0, PD1, PD4…PD5 ивключаемрезисторы PD2, PD3, PD6

outPORTD,temp;

;———————–Инициализация таймера Т1

lditemp,0b00000000;Останов таймера, нормальный режим

outTCCR1B,temp;

;———————–Инициализация компаратора

lditemp,0b01110000;Настройка компаратора

outACSR,temp;

;———————–Определение масок прерываний

lditemp,0b00000000;Выбор режима вызова внешних прерываний PD2 (U1) и PD3 (U2)

outMCUCR,temp;

lditemp,0b00000000;Запрет прерываний по таймеру 1

outTIMSK,temp

lditemp,0b00000000;Запрет внешних прерываний

outGIMSK,temp;

;———————–Инициализация LCD (WH1602J)

lcd_init:

rcalldel20m;Вызов подпрограммы задержки (~20мс)

rcalldel20m;Вызов подпрограммы задержки (~20мс)

rcalldel20m;Вызов подпрограммы задержки (~20мс)

;Команда 0010

sbiPORTB,E;Строб вверх

lditemp,0b00101000;Команда (строб вверх + команда)

outPORTB,temp;Запись команды в порт

rcalldel1u;Вызов подпрограммы задержки (~1мкс)

cbiPORTB,E;Строб вниз

rcalldel1u;Вызов подпрограммы задержки (~1мкс)

ldilcd,0b00101000;Команды 0010 и 1000

rcalllcd_com;Вызов подпрограммы отправки команды на LCD

ldilcd,0b00001000;Команды 0000 и 1000

rcalllcd_com;Вызов подпрограммы отправки команды на LCD

ldilcd,0b00000001;Команды 0000 и 0001

rcalllcd_com;Вызов подпрограммы отправки команды на LCD

rcalldel3m;Вызов подпрограммы задержки (~3мс)

ldilcd,0b00000110;Команды 0000 и 0110

rcalllcd_com;Вызов подпрограммы отправки команды на LCD

;———————–Начало основной программы

cli;Глобально запрещаем прерывания

clrk_del;Очистка k_del

clrtok_zar;Очистка tok_zar

clrautoff;Очистка autoff

clrautoff2;Очистка autoff2

ldilcd,0b00001100;Включение дисплея и выбор курсора

rcalllcd_com;

;———————–Выключение прибора

lditemp,0b01110000;Разрешение перехода в режим Power-Down

outMCUCR,temp;

sbiPORTB,0;Выключение питания

sleep;Переход в режим Power-Down

bat_check1:

clrz1;Очистка z1

clrz2;Очистка z2

lditemp,55;Запись 55 в temp

bat_check2:

dectemp;Уменьшение temp на 1

sbisACSR,ACO;Если на выходе компаратора 1, то пропуск след.команды, иначе далее

rjmpbat_check3;На bat_check3

incz1;Увеличение z1 на 1

rjmpbat_check4;На bat_check4

bat_check3:

incz2;Увеличение z2 на 1

bat_check4:

cpitemp,0;Сравнение temp с 0

brnebat_check2;Если temp<>0, то на bat_check2, иначе далее

cpz1,z2;Сравнение z1 с z2

brlopusk_0;Если z1<z2, то на pusk_0, иначе далее

ldiZL,low(Bat*2);Запись в ZL младшего байта адреса ячейки из таблицы Bat (альтернативная адресация)

ldiZH,high(Bat*2);Запись в ZH старшего байта адреса ячейки из таблицы Bat (альтернативная адресация)

rcalllcd_all;Вызов подпрограммы отображения двух строк на LCD по данным из таблиц

incautoff2;Увеличение autoff2 на 1

;———————–Измерение на большом токе заряда

b_tok:

lditemp,0b00000001;Пуск таймера (clk/1)

addtemp,k_del;с коррекцией коеффициента деления таймера

cbiPORTD,0;Включение заряда конденсатора

outTCCR1B,temp;

rjmpcikl;На cikl

;———————–Измерение на малом токе заряда

m_tok:

lditemp,0b00000001;Пуск таймера (clk/1)

addtemp,k_del;с коррекцией коеффициента деления таймера

cbiPORTD,4;Включение заряда конденсатора

outTCCR1B,temp;

cikl:

rjmpcikl;Зацикливаем

;———————–Умножение (c3+c2+c1)*(XH+XL)=(c4+c3+c2+c1) или (n2-n1)*const1b

ldiXL,low(const1m);Запись младшего байта const1m в XL

ldiXH,high(const1m);Запись старшего байта const1m в XH

rjmpstep6_2;На step6_2

step6_1:

ldiXL,low(const1b);Записьмладшегобайта const1b в XL

ldiXH,high(const1b);Записьстаршегобайта const1b в XH

step6_2:

rcall mul16x16;Вызов подпрограммы перемножения 16-ти битных чисел

;———————–Отображение первой строки LCD

rcalllcd_1str;Вызов подпрограммы отображения первой строки LCD

clrautoff;Очистка autoff

;———————–Умножение (c3+c2+c1)*(XH+XL)=(c4+c3+c2+c1) или (U2/I)*n1

ldiXL,low(const3);Запись младшего байта const3 в XL

ldiXH,high(const3);Запись старшего байта const3 в XH

rcall mul16x16;Вызов подпрограммы перемножения 16-ти битных чисел

movz1,c1;Копирование результата умножения из c1 в z1

movz2,c2;Копирование результата умножения из c2 в z2

movz3,c3;Копирование результата умножения из c3 в z3

movz4,c4;Копирование результата умножения из c4 в z4

movc1,b1;Копирование 1-го байта n2 из b1 в c1

movc2,b2;Копирование 2-го байта n2 из b2 в c2

movc3,b3;Копирование 3-го байта n2 из b3 в c3

;———————–Умножение (c3+c2+c1)*(XH+XL)=(c4+c3+c2+c1) или (U1/I)*n2

ldiXL,low(const2);Запись младшего байта const2 в XL

ldiXH,high(const2);Запись старшего байта const2 в XH

rcall mul16x16;Вызов подпрограммы перемножения 16-ти битных чисел

popa3;Извлечение из стека в a3 (извлечение n2-n1)

popa2;Извлечение из стека в a2

popa1;Извлечение из стека в a1

subc1,z1;Вычитание z1 из c1 ((U1/I)*n2)-((U2/I)*n1)

sbcc2,z2;Вычитание z2 из c2 с учётом переноса

sbcc3,z3;Вычитание z3 из c3 с учётом переноса

sbcc4,z4;Вычитание z4 из c4 с учётом переноса

brplstep8;Если результат положительный, то на step8, иначе далее

ldiZL,low(ESRmn*2);Запись в ZL младшего байта адреса ячейки из таблицы ESRmn (альтернативная адресация)

ldiZH,high(ESRmn*2);Запись в ZH старшего байта адреса ячейки из таблицы ESRmn (альтернативная адресация)

;———————–Отображение второй строки LCD

step10:

rcalllcd_2str;Вызов подпрограммы отображения второй строки LCD

;———————–Подпрограмма отображение первой строки LCD

lcd_1str:

;———————–Отображение ёмкости

ldilcd,0x80;Выбор знакоместа (начало 1й строки)

rcalllcd_com;Вызов подпрограммы отправки команды на LCD

;———————–Отображение “12345” или ” 2345″

clrtemp;Очистка temp

cpdes_tysh,temp;Если значение десятков тысяч не равно нулю, то переход на lcd_1str_4

brnelcd_1str_4;иначе далее

cptyshi,temp;Если значение тысяч не равно нулю, то переход на lcd_1str_3

brnelcd_1str_3;иначе далее

cpsotni,temp;Если значение сотен не равно нулю, то переход на lcd_1str_2

brnelcd_1str_2;иначе далее

cpdesyatki,temp;Если значение десятков не равно нулю, то переход на lcd_1str_0

brnelcd_1str_0;иначе далее

;———————–Отображение ” 5,67″ или “45,67”

ldilcd,0x20;Отображение ” ” (ёмкость)

rcalllcd_dat;

rjmplcd_1str_1;На lcd_1str_1

lcd_1str_0:

cpik_del,4;Сравнение k_del с 4

brnelcd_1str_0_1;Если k_del<>4, тона lcd_1str_0_1

ldilcd,0x30;Отображение “0” (ёмкость)

rcalllcd_dat;

ldilcd,0x2C;Отображение “,” (ёмкость)

rcalllcd_dat;

lcd_1str_0_1:

ldilcd,0x30;Определение кода для числа десятков (ёмкость)

addlcd,desyatki;

rcalllcd_dat;Отображение числа десятков (ёмкость)

lcd_1str_1:

ldilcd,0x30;Определение кода для числа единиц (ёмкость)

addlcd,edinicy;

rcalllcd_dat;Отображение числа единиц (ёмкость)

cpik_del,4;Сравнение k_del с 4

brnelcd_1str_1_1;Если k_del<>4, то на lcd_1str_1_1

ldilcd,0x30;Определение кода для числа десятых долей (ёмкость)

addlcd,desyatye;

rcalllcd_dat;Отображение числа десятых долей (ёмкость)

ldilcd,0x30;Определение кода для числа сотых долей (ёмкость)

addlcd,sotye;

rcalllcd_dat;Отображение числа сотых долей (ёмкость)

ldilcd,0x20;Отображение ” ” (ёмкость)

rcalllcd_dat;

rjmpF_lcd;На F_lcd

lcd_1str_1_1:

ldilcd,0x2C;Отображение “,” (ёмкость)

rcalllcd_dat;

ldilcd,0x30;Определение кода для числа десятых долей (ёмкость)

addlcd,desyatye;

rcalllcd_dat;Отображение числа десятых долей (ёмкость)

ldilcd,0x30;Определение кода для числа сотых долей (ёмкость)

addlcd,sotye;

rcalllcd_dat;Отображение числа сотых долей (ёмкость)

rjmpuF_lcd;На uF_lcd

;———————–Отображение “345,6”

lcd_1str_2:

ldilcd,0x30;Определение кода для числа сотен (ёмкость)

addlcd,sotni;

rcalllcd_dat;Отображение числа сотен (ёмкость)

ldilcd,0x30;Определение кода для числа десятков (ёмкость)

addlcd,desyatki;

rcalllcd_dat;Отображение числа десятков (ёмкость)

ldilcd,0x30;Определение кода для числа единиц (ёмкость)

addlcd,edinicy;

rcalllcd_dat;Отображение числа единиц (ёмкость)

ldilcd,0x2C;Отображение “,” (ёмкость)

rcalllcd_dat;

ldilcd,0x30;Определение кода для числа десятых долей (ёмкость)

addlcd,desyatye;

rcalllcd_dat;Отображение числа десятых долей (ёмкость)

rjmpuF_lcd;На uF_lcd

;———————–Отображение ” 2345″ или “12345”

lcd_1str_3:

ldilcd,0x20;Отображение ” ” (ёмкость)

rcalllcd_dat;

rjmplcd_1str_5;На lcd_1str_5

lcd_1str_4:

ldilcd,0x30;Определение кода для числа десятков тысяч (ёмкость)

addlcd,des_tysh;

rcalllcd_dat;Отображение числа десятков тысяч (ёмкость)

lcd_1str_5:

ldilcd,0x30;Определение кода для числа тысяч (ёмкость)

addlcd,tyshi;

rcalllcd_dat;Отображение числа тысяч (ёмкость)

ldilcd,0x30;Определение кода для числа сотен (ёмкость)

addlcd,sotni;

rcalllcd_dat;Отображение числа сотен (ёмкость)

ldilcd,0x30;Определение кода для числа десятков (ёмкость)

addlcd,desyatki;

rcalllcd_dat;Отображение числа десятков (ёмкость)

ldilcd,0x30;Определение кода для числа единиц (ёмкость)

addlcd,edinicy;

rcalllcd_dat;Отображение числа единиц (ёмкость)

uF_lcd:

ldilcd,0x20;Отображение ” ” (ёмкость)

rcalllcd_dat;

ldilcd,0x75;Отображение “u” (ёмкость)

rcalllcd_dat;

F_lcd:

ldilcd,0x46;Отображение “F” (ёмкость)

rcalllcd_dat;

ret;Выход из подпрограммы

;———————–Подпрограмма отображение второй строки LCD

lcd_2str:

;———————–Отображение ESR

ldilcd,0xC0;Выбор знакоместа (начало 2й строки)

rcalllcd_com;

clrtemp;Очистка temp

cpdesyatki,temp;Если значение десятков равно нулю, то переход на lcd_2str_0

breqlcd_2str_0;иначе далее

ldilcd,0x30;Определение кода для числа десятков (ESR)

addlcd,desyatki;

rcalllcd_dat;Отображение числа десятков (ESR)

rjmplcd_2str_1;Переход на lcd_2str_1

lcd_2str_0:

ldilcd,0x20;Отображение ” ” (ESR)

rcalllcd_dat;

lcd_2str_1:

ldilcd,0x30;Определение кода для числа единиц (ESR)

addlcd,edinicy;

rcalllcd_dat;Отображение числа единиц (ESR)

ldilcd,0x2C;Отображение “,” (ESR)

rcalllcd_dat;

ldilcd,0x30;Определение кода для числа десятых долей (ESR)

addlcd,desyatye;

rcalllcd_dat;Отображение числа десятых долей (ESR)

ldilcd,0x30;Определение кода для числа сотых долей (ESR)

addlcd,sotye;

rcalllcd_dat;Отображение числа сотых долей (ESR)

ldilcd,0x20;Отображение ” ” (ESR)

rcalllcd_dat;

ldilcd,0x4F;Отображение “О” (ESR)

rcalllcd_dat;

ldilcd,0xBC;Отображение “м” (ESR)

rcalllcd_dat;

ret;Выход из подпрограммы

;———————–Подпрограмма отображение сообщений на LCD

lcd_mess:

ldiz4,8;Запись 8 в z4

cpitemp,1;Сравнение temp с 1

brnelcd_mess_2str;Если str не равен 1, то на lcd_mess_2str, иначе далее

lcd_mess_1str:

ldilcd,0x80;Выбор знакоместа (начало 1й строки)

rcalllcd_com;

rjmplcd_mess_0;На lcd_mess_0

lcd_mess_2str:

ldilcd,0xC0;Выбор знакоместа (начало 2й строки)

rcalllcd_com;

lcd_mess_0:

lpmlcd,Z+;Запись lcd байта состояния строк из ячейки с адресом из Z

rcalllcd_dat;

decz4;Уменьшение z4 на 1

cpiz4,0;Сравнение z4 с 0

brnelcd_mess_0;Если z4<>0, то на lcd_mess_0, иначе далее

ret;Выход из подпрограммы

;———————–Подпрограмма отображения двух строк подряд на LCD по данным из таблиц

lcd_all:

lditemp,1;Отображение 1-й строки

rcalllcd_mess;Вызов подпрограммы отображения сообщений

lditemp,2;Отображение 2-й строки

rcalllcd_mess;Вызов подпрограммы отображения сообщений

ret;Выход из подпрограммы

;———————–Подпрограмма вычитания (c3+c2+c1)-(z3+z2+z1)=(c3+c2+c1)

c_minus_z:

subc1,z1;

sbcc2,z2;

sbcc3,z3;

ret;Выход из подпрограммы

;———————–Подпрограмма сложения (c3+c2+c1)+(z3+z2+z1)=(c3+c2+c1)

c_plus_z:

addc1,z1;

adcc2,z2;

adcc3,z3;

ret;Выход из подпрограммы

;———————–Подпрограмма отправки команды на LCD

lcd_com:

cbiPORTB,RS;Команда

intemp,PORTB

anditemp,0b00000011;Маска 00000011 дляобнулениялишнего

oritemp,0b00001000;Логическое сложение temp с 00001000 (строб вверх + команда)

rcalllcd_out;Вызов подпрограммы lcd_out

ret;Выход из подпрограммы

;———————–Подпрограмма отправки данных на LCD

lcd_dat:

sbiPORTB,RS;Данные

intemp,PORTB

anditemp,0b00000011;Маска 00000011 для обнуления лишнего

oritemp,0b00001100;Логическое сложение temp с 00001100 (строб вверх + команда)

rcalllcd_out;Вызов подпрограммы lcd_out

ret;Выход из подпрограммы

;———————–Подпрограмма отправки на LCD

lcd_out:

sbiPORTB,E;Строб вверх

pushlcd;Сохранение lcd в стеке

andilcd,0b11110000;Маска 11110000 для обнуления младшего полубайта

orlcd,temp;Логическое сложение lcd с temp (строб вверх + команда)

outPORTB,lcd;Запись команды в порт

cbiPORTB,E;Строб вниз

sbiPORTB,E;Строб вверх

poplcd;Извлечение lcd из стека

swaplcd;Смена полубайт местами

andilcd,0b11110000;Маска 11110000 для обнуления младшего полубайта

orlcd,temp;Логическое сложение lcd с temp (строб вверх + команда)

outPORTB,lcd;Запись команды в порт

rcalldel1u;Вызов подпрограммы задержки (~1мкс)

cbiPORTB,E;Строб вниз

rcalldel40u;Вызов подпрограммы задержки (~40мкс)

rcalldel40u;Вызов подпрограммы задержки (~40мкс)

ret;Выход из подпрограммы

;———————–Подпрограмма отображения числовых строк (для отладки)

otlad:

sbicPIND,6;Если PD6=0, то пропуск след.команды

rjmpotlad_2;На otlad_2

rcalldel3m;Вызов подпрограммы задержки (~3мс)

sbicPIND,6;Если PD6=0, то пропуск след.команды

rjmpotlad_2;На otlad_2

rcall lcd_both_str;Вызов подпрограммы отображения двух числовых строк

otlad_1:

rcallknop_off;Вызов подпрограммы ожидания отпускания кнопки

poptemp;Очистка стека (поскольку выход не по ret)

poptemp;Очистка стека

rjmpmain;На main

otlad_2:

ret;Выход из подпрограммы

;———————–Подпрограмма ожидания отпускания кнопки

knop_off:

sbisPIND,6;Если PD6=1, то пропуск след.команды

rjmpknop_off;На knop_off

rcalldel3m;Вызов подпрограммы задержки (~3мс)

sbisPIND,6;Если PD6=1, то пропуск след.команды

rjmpknop_off;На knop_off

ret;Выход из подпрограммы

;———————–Подпрограмма передачи с 1-го по 7-й байт через USART

usart_1_7:

rcallUSART_ready;Вызов подпрограммы ожидания готовности буфера передачи

lditemp,0x10;Запись 0x10 в temp

ordes_tysh,temp;Логическое сложение des_tysh с temp, результат в des_tysh

outUDR,des_tysh;Передачаиз des_tysh в USART

lditemp,0x20;Запись 0x20 в temp

ortyshi,temp;Логическое сложение tyshi с temp, результат в tyshi

outUDR,tyshi;Передача из tyshi в USART

lditemp,0x30;Запись 0x30 в temp

orsotni,temp;Логическое сложение sotni с temp, результат в sotni

outUDR,sotni;Передача из sotni в USART

lditemp,0x40;Запись 0x40 в temp

ordesyatki,temp;Логическое сложение desyatki с temp, результат в desyatki

outUDR,desyatki;Передача из desyatki в USART

lditemp,0x50;Запись 0x50 в temp

oredinicy,temp;Логическое сложение edinicy с temp, результат в edinicy

outUDR,edinicy;Передачаиз edinicy в USART

lditemp,0x60;Запись 0x60 в temp

ordesyatye,temp;Логическое сложение desyatye с temp, результат в desyatye

outUDR,desyatye;Передача из desyatye в USART

lditemp,0x70;Запись 0x70 в temp

orsotye,temp;Логическое сложение sotye с temp, результат в sotye

outUDR,sotye;Передача из sotye в USART

ret;Выход из подпрограммы

;———————–Подпрограмма отображения одной числовой строки

lcd_one_str:

ldilcd,0x4E;Отображение “N”

rcalllcd_dat;

ldilcd,0x3A;Отображение “:”

rcalllcd_dat;

ldilcd,0x30;Определение кода для числа тысяч

addlcd,tyshi;

rcalllcd_dat;Отображение числа тысяч

ldilcd,0x30;Определение кода для числа сотен

addlcd,sotni;

rcalllcd_dat;Отображение числа сотен

ldilcd,0x30;Определение кода для числа десятков

addlcd,desyatki;

rcalllcd_dat;Отображение числа десятков

ldilcd,0x30;Определение кода для числа единиц

addlcd,edinicy;

rcalllcd_dat;Отображение числа единиц

ldilcd,0x30;Определение кода для числа десятых долей

addlcd,desyatye;

rcalllcd_dat;Отображение числа десятых долей

ldilcd,0x30;Определение кода для числа сотых долей

addlcd,sotye;

rcalllcd_dat;Отображение числа сотых долей

ret;Выход из подпрограммы

;———————–Подпрограмма отображения двух числовых строк по данным

lcd_both_str:

movc1,a1;Копирование из a1 в c1

movc2,a2;Копирование из a2 в c2

movc3,a3;Копирование из a3 в c3

;———————–Отображение смещения от нуля для U1 “1= “

ldilcd,0x80;Выбор знакоместа (начало 1й строки)

rcalllcd_com;

rcalllcd_one_str;Вызов подпрограммы отображения одной числовой строки

movc1,b1;Копирование из b1 в c1

movc2,b2;Копирование из b2 в c2

movc3,b3;Копирование из b3 в c3

;———————–Отображение смещения от нуля для U2 “2= “

ldilcd,0xC0;Выбор знакоместа (начало 2й строки)

rcalllcd_com;

rcalllcd_one_str;Вызов подпрограммы отображения одной числовой строки

ret;Выход из подпрограммы

;———————–Подпрограмма обработки прерывания по переполнению таймера 1

;Поскольку выход не по reti, то глобально запрещённые прерывания остаются запрещены

ovtim1:

cli;Глобально запрещаем прерывания

lditemp,3;Заносим 3 в temp

cpc3,temp;Сравнение c3 с temp

breqovtim1_0;Если с3=3, то на ovtim1_0, иначе далее

incc3;Увеличение c3 на 1

reti;Выход из подпрограммы обработки прерывания

ovtim1_0:

sbiPORTD,0;Выключение большого тока заряда конденсатора

sbiPORTD,4;Выключение малого тока заряда конденсатора

sbiPORTD,5;Включение разряда конденсатора

lditemp,0b00000000;Останов таймера

outTCCR1B,temp;

poptemp;Очистка стека (поскольку выход по clk_down, а не по reti)

poptemp;Очистка стека

rjmpclk_down;Переход на clk_down

;———————–Подпрограмма обработки внешнего прерывания по U1

;Поскольку выход не по reti, то глобально запрещённые прерывания остаются запрещены

com_U1:

ina1,TCNT1L;Сохраняем 1-йбайт n1

ina2,TCNT1H;Сохраняем 2-йбайт n1

mova3,c3;Копируем из c3 в a3 3-й байт n1

lditemp,0b10000000;Разрешение внешнего прерывания только по PD3 (U2)

outGIMSK,temp;

reti;Выход из подпрограммы обработки прерывания

;———————–Подпрограмма обработки внешнего прерывания по

U2

com_U2:

inc1,TCNT1L;Сохраняем 1-й байт n2

inc2,TCNT1H;Сохраняем 2-й байт n2

cli;Глобально запрещаем прерывания

sbiPORTD,0;Выключение большого тока заряда конденсатора

sbiPORTD,4;Выключение малого тока заряда конденсатора

sbiPORTD,5;Включение разряда конденсатора

lditemp,0b00000000;Останов таймера

outTCCR1B,temp;

poptemp;Очистка стека (поскольку выход не по reti)

poptemp;Очистка стека

Поделиться статьёй
Поделиться в telegram
Поделиться в whatsapp
Поделиться в vk
Поделиться в facebook
Поделиться в twitter
Леонид Федотов
Леонид Федотов
Окончил НИУ ВШЭ факультет компьютерных наук. Сам являюсь кандидатом наук. По специальности работаю 13 лет, за это время создал 8 научных статей и 2 диссертации. В компании подрабатываю в свободное от работы время уже более 5 лет. Нравится помогать школьникам и студентам в решении контрольных работ и написании курсовых проектов. Люблю свою профессию за то, что это направление с каждым годом становится все более востребованным и актуальным.

Ещё статьи

Нет времени делать работу? Закажите!
Вид работы
Тема
Email

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