Найти в Дзене

Точный вольтметр на Arduino из трех деталей

Друзья, сразу скажу - заголовок отчасти провокационный. Но только отчасти. Посмотрев, что выдаёт поисковик на запрос «вольтметр на Arduino», у меня на лысине волосы встали дыбом. «Топовые» блоггеры «кормят» людей простейшей схемой, подключая переменный резистор как делитель напрямую к АЦП микроконтроллера. Всегда хочется потролить таких «профи», попросив измерить напряжение в обратной полярности. К слову сказать, мало кто из «просветителей» и «обучителей» говорит о том, что их вольтметр убог чуть более чем полностью и не умеет измерять напряжение в обратной полярности. Мало того, он не решает почти никаких задач. Чему научится человек, повторив такую конструкцию - непонятно. Наверное, подключать потенциометр как делитель и вызывать analogRead. Забыл! Еще научатся подключать простенький дисплей. Для новичка вроде немало. Концепция «от простого к сложному» - проста и убога одновременно. В наше продвинутое время стоит предлагать конструкции посложнее, которые задействуют сразу несколько

Друзья, сразу скажу - заголовок отчасти провокационный. Но только отчасти.

Посмотрев, что выдаёт поисковик на запрос «вольтметр на Arduino», у меня на лысине волосы встали дыбом. «Топовые» блоггеры «кормят» людей простейшей схемой, подключая переменный резистор как делитель напрямую к АЦП микроконтроллера. Всегда хочется потролить таких «профи», попросив измерить напряжение в обратной полярности. К слову сказать, мало кто из «просветителей» и «обучителей» говорит о том, что их вольтметр убог чуть более чем полностью и не умеет измерять напряжение в обратной полярности. Мало того, он не решает почти никаких задач. Чему научится человек, повторив такую конструкцию - непонятно. Наверное, подключать потенциометр как делитель и вызывать analogRead. Забыл! Еще научатся подключать простенький дисплей. Для новичка вроде немало. Концепция «от простого к сложному» - проста и убога одновременно.

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

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

Наверное, никто не будет спорить, что мир вокруг нас аналоговый. То есть он, как минимум на уровне нашего восприятия, выглядит как единый и непрерывный. А вот микроконтроллер это цифровое устройство, которое воспринимает мир «порциями». Для преобразования какого-либо аналогового сигнала в «порционный» цифровой, почти у каждого микроконтроллера внутри имеется аналого-цифровой преобразователь — АЦП. Многие микроконтроллеры позволяют подключать внешний АЦП если внутреннего нет или по каким-то причинам разработчик его использовать не хочет. В нашем случае будет использован внешний АЦП. Для этого у меня есть веские причины, о которых расскажу ниже. Но если вы вдруг соберётесь повторить схему, то могу сказать, что использовать внешний АЦП нет необходимости. Но точность вольтметра снизится. Также надо принимать во внимание, что аналоговый мир куда богаче на сигналы нежели цифровой. Например, АЦП микроконтроллера Atmega 328 готов принять сигнал от нуля до +5В относительно нулевой шины питания (земли). Никак иначе. Т.е подать отрицательный сигнал на вход такого АЦП нельзя. Есть не иллюзорный риск повредить вход АЦП. Правда обычно на «полшишечки» можно. Где-то -50-100мВ подать можно. Но измерить такой потенциал всё равно нельзя. Такие АЦП не могут измерять сигнал ниже нулевого уровня. Земля в схеме с однополярным питанием и есть тот самый нулевой потенциал. Для нашей схемы: всё что ниже самого нулевого потенциала — не существует.

Любой, кто имеет инженерное чутьё уже на этом этапе должен увидеть некое противоречие: нечто непрерывное, которое может как-то изменяться от минуса до плюса в широких пределах, например 30 Вольт, нужно подать туда, куда его подавать в принципе нельзя. Даже топовым блоггерам известно, что нельзя подавать 30 Вольт в схему, которая рассчитана на 5. :)

Описанное словами выше, на картинке выглядит примерно вот так:

