15.4 Пример разработки 2: управление сетевым питанием
==1062
В родной астрофизической обсерватории имеется несколько десятков устройств с сетевым питанием, которые требуется отключать дистанционно: купольная механизация, привод телескопа, подогрев зеркал, свет, камеры, источники питания детекторов и регистрирующей аппаратуры и т.п. Строить такого рода схему удобнее на микроконтроллере. В качестве бесплатного дополнения появляется возможность запоминания состояния по умолчанию и получения информации о текущей конфигурации ( что включено, сколько тока потребляет и т.д. ).
Попробуем разработать что-то аналогичное, а именно: управляющую схему для двух розеток на 110 Vac , которое сообщает запрошенное состояние и рапортует о реальном наличии напряжения в розетке. Кроме удалённого управления через RS-232 или USB, устройство допускает «местное» управление с помощью переключателей на передней панели. Включённое состояние отмечается зажжённым светодиодом 16 .
15.4.1 Реализация на микроконтроллере
Схема показана на рис. 15.4 . Для разнообразия взята модель из семейства PIC ( PIC16F627, DIP-18 , $2 ), в которой есть последовательный порт ( UART ), внутренний источник тактирования, EEPROM с 1'000'000 циклов стирания-записи и много линий портов. Большая часть содержимого ( аналоговый мультиплексор, компаратор, ШИМ, скорость 20 MHz ) не понадобятся, но цена всего $1.50, что составляет лишь малую часть от стоимости компонентов.
Рис. 15.4 Блок управления нагрузкой переменного тока с удалённого поста ( по последовательному каналу ) или локально ( кнопками ). При токе нагрузки 10 A SSR рассеивает 10 W и нуждается в адекватном теплоотводе. Вместо оптического можно использовать механическое реле, например, Panasonic ALE12B05 с контактами на 16 A@277 Vac и такими же, как у Crydom, ножевыми терминалами «faston» [* «автомобильными» ] . Для обмотки реле требуется 80 mA , т.е. необходим транзистор. Зато цена всего $1.60 в розницу, а SSR - $35
Самый простой путь переключать нагрузку переменного тока логическим сигналом - использовать твердотельное реле ( SSR , см. §12.7.5 и §12.7.6 ). Это залитый модуль, содержащий симистор с оптическим управлением. Такие компоненты производят многие фирмы 17 . На входе логический уровень с током 3...15 mA и допустимым напряжением 3...15 Vdc или 3...32 Vdc . Выход хорошо изолирован ( типичные цифры 3.5—5 kV ), и, вдобавок, переключается в нуле ( обычная опция ). Стандартные токи нагрузки 10 или 20 A при 280 Vac , но есть модули 100 A@660 Vac .
В примере для управления оптореле используется цифровой порт. НИЗКИЙ уровень на выводе контроллера включает нагрузку. Здесь такая полярность оправдана: спецификация сообщает, что напряжение насыщения ∼0.35 V при токе 15 mA и целых ∼1.3 V ( ниже шины положительного питания ), когда указанный ток вытекает в заземлённую нагрузку. Параллельно реле включён панельный светодиод, который показывает активное состояние реле.
[* В такой схеме корректнее включать светодиоды последовательно. Тогда выгоревший или оборванный индикаторный светодиод или светодиод оптопары однозначно не позволит игнорировать неисправность. При параллельном включении обрыв в цепи реле не помешает зажечь индикатор и не позволит вовремя обнаружить неисправность. Но последовательное соединение требует большего напряжения в цепи светодиодов. Однако, разработка ].
Оптореле имеет некоторый ток утечки в состоянии ВЫКЛЮЧЕНО. Обычные цифры лежат в диапазоне 0.1—10 mA , поэтому подключаемая розетка шунтируется резистором 15 kΩ 18 . ∼8 mA через него во включённом состоянии позволяют включить светодиод, индицирующий наличие напряжения на нагрузке, а равно и оптопару, сообщающую микроконтроллеру, что всё в порядке. Оптопара предназначена для работы на переменном токе, поэтому её светодиоды включены встречно-параллельно . Выбранная модель имеет изоляцию 5 kV и минимальный коэффициент передачи тока 50% ( т.е. столько сможет выдать фототранзистор, если считать ток через светодиод за 100% ) и цену порядка $0.25 в умеренных партиях.
Упражнение 15.2 А зачем нужен резистор 1 kΩ ? Почему встречно-параллельно индикаторному стоит обычный диод ?
Возвращаемся к схеме. На линиях входных кнопок местного управления задействованы внутренние подтяжки µC ( по спецификации их ток составляет 50...400 μA ). Пара индикаторов сообщает, включён ли в устройстве режим местного управления, или оно управляется удалённо через RS-232 или USB.
==1063
Микроконтроллер был выбран, в том числе, и из-за внутреннего генератора, который по факту оказался недостаточно точным. Спецификация говорит о ±7% , что недостаточно для асинхронной последовательной передачи в формате 8N1 ( см. §14.7.8 ). Приёмник проверяет состояние каждого из битов данных в середине битового промежутка, который отсчитывается внутренним тактовым генератором. Синхронизация происходит один раз по стартовому биту в начале каждого байта. Ошибка 7% вызовет сдвиг точки считывания последнего восьмого бита за границы битового промежутка.
Проблема решается использованием внешнего генератора нужной точности ( например, кварцевым генератором с ценой около $2 ) или кварцевым кристаллом, повешенным на выводы «OSC1» и «OSC2» контроллера. Для схемы взят керамический 3-выводной резонатор, в котором уже есть требуемые конденсаторы. СтОит он около $0.40, а точность имеет ±0.5% .
В микроконтроллере есть UART, который существенно упрощает последовательную связь 19 . Единственным внешним компонентом, нужным для непосредственного подключения к COM порту компьютера, является преобразователь уровня ( в RS-232 сигналы двуполярные, см. §14.7.8 [* и §12.10.4 ] ). Для схемы выбран MAX202, который работает от одного источника +5V и получает требуемые ±10 V с помощью внутренней схемы накачки заряда. Для его работы нужны четыре конденсатора 0.1 μF [* т.е. «единственный внешний компонент» плавно превращается в пять дополнительных деталей и ещё разъём ] . Если вникать во все эти детали нет желания, можно взять MAX203 со встроенными конденсаторами. Но его цена ∼$5, а MAX202 стоит всего $0.75. Разница слишком велика, поэтому большинство инженеров выбирает голый преобразователь. [* В данном случае важнее не цена. MAX203 выпускается ## одним производителем, который, к тому же, обожает снимать микросхемы с производства, а MAX202 - промышленный стандарт и выпускается всеми, кому не лень. Т.е. выбрав MAX202, можно с уверенностью утверждать, что ситуация «микросхем нет и не будет» не возникнет ] .
==1064
Если нужна связь через USB, есть несколько путей. Можно взять микроконтроллер с поддержкой этой шины, например PIC18F2450. Но не стОит недооценивать сложность протокола обмена. Разбираться с ним придётся или при написании собственного драйвера устройства для управляющей машины, или для подгона своего прибора под один из 16 предопределённых классов. В их число входит манипулятор интерфейса пользователя ( human interface device - HID ), накопителей ( mass-storage device ), принтер, устройство ввода изображения ( imaging device ), связное устройство ( communications device ). Но гораздо проще, оставаясь в рамках асинхронной передачи, использовать преобразователь USB-COM в виде готовой микросхемы, например FT232R ( $4 ), которая и создавалась для такого рода задач 20 . Основным её достоинством является надёжное функционирование и наличие полного набора драйверов и утилит для управляющей машины. Настройка нужна только один раз, а потом скорость и прочие параметры считываются из внутренней EEPROM на кристалле.
Аналогично, встроенный в контроллер UART можно использовать для подключения к Ethernet, задействовав коммерческий модуль преобразователя Ethernet-COM, например, Lantronix XPort. Этот симпатичный компонент выглядит как чуть удлинённая розетка RJ45 на плату. Вся электроника спрятана внутри. Модуль имеет даже привычные индикаторы активности - жёлтый и зелёный и стоит $50.
Обзор схемы закончим на оптоизоляторе. Его выходом служит плавающий фототранзистор. Вывод микроконтроллера подтягивается к земле, когда через светодиод течёт ток. Светодиод гаснет при каждом переходе через ноль примерно на 1 ms , поэтому на выходе стоит накопительный конденсатор 100 nF , поддерживающий непрерывный НИЗКИЙ уровень на входе. Часто можно видеть попытки использовать в такой схеме встроенные подтяжки, но, несмотря на уверения справочных данных, они оказываются не такими уж «слабыми». По спецификации ток может достигать 0.4 mA и потребует конденсатора 1 μF , чтобы удержать потенциал входа ниже 0.4 V в течение ∼1 ms . Выходом будет отказ от штатной опции. Надо отключить внутренние подтяжки и поставить «гарантированно слабые» внешние. Ток 50 μA требует конденсатора всего 0.1 μF .
15.4.2 Микропрограмма
Код, как и прежде, незатейлив. Разберём сначала псевдокод 15.2 . После подачи питания надо перевести в пассивное состояние линии управления реле, установить режим работы портов ( направление, подтяжки ), настроить последовательный порт ( скорость, формат передачи ), разрешить сброс при просадке питания ( “brownout” ) и при сбое программы ( “watchdog” ), а затем выполнять обычную для данной задачи работу: постоянно проверять состояние органов управления ( у них нет защиты от дребезга ) и пинать сторожевой таймер - “watchdog” 21 . ( Это полезное занятие, показывающее, что контроллер в активном режиме ). Нажатие кнопки «LOCAL» переводит устройство под местный контроль, в котором начинается опрос кнопок прямого управления нагрузкой. Программа 15.2 защищается от дребезга, выполняя повторное считывание уровня на входе через 10 ms после обнаружения нового состояния.
Псевдокод 15.2 Управление нагрузкой переменного тока
Setup Ports: disassert (setbits) relay outputs (A0, A1) setports LEDs (A2, A3) and relays (A0, A1) as outputs setports switches (B3-B7) and opto (A4, A5) as inputs set switch input ports (B3-B7) as weak pullups set up UART: baudrate, 8N1, interrupts, enable Low Power: disable unused peripherals Automatic Reboot: enable “brownout reset” and watchdog Switch Polling Loop read switches (port B) if (any switchbit has changed) if localmode switch (B3) asserted, set mode=local if mode=local and any switch went H^L turn ON or OFF that relay output delay 10 ms (“software debounce”) kick the watchdog repeat Switch Polling Loop Serial Interrupt Handler get character if “r” or “R”, set mode=remote if “l” or “L”, set mode=local if “s” or “S”, assemble 5-bit status byte and send if mode=remote if “A”, turn on A relay if “a”, turn off A relay if “B”, turn on B relay if “b”, turn off B relay
Основной цикл активен постоянно, но отсутствие опроса последовательного порта не означает, что он не работает. Процесс инициализации µC после подачи питания включает настройку UART на работу по прерыванию. Принятая по последовательному каналу команда вызывает переключение процессора на обработчик прерывания, в котором входящий байт данных сравнивается с семью допустимыми кодами ( один печатный символ ) и соответственно обрабатывается. В основном вся реакция заключается в изменении состояния одного бита ( или порта, управляющего нагрузкой, или переключателя удалённое/местное управление ). Команда «s» ( «status» ) чуть интереснее. Она заставляет процессор собрать четыре бита, отражающие состояние реле и выходов оптопар обратной связи для обоих каналов, и бит активности местного управления. Все они пакуются в один байт данных и отправляются в качестве ответа.
15.4.2.A Некоторые пояснения
- Микроконтроллеры обычно имеют внутреннюю постоянную память данных [* это именно память данных: из неё нельзя исполнять код ] , которую можно использовать для сохранения состояния выхода и восстановления его после аварии питания или сброса. Для таких целей у выбранного µC есть 128 байт EEPROM.
==1065
- Должной программной практикой является всемерное сокращение времени, которое процессор тратит в обработчиках прерываний. В частности следует избегать использования в них кода, который может застопориться в ожидании готовности медленного периферийного устройства ( например, последовательного порта ! ), потому что в этом случае основной цикл может пропустить изменение состояния кнопки. В данном случае всё хорошо, потому что и команда, и ответ - однобайтные, и µC не требуется дожидаться, пока аппаратура доложит о завершении передачи 22 .
==1065
16 Если хочется сэкономить время ( и слегка схитрить в ходе обучения ), можно залить проблему деньгами: существует масса отличных модулей, выполняющих такую работу. В качестве примера можно назвать Pulizzi Engineering ( Eaton Corporation ) или APC ( Schneider Electric ). Само задание предложено из педагогических соображений и разрабатывалось на грант фонда Шульского (Shulsky Foundation). <-
17 Например, Crouzet, Crydom, Magnecraft, Omron, Opto22, P&B, Teledyne. <-
18 Измерения тока утечки в выключенном состоянии у двух оптореле фирмы Crydom дало ∼2 mA для D2425 ( 25 A ) и ∼6 μA для EZ240D18 ( 18 A ). Спецификации указывают ток для наихудшего случая: соответственно 10 mA и 100 μA . <-
19 А вот настройка его в микроконтроллере ( установки таймера, делители, режим сдвига, прерывания ) довольно запутанная вещь. Лучший выход - беззастенчиво скопировать образец настройки из какого-нибудь примера в документации ( это целые книги на 300...400 страниц ). Примеры всегда есть, потому что производители не уверены, что сами пользователи сделают всё правильно. <-
20 Его можно получить в нескольких исполнениях. Есть, например, кабель с USB разъёмом на одном конце ( там же находится микросхема ) и 9-контактным разъёмом последовательного порта с уровнями RS-232 на другом. А в другом варианте на стороне COM порта могут просто торчать провода с рабочими уровнями 3- или 5-вольтовой логики. <-
21 БОльшая часть инженеров зовёт данный процесс “kicking the dog” ( «пинание собаки» от watchdog - сторожевой таймер ), но наблюдательный коллега авторов Фрэнк Канингхэм (Frank Cunningham) заметил, что на самом деле это поглаживание собаки. Если собаку пнуть, она сработает немедленно, а если гладить, то только когда поглаживание прекращается. <-
22 Это стандарт, известный под названием SCPI ( Стандартные команды для программируемых приборов ). Он определяет набор кодов и синтаксис, используемый при обращении к прибору. SCPI довольно многословен, но зато понятен и широко используется производителями измерительных инструментов ( в их числе Agilent, Fluke, Keithley, LeCroy, Rohde & Schwarz, Tektronix ). Например, чтобы выяснить напряжение надо послать команду «MEASure:VOLTage:DC?» ( изменение регистра символов - опциональное ). Измеренное значение возвращается в предопределённом формате. <-