Digital Electronics For Programmers

Digital Electronics For Programmers

В статье поговорим про:

  • Общие базовые идеи – что сейчас используется в цифровой электронике и как это работает;
  • Разные интерфейсы, которые используются для управления железом или которые работают внутри них, то есть между контроллерами и микросхемами;
  • Софтовую часть – как программировать и как использовать;
  • Как искать конструкции для автоматизации.

Аналоговые и цифровые сигналы

Начнем с самого простого: наверное, все слышали про аналоговые и цифровые сигналы. Аналоговый сигнал непрерывен, он никак не меняется. До середины прошлого века вся электрическая часть работала именно на нем. В один момент пришло понимание того, что удобнее работать с дискретными сигналами:

На картинке вы видите да/нет, включен/выключен. В самом общем смысле сигнал и состоит из таких нулей и единиц, именно так он воспринимается какими-то устройствами, датчиками и т.д. Однако полагать, что в физическом проводе тоже присутствует сигнал да/нет – неверно, это утопия. Поэтому существуют некие условности: что такое да/нет договариваются электронщики между собой, наряду с тем, какие схемы они используют – микро или макро-устройства и т.д. В качестве да/нет, например, могут выступать 0 или 5 Вольт, 0 или 3 Вольта, есть вариант -5 и 5 Вольт, в устройствах с очень маленьким энергопотреблением может быть 1, 8 Вольт или 1, 2 Вольта, в зависимости от того, что является источником тока. Устройства с 0 и -12 Вольт или с 0 и 12 Вольт тоже используются в промышленной электронике, в частности, в компьютерной.

Еще важный момент – это несуществование тех прямоугольников, которые нарисованы на схеме, в реальной жизни. У всех элементов есть емкость с индуктивным сопротивлением и прочими необходимыми параметрами, где сигнал не переключается из 0 одномоментно в 5 Вольт. Правильнее сказать, что в реальной жизни вместо прямых углов есть какие-то гладкие прямые, то есть, нарастание и ослабление сигнала происходит в какое-то измеримое время.

Осциллятор

Даже если у вас есть прибор, который всегда выдает 0 или 1, то, несмотря на всю его пользу, не очень понятно, что с ним делать. Обычно, когда говорят про цифровую электронику, то имеют в виду, что сигнал меняется во времени с каким-то дискретным шагом или периодом. Для того, чтобы задать дискретный период в схеме всегда присутствует осциллятор – штука, которая задает ритм, как маятник в часах отсчитывает секунды так, чтобы все шестеренки крутились с одним периодом.

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

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

Есть схемы, чувствительные к качеству осциллятора, то есть его периоду – тому, насколько он аккуратен. Это относится к часам, аналогово-цифровым преобразователям, и прочим устройствам, которые опираются на этот период как на устойчивую константу.

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

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

Электромагнитное реле

Продолжая идею про лимитную базу: на чем вообще строится вся цифровая электроника? Её главный компонент – это ключик-переключатель, девайс-устройство, которое по команде может замыкать или размыкать цепь. Этого довольно грубого и примитивного утверждения достаточно, чтобы понимать, как работают схемы в своей концепции.  Самый примитивный вариант такого устройства – это электромагнитное реле, которое устроено по типу выключателя. Все, наверное, видели выключатель: внутри него есть две пластинки, и когда вы нажимаете кнопочку, одна пластинка прижимается к другой. Реле делает то же самое, только с помощью электромагнита.

Внутри этой синенькой коробочки на рисунке есть пара контактов и электромагнит, который намотан па проволочку на катушке. Когда в катушке появляется необходимый ток, она примагничивает пластинку и замыкает контакт. Контактов может быть разное количество – хоть 2, хоть 3, хоть 10, какие-то группы контактов при подаче тока размыкаются. Таким образом, можно с помощью слаботочного низковольтного устройства управлять мощной нагрузкой. Если вы ездили на трамвае или троллейбусе и слышали характерные щелчки, когда их разгоняют или притормаживают, то это как раз тот момент, когда в них включаются реле, которые относятся к конкретным частям бортовой электроники.

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

