О вреде блокирующих конденсаторов

Какой емкости нужно ставить конденсаторы в цепи питания микроконтроллера? — Вопрос далеко не праздный.

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

Когда нужно разработать какое-нибудь устройство, сначала выбирается собственно сам микроконтроллер. Для устройств, которые питаются от сети или от компа (по USB) я обычно беру что-нибудь из AVR или Cortex. Для устройств с автономным питанием (от батареек) — беру MSP430.

Вообще надо заметить, это так было раньше — лет пять назад. Сейчас  почти все новые МК имеют энергопотребление от 150 до 250 мкА/МГц. Поэтому особой роли не играет, какой МК следует закладывать в разработку.

Вот и сейчас, для нового девайса с батарейным питанием я по инерции использовал MSP430.

Чтобы не водить читателей за нос, скажу, что это устройство — индикатор протечек «Филимон». Не путайте индикаторы протечек с пожарными извещателями, которые я тоже описывал в блоге, — и те и другие имеют одинаковое сокращение — ИП. (С некоторых пор я уже не занимаюсь пожарными извещателями.)

ИП «Филимон» — в двух словах — это устройство, которое следит за протечкой воды. Датчики устанавливаются под ванну, под раковину, под стиральную машину и т.д. Как только случается протечка, устройство начинает истошно орать. Есть версия, которая имеет выход «сухого контакта» для исполнительных устройств, которые перекрывают воду.

Поскольку девайс имеет автономное питание типа  батарея «Крона», то нужно очень экономно расходовать энергию. Если в пожарных извещателях «Спектрон-305» мне удалось добиться энергопотребления 75-100 мкА (и это считалось круто!), то в ИП «Филимон» я добился потребления 10-12 мкА.

Емкость батареек «Крона» (6F22) составляет около 430 мА*ч. Это значит, что устройство способно проработать от «Кроны» 430 / 0.012 = 35800 часов. Поделим полученное число на 24 и получим — почти полторы тысячи суток. Поделим еще раз 365 и получим что-то около четырех лет.Ежу понятно, что «Крона» столько не протянет даже хранясь в упаковке! Поэтому, я буду считать, что между заменой источника питания, «Филимон» способен проработать 1-2 года, а дальше как повезет.

Так вот, в «Филимоне» я использовал мало потребляющий стабилизатор MC78LC33 (который, к стати, потребляет на свои нужды всего 1 мкА!). По привычке, по рекомендациям производителей, и я также делал и в «Спектронах», — я установил на входе и на выходе стабилизатора керамику X7R емкостью 0.1 мкФ. А так же между ножками VCC и GND процессора MSP430F2001 повесил еще один конденсатор на 0.1 мкФ.

В принципе, этих конденсаторов было бы уже достаточно. Но у меня в схеме используются светодиоды — аж четыре штуки! И они находятся в цепях питания процессора. Таким образом, при включении/выключении светодиодов, в питании будут наблюдаться мощные броски тока — до десятка миллиампер. Как это может сказаться на работе процессора — никто не знает. Надо проверять экспериментально. Поэтому на всякий случай я поставил  на выходе стабилизатора еще один дополнительный конденсатор — тантал на 10 мкФ.

Вот он-то и сыграл со мной злую шутку!

Небольшая серия «Филимонов» была собрана, проверена и уже была готова уйти к людям, как внезапно я обнаружил зависание процессора при смене батарейки. Оба-на!

Крайне неприятный момент. И очень хорошо, что ИП никуда не ушли, а лежали у меня на столе.

Я погрузился в изучение этого глюка. Оказалось, что если батарейку менять очень неспешно или, наоборот, очень быстро (за 3 секунды), то глюк себя не проявляет. Но если батарейку менять в течение секунд 5-15 секунд, то процессор «Филимона» надежно подвешивается.

Понятно, что чтобы перезапустить проц, нужно либо дернуть ножку RST, либо отрубить питание и дождаться пока разрядятся все емкости. Первое не канает, так как кнопку «Сброс» я не устанавливаю по идеологическим соображениям. Советовать же пользователям замыкать RST на землю скрепкой — ну, это ваааще не вариант!

Второе — ждать разряда конденсаторов. Этот вариант тоже не особо канает, так как нужно ждать минуту или две. В момент, когда зависает проц, он вообще перестает потреблять ток, поэтому разряд конденсаторов (точнее — того самого большого конденсатора на 10 мкФ) происходит через мегаомные резисторы в сигнальных цепях, и это очень долго!

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

