Что такое Brown Out Reset в микроконтроллерах? Как предотвратить ложные отключения питания
Brown Out Reset (BOR) – важная функция, служащая для повышения надежности работы микроконтроллера после запуска. Данная статья покажет, как обычно используемая для решения проблем с источником питания функция Brown Out Reset может предотвратить и другую проблему.
Обзор функции Brown Out Reset
«Brown out» в микроконтроллере – это частичное и временное снижение напряжения источника питания ниже уровня, необходимого для надежной работы. Многие микроконтроллеры содержат схему защиты, которая определяет, когда напряжение питания падает ниже этого уровня, и переводит устройство в состояние сброса, чтобы обеспечить правильный запуск при восстановлении питания. Это действие называется «сброс при снижении напряжения питания» или «Brown Out Reset» или BOR. Аналогичная функция называется «обнаружение низкого напряжения» или «Low Voltage Detect» (LVD), которая является более сложной и добавляет детектирование нескольких уровней напряжения и может перед запуском сброса вызывать прерывание.
BOR часто включается битом в регистре конфигурации. Как правило, когда BOR вызывает сброс, устанавливается бит состояния. Этот бит состояния сохраняется после сброса (если напряжение питания не снижается слишком сильно!) и позволяет программе обнаруживать проблему и выполнять дополнительное восстановление или регистрировать событие.
Что произойдет, если BOR будет отключен? Вот изображение постепенно падающего напряжения питания. Возможно, это ухудшающийся источник питания или разрядка аккумулятора.
V1 – нормальное напряжение питания. V2 – это точка, в которой микроконтроллер может работать ненадежно. Я показываю V3 как точку, где работа полностью останавливается. Между V2 и V3 находится «опасная зона», где что-то может пойти не так, и работа ненадежна. Устройство может работать корректно в течение многих лет, пока блок питания входит и выходит из опасной зоны, а затем, «бам!», происходит сбой. Уровень BOR устанавливается выше V2 и заменяет опасную зону сбросом устройства. Сброс – это конечно не хорошо, но (обычно) лучше, чем неопределенность.
Далее я описываю ситуацию, когда источник питания работал нормально, но BOR использовался для решения другой проблемы.
В поисках другого использования для Brown Out Reset (трудный путь)
Я проектировал схему, содержащую микроконтроллер PIC и 18 стабилизаторов напряжения, для модуля, управляющего напряжением + 5В для 18 датчиков освещенности. Двенадцать модулей управляли массивом из 204 датчиков. Эти модули являются частью адаптивной оптической системы в большом астрономическом телескопе на Мауна-Кеа на Гавайях. Ниже показана внутренняя часть модуля.
Микроконтроллер находится в центре платы, а 18 линейных стабилизаторов напряжения установлены на стенках корпуса. Модули и датчики установлены на пластинах с водяным охлаждением для отвода тепла от оптической скамьи, которая находится над массивом датчиков. Импульсы от датчиков освещенности поступают на модуль, где они преобразуются в дифференциальные сигналы RS-485 и выводятся на разъем в верхней средней части изображения. Кроме того, в модуль поступают управляющие сигналы RS-485. Все сигналы RS-485 соединяют схемы на расстоянии около 10 метров. Важным моментом является то, что все схемы в модуле питаются от одного источника питания +5 В.
Ниже показан крупный план микроконтроллера и линейных драйверов и приемников RS-485, которые являются центральными для этой проблемы. Черный разъем – это асинхронный последовательный интерфейс, который добавляет еще два сигнала ввода-вывода RS-485.
Модули прошли обширное тестирование на стенде. Без проблем! Они прошли месяцы системных испытаний в лаборатории. Отлично! Настало время для первого испытания на телескопе. Провал! После выключения и включения питания была потеряна связь примерно с половиной модулей. Я подключил отладчик и обнаружил, что микроконтроллер работает и выполняет код, но были поврежденные переменные, и не работал последовательный интерфейс. Очень странно.
Во-первых, я хочу сказать, что отладка в середине ночи на высоте 13 589 футов (4138 м) при температуре воздуха 40°F (4°C) – это не очень весело. Тем не менее, давайте двигаться дальше. Вот схема, показывающая проблему.
Справа находится модуль с линейными приемниками RS-485, подключенными к микроконтроллеру и источнику питания +5 В. Слева находятся линейные драйверы на другом конце кабеля, которые всегда включены. На самом деле, есть драйверы и приемники, идущие в обоих направлениях, но я упрощаю. Когда питание модуля (VCC) было отключено, драйверы и приемники на другом конце линии всё еще были включены (VDD). Сигналы действовали как источники питания и находили путь к линии питания +5 В напрямую или через схему защиты от электростатического разряда на выводах микроконтроллера. Этого питания было достаточно, чтобы предотвратить полное выключение микроконтроллера, и устройство находилось в опасной зоне.
Когда питание модуля включалось, микроконтроллер не запускался с нормальной последовательностью сброса при включении питания. Он запускался, но с проблемами. Почему это не обнаружилось во время предыдущих тестов? Помните пластины с водяным охлаждением? Охлаждающая жидкость в телескопе была немного холоднее, чем охлаждающая жидкость в лаборатории. Моя теория состоит в том, что более низкая температура была достаточной, чтобы выявить эту проблему в некоторых модулях.
Исправить проблему было легко. Я добавил в код оператор, чтобы включить BOR, и проблема была решена. Кстати, мне понадобилось гораздо больше времени, чтобы написать отчет и убедить руководителя проекта, что всё в порядке, чем на решение проблемы.
Ложное выключение питания
Ниже показана диаграмма, иллюстрирующая общую проблему.
Когда источник питания выключен, напряжение не падает до конца. Вместо этого, другие источники питания поддерживают напряжение питания в опасной зоне. Одним из описаний этого напряжения является «ложное питание». Функция BOR не была включена, чтобы обнаружить это состояние и вызвать сброс. При повторной подаче напряжения питания устройство может не пройти обычную последовательность включения, поскольку схема сброса при включении питания может не сработать. Последующая работа является неопределенной, потому что напряжение источника питания опустилось ниже минимального значения, и сброс не произошел.
В моем случае микроконтроллер был Microchip PIC16F877-20I/L. Это промышленная версия с диапазоном рабочих температур от -40°C до +85°C. При тактовой частоте 16 МГц диапазон напряжений питания составляет от +4,0 до +5,5 В. Рабочее напряжение внутри модуля (V1) было устойчивыми +5 В. Напряжение ложного питания на микроконтроллере (V2) при работе на телескопе было около + 1,5 В. Я не измерял его в лаборатории потому, что не было никаких проблем, и я не знал, что его нужно проверить.
Также есть два других, относящихся к этой теме параметра:
- «напряжение хранения данных ОЗУ» («RAM Data Retention Voltage», VDR), «типовое» значение которого составляет +1,5 В;
- «стартовое напряжение питания» («VDD Start Voltage», VPOR) для обеспечения внутреннего сброса при включении питания, «типовое» значение 0 В.
Сложив всё это вместе, я понял, что устройство находилось в опасной зоне. Сброс при включении питания не стоило ожидать, так как напряжение было значительно выше VPOR. Кроме того, не ожидалось, что ложное питание поддержит устройство в рабочем состоянии, поскольку напряжение ложного питания было примерно равно напряжению удержания ОЗУ (VDR). Кто знает, чем модуль занимался в это время...
Почему включение BOR решило проблему? Напряжения запуска сброса при снижении напряжения питания (Brown Out Reset, VBOR) находится диапазоне от +3,7 В до +4,35 В с типовым значением +4,0 В. Уровень ложного питания был значительно ниже напряжения запуска BOR. Проблема решена. Тем не менее, до сих пор остается загадкой, почему микроконтроллеры работали в лаборатории и работали нормально с большим количеством циклов включения/выключения питания.
Заключение
Я нашел описание этой ситуации в конце примечания к применению от Microchip (AN607), которая называет это «ложное выключение питания» («False Power-Down»). И не нашел, чтобы это было задокументировано где-то еще.
Ложное питание может исходить от таких источников, как:
- внешние сигналы (мой случай);
- несколько источников питания в схеме;
- конденсаторы, требующие времени для полной разрядки.
Кажется, что источник ложного питания достаточно высокого уровня, подключенный непосредственно к выводу GPIO и проникающий в устройство через схему защиты от электростатического разряда, может вызвать проблемы даже при включенном BOR. Кроме того, в проектах с очень низким энергопотреблением есть причина вообще не использовать BOR, поскольку он потребляет значительное количество энергии по сравнению с режимами глубокого сна некоторых устройств. Я пришел к выводу, что BOR и его преемник LVD становятся всё сложнее, и ложное питание создает разработчикам еще одну проблему, которую необходимо учитывать в этой сложной составляющей своих проектов.