Транзисторы

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

Аналогичным образом работает любой другой транзистор (схема справа), не в смысле физики, а в смысле общей логики: на gate, то есть затвор, подается определенное напряжение; он открывается, появляется ток, он включается. В отличие от реле, транзистор работает устойчиво, так как там нет механических штук, его можно сделать очень маленьким, в особенности если токи и мощность, которую он рассеивает – мизерная. Таких транзисторов на кристалле кремния можно сделать миллионы штук, чем и пользуется вся современная микроэлектронная промышленность.

Q: В чем разница между реле и генератором? Генератор с какой-то частотой посылает единички, а потом нолики, и в этом заключается замыкание и размыкание. И реле размыкает также.

А: Если мы возьмем кварц, то токи напряжения, с которыми он работает, очень малы – он не может размыкать какую-то мало-мальски острую нагрузку. Не получится даже сделать «моргалку» с диодом, потому что он просто сгорит. Реле – средство управляющего сигнала и потенциально мощной нагрузки. К реле можно подсоединить лампочку 220 Вольт, обогреватель или даже определенной мощности двигатель, и эта конструкция будет работать. Для реле как такового, генератор не нужен, далее я остановлюсь на этом подробнее.

Микросхемы с логическими элементами внутри

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

Процессоры

Нам, как программистам, интереснее более высокий уровень, поэтому дальше речь пойдет о процессорах, в широком смысле этого слова – я буду иметь в виду и контроллеры и процессоры класса Intel Core i9, так как они работают по общим принципам.

Обычно у стандартного процессора есть набор шин, к которым подсоединяется память и какая-то базовая периферия. Также у процессора есть несколько ножек, которыми программист может управлять. Эти ножки обычно называют GPIO. Часть ножек процессора может работать на вывод, например, вы пишете инструкцию, и состояние этой ножки меняется на 1. Это значит, что к этой ножке можно подсоединить реле или еще какое-то управляющее устройство. И, наоборот, чтением какой-то инструкции можно понять состояние какой-то ноги-пина у процессора. То есть вы, подавая 1 или 0, получаете однобитовый цифровой вход. Также на эту ногу можно повесить программу прерывания – каждый раз, когда будет происходит что-то неправильное, ваша программная функция будет прерывать операцию.

На компьютерах бывают пины, которые работают не только с 1 и 0, но и с аналоговыми значениями, о них будем говорить чуть позже. У многих процессоров есть возможность подключать к ножкам аппаратные модули, которые обслуживают конкретный протокол.

Шины и интерфейсы

Сейчас перейдем к самому простому, поговорим о шинах и интерфейсах и узнаем, как поморгать лампочкой. Нам понадобится светодиод и резистор на 220 Ом. Светодиод пропускает ток в одну сторону и светится. Резистор нужен для того, чтобы ограничить ток, протекающий в цепи. Если вы нагрузите микросхему больше прописанного в инструкции, то она сгорит.

На схеме вы сидите кнопку и резистор. Казалось бы, можно просто замыкать кнопку и заземлять какую-то ногу контроллера, и у нас появится состояние 0 или 1, кажется, что резистор не нужен. Однако если нога процессора никуда не подсоединена, то мы не можем гарантировать его состояние 0 или 1, то есть оно становится неопределенным. Для того, чтобы сделать его определенным, в свою очередь, в схему припаивают подтягивающий резистор (pull-up или pull-down). Он подтягивает ножку либо к 5Вт либо к земле. Если кнопка разомкнута, мы обеспечиваем всегда 0 или всегда +5Вт. Получается, что резистор нужен для того, чтобы избавиться от неопределенного состояния в этой схеме.

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