Таким образом получается, даже если мы рискнули подать наш сигнал на вход АЦП, то в лучшем случае мы сможем зафиксировать всего лишь часть сигнала. Такое даже на показометр не тянет. При разработке устройства взаимодействующего с внешним миром, как правило, определяют диапазон того с чем мы будем взаимодействовать и тип величины (переменное или постоянное напряжение, ток, температура и т.п) Например, если это напряжение, то надо определить диапазон, который собираемся измерять — в моём случае это 0 — 32В, а также какое напряжение будем измерять - постоянное или переменное. Если это температура, то диапазон будет в градусах, если обороты, то в оборотах в минуту и т.д. Имея на руках граничные значения всегда проще проектировать схему. Здесь я не пишу про техническое задание (ТЗ), так как мы всё-таки выступаем здесь как любители. В случае профессиональной (за деньги) разработки всё может быть сильно по другому. Иногда заказчик, не сильно разбираясь, может в ТЗ написать всякое. Например, прибор должен измерять напряжения в широком диапазоне, а в скобочках припишет от 0.00001В до 100 000В. :) Бывает. В общем старайтесь оставаться в рамках реальности. Любая разработка решает конкретную задачу.

После того как определились с диапазоном входных сигналов неплохо понять возможности «железа» - то есть посмотреть документацию на те компоненты, которые планируется использовать. Если это внешний АЦП, то надо внимательно посмотреть диапазон входных напряжений, тип входа, напряжение питания, насколько будет сложно наладить взаимодействие нашего МК (микроконтроллера) с АЦП. Если это операционный усилитель, то надо понимать какое он требует напряжение питания, какие сигналы может принимать на входе и какие выдавать на выходе. В общем из вот таких мелких деталей складывается пазл разработки. Я, к слову сказать, шибко не мудрствовал. Собрал из того, что было в наличии.

Вернёмся к нашим баранам сигналам. Мы имеем достаточно информации, чтобы понять, что нам нужно сделать. Картинка подсказывает часть решения — нам каким-то образом надо «ужать» наш сигнал в диапазон 0-5 Вольт. «Ужать» - это по сути ослабить. Но что делать с отрицательной частью? Ужать в диапазон +2.5В -2.5В можно с помощью обычного делителя, но отрицательная часть сигнала по-прежнему не будет обработана нашим АЦП, если он не имеет дифференциального входа, поскольку пока мы говорим об АЦП Arduino. Попробую на картинке пояснить разницу между дифференциальным входом АЦП и обычным:

-2

К слову сказать не все АЦП имеют по-настоящему дифференциальный вход. Чаще это псевдо дифференциальный вход. Поэтому картинка несколько упрощает ситуацию. Но в любом случае видно, что простым ослаблением сигнала отделаться не получится. Наш знакопеременный сигнал надо не просто «ужать», но ужать таким образом, чтобы знакопеременность была в диапазоне от 0 до +5В. Если не растекаться мыслью по дереву, то мы подошли, если сказать по инженерному, к вопросу согласования входа нашего АЦП с реальным миром. Пожалуй эта одна из самых распространённых задач при разработке. Есть АЦП — значит надо согласовать вход. Иногда это тривиальная задача, как в случае с делителем на входе АЦП у «топовых» блоггеров, иногда не тривиальная. Я бы сказал, что чаще задача обычная.

