Раздел: Технические науки Блок управления реверсивным двигателем Введение. Сегодня почти не возможно найти промышленную или научную отрасль, в которой не использовались бы микроЭВМ и микропроцессоры (МП). Дешевизна и высокая надежность, гибкость, универсальность позволяют широко применять МП в самых различных системах управления. Они используются для замены аппаратной реализации функций управления, контроля, измерения и обработки данных. Предполагается применение микроЭВМ и МП для управления самыми различными устройствами – от станков и прокатных станов до атомных реакторов и электростанций. Также предполагается создание на их основе робототехнических комплексов, систем контроля и диагностики, гибких автоматизированных производств. По сложности исполняемых функций устройства управления, созданные на основе микропроцессорных средств, могут быть очень разнообразными - от простейших микроконтроллеров несложных приборов и механизмов до сложнейших специализированных и универсальных систем распределенного управления в реальном времени. Различные формы организации современных микропроцессорных средств можно условно разделить на следующие группы:
МП, встраиваемые в приборы и аппаратуру, и простейшие микроконтроллеры предназначены строго для решения узкоспециализированных задач. Их программное обеспечение проходит отладку на специальных стендах или универсальных ЭВМ. После отладки оно записывается в ПЗУ и в процессе эксплуатации изменяется редко. Встраиваемые средства используют и простейшие внешние устройства, такие как тумблеры, клавишные переключатели, индикаторы. Специализированные микроЭВМ чаще всего создаются на базе секционных микро программируемых МП. Они позволяют адаптировать структуру, разрядность, систему команд микроЭВМ под определенный класс задач. Однако, такой подход к организации систем осложнен необходимостью дорогой и трудоемкой разработки “собственного” программного обеспечения. Широкое распространение в последнее время получают также программируемые микроконтроллеры. Они являются специализированными микроЭВМ и предназначены для решения разнообразных задач в системах управления, регулирования и контроля. В особую категорию выделяют программируемые контроллеры для систем автоматического регулирования. В любой системе автоматического регулирования главным устройством является регулятор. Он задает основной закон управления исполнительным механизмом. Смена классических аналоговых регуляторов на универсальные программируемые микроконтроллеры, способные программно перестраиваться на реализацию любых законов регулирования, записанных в их память, способствует повышению точности, гибкости, надежности, производительности и снижение стоимости систем управления. Основное преимущество универсальных микроконтроллеров - их способность выполнять ряд дополнительных системных функций, таких как автоматическое обнаружение ошибок, оперативное отображение состояния систем контроль предельных значений параметров и т. п. Особое место в системах автоматического регулирования занимают системы управления двигателями. Основной регулируемой величиной в подобных системах является частота вращения якоря двигателя. При изменении нагрузки она меняется. Замена аналогового регулятора на микроконтроллер позволит значительно улучшить процесс регулирования, использование цифрового индикатора и клавиатуры облегчит работу по установке параметров автоматического регулирования и контроля регулируемого значения. В данном проекте рассматривается автоматизированная система управления двигателем, в качестве регулятора используется микроконтроллер. Он должен поддерживать определенную пользователем частоту вращения, а также выдавать текущие обороты якоря двигателя. Анализ исходных данных, выбор параметра контроля. Исходными данными определена разработка платы и программного обеспечения с режимами установки частоты вращения якоря двигателя, стабилизации частоты вращения и ее индикации. Область применения макета – лабораторные и практические работы в ККЭП. Отладочный комплекс. Основой для исходных является отладочный комплекс МК51, состоящий из платы микроконтроллера и программного обеспечения. Он предназначается для отладки и тестирования аппаратуры и программного обеспечения управляющих систем. Выполнен на базе микроконтроллера (МК) семейства Intel imcs51. В состав платы МК51 входят следующие блоки: - МК SAB80C535, предназначенный для выполнения программы МОНИТОР и для выполнения пользовательской программы (управления); - постоянное запоминающее устройство, предназначенное для хранения программы МОНИТОР; емкость 32К байт; - оперативное запоминающее устройство, предназначено для хранения программы работы управляющей системы (программы пользователя); - дисплей, предназначен для контроля значений вводимых параметров, вывода значений параметров системы управления, вывода символов; - клавиатура для ввода значений параметра программы управляющей системы, запуска программы управления, вызова процедур и сброса МК; - буфер интерфейса связи платы ПМК с компьютером; - блок коммутации адресов ОЗУ и ПЗУ. Программным обеспечением является FDSAB - полноэкранный отладчик программ на ассемблере микроконтроллеров семейства МК51. Он ориентирован на использование совместно с платой для отладки программ на базе микроконтроллера Siemens SAB80C535, служит для отображения и редактирования ресурсов микроконтроллера, а так же загрузки программного кода для микроконтроллера. Исполнение его в ПМК возможно полностью, блоками или по шагам. В отладчике существует режим терминала, предоставляющий возможность выбора номера коммуникационного канала (1 или 2) и скорости передачи/приема данных. Меню программы содержит следующие пункты:
Назначение пунктов меню: - выбор на дисках компьютера двоичного файла (.BIN) с программой, загрузка в отладчик и память команд макета и дизассемблирование загруженного кода на экран в область отображения дизассемблированных инструкций. - передача управления от монитора ПМК программе пользователя в памяти команд макета. - считывание содержимого внутренней ОЗУ макета и специальных функциональных регистров из ПМК. - загрузка в ПМК содержимого внутренней ОЗУ из отладчика и специальных регистров. - считывание содержимого памяти команд ПМК в отладчик (диапазон запрашивается). - загрузка содержимого памяти команд ПМК из отладчика в ПМК (диапазон запрашивается). - повторная загрузка программного кода в память команд ПМК из памяти отладчика. - дизассемблирование программного кода из памяти команд отладчика в запрашиваемом диапазоне адресов. Имеется возможность дописывать инструкции за уже имеющимися либо заменять их. - сохранение в файл дизассемблированного фрагмента программы пользователя с мнемоническими обозначениями регистров процессора Siemens SAB80C535 и символьными метками (в том случае если включен режим отображения символьных меток). - переключение режима представления дизассемблированного кода на экране: только с адресами переходов или с выделенными символьными метками. - изменение номера последовательного порта компьютера, к которому подключена ПМК и скорости передачи через порт путем изменения делителя частоты. - перевод программы в режим терминала. Пользователь в этом режиме может принимать и передавать данные по последовательному порту в ПМК. - отображение краткой информации о системе (объем свободной оперативной памяти, место на текущем диске, параметры соединения, загруженный файл). - выход из программы. - выбор параметра контроля. Выбор параметра контроля очевиден - частота вращения ротора электродвигателя. В качестве датчика для определения числа оборотов может служить оптопара. Однако в этом случае ввиду малой частоты импульсов, которые поступают от датчика, стабильность частоты вращения будет невысокой, так как длительность измерения велика и характер изменения нагрузки достаточно быстр. Чтобы увеличить стабильность предусмотрен диск, на котором расположено максимальное число прорезей. Тогда одному обороту вала двигателя будет соответствовать большое количество импульсов от датчика. Тем не менее и в этом случае для точного измерения частоты вращения необходимо значительное время. Опыты показывают существенное отклонение частоты вращения от установленной. Высшую стабильность удержания частоты вращения обеспечивает способ измерения периода импульсов от датчика. МК имеет в своей архитектуре соответствующую аппаратную и программную поддержку. Описание схемы электрической принципиальной. Схема электрическая принципиальная представлена в графической части лист1. Плата микроконтроллера. Порты Р0 и Р2 МК используются в режиме внешней памяти. Младшие разряды адреса ячейки памяти запоминаются в регистре адреса (DD9) импульсом ALE. Блок переадресовки выполнен на элементах DD6 и DD7 и выполняет функцию переключения адресов в соответствии с таблицей 3.1. Таблица 3.1
По сигналу RESET=0 RS – триггер на элементах DD7.3 – DD7.4 установлен в единичное состояние (на выводе 13 DD7.4 уровень логического нуля) и производится выбор ПЗУ (DD12). После отпускания кнопки сброса (SA1) триггер сохраняет свое состояние и импульсом PSEN считывается 1-й байт команды перехода из ПЗУ. Триггер удерживается в единичном состоянии сигналом с выхода DD6.1 (А15=0 => А15=1), несмотря на наличие импульса PSEN на входе 1 элемента DD7.2. В следующих двух обращениях считывается из ПЗУ адрес перехода 8000Н и выполняется команда SJMP 8000H. При чтении из ячейки 8000Н первого байта команды МК выдает адрес, в котором А15=0, следовательно на выходе DD6.1 формируется низкий уровень. Импульсом PSEN формируется положительный импульс на выходе DD7.2 и триггер переключается. Так как А15=1, то на выходе DD6.1 присутствует низкий уровень, следовательно на выходе DD6.2 – высокий и несмотря на то, что триггер переключился выбор ОЗУ не производится. Выбор ОЗУ будет производится если А15=0 и считывание команд производится импульсом PSEN. Порты Р4 и Р5 используются для подключения клавиатуры и дисплея. В плате используется клавиатура формата 4х4 и четырех разрядный дисплей динамического типа. Разряды Р4.3 – Р4.0 являются разрядами сканирования клавиатуры и одновременно разрядами выбора индикатора. Сигналы выбора индикатора (“бегущий ноль”) подаются на входы усилителей (DD10). Низкий уровень с выхода DD10 производит выключение транзистора, через который подается на общий анод выбранного индикатора напряжение +5В. Сигналы сегментов с выходов порта Р5 через токовые усилители DD4 поступают на шину сегментов С0 – С7 индикаторов. Резисторы R17 – R24 определяют значения амплитуды импульса тока, протекающего через сегменты. Разряды Р4.7 – Р4.4 являются входами сигналов опроса клавиатуры. С помощью элементов DD11.1 – DD11.2 формируется сигнал запроса прерывания от клавиатуры, поступающий на вход INT0 МК. ИМС DD5 является преобразователем уровней для последовательного канала. Элементы источника питания: VD3 – диод выпрямителя; С5 – С8 – сглаживающий фильтр; DD3 – стабилизатор напряжения. Трансформатор блока питания вынесен в отдельный блок, совмещенный вилкой питания. Соединение с “внешним миром” производится с помощью разъемов. Разъем Х7 предназначен для соединения с СОМ – портами компьютера. На контакты разъемов Х1 выведены входы порта Р6 и входы эталонных питания и земли. На контакты разъема Х5 выведены линии от порта Р3. На контакты разъема Х4 выведены линии от порта Р1. Разъем Х8 используется для подключения блока трансформатора. Плата макета. Оптопара VD1 VD2 является датчиком частоты вращения якоря двигателя. Фотодиод VD1 формирует токовые импульсы при прохождении шторки освещением от светодиода VD2. Импульс с VD1 открывает транзистор VT1 тем самым формируя импульс на его коллекторе. Управление двигателем происходит при помощи DD1 (ИМС управления реверсивными коллекторными двигателями). Режимы работы представлены в таблице 3.2. Таблица 3.2
На входы DD1 поступают логические уровни “0” “1”, что выбирает режим работы двигателя, подключенного к выходам DD1. С1 – С4 – сглаживающие фильтры. Переменным резистором R8, соединенным последовательно с генератором, подается нагрузка на двигатель. Резисторы R5 R9 (R5=R9) соединены общим проводом, а с других концов снимается аналоговое значение напряжения для определения нагрузки. В зависимости от направления вращения генератора ток в цепи будет протекать в двух направлениях, следовательно, значение потенциалов напряжения на R5 R9 будут противоположны, но равны по значению. Это обеспечивает измерение напряжения в реверсном режиме работы двигателя. Описание алгоритма программы. Блок схема алгоритма представлена в графической части лист 2. Главная программа зациклена и представляет собой блок процедуры индикации. Программы измерения частоты вращения двигателя и обработки нажатия клавиш выполняются прерывая основную программу индикации прерываниями от измерителя частоты и клавиатуры соответственно. После выполнения программ обработки прерываний программа индикации продолжает работу с места ее прерывания. Подпрограмма (ПП) обработки прерывания от измерителя (INT1) вначале выполнения проверяет повторное вхождение в ПП. При первом вхождении осуществляется запуск измерителя и выход. При повторном вхождении измеренное значение длительности периода импульса от датчика запоминается, сравнивается с заданным значением. Если измеренное значение меньше заданного тогда значит частота вращения снизилась и происходит включение двигателя, иначе двигатель отключается. После чего анализируется режим индикации: обороты двигателя или индикация нагрузки приложенной к двигателю с помощью генератора. В зависимости от сделанного выбора измеренное значение частоты вращения или нагрузки преобразовывается в позиционно-десятичное значение и выдается в индикатор. Затем происходит выход из ПП. В ПП обработки прерывания от клавиатуры (KLAV) определяется нажатие функциональной клавиши. Если клавиша не функциональная то выполняется сдвиг индикационных ячеек влево и запись кода нажатой клавиши в последнею индикационную ячейку, далее выход. Если же клавиша функциональная производится определение какая именно нажата для этого служат четыре блока решения, если функциональность клавиши не определится то значит нажата клавиша “реверса” при нажатии которой осуществляется реверс направления вращения якоря двигателя и выход. Далее перечислены действия по нажатию функциональных клавиш, после выполнения которых ПП завершается: клавиша “удалить” - сдвиг индикационных ячеек в право и запись в старшую ячейку нуля; клавиша “старт” - преобразования введенного числа оборотов в секунду в длительность периода импульсов с датчика; клавиша “стоп” - остановка двигателя; клавиша “режим” - переключение режима индикации частоты вращения / подаваемой нагрузки. Описание программы. В программе используются символические имена присвоенные ячейкам ОЗУ: st1 data 52h номер сдвига индикационной ячейки n_sd data 53h введенная частота вращения якоря двигателя obor data 54h делимое 1-й байт chi_3 data 55h делимое 2-й байт chi_2 data 56h делимое 3-й байт chi_1 data 57h делитель 1-й байт zn_h data 59h делитель 2-й байт zn_l data 5ah частное 1-й байт rez_h data 5bh частное 2-й байт rez_l data 5ch результат деления 16/8 rezul data 5dh измеренная длительность импульса мл. байт dli_i_l data 5eh измеренная длительность импульса ст. байт dli_i_h data 5fh заданная длительность импульса мл. байт dli_l data 60h заданная длительность импульса ст. байт dli_h data 61h временная ячейка temp data 62h счетчик паузы выдачи измеренного значения indik data 63h Используемые биты флагов перечислены ниже: повторный вход в п.п. измерения периода импульса flag bit 00h индикация нажатия функциональной клавиши f_ind bit 01h функциональная клавиша “реверс” f_rev bit 02h направление вращения f_nap bit 03h вкл./выкл. двигатель f_rab bit 04h индикация обороты/нагрузка f_rez bit 05h функциональная клавиша “режим” f_rezind bit 06h Деление 24-х битного числа на 16-и битное результат 16 бит, реализовано в подпрограмме div24. Деление многобайтного числа на многобайтное реализуется по принципу вычитания делителя из делимого со сдвигом последнего влево, с возможностью восстановления делимого. Перед процедурой деления в ячейки делителя записывается число в диапазоне 0-0fffh. В начале деления происходит: сдвиг делителя на четыре разряда влево это необходимо для деления 24/16, запись в частное 10h для определения окончания деления, запись в ячейки делимого число 1000000. В начале цикла деления производится сдвиг делимого влево на один разряд, а так же сдвиг влево частного и запись в стек значений флагов переносов. Далее из старшей части делимого вычитаем делитель, в зависимости от знака переноса в частное записывается “0” или “1” и сохранение делимого. Проверка переноса при сдвиге делимого и запись в частное “1” если перенос был. Проверка окончания деления путем проверки восстановленного значения флага переноса при сдвиге частного. После окончания деления результат деления находится в ячейках результата. После нажатия клавиши “Старт” происходит преобразования значения индикационных ячеек в двоичный код (1 байт), после чего это значение умножается на 24, что соответствует 24 прорезям диска оптопары (результат 2 байта) и делим 1000000 на это число в результате получается длительность периода импульсов от оптопары для введенного числа оборотов в секунду. После преобразования выполняется функция запуска двигателя которая дает толчок и разрешается прерывание INT1 с оптопары. В подпрограмме обработки прерывания INT1 проверяется повторное вхождение для этого используется флаг flag. При первом вхождении запускается таймер и происходит выход из подпрограммы обработки прерывания. Во втором вхождении таймер останавливается, запрещается прерывание INT1 и значение таймера (что соответствует периоду импульса) записывается в ячейки dli_i_l и dli_i_h. После чего производится регулирование частоты вращения двигателя, для этого из ячеек dli_l dli_h (введенное значение) вычитается измеренное dli_i_l dli_i_h, если возник перенос значит частота вращения меньше необходимой и двигатель включается (отключается, если переноса нет) установкой кода на портах Р3.4 Р3.5. Комбинация выбирается в зависимости от направления вращения которая определяется битом f_nap. Индикация измеренной частоты вращения происходит через 47 (2f) раз измерения импульсов, это нужно для того чтобы убрать мелькание цифр на индикаторе. Преобразование измеренного значения в частоту вращения двигателя в обр/сек происходит следующим образом: деление 1000000 на измеренное значение, деление на 24, преобразование bin->dec->индикатор. Перед завершением подпрограммы обработки прерывания INT1 производится инициализация регистров и ячеек перед следующим запуском процедуры и разрешается прерывание INT1. Для настройки таймера и прерывания INT1 используются следующие управляющие слова: TMOD=01H – режим работы таймера; TCON=04H Tr – разряд запуска таймера; IEN0 – разрешения прерываний 8 разряд – запрет всех прерываний; 3 разряд – INT1; 1 разряд – INT0 (клавиатура); Методика выполнения лабораторной работы. Цель работы. Приобретение практических навыков в технологии разработки и отладки элементов управляющих систем. Описание лабораторной установки. Лабораторная установка состоит из следующих частей: платы управления ПМК, платы двигателя и блока питания. Плата двигателя рис.6.1 состоит из трех блоков: блок датчика скорости вращения, блок управления, блок датчика нагрузки. Плата двигателя подключается к разъемам портов ПМК при помощи разъемов. X2 подключается к порту Р3 и служит для соединения: оптопары (“Датчик”) со входом прерывания INT1, портов Р3.4 Р3.5 с входами блока управления (Упр1 и Упр2). X6 подключается к порту Р6 используя две линии AI6 и AI7 для измерения нагрузки прелагаемой к двигателю с помощью генератора (измерение нагрузки прелагаемой из вне при помощи этой схемы невозможно). Использование двух каналов предусматривается для измерения напряжения двигателя с возможным реверсом когда при вращении в одну сторону измерение происходит с первого канала, а при вращении в другую со второго. Такое распределение получается путем использования делителя напряжения общий конец которого соединен с нулевым проводом и при протекании тока в разных направлениях меняет знак напряжения на концах делителя относительно общего провода на противоположный. Опорное напряжение Uref подается соединением +5В, а нижняя граница (Ugnd) задается соединением с общим. Рис. 6.1.Схема платы двигателя. Разъем X3 соединяет схему с блоком питания. Датчик числа оборотов выполнен в виде диска, с 24-ю прорезями. Он жестко крепится на валу вращения двигателя. Когда прорезь проходит между оптопарой, светодиод VD2 освещает инфракрасным излучением фотоприемник, которым является фотодиод VD1. Полупроводниковый фотоприемник, за счет уменьшив этого свое сопротивление, начинает пропускать ток. Тем самым он открывает транзистор VT1 с коллектора которого снимаются прямоугольные импульсы. Частоту вращения двигателя предлагается держать в определенных границах путем изменения напряжения, подаваемого на двигатель. Это вытекает из того, что обороты двигателя прямо пропорциональны приложенному к нему напряжению. Благодаря использованию цифровых систем управления возможно применение в качестве меняющегося напряжения шим-генератора. Длительность импульсов и пауз формируется динамически в зависимости от характера приложенной нагрузки. До тех пор, пока длительность паузы не будет равной нулю будет длиться поддержание оборотов при увеличении нагрузки. Тогда дальнейшее увеличение нагрузки будет снижать обороты двигателя. Чтобы улучшить поддержание частоты вращения следуте максимально возможно увеличить напряжение источника питания. Исходные данные. Комплекс отладочный: плата, ПО FDSAB; Установка управления двигателем; Возможность установки частоты вращения с клавиатуры; Стабилизация частоты; Импульсы с датчика поступают на вход прерывания INT1; Управление двигателем осуществляется выдачей кода на порты Р3.4 и Р3.5 в соответствии с таблицей 6.1; Максимальная скорость вращения двигателя 110 обр1/сек.; Число прорезей диска вращения датчика составляет 24 шт. Мощность двигателя 10 Вт; Входы для измерения нагрузки поступают на АЦП каналы AI6 и AI7. VAREF=5B. Таблица 6.1
Домашние задание. Написать алгоритм и программу стабилизации частоты вращения электродвигателя постоянного тока с параллельным возбуждением в соответствии с исходными данными. Рекомендации по выполнению. Взять длительность периодов импульсов от оптопары в качестве параметра регулирования. Следует выбрать этот параметр взамен измерению частоты вращения диска, перекрепленного на двигатель. Тогда он позволяет производить быстрый контроль стабильности системы управления благодаря существенному уменьшению длительности измерения. Что бы осуществить такое регулирование необходимо преобразовывать введенную частоту вращения в длительность периода импульсов, которые формируются прорезями на диске датчика, и обратно – длительность периода в частоту вращения. Преобразование рекомендуется осуществить так: Введенную частоту вращения (обр/сек) умножить на число прорезей в диске (24); 1000000 разделить на полученное число. Таким образом получим длительность одного периода в мкс. Для обратного преобразования: 1000000 разделить на длительность периода; разделить на 24. При делении 1000000 (3 байта) на 2 байта возможно использование стандартной процедуры деления 4-х байтного числа на 2-й байтное. Однако для более быстрого деления (а следовательно и увеличения скорости измерения) рекомендуется уменьшить длительность деления, производя деление 6-ти тетрад (1000000) на 3-и тетрады (максимально возможное число 4095), для этого необходимо: перед делением сдвинуть делитель на четыре разряда влево; продолжать деление с учетом сдвинутого делителя (т. е. деление должно длится на четыре цикла меньше); после деления сдвинуть частное на четыре разряда влево. Для измерения длительности периода импульсов необходимо в качестве счетчика использовать один из таймеров в режиме таймера. Подача на вход прерывания INT1 импульсов вызывает ПП обработки прерывания в которой необходимо следить за первым и вторым входом в ПП. При первом вхождении таймер следует включить, а при втором вхождении считать его состояние. Полученный результат и есть длительность периода импульса. Последовательность выполнения работы. Внимание! При приложении больших усилий торможения двигателя он может остановится что приведет к резкому увеличению тока в выходной цепи ИМС управления и возможно выход ее из строя. Заключение. Благодаря проделанной дипломной работы была разработана плата макета и программное обеспечение блока управления реверсивным двигателем. Режимы работы: установка частоты вращения якоря двигателя, стабилизация и индикация частоты. Нагрузкой является генератор, соединенный с двигателем. К его выходам подсоединен переменный резистор, которым задается нагрузка. В цепь генератора включен делитель напряжения для измерения напряжения и его индикации. В ходе разработки проекта было опробовано два способа автоматического регулирования частоты вращения двигателя. Первый - измерение частоты - за определенное время подсчитывалось количество импульсов от датчика. Второй - измерение периода - измерялась длительность периода импульсов поступающих от датчика. При использовании первого способа выявлена низкая стабильность частоты вращения регулирующей системы. Это связано с тем, что из-за большой длительности измерения и быстрого изменения характера нагрузки система не успевала отслеживать это изменение, а следовательно и регулировать входную величину. При уменьшении же длительности измерения увеличивалась погрешность. Второй способ регулирования (с измерением длительности периода) выявил хорошую стабильность автоматической системы управления. Это достигается путем увеличения числа прорезей на вращающемся диске оптопары. Измерение длится короткое время и система автоматического регулирования не успевает отклониться от установленного значения. Небольшое отклонение частоты вращения за короткий промежуток времени (времени измерения одного периода) моментально контролируется и выходной параметр изменяется. Приложение. Текст программы. ; присваивание имен p4 data 0e8h p5 data 0f8h ip0 data 0a9h ip1 data 0b9h ien0 data 0a8h ien1 data 0b8h adcon data 0d8h addat data 0d9h darp data 0dah st1 data 52h n_sd data 53h obor data 54h chi_3 data 55h chi_2 data 56h chi_1 data 57h chi_t data 58h zn_h data 59h zn_l data 5ah rez_h data 5bh rez_l data 5ch rezul data 5dh dli_i_l data 5eh dli_i_h data 5fh dli_l data 60h dli_h data 61h temp data 62h indik data 63h flag bit 00h f_ind bit 01h f_rev bit 02h f_nap bit 03h f_sta bit 04h f_rab bit 05h f_rez bit 06h f_rezind bit 07h ; определение векторов прерываний org 0000h sjmp start org 0003h ljmp klav org 013h ljmp int_1 ; начальная инициализация start: mov darp,#00h mov adcon,#0fh clr f_rezind clr f_rab clr f_rev clr f_sta setb f_nap setb f_rez mov n_sd,#0bh mov st1,#3fh mov ip0,#04h mov ip1,#04h mov sp,#65h mov ien0,#81h inizial:mov r0,#47h mov r1,#03h ; начальное обнуление индикатора numb: mov @r0,#00h inc r0 djnz r1,numb ; определение режима работы и его индикация jnb f_sta,re1 jb f_rez,re1 mov 4ah,#19h sjmp re2 re1: mov 4ah,#10h re2: clr f_ind beg: jb f_ind,beg2 ; определение режима работы jnb f_rezind,na2 clr f_rezind jb f_nap,na1 mov 4ah,#0fh sjmp na2 na1: mov 4ah,#0ah ; запуск двигателя с проверкой направления вращения na2: jnb f_rev,beg2 jb f_nap,napr1 clr p3.5 mov 4ah,#0fh jb f_rez,napr mov 4ah,#19h sjmp napr napr1: clr p3.4 mov 4ah,#0ah jb f_rez,napr mov 4ah,#19h napr: clr f_rev clr flag setb f_rab mov ien0,#85h ; остановка двигателя beg2: jnb f_ind,beg1 djnz st1,beg1 mov st1,#05fh ; сдвиг индикационных ячеек вправо mov r0,#0ahov r1,#49h mov 40h,#10h sdvig: mov a,@r1 inc r1 mov @r1,a mov a,r1 subb a,#02h mov r1,a djnz r0,sdvig djnz n_sd,beg1 mov n_sd,#0bh ljmp inizial ; процедура индикации beg1: mov r4,#0feh mov dptr,#tabcod mov r0,#47h cycl: mov p4,#0ffh mov a,@r0 movc a,@a+dptr mov p5,a mov a,r4 mov p4,a rl a mov r4,a inc r0 lcall del cjne r0,#4bh,cycl ljmp beg del: mov r1,#10 st_2: mov r2,#10 st_1: nop nop nop djnz r2,st_1 djnz r1,st_2 ret tabcod: db 0c0h,0f9h,0a4h,0b0h,99h,92h,82h,0f8h,80h,90h db 0feh,0fdh,0fbh,0f7h,0efh,0dfh,0ffh db 0c6h,0f8h,0c0h,0c8h,88h,8ch,86h,80h,89h,0ceh,91h,0b0h,82h ; клавиатура klav: push acc push p4 push psw setb psw.3 mov r4,#00h mov r7,#04h mov r6,#0feh loop: mov a,r6 mov p4,a rl a mov r6,a mov a,p4 mov r5,#04h swap a rotate: rrc a jnc dbnc inc r4 djnz r5,rotate djnz r7,loop ljmp quit dbnc: mov r2,#0ah m1: mov r3,#55h m2: djnz r3,m2 djnz r2,m1 mov a,#0f0h wait: mov p4,#0f0h cjne a,p4,wait mov r2,#0ah m3: mov r3,#55h m4: djnz r3,m4 djnz r2,m3 mov a,#09h subb a,r4 jc func rel: mov r0,#03h mov r1,#48h new: mov a,@r1 inc r1 mov @r1,a mov a,r1 subb a,#02h mov r1,a djnz r0,new mov r1,#47h mov 47h,r4 ljmp quit ; определение режима по функциональной клавише func: jb f_ind,quit cjne r4,#0ah,g2 ljmp bakesp g2: cjne r4,#0bh,g3 ljmp sta g3: cjne r4,#0ch,g4 ljmp stop g4: cjne r4,#0dh,g5 ljmp rezim g5: cjne r4,#0eh,g6 ljmp rezim g6: ljmp revers quit: clr psw.3 pop psw pop p4 pop acc reti ; удаление символа bakesp: jb f_rab,quit mov 47h,48h mov 48h,49h mov 49h,#00h ljmp quit ; старт. DEC->BIN sta: jb f_rab,quit mov 4ah,#0ah mov b,#0ah mov a,49h mul ab add a,48h mov b,#0ah mul ab add a,47h mov obor,a ; BIN*24 mov b,#18h mov a,obor mul ab mov zn_l,a mov zn_h,b ; деление1000000 на полученное значение lcall div24 mov dli_l,rez_l mov dli_h,rez_h ; старт измерение mov tl0,#00h mov th0,#00h clr flag mov indik,#00h mov tmod,#10h mov tcon,#04h mov 4ah,#10h mov 49h,#10h mov 48h,#10h mov 47h,#10h mov 46h,#11h mov 45h,#12h mov 44h,#15h mov 43h,#16h mov 42h,#12h mov 41h,#10h setb f_ind setb f_rev setb f_sta ljmp quit ; стоп stop: jnb f_rab,quit mov ien0,#81h setb p3.4 setb p3.5 clr f_rab mov 4ah,#10h mov 49h,#10h mov 48h,#10h mov 47h,#10h mov 46h,#10h mov 45h,#11h mov 44h,#12h mov 43h,#13h mov 42h,#14h mov 41h,#10h setb f_ind clr f_sta ljmp quit ; реверс revers: jnb f_rab,out2 mov ien0,#81h setb p3.4 setb p3.5 mov 4ah,#10h mov 49h,#10h mov 48h,#10h mov 47h,#10h mov 46h,#16h mov 45h,#17h mov 44h,#18h mov 43h,#17h mov 42h,#16h mov 41h,#11h jb f_nap,n1 mov adcon,#0eh sjmp n2 n1: mov adcon,#0fh n2: setb f_rev cpl f_nap setb f_ind out2: ljmp quit ; режим обороты двигателя/нагрузка rezim: jnb f_rab,out cpl f_rez jb f_rez,rez1 mov 4ah,#10h mov 49h,#10h mov 48h,#10h mov 47h,#10h mov 46h,#19h mov 45h,#15h mov 44h,#1ah mov 43h,#16h mov 42h,#1bh mov 41h,#1ch setb f_ind out: ljmp quit rez1: mov 4ah,#10h mov 49h,#10h mov 48h,#10h mov 47h,#10h mov 46h,#13h mov 45h,#1dh mov 44h,#13h mov 43h,#16h mov 42h,#13h mov 41h,#12h setb f_rezind setb f_ind ljmp quit ; процедура деления 3-х байт на 2-ва div24: push psw push acc mov chi_3,#0fh mov chi_2,#42h mov chi_1,#40h mov rez_h,#00 mov rez_l,#10h mov a,zn_h mov b,#10h mul ab mov zn_h,a mov a,zn_l mov b,#10h mul ab mov zn_l,a mov a,b add a,zn_h mov zn_h,a lp24: mov a,rez_l rlc a mov rez_l,a mov a,rez_h rlc a mov rez_h,a push psw clr c mov a,chi_1 rlc a mov chi_1,a mov a,chi_2 rlc a mov chi_2,a mov a,chi_3 rlc a mov chi_3,a push psw clr c mov a,chi_2 subb a,zn_l mov chi_t,a mov a,chi_3 subb a,zn_h jc nosav pop psw sav: mov chi_3,a mov chi_2,chi_t inc rez_l sjmp qsav nosav: pop psw jc sav qsav: pop psw jnc lp24 pop acc pop psw ret ; прерывание от датчика int_1: jb flag,iz2 setb flag setb tr1 ; первое вхождение. запустить таймер reti iz2: push psw ; второе вхождение push acc clr tr1 mov ien0,#80h mov dli_i_l,tl1 ; сохранить измеренное значение mov dli_i_h,th1 ; ; регулировка clr c mov a,dli_i_l subb a,dli_l mov a,dli_i_h subb a,dli_h jc mot_1 jb f_nap,nap11 setb p3.4 sjmp mot_0 nap11: setb p3.5 sjmp mot_0 mot_1: jb f_nap,nap01 clr p3.4 sjmp mot_0 nap01: clr p3.5 mot_0: ; индикация jb f_ind,inizdp djnz indik,inizdp mov indik,#2fh jb f_rez,chas ; индикация нагрузки azp0: jnb adcon.4,azp0 mov a,addat mov b,#0ah div ab mov 47h,b mov b,#0ah div ab mov 48h,b mov 49h,a inizdp: ljmp iniz ; индикация частоты вращения chas: jb f_nap,i_nap1 mov a,4ah cjne a,#0ah,in_ob2 mov 4ah,#10h in_ob2: dec 4ah sjmp i_nap2 i_nap1: mov a,4ah cjne a,#0fh,in_ob1 mov 4ah,#09h in_ob1:inc 4ah i_nap2: mov zn_l,dli_i_l mov zn_h,dli_i_h lcall div24 ; деление 3 байт на 2 байт mov rezul,#01h ; деление 2 байт на 24 lp16: clr c mov a,rezul rlc a mov rezul,a push psw clr c mov a,rez_l rlc a mov rez_l,a mov a,rez_h rlc a mov rez_h,a push psw clr c mov a,rez_h subb a,#18h jc nosav16 pop psw sav16: mov rez_h,a inc rezul sjmp qsav16 nosav16: pop psw jc sav16 qsav16: pop psw jnc lp16 ; BIN->DEC mov a,rezul mov b,#0ah div ab mov 47h,b mov b,#0ah div ab mov 48h,b mov 49h,a ; инициализация нового запуска программы измерения iniz: mov tl1,#00h mov th1,#00h clr flag port_0: jb p3.3,port_0 port_1: jnb p3.3,port_1 mov ien0,#85h;84 pop acc pop psw reti end |