Первым делом я подумал, что у меня происходит паразитное питание проца от входных сигналов. А что, вполне может такое быть — много-ли процу надо! Он потребляет всего несколько микроампер, и если входные цепи способны обеспечить эти микроамперы, то такое вполне может произойти.

В схеме у меня реально такая цепь есть —  цепь определения напряжения на батарейке — это резистор 2.4 МОм с ножки проца на +9В. В принципе, резистор может легко обеспечить процу паразитное питание величиной в пару микроампер. Этого вполне достаточно чтобы проц сохранил питание, но при этом слегка сбрендил.

Я убрал эти цепи, переписал прогу, чтобы «Филимон» не орал, что батарейка села. Проверяю… Глюк сохранился. Значит это не паразитное питание. А тогда — что?

Начинаю копать глубже. Проблема, однако, в том, что к процу не имеет смысла подключаться JTAG-ом. Во первых, глюк проявляется при снижении напряжения питания — а смоделировать это при подключенном JTAG-е практически невозможно! А во вторых — проц большую часть времени находится в спячке и практически ничего не потребляет — то есть JTAG-ом ничего не посмотреть, а будешь смотреть — нарушишь условие возникновения глюка. Ларчик захлопнулся…

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

Начинаю экспериментировать — вытаскиваю батарею и вижу, что импульсы пропадают при снижении напряжения питания проца в районе 2.3 В. Благо, танталовый конденсатор в 10 мкФ обеспечивает очень плавное снижение напряжения питания.

Ну что ж! Точка, когда процессору сносит крышу — найдена. Но 2.3 В — это какое-то неправильное наряжение. MSP430 сохраняют свою работоспособность до 1.2 В. По крайней мере User Manual говорит о цифре 1.8 В, а это все-равно намного ниже, чем 2.3 В. В общем, получается не совсем понятно, с чем это я столкнулся.

Хорошо. У процессора есть вывод (ножка) для наблюдения за тактовой частотой SMCLK. Переписываю снова программу, осциллографом смотрю на тактовую частоту на этой «лапке». Частота есть. Отключаю «Крону», напряжение с 3.3 В начинает плавно снижаться. При напряжении 2.3 В тактовая частота пропадает примерно на 100 мкс и возникает снова. И уже окончательно пропадает при напряжении примерно 1.9 В. Чудеса!

Причем, пауза в 100 мкс повторяется с завидной стабильностью. Интересно, что это такое? «Становится всё чудесатее и чудесатее» (с)

Довешиваю в цепь питяния 3.3 В электролит на 47 мкФ, чтобы еще сильнее затянуть процесс снижения напряжения питания. 100-микросекундная пауза, возникающая при напряжении 2.3 В сохраняется. Более того — и даже вообще не думает изменяться по какому-либо параметру. Понятно, что что-то происходит не в мой программе, а внутри процессора.

И вот тут-то я замечаю две вещи. После паузы в SMCLK, мои программно-формируемые импульсы пропадают. Ну это понятно, этого и следовало ожидать — ведь после снижения напряжения питания до 2.3 В проц подвешивается. А второе — это я замечаю на осциллографе — формы тактовых импульсов до паузы и после, как-то сильно отличаются друг от друга.

До паузы — импульсы тактовой частоты — это хорошие такие хорошенькие прямоугольнички. Не скажу, что с ровными фронтами. Как обычно — слегка «смазаны». Но это однозначно прямоугольники! А вот после паузы импульсы то прямоугольные, то треугольные, то трапецеидальные — всякие! Такого я еще не видел!…

Начинаю соображать — что вообще происходит-то? А надо сказать, что горизонтальную развертку осциллографа я включаю на значении в несколько миллисекунд. Картинка тактовых импульсов выглядит как сплошной забор, у которого высота постепенно снижается (ну понятно — напряжение питания падает же!), а где-то посредине экрана в «заборе» выломана одна дощечка — это и есть та самая пауза в 100 мкс. Понятно, что при такой развертке формы импульсов — не видно. Вместо импульсов — сплошная заливка! Чтобы посмотреть на форму импульсов нужно подвести к центру экрана интересующую нас область и увеличить скорость развертки в несколько раз.

И вот тут до меня «долетело» — до и после паузы тактовая частота импульсов оказалась разная! До паузы тактовая частота 12 кГц, а после — примерно 1 МГц. Ой-ё-ёй! И как сие понимать?

