Наверняка многие, и не только начинающие, любители электроники сталкивались с неработоспособностью своих разработанных цифровых устройств, схем. И хорошо еще, если устройство вообще не работает, тогда поиск ошибки может быть простым. Но бывает, что устройство просто работает неустойчиво, или ошибки возникают изредка, причем без видимых причин. При этом даже попытка посмотреть осциллографом, что творится в схеме, радикально изменяет поведение устройства. Вот об этом и поговорим. Я не буду рассматривать неисправность компонентов схемы, холодные пайки, ошибки монтажа, и тому подобное. Я буду рассматривать схемотехнику и программное обеспечение.
Сразу уточню, что статья рассчитана, большей частью, на начинающих любителей электроники. На тех, кто пытается перейти от повторения готовых конструкций к разработке своих. Тем, кто делает лишь первые шаги в электронике, статья покажется слишком сложной и непонятной. Профессионалам и опытным радиолюбителям статья покажется слишком простой и очевидной. Уровень изложения диктуется лишь целевой аудиторией.
Рассказать про все причины неустойчивой работы цифровых схем невозможно. Их слишком много. Кроме того, некоторые тонкости нужно учитывать лишь в специфических условиях. Я постараюсь достаточно широко охватить вопрос, но не на 100%.
Схемотехнические проблемы и проблемы дизайна
Наибольшее количество случаев неустойчивой работы цифровых устройств вызывают "аппаратные" проблемы и ошибки. Это ошибки и неточности в схемотехнике. Ошибки проектирования печатных плат. Пренебрежение учетом влияние климатических условий и различного вида помех. И тому подобное.
Проблемы с питанием
Весьма распространенное и многогранное явление. Типичной ошибкой начинающих является отсутствие конденсаторов в цепях питания микросхем. Но это лишь малая часть вопроса. Что бы разобраться подробнее, нам потребуется немного "углубиться в дебри".
Любой провод, любая дорожка на печатной плате, вообще любой проводник, обладают не нулевым сопротивлением, индуктивностью, емкостью по отношению к другим проводникам, окружающим предметам, земному шару. Причем и сопротивление, и индуктивность, и емкость распределены, не всегда равномерно, по всей длине проводника. Это можно представить эквивалентной схемой
Обратите внимание, что я не показал, куда подключены вторые выводы емкостей. Емкость может быть относительно общего провода, других проводников, других элементов схемы, и так далее.
О проводниках питания чаще задумываются, когда через них протекает большой ток. Тогда используют провод большего диаметра или более широкие дорожки печатной платы. Действительно, диаметр провода и материал, из которого он изготовлен, толщина медного слоя печатной платы и ширина дорожки, заливка дорожки припоем, влияют на резистивную составляющую. Если используются микросхемы ТТЛ логики старых серий (131, 133, 155 отечественные, 74 импортная), или ЭСЛ логики (отечественные серии 100, 500, например), современные микросхемы с большой потребляемой мощностью, то обычно предусматривают достаточную ширину дорожек. Но вот для микроконтроллеров, современной микропотребляющей логики, аналого-цифровых микросхем, иногда считают, что достаточно тонких дорожек для цепей питания, ток то ведь совсем мизерный. И это первая ошибка.
Микросхемы CMOS (КМОП) логики имеют очень малый потребляемый ток только в статическом режиме. При переключении потребляемый ток может быть весьма большим, но на очень короткое время. То есть, возникают короткие (очень короткие!) пики тока потребления. А это приводит к таким же коротким провалам и выбросам по цепям питания (включая общий провод). Это не увидеть вольтметром. Это можно увидеть только осциллографом (и то не каждым), причем непосредственно на выводе питания микросхемы. Но сначала давайте разберемся с причиной появления этих пиков потребляемого тока. Для этого посмотрим на упрощенную схемы выходного каскада цифровых микросхем. Я изобразил каскад на полевых транзисторах, но все сказанное будет верным и для каскада на биполярных.
CL это емкость нагрузки, и она есть всегда, даже если конденсатор отсутствует. Это емкость самого вывода, емкость монтажа, емкость входов, к которым подключен выход нашей микросхемы. RL это сопротивление нагрузки, которое тоже есть всегда, даже, если оно очень велико. Отмечу, что с точки зрения эквивалентной схемы не имеет значения, куда подключены емкость и сопротивление нагрузки, к общему проводу, или к Vdd. Сопротивление нагрузки не влияет (почти) на пики тока переключения, но влияет на потребляемый в различных статических состояниях ток. В данном случае оно нам не интересно.
Первой причиной возникновения пиков потребляемого тока является перезаряд емкости нагрузки. Пусть в начальный момент времени у нас на выходе микросхемы уровень логического 0. Емкость CL разряжена. Точнее, заряжена до уровня логического 0, что редко превышает 0.5В. Теперь выход переключается в состояние логической 1. При этом емкость должна зарядиться, обычно, почти до напряжения питания микросхемы. Как известно, для идеальной емкости начальный бросок тока может быть бесконечным и ограничиваться только сопротивлением источника напряжения или током источника тока. У нас емкость далеко от идеальной, но бросок тока все таки может быть достаточно большим.
Ток заряда емкости нагрузки ограничивается сопротивлением каналов транзисторов выходного каскада (для полевых транзисторов), но может быть дополнительно ограничен схемотехнически, внутри микросхемы. Не стоит смотреть, что максимальный ток выходного каскада, например, лишь 20 мА. Тут речь идет о постоянном токе, а у нас очень короткий импульс тока. Время перезаряда емкости, то есть, длительность импульса тока потребления, определяется емкостью нагрузки и ограничением тока со стороны выходного каскада. Длительность импульса может лежать и в пикосекундном, и в наносекундном диапазоне.
Аналогичная картина наблюдается и при обратном переключении, из 1 в 0. Только теперь емкость будет разряжаться. Казалось бы, в этом случае нет ничего страшного. Но емкость нагрузки может стоять довольно далеко от вывода микросхемы, если это физическая емкость или какой то компонент, или может быть распределенной.
Вторая причина возникновения пиков потребляемого тока заключается в возникновении сквозных токов через транзисторы выходного каскада в момент переключения. Для обеспечения высокого быстродействия выходные каскады современных микросхем делают достаточно мощными, что позволяет быстро перезаряжать емкость нагрузки. Но эти каскады не могут работать в линейном режиме, так как оба транзистора могут оказаться в проводящем состоянии, что приводит к возникновению сквозного тока. И это даже может вывести микросхему из строя. При этом микросхемы ранних серий, вроде 176, 561, 564 отечественных (и их зарубежные аналоги) в линейном режиме работали успешно. Но у них и быстродействие было ниже.
Что бы проиллюстрировать сказанное на реальном примере, приведу некоторые параметры микросхемы NC7WZ04. Напряжение питания от 1.65В до 5.5В. Входное напряжение низкого уровня не должно превышать 0.3 от напряжения питания, что дает примерно 1.5В при питании от 5В. Входное напряжение высокого уровня не должно быть меньше 0.7 от напряжения питания, что дает примерно 3.5В при питании от 5В. То есть, между 1.5В и 3.5В напряжения на входе лежит зона неопределенности, фактически, зона линейного режима. И время нахождения входного сигнала в этой зоне весьма ограничено. Документация на микросхему определяет, что скорость нарастания входного напряжения не должна быть ниже 5 нс/В при питании от 5 В. Исходя из этого требования можно определить, что в "запрещенной зоне" входной сигнал может находиться не более 10 нс. Вот такие вот жесткие требования.
Выходное напряжение высокого и низкого уровня зависит не только от напряжения питания, но и от сопротивления нагрузки. Для упомянутой выше микросхемы при питании от 5В и токе нагрузки 32мА выходное напряжение высокого уровня 4.13В (типовое значение), но не ниже 3.8В. А выходное напряжение низкого уровня, при тех же условиях, 0.25В (типовое), но не выше 0.55В. Это дает нам возможность оценить выходное сопротивление микросхемы, но только в статическом режиме.
Время переключения составляет, примерно, 2.3 нс при питании от 5В и емкости нагрузки 50 пф. А вот тут уже можете посчитать и пиковый ток перезаряда емкости нагрузки.
А вот так себя эта микросхема ведет при медленном изменении входного напряжения
Хорошо видно, что при этом возникает генерация при нахождении сигнала в "запрещенной зоне". Частота генерации составляет десятки МГц. При этом потребляемый ток возрастает до сотен мА. Эта генерация вызвана работой микросхемы в линейном режиме и работой схем ограничения тока выходного каскада.
Разобравшись с причинами появления пиков потребляемого тока и посмотрев на пример поведения реальной микросхемы мы можем переходить к тому влиянию, которое эти токовые пики оказывают на схему.
Сначала рассмотрим путь тока при переключении выхода из 0 в 1. От источника питания ток пойдет по проводнику, или дорожке, до вывода питания микросхемы (Vdd). Далее, часть тока ответвится для заряда емкости нагрузки, а часть на сквозной (если он возникнет) ток выходного каскада и пройдя через вывод питания (Vss) микросхемы и проводник, дорожку, уйдет в источник. Ток заряда емкости тоже уйдет в источник, но тут путь тока проследить сложнее, так как не обязательно емкость присутствует в виде дискретного компонента. Но, в общем случае, ток пройдет по общему проводу, точнее, его части, и уйдет в источник.
Посмотрите еще раз на эквивалентную схему проводника. Пиковый выброс тока потребления создаст падение напряжения на активном сопротивлении проводника. А это создаст провал питающего напряжения на выводе Vdd микросхемы. Но проводник имеет и индуктивную составляющую. Оставим в стороне возможные резонансные явления из-за индуктивности и емкости проводника. Для коротких импульсов индуктивное сопротивление высоко, что усугубит ситуацию со снижением напряжения на выводе Vdd. Сдвиг фаз между эффектами от активного, индуктивного и емкостного сопротивлений проводника имеет место, но я не буду его рассматривать, для упрощения.
Давайте вспомним, что пороговые уровни для входного сигнала зависят от напряжения питания. Провал напряжения питания, даже очень короткий, приведет и к снижению порогов. Оценим влияние для рассматриваемой в качестве примера NC7WZ04. Пусть провал составит 1В, тогда пороговое напряжение высокого уровня понизится с 3.5В до 2.8В, а пороговое напряжение низкого уровня с 1.5В до 1.2В. Можно заметить, что при этом входной сигнал логического 0, с немного повышенным уровнем, который не вызывал проблем, может оказаться в "запрещенной зоне". А это приведет к некорректной работе схемы. Но это еще не все. Ток через вывод Vss протекающий по общему проводу и ток заряда емкости, протекающий по части общего провода, создают падение напряжения на активном сопротивлении проводника и его реактивных составляющих. А это вызовет повышение потенциала на выводе Vss. Теперь нам грозит другая опасность, теперь входной сигнал логической 1, с немного пониженным уровнем, может оказаться в "запрещенной зоне". Ведь пороги отсчитываются от потенциала вывода Vss. Пусть повышение потенциала составит 0.5В. Тогда пороговое напряжение высокого уровня, относительно "земли", составит не 3.5В, а 4В. То есть, схема может оказаться неработоспособной. Причем неработоспособной неустойчиво.
Теперь рассмотрим переключение из 1 в 0. Точно так же, как с переключением из 0 в 1, может (но не обязан) возникнуть сквозной ток, который приведет к провалу напряжения питания и повышению потенциала вывода Vss. Но у нас есть еще емкость нагрузки. Она будет разряжаться через нижний транзистор выходного каскада и часть проводника между выводом Vss и емкостью нагрузки. Даже, если емкость распределенная. А это тоже вызовет подъем потенциала вывода Vss. Со всеми вытекающими.
Влияние емкости нагрузки может быть очень большим. Так иногда встречаются схемы, где затвор полевого транзистора подключен напрямую к выходу микросхемы (не специализированной). Видимо авторы таких схем считают, что ток в цепи затвора не протекает, но забывают про емкость затвора. Емкость затвор-исток может достигать значительных величин. Так для транзистора NP88N04NUG она составляет 15000 пф (15 нф), и это без учета влияния выходной емкости транзистора.
Что же делать? Если кратко, то нужно уделять цепям питания цифровых микросхем, да и не только им, достойное внимание. Импульсные токи могут достигать весьма заметных значений на фоне среднего потребляемого тока. Проводники и дорожки печатных плат должны иметь достаточное сечение (дорожки - достаточную ширину). Выводы питания микросхем необходимо шунтировать керамическими конденсаторами, причем располагать их как можно ближе к самим выводам. Обычно, устанавливают конденсаторы емкостью 0.1мкф на каждую микросхему. Но может потребоваться и установка нескольких конденсаторов, например, параллельно 0.1мкф и 0.01мкф, если схема очень быстрая и высокочастотная. Кроме того, иногда стоит предусмотреть и электролитические (или полимерные, танталовые) конденсаторы, несколько штук на печатную плату. Они не спасут от коротких токовых импульсов, но помогут при более медленных колебаниях токов в цепях.
Влияние помех, возникающих в цепях питания, я дополнительно рассмотрю немного позднее.
Вторую ошибку часто допускают не учитывая влияние напряжения питания схемы на работу компонентов схемы. Например, понижают напряжение питания с 5В, до 3.3В, так как микросхемы при таком напряжении работают нормально и можно использовать LiIon аккумулятор. Но при этом забывают, что используемым в схеме полевым транзисторам может не хватить напряжения на затворе для обеспечения заданного тока стока. Что бы решить эту проблему нужно выбрать другие транзисторы, но подумать об этом нужно заранее.
Третью ошибку допускают не учитывая влияние климатических условий (температуры, влажности, давления) на работу схемы. Пороговые напряжения логических уровней, длительность переключения, времена задержек распространения сигнала, пороговые напряжения затвор-исток полевых транзисторов, зависят от температуры. Причем довольно заметно. Вместе в влиянием температуры на сопротивление резисторов (ТКС), емкость конденсаторов (ТКЕ), коэффициенты усиления и крутизну транзисторов, это может весьма заметно отразиться на работе схемы. Поэтому собранное устройство, тестовый вариант, надо проверять на работоспособность не только на столе при комнатной температуре, но и при повышенной и пониженной температурах. Если конечно устройство должно работать в таких условиях. Влажность воздуха, повышенная влажность, может влиять на токи утечки по поверхности платы, что иногда надо учитывать, помня о высоком входном сопротивлении многих современных компонентов.
Помехи
Помехи могут быть вызваны не только внешними наводками, но и процессами происходящими внутри самого устройства. От внешних помех можно спастись экранированием, от внутренних только изменив конструкцию устройства.
Вспомним еще раз эквивалентную схему проводника, которую я приводил в начале статьи. Конденсаторы, вторые выводы которых никуда не подключены, показывают не только емкость проводника, но и емкостные связи с другими проводниками и компонентами схемы. Два рядом расположенных проводника, в зависимости от длины, могут иметь емкость от единиц пикофарад, и выше. Короткий импульс с крутыми фронтами прекрасно пройдет через емкость между проводниками в цепь, где его быть не должно, и создаст помеху. А эта помеха вполне способна переключить триггер или быть воспринятой как полезный сигнал микроконтроллером. А теперь вспомним, что в цепях питания (включая общий провод) у нас всегда есть короткие импульсы тока с крутыми фронтами. Это еще раз подчеркивает необходимость установки блокировочных конденсаторов в цепях питания.
Кроме того, любой проводник работает как передающая или принимающая антенна. И это тоже надо учитывать.
Борьба с помехами не так проста, как может показаться. И она выходит далека за рамки статьи. Но, если в общих чертах, то необходимо внимательно подходить не только к цепям питания, но и к топологии монтажа и расположения проводников в целом.
Влияние особенностей используемых микросхем
Начну с устаревшей, на первый взгляд, ТТЛ логики. Напомню, как выглядит типичный входной каскад
Имея дело, например, только с КМОП логикой, легко забыть, что у микросхем ТТЛ есть вытекающий из входов ток. Величина этого тока разная, в разных сериях, и даже у разных микросхем одной серии. Поэтому сопротивление резистора, подключенного между ТТЛ входом и общим проводом не может быть слишком большим.
Но это сопротивление может быть выбрано, случайно, таким, что уровень напряжения на входе (падение напряжения от вытекающего входного тока) лишь немного ниже порогового напряжения логического нуля. А значит, изменение температуры может привести к тому, что напряжение попадет в зону неопределенности. Ну а устройство даст сбой. Или можно подключить к одному входу еще один, не уменьшив сопротивление резистора, и получить входное напряжение в зоне неопределенности, так как ток через резистор вырос в два раза.
Любую микросхему можно непреднамеренно перегрузить по выходу. Этом может быть вызвано, в том числе, емкостью компонентов подключенных к выходу. В таком случает выходное напряжение высокого уровня будет пониженным, если нагрузка подключена к общему проводу. Или напряжение низкого уровня будет повышенным, если нагрузка подключена к цепи питания. Это изменение уровней выходного сигнала может быть постоянным или кратковременным (влияние емкости нагрузки). Но оно вполне может оказаться в "запрещенной зоне" и вызвать неоднозначное и нестабильное поведение устройства при изменении температуры, напряжения питания, или под воздействием помехи.
У микросхем КМОП логики есть свои хитрости. Например, они могут работать при отсутствии питающего напряжения. Что бы понять, как такое возможно, давайте посмотрим на фрагмент схемы входной цепи таких микросхем
Обратите внимание на два диода, защищающие вход от обратной полярности и превышения входным сигналом уровня питающего напряжения. Когда у нас вывод питания микросхемы никуда не подключен, то входной сигнал высокого уровня через диод VD1 попадает в цепи питания. И этого сигнала может оказаться достаточно, что бы обеспечить микросхему питанием. Но это совершенно не гарантирует, что микросхема будет работать корректно.
Приведу простой пример. Для экономии энергии батареи вы отключаете микроконтроллером питание части схемы с помощью транзистора в цепи питания. Но входные сигналы при этом не снимаются. Вы рассчитываете, что после подачи питания схема начнет работать "с чистого листа". Но может оказаться так, что при некотором стечении обстоятельств "чистого листа" не получится. А вы получите проблемы неустойчивой работы.
Переходные процессы
Наверное, многие встречали цепи начального сброса подобные ниже приведенной
Но давайте посмотрим на эту сбросовую цепь внимательнее. Что будет, если напряжение питания пропало (понизилось) на короткое время, а потом восстановилось? Конденсатор не успеет разрядиться, а значит и сигнал сброса не будет сформирован как требуется. По этой причине многие микроконтроллеры имеют внутренние цепи сброса не требующие внешних элементов. Но если требуется внешняя цепь сброса, то нужно принять меры для быстрого разряда сбросового конденсатора, например, параллельным резистором. Или каким либо другим способом.
Теперь давайте вспомним, что логический элемент в микросхеме не переключается мгновенно. Причем задержка переключения может изменяться, как под воздействием внешних фактором, так из-за технологического разброса параметров.
А это приводит к некоторой неопределенности, показанной на рисунке для сигнала Y несколькими линиями. Для более сложных схем влияние становится более заметным. В данном случае я не буду рисовать иллюстрацию сам, а воспользуюсь картинкой из книги (не обращайте внимания на номер рисунка, он для нас не имеет значения).
А ведь это еще очень простая схема. Обратите внимание, насколько сильно изменяется вид сигналов на отдельных элементах, если учитывать не только задержки, но и их разброс.
Поэтому, при составлении схемы реализующей заданную логическую функцию нужно пользоваться не только формулами логики, но и учитывать параметры используемых микросхем.
Задержка одного логического элемента мала, но не постоянна. Задержка сложных логических схем, например, счетчиков, триггеров, сумматоров, уже гораздо больше. И изменяется сильнее. Это необходимо обязательно учитывать при проектировании устройства.
Другой пример, уже из реальных схем. Вы наверное не раз видели схемы электронных часов на микросхемах счетчиков. Счетчик десятков минут должен считать от 0 до 5, при этом его реализуют на двоичном счетчике вот по примерно такой схеме
Когда счетчик досчитает до 6, он будет сброшен в 0. Глаз на индикаторе часов этого не увидит, но на выходах счетчика будет присутствовать запрещенное состояние 6! Оно будет очень коротким, время определяется задержкой элемента 2И-НЕ и временем распространения сигнала сброса в счетчике. Но будет. Если выходы счетчика используются не для индикации, а для дальнейшей обработки, то это может повлиять на устойчивость работы устройства, так как длительность запрещенного состояния будет изменчивой.
Еще одним проявлением переходных процессов являются так называемые "гонки". Предположим, что некий сигнал у нас разветвляется, проходит двумя разными путями, а потом эти сигналы снова сходятся на одном логическом элементе. Пример снова приведу не нарисованный мной, а взятый из книжной иллюстрации.
Обратите внимание, что у нас появляется сигнал помехи, который может оказать существенное влияние на работу схемы.
Думаете, это все применимо только к схемам на дискретной логике? Ошибаетесь. Все это применимо и к схемам на микроконтроллерах.
Влияние неучтенного функционала применяемых компонентов
Предположим, вы управляете какой то микросхемой, например, шинным формирователем, с помощью микроконтроллера. Вход выбора режима микросхемы должен иметь уровень 1 при нормальной работе, и 0 при инициализации и конфигурировании. Вы подключили этот вывод к микроконтроллеру, но не подключили к нему подтягивающий резистор (ни к общему проводу, ни к шине питания), полагая, что выход порта микроконтроллера обеспечивает исключение неоднозначных состояний. Но вы упустили из виду, что при подаче питания на микроконтроллер все выводы порта устанавливаются в состояние "вход" до тех пор, пока вы не переключите требуемый вывод в состояние "выход". Это делается при инициализации, вашей программой. Но между включением питания и переключением вывода порта в состояние "выход" пройдет некоторое время, в течении которого вход выбора режима формирователя оказывается висящим в воздухе. А это может привести к тому, что формирователь перейдет в сосотяние, из которого его сможет вывести только аппаратный сброс через отключение питания.
Я не буду иллюстрировать этот случай картинкой или схемой, ограничусь описанием на словах.
Программные ошибки
Этот раздел будет значительно короче предыдущего. Я обойду стороной ошибки в алгоритмах и реализующих их программах.
Предположим, что вы реализуете алгоритм работы Master шины i2c программным способом. При этом вы используете тактовую частоту 4МГц для микроконтроллера. Не важно, внутренний это генератор, или кварцевый резонатор. Вы внимательно отнеслись к формированию временных диаграмм, но не оставили запаса, или запас очень маленький. Что бы обмен с внешними устройствами был как можно более быстрым. Через некоторое время вы обратили внимание, что тактовая частота 4 МГц не дает требуемой точности для обмена по RS-232 с компьютером, например. Вы решили немного увеличить частоту согласно рекомендациям производителя микроконтроллера. Но вносить изменения в процедуры реализующие i2c не стали. В результате временные параметры для этой шины стали немного выходить за рамки стандарта (чуть быстрее). С довольно высокой вероятностью у Вас все будет работать. Но с изменением температуры, или на другой плате, внешнее устройство может немного не успевать. А вы получите плавающую неисправность. Программную.
Другим примером может быть невнимательность к реализации протоколов и процедур обмена с управляемыми микроконтроллером устройствами. Все может прекрасно работать на макете, но при длительной работе некоторая совокупность факторов может конечный автомат, реализуемый внешним устройством, в запрещенное состояние выйти из которого можно только через сброс. Самое печальное, что такая ошибка может возникать изредка, внешне случайно, и не воспроизводиться при тестировании.
Заключение
На этом я заканчиваю свой длинный, но, безусловно, не полный, рассказ. Основное внимание я уделил цепям питания, входным и выходным каскадам, учету особенностей применяемых микросхем и переходным процессам. Многие другие вопросы обрисовал лишь схематично, на словах. Но, в любом случае, эта статья, по сути, лишь конспективно затрагивает вопросы проектирования устойчивых цифровых устройств. Я постарался показать картину в целом, а не выхватывая отдельные вопросы.
Еще раз подчеркну, статья ориентирована на новичков, на тех, кто переходит от повторения готовых конструкций к разработке собственных, на начинающих автоматизаторов. При этом предполагается, что читатели все таки обладают определенными познаниями в электронике. Поэтому и стиль изложения выбран в достаточной степени упрощенным и образным.
Если вам интересно более глубокое освещение каких либо вопросов, напишите об этом в комментариях. Я подготовлю более подробные статьи по интересующим вас вопросам.