Здесь самый подходящий момент, чтобы отвлечься и немного поговорить о так называемом опорном напряжении. Для того чтобы измерить какую либо величину, нам нужно её с чем-то сравнить. Потом мы можем принимать решение больше она или меньше того с чем мы сравниваем. В случае, например, с мультиметром, сравнивается сигнал на «плюсовом» проводе с «общим» (common) или нулём. Например, в случае температуры, у нас, для разных шкал, тоже есть опорные значения. Для Фаренгейта. Для Цельсия. Как видим без «опоры» никуда. Никакой АЦП не сможет ничего измерить если у него нет источника опорного напряжения. Так называемого ИОН’а. В случае с Arduino мы можем использовать встроенный источник 5В, либо внешний, который не может быть больше напряжения питания. Строго говоря разные платы Arduino могут иметь разное опорное напряжение. Подробней можно посмотреть в документации. Внешние АЦП функционируют по похожему принципу — имеют встроенный источник опорного напряжения, и часто есть возможность подключить внешний. В моём случае случилась беда. Плата Arduino nano уже пожилая и вход / выход Ref не работает. Поэтому в схеме будет внешний АЦП ADS 1115, который имеет встроенный источник опорного напряжения. Но мы этот источник напрямую использовать тоже не будем. :) Применим схему с «плавающим» опорным напряжением. Теперь давайте опять вернемся к нашим баранам сигналу.

То что его надо «ужать» то бишь ослабить — мы поняли. Но что делать с отрицательной частью? А что если нам сигнал как бы «приподнять» над нулём? Сделать так, чтобы колебания были только в положительной области? «Приподнять» в данном случае означает задать смещение — «подмешать» постоянную составляющую в наш сигнал.

Попробовал изобразить на картинке, но художник из меня только от слова «худо».

-3

Путём «нехитрых» преобразований мы заставили сигнал колебаться не относительно нулевой точки, а относительно 2.5В — это наше опорное напряжение. При этом размах сигнала мы пока не изменили. Относительно 2.5В в дальнейшем мы будем измерять сигнал. В аналоговых схемах это опорное напряжение часто называют напряжением смещения, внося путаницу. Дело в том, что у «иконы» аналоговых схем — операционного усилителя, есть паспортный параметр «напряжение смещения», который отражает несовершенство входного каскада усилителя. Исчисляется такое смещение обычно в микровольтах. Так что постарайтесь не путать.

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

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

Сразу обращу внимание, что нам не особо важно усиливает или ослабляет сигнал наш согласователь входа АЦП. А вот какое напряжение выберем за точку отсчета — важно. Обычно за точку отсчета, в случаях похожих на наш, выбирают половину напряжения питания. Но это делается исключительно из соображений удобства. Строго говоря опорное напряжение может быть любым удобным, не выходящим за рамки спецификации устройства. Наверняка, пока вы читали этот абзац, уже догадались как можно сделать обратное преобразование. В данном случае всё линейно и принцип прост: если где-то прибыло, мы же добавили смещение 2,5В, то должно где-то убыть, чтобы получились истинные значения.

-4

Давайте внимательно посмотрим на графики. Слева у нас сигнал на входе нашего согласователя, справа на выходе. Форма сигналов не отличается, а вот диапазоны напряжений, где располагается сигнал отличаются. Слева сигнал колеблется в диапазоне от -2.5В до +2.5В, а справа всё умещается в диапазон от 0 до +5В — как раз то, что требует наш АЦП. Для удобства я отметил три точки - №1, №2, №3.

Точка №1:

На входном сигнале это -2.5В, на выходном 0В. По принципу прибыло-убыло отнимаем наше напряжение смещения или опорное. 0 — 2.5 = -2.5В.

Точка №2:

Входной сигнал +2.5В, выходной +5В. Опять отнимаем опорное напряжение: 5-2.5 = +2.5В

Ну и точка №3:

Входной сигнал +1.25В, выходной +3.75. 3.75-2.5 = +1.25В.

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

Мы еще даже не увидели никакой схемы, а уже имеем представление о том, как можно согласовать вход АЦП с сигналами в реальном мире. Любой, кто знает что такое операционный усилитель, скорее всего уже набросал в уме схему. С виду ничего сложного. Но дело, как всегда, в мелких деталях. Друзья, как часто у меня бывает, в процессе написания статьи получилось замах на рупь, удар на копейку. :) Думал, что смогу всё уложить в одной статье. Но чувствую, что утомил своей графоманией. Поэтому описание схемы и программной части будут в следующих частях. Не пишите как я «лонгриды». На этом пока всё.

Продолжение опуса здесь.