Тактовая частота ядра в программе равна 16 Мгц — я сам устанавливаю ее на это значение во время инициализации. Но прога устроена так, что проц все время спит, и тактовый генератор (DCO) не работает. Зато работает 12-кГц-овый тактовый генератор VLO. Он питает Вотчдог. Вотчдог просыпается раз в секунду, вызывает соответствующее прерывание, пробуждаете генератор DCO. В результате проц на полной скорости (16 МГц) быстро выполняет свою работу и снова ложиться спать.

При снижении напряжения питания что-то происходит, и сигнал SMCLK переключается с VLO на DCO, что я и увидел на осциллографе. Переключение происходит не мгновенное, а с какой-то паузой в 100 мкс. Я не могу дать объяснение этой паузе.

Однако, сейчас меня волнует другой факт — что происходит с генераторами при напряжении 2.3 В?

На исследование проблемы я потратил почти день, и у меня нет полной уверенности в том, что я правильно понимаю что происходит. Я лишь предполагаю, что при снижении напряжения питания наступает ограничение по максимальному значению тактовой частоты. Согласно документации проц может работать на максимальная частоте (16 МГц) только при напряжении питания 3.3 В. При понижении напряжения питания максимальная частота также должна снижаться.

Видимо, когда у меня в схеме перестает выполняться условие соответствия напряжения питания тактовой частоте, происходит формирование сигнала PUC, который и заставляет модуль синхронизации (BCM+) переключить систему тактирования.

Надо заметить, что аварии с генераторами тактовых сигналов не вызывают сброса процессора — просто система тактирования переключается на другие тактовые генераторы (не другие частоты).

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

Как такое вообще могло произойти? Скорее всего в этом виновато очень малое энергопотребление и относительно (этого потребления) большая емкость танталового конденсатора. Реально получалось, что при отключении «Кроны» на 5-10 секунд, напряжение питания снижалось как раз до этих самых 2.3 В, когда происходит сбой в тактовом генератора DCO (16 МГц) и модуль синхронизации производит «перестроение» схемы тактирования. При этом проц продолжает жить! До снижения напряжения питания — чтобы произошел сброс проца — остается еще «много» напряжения. Поэтому сброса нет. А поскольку проц перестает просыпаться (Вотчдог отключен от VLO), то процесс снижения напряжения питания еще больше затягивается. Подсоединение батарейки вновь восстанавливает питание проца до положенных 3.3 В, но Вотчдог все равно от VLO отключен. Поэтому ничего не меняется.

Можно, конечно, понизить тактовую частоту DCO до 1 МГц и тем самым предупредить выход за границы допустимых значений. Но при этом время обработки (время работы программы) увеличится в те же 16 раз, а также возрастет энергопотребление.

Я поступил по другому. Я удалил из схемы танталовый конденсатор. Таким образом, емкость в цепи питания уменьшилась примерно в 50 раз, и примерно во столько же раз уменьшилось время захода в диапазон питающих напряжений 2.3 В и ниже. Практически, пока происходит смена батарейки, проц просто «пролетает» это напряжение. А когда происходить подсоединение новой батарейки, оставшееся напряжение питания проца очень мало, поэтому получается, что проц перезагружается обычным способом.

Наверно надо сказать еще и вот такую вещь. Дело в том, что во многих современных процессорах имеются специальные модули, которые отслеживают снижение напряжения питания ниже заданного уровня. И если такое происходит, то перезагружают процессор. Но в МК, на базе которого построен ИП «Филимон», такой модуль отсутствует. Просто предполагается, что если проц работает на 16 МГц, то напряжение питания не должно снижаться. А если имеется вероятность снижения напряжения питания, то максимальная частота не должна быть высокой. В документации на проц все это четко описано.

Для меня оказалось неожиданностью стечение вместе сразу нескольких обстоятельств. До этого мне как-то не доводилось практиковать одновременно и крайне низкое энергопотребление (единицы мкА), и высокие частоты (16 МГц), и батарейное питание (временное снижение напряжения питания).

Если Вы дочитали до этой строки, то я поражаюсь Вашему терпению! Я опять много написал. Но проблема, с которой я столкнулся, реально из разряда тяжелых. Так что лучше о ней знать.

8 responses to “О вреде блокирующих конденсаторов

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

  2. Да уж, целое расследование прям, прочитал с интересом ))

  3. Разве в MSP430 нет Brown-out detector’a?

    • Хороший вопрос, Кирилл!

      В MSP430 присутствует Модуль Снижения Напряжения Питания (BOR). Этот модуль производит сброс микроконтроллера при включении питания и при просаживании питающего напряжения ниже … ВНИМАНИЕ! … 1.71 В. Причем напряжение 1.71 В согласно даташиту (SLAG491) является самым максимальным значением, типовое и среднее значения — не оговорены, но и так понятно, что они меньше максимального. Таким образом получается, что при снижении питания ниже 1.7 В микроконтроллер будет автоматически перезапущен.

      В мой схеме проблема появляется при более высоком напряжении — примерно 2.2 В, которое с точки зрения модуля BOR является «безопасным». Поэтому модуль BOR в принципе не может отработать этот случай.

      Более того!

      В некоторых микроконтроллерах MSP430 имеется Модуль Супервизора Напряжения Питания (SVS), который также может перезагружать МК. Этот модуль можно сконфигурировать на любое напряжение от 1.9 до 3.7 В (с шагом 0.1-0.2 В). В дополнение к этому, у модуля SVS также имеется еще и специальный отдельный вход — SVSIN. Модуль SVS сравнивает напряжение на этом входе с напряжением внутреннего опорного генератора 1.2 В. Таким образом, к этому выводу можно подключить резистивный делитель и тем самым установить требуемое (свое собственное) напряжение для срабатывания модуля.

      Модуль SVS присутствует не во всех микроконтроллерах MSP430. В микроконтроллере, который я использую — MSP430F2001, этого модуля нет.

  4. Интересная борьба за ресурсы. По-доброму завидую.
    Помню, как запустил AVR на 16 МГц, да со всей периферией. Был поражён собственным потреблением 25 мА. А разрабатывал как раз датчик. Тогда же принял за правило оптимизировать код и «дочитывать до конца» даташит. В том случае удалось добиться 5мА из 20мА суммарных в устройстве (плюс две м/с на плате, с которыми ничего поделать не мог). Сейчас бы сделал совсем по-другому, конечно. Так вот, как раз стоял у меня 78LCxx в SOT23. В той конструкции — это из пушки по воробьям. Только учился.

    «Покой и сон нам только снится».
    С тех пор ничего автономного с потреблением ниже 15-20мА делать не довелось: то внешний АЦП портит картину, то датчик Холла, трансивер и т.п. Отсюда – необходимость иметь от 2 до 10 А×ч аккумулятор, чем и решается проблема с питанием. Зато работая с аналоговыми сигналами, столкнулся с шумами по питанию, дрейфом и др. неприятными вещами, в основном сосредоточенными вокруг пары ОУ/АЦП. Сейчас использую серию стабилизаторов ADP33xx (ADP3303 самый ходовой) – дороговато, и подешевле MC33275. А также часто ставлю вместо стабилизатора ИОН для небольшой нагрузки, MAX61xx, MAX62xx, ADR44x – такие использую. Круг задач, очевидно, другой.

    Но что это я. Возникли некоторые вопросы/соображения:
    — почему не собрать внешнюю схему сброса, реализовав супервизор, к примеру, на той же малопотребляющей логике серии LVC. Или всё равно в 1-2мкА не уложиться никак?
    — я с MSP знаком отдалённо, но наслышан о помехозащищённости этих МК. И всё же ни за что не отказался бы от ёмкости 10мкФ, какой бы злющей не была свора watchdog 🙂
    — от чего не разместить на плате микровыключатель, управляемый крышкой батарейного отсека и полностью снимающий питание с МК в момент отсутствия элемента питания. Ведь устройство без выключателя может насторожить потребителя.

    И вопрос по существу: понятно, что на МК ложится роль опроса датчиков и формирования посылки – но вот куда, в статье не написано. Это часть полноценной системы «Умный дом» с продолжением в виде SMS-извещателя? Просто интересно, второй раз наткнулся на Ваш блог.

  5. А если повесить обработчик прерывания по событию неисправности генератора? Вотчдог вроде этим занимается. В стандартных примерах по мсп430 серии г видел проверку успешности старта генератора.

    • С момента возникновения вопроса прошло почти два года. Я уже почти потерял суть проблемы. В общем, для меня это уже не актуально. Занимаюсь решением других задач. Может кто ответит, но я — пасс.

Оставьте комментарий