Здесь вы видите два элемента – реле справа и транзистор посередине. Транзистор нужен для того, чтобы не перегружать вывод контакта Raspberry PI. Максимальный ток, который отдает контроллер, недостаточен для того, чтобы сработало реле, поэтому здесь используется промежуточный транзистор, который открывает транзистор, пускающий ток внутрь реле. Обратите внимание, что управляющий сигнал у Raspberry PI равен 3.3Вт, а в большинстве реле стоит обводка либо на 5Вт либо на 12Вт.

Казалось бы, если у нас есть возможность управлять отдельными ножками на процессоре, то можно организовать любую шину и любой интерфейс. Так и есть, только с несколькими «но»: во-первых, это сильно нагружает CPU. Если мы шьем по какому-то протоколу, то каждый байт нужно разложить на биты, выбрать исключения, провести еще несколько сложных операций, и ресурсы просто заканчиваются, до математических вычислений дело даже не доходит. Поэтому в большинстве современных процессоров, кроме того, что можно программно управлять какими-то ногами этого процессора поштучно, внутри есть готовые блоки, которые реализуют конкретный протокол. Плюс ко всему, шина устроена таким образом, что нужно передавать сигналы в соответствии с расписанием, а если ваш процессор в этот момент времени что-то высчитывал, то вы уже теряете бит и ломаете протокол.

UART

Самый популярный из таких интерфейсов это UART, с точки зрения программиста он называется последовательный порт. В этой конструкции есть две физические ножки, receive (RX) и transmit (TX). По одному каналу данные отправляются, по другому каналу данные слушаются. Пакет протокола нарисован на схеме внизу: с определенной частотой подается старт-бит, какое-то количество полезных данных, бит четности и один или два стоповых бита.

Кроме этого, могут присутствовать два опциональных контакта DSR и DTR, которые сообщают, готово ли устройство отправлять и принимать данные.

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

В реальной жизни UART как интерфейс встречается практически везде: через такой интерфейс работает большое количество embedded устройств, в том числе, WI-FI, все модемы, купюроприемники и т.д.

Порт как на фотографии есть внутри любого модема, роутера, здесь к UART подсоединяется консоль ядра.

Все UART интерфейсы выглядят аналогично тому, как выглядит COM Port в Linux.Работать с ними можно с помощью программ Screen и Minicom.

SPI

Следующий популярный аппаратный интерфейс, это SPI. Принципиально он очень похож на UART, но здесь есть управляемое и управляющее устройство, которые взаимодействуют друг с другом.

На больших контроллерах и процессорах SPI интерфейсов может быть много, и они могут не зависеть друг от друга.

Теперь пара слов про настоящие шины, а не про способ подсоединить периферию к процессору. I2C состоит из двух проводников, один из них – генератор тактовой частоты, по другому контакту передаются данные. Инициализация происходит со стороны master, slaves между собой общаться по протоколу не могут.

В современных PC машинах даже есть готовый софт для работы с такими шинами:

1-Wire Bus

И последняя из таких широко применяющихся шин это 1-Wire Bus. У нее три ножки – питание, данные и земля. Используется в физических устройствах типа датчиков, домофонов и т.д.

На фотографии вы также видите термодатчик. К одному процессору может быть подключено несколько устройств, но одновременно работать они не смогут.

Цифро-аналоговые преобразователи

Пара слов об аналоговом мире: когда у вас есть датчик температуры, который вам дает цифровую температуру – это здорово, но зачастую в нем к вам приходят аналоговые сигналы. Как пример – звук. Есть такие устройства, которые называются цифро-аналоговыми преобразователями, которые как раз занимаются этими преобразованиями.

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

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

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

Что можно сделать дома?

Если вы возьмете Raspberry PI, то увидите на нем гребенку ножек и контактов, которые торчат из платы. Это как раз то, что можно программировать. В Питоне есть модули RPI GPIO, которые представляют собой набор функций примитивов, которые позволяют что-то включать и выключать, а потом подсоединить нагрузку.

Также используя шину 1-Wire Bus и Raspberry PI, можно мерить температуру:

По материалам открытого семинара Александра Сморкалова (Xperience AI) «Digital Electronics For Programmers».