ПРОЕКТИРУЕМ УСТРОЙСТВА НА МИКРОКОНТРОЛЛЕРАХ (Часть 2)


М. ГЛАДШТЕЙН, г. Рыбинск Ярославской обл.

Построенный граф показан на рис. 4. Нетрудно заметить, что невозможно изменить случайно заданное неверное направление вращения, не включив, а затем выключив двигатель. К тому же, чтобы запустить его, всегда требуется подать две команды - направления и пуска. Отказавшись от команды "ПУСК", можно исключить состояние СТОП2, а дуги команд "НАГНЕТАНИЕ" и "ВЫТЯЖКА" направить непосредственно в состояние РАБОТА. В результате на пульте управления станет одной кнопкой меньше, освободится один вход МК, а двигатель будет включаться сразу же после нажатия любой из кнопок, задающих направление. Строго говоря, на любое изменение заданного алгоритма управления нужно получить согласие заказчика или будущего пользователя устройства. Но в любительской практике заказчик, исполнитель и пользователь нередко - одно лицо и достаточно "посоветоваться с самим собой".

pic-001.gif
Puc.4

Бросается в глаза, что граф не отражает способ формирования сигнала PWM с переменным коэффициентом заполнения. В общем случае это может делать специальное устройство, управляемое от МК. Но мы стремимся все реализовать чисто программным путем, поэтому придется разбить состояние РАБОТА на два. В первом из них (РАБОТА0) PWM=0, во втором (РАБОТА1) - PWM=1.

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

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

Командами "БЫСТРЕЕ" и "МЕДЛЕННЕЕ" регулируют выдержки времени таймеров, оставляя их сумму неизменной и равной заданному периоду повторения импульсов PWM. Реагировать на эти команды автомат может в обоих рассматриваемых состояниях. Однако для упрощения алгоритма допустимо ограничиться реакцией только в одном из них. Благодаря кратковременности этих состояний задержка исполнения останется незаметной оператору.

Еще одно необходимое уточнение - проверка допустимости значений выдержек времени. Согласно заданию, коэффициент заполнения сигнала PWM, равный Т1/(Т1+Т0), где Т1 и Т0 - выдержки времени таймеров, должен всегда оставаться в интервале 0,2... 1. Поэтому после каждой команды изменения скорости автомат должен переходить в состояние ПРОВЕРКА и только из него возвращаться в состояние РАБОТА по одной из двух дуг. Первая соответствует положительному результату проверки, при переходе по ней устанавливаются новые значения выдержек. Вторая - результат отрицательный, действовавшие ранее выдержки остаются неизменными.

Продолжая анализировать граф, обращаем внимание, что состояния ПЕРЕГРЕВ и ПЕРЕГРУЗКА различаются только периодом повторения звукового сигнала. Их неплохо объединить в одно, назвав его АВАРИЯ. Звуковой сигнал S можно генерировать с помощью двух таймеров, подобно рассмотренному выше сигналу PWM. Более того, желательно использовать тот же самый "физический" таймер, который в этом состоянии остается безработным.

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

Разработанный граф автомата управления двигателем показан на рис. 5. Обратите внимание, что словесные формулировки выполняемых действий заменены присваиванием определенных значений переменным. Например, вместо фразы "включить желтый светодиод" указано Y^1 и уточнено, что зеленый светодиод следует выключить, G=0. Кроме упоминавшихся ранее выходных сигналов и выдержек таймеров, введены константа Т - период повторения импульсов PWM и переменная N - число импульсов S, оставшихся до завершения формируемого интервала звукового сигнала.

pic-002.gif
Puc.5

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

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

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

pic-003.gif
Puc.6

Процедуры, реализующие каждое из состояний автомата, строят по блок-схемам, аналогичным показанной на рис. 7. Прежде всего анализируют внешние воздействия (события). Далее процесс делят на столько ветвей, сколько дуг выходит из соответствующей вершины графа автомата. В каждой из них предусмотрено выполнение функций, необходимых для реализации данного перехода, в заключение присваивают переменной состояния значение, равное номеру вершины, в которую направлена дуга. Возможен и другой подход: сначала реализуют дуги, входящие в вершину, а затем реагируют на воздействия. Его основной недостаток - программа должна "знать", из какого состояния автомат перешел в данное, чего не требовалось в предыдущем случае.

pic-004.gif
Puc.7

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

Если внешних воздействий немного и реакция на них в каждом состоянии специфична, процедуры обнаружения событий включают в блоки обработки состояний. Например, проверять, нажата ли кнопка "ПУСК", можно только в том состоянии, в котором автомат должен на это реагировать. Часто процедуру фильтрации событий выносят в главный цикл (на рис. 6 она показана штриховой линией) и предусматривают переменную, которой присваивают значение, однозначно связанное с произошедшим событием. Например, результат опроса клавиатуры - код нажатой клавиши. В блоке обработки состояния, выполненном по второму из рассмотренных выше вариантов, лишь анализируют значение этой переменной.

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

Непредсказуемое поведение системы на МК часто объясняется помехами или дребезгом контактов органов управления. Подобные ложные события необходимо "отсеивать" с помощью программных фильтров. Чаще всего для признания события свершившимся достаточно убедиться, что логический уровень сигнала на соответствующем входе МК оставался неизменным в течение определенного времени. В ответственных случаях применяют и более сложные процедуры.

Среди множества событий нередко можно выделить "экстренные", реакция на которые должна быть немедленной. Типичный пример. Чтобы не пропустить момент срабатывания таймера, программе приходится непрерывно проверять состояние его регистра, не имея возможности до истечения выдержки заниматься чем-либо еще. Сигнал запроса прерывания, генерируемый таймером по окончании счета, решает проблему. Приняв его, МК немедленно (во всяком случае, значительно быстрее, чем при обычной программной обработке того же события) переходит к выполнению подпрограммы обслуживания данного прерывания, адрес (вектор) которой должен быть указан в специально отведенных ячейках памяти программ.

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

Нередко одно из внутренних прерываний современных МК связано с так называемым сторожевым таймером (Watch Dog), служащим для защиты от случайных сбоев. Этот таймер требует постоянной инициализации путем записи определенного кода в определенную ячейку адресного пространства. Программу МК строят таким образом, чтобы при ее нормальном ходе такая процедура выполнялась достаточно часто. Если МК "завис", инициализация сторожевого таймера прекращается и через некоторое время он подает свой запрос прерывания, обработка которого призвана восстановить нормальную работу системы. Как правило, реакция на прерывание от сторожевого таймера такая же, как на внешний сигнал, устанавливающий МК в исходное состояние.

Прерываниями управляют, разрешая или запрещая их в зависимости от состояния реализуемого автомата. Если одно и то же прерывание в разных состояниях необходимо обрабатывать по разному, процедуру обработки строят подобно главному циклу программы, предусматривая в ней анализ состояния. Отличие состоит в том, что такую процедуру не замыкают в кольцо. Завершив ее, МК продолжит выполнять программу с того места, где она была прервана. Это чревато сбоями, так как в изменившемся в результате обработки прерывания состоянии продолжение прерванных действий может дать неправильный результат. Защищаются от подобных ошибок, запрещая прерывания на время выполнения критических участков программного кода, что, несомненно, замедляет реакцию системы.

Если источников запросов прерываний в системе больше предусмотренных для них входов МК, аппаратно реализуют групповой запрос, объединяя выходы нескольких источников по схеме ИЛИ. Приняв такой запрос, МК обязан выяснить, кто его послал и соответствующим образом обработать.

Весь алгоритм работы устройства иногда реализуют набором подпрограмм обработки прерываний. В этом случае главный цикл вырождается в несколько машинных команд, вплоть до единственной команды безусловного перехода на саму себя. Во многих МК специально предусмотрены команды HALT или IDLE, по которым они, по существу, прекращают работать (иногда выключается даже тактовый генератор). Вывести МК из этого состояния способен лишь поступивший запрос прерывания. Закончив обработку запроса, МК выполняет предусмотренный в главном цикле безусловный переход на команду остановки и вновь "засыпает". Этот режим очень экономичен, так как мощность, потребляемая остановленным МК, многократно уменьшается, возрастая лишь во время реакции на внешние воздействия.

pic-005.gif
Puc.8

Разработанная с учетом изложенного блок-схема алгоритма управления электродвигателем вентилятора состоит из двух частей, изображенных на рис. 8 (главный цикл) и рис. 9 (обработка прерывания от таймера). Обе они соответствуют в основном рассмотренным выше типовым блок схемам, за исключением того, что объединены одинаковые операции, выполняемые при обработке разных событий. Обработчик прерывания от таймера формирует сигналы PWM и S. При переходе из состояния СТОП в состояние РАБОТА0 прерывание разрешается, а при возврате в состояние СТОП - запрещается.

pic-006.gif
Puc.9

В программе появилась переменная состояния ST, которой для наглядности присваиваются строковые значения - названия соответствующих состояний. Как говорилось выше, в программе это будут числа - номера состояний или их символические имена. Значения, присваиваемые переменной NO, выбраны исходя из предположения, что периоды повторения формируемых импульсов PWR и S одинаковы и равны 1 мс. Если это не так, блок-схему придется немного изменить.

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

ЛИТЕРАТУРА

1. Франке К. Введение в микро-ЭВМ:
Пер. с нем. - М.: Энергоатомиздат, 1998.
2. Каган Б. М., Сташин В. В. Основы проектирования микропроцессорных устройств автоматики. - М.: Энергоатомиздат, 1987.
3. Сташин В. В., Урусов А. В., Мологонцева О. ф. Проектирование цифровых устройств на однокристальных микроконтроллерах. - М.: Энергоатомиздат, 1990.


РАДИО 12-2000, с.20-23.