В первой части мы разбирались с задачей на концептуальном уровне. На мой взгляд было не слишком сложно, хотя местами можно запутаться. Основной принцип был: «ослабить и сместить». И это не про политику. :) Если вы вдруг попали сюда из поиска, то настоятельно рекомендую прочитать первую часть статьи. Здесь-же будет практическая часть.
Поначалу я было подумал, что надо идти от простого к сложному: взять операционный усилитель (ОУ) и далее с картинками наращивать «мясо», объясняя для чего нужен тот или иной элемент. Но тогда будет много картинок и материал придётся растягивать еще на пару частей. Поэтому поступим по другому и не будем избавлять читателя от необходимости включать голову. Берём готовую схему:
И пробуем с ней разобраться.
Скорее всего опытный глаз в этой мешанине элементов сможет различить ОУ в дифференциальном включении. Так оно и есть.
Делитель на резисторах R1, R2 формирует «опорное» напряжение 2,5В — половина питания, оно же напряжение смещения для U1А, вторая половина ОУ (U1B), включенная как повторитель и выступает как буфер. На ОУ U1A собран дифференциальный усилитель. Коэффициент усиления задаётся резисторами R21 и R20 и составляет 0.075, что меньше единицы. Следовательно, у нас не усилитель, а аттенюатор. Диоды D1, D2, D12, D13 защищают входы ОУ от перенапряжения. Их можно заменить на российские КД522. Супрессор D14 обеспечивает защиту от импульсов, например статического электричества — у нас-же вольтметр, и мы предполагаем, что наэлектризованный юзер может взяться за щупы. Резистор R3 выполняет двоякую функцию: обеспечивает входное сопротивление 1МОм, а также немного выравнивает ток смещения между входами. Для полного счастья на вход надо поставить многоразовый предохранитель и варистор. Но у меня нужных номиналов в наличии нет, протестировать как эти компоненты повлияют на точность я не могу, поэтому на схеме не рисую. Предполагаю, что без существенного ухудшения точности можно поставить варистор на 35В и многоразовый предохранитель на 0.25А. При превышении входного напряжения варистор сработает, ток через предохранитель превысит номинальный, и предохранитель разомкнёт цепь. Если вдруг будете повторять схему и решите поставить варистор и предохранитель, то имейте в виду, что ток через варистор начинает течь раньше чем напряжение достигнет номинального, многоразовый предохранитель обладает не малым сопротивлением — в районе 0.5 — 1 Ом.
Операционный усилитель AD8602AR — RRIO, но для этой схемы он избыточен и дорог — цена в Чип и Дип 160руб. Просто у меня он был в наличии. В эту схему лучше подойдет RRIO операционный усилитель с автоустановкой нуля (с нулевым дрейфом) и питанием 5В, например AD8629. Его цена в районе 70руб. RRIO — rail-to-rail input output - это значит что ОУ обеспечивает на выходе напряжение близкое к напряжению питания, а также допускает на входе напряжения от почти нуля до почти напряжения питания. ОУ с нулевым дрейфом предпочтительней, так как схема будет работать точнее и повысится температурная стабильность. Для ОУ AD8602AR заявленный дрейф напряжения смещения в диапазоне температур -40 + 125 составляет 7000мкВ, а для AD8629 всего каких-то 10мкВ. Разница довольно большая, если не сказать огромная.
Схема очень чувствительна к подбору резисторов. Резисторы с разбросом 0.1% здесь надо принимать как данность. Если взять с разбросом 1%, то никакой точности не получите. Я не сильно заморачивался и подобрал из пачки однопроцентных. Отсюда и номинал 9кОм не совсем стандартный. В общем, чем меньше разброс резисторов тем точнее будет прибор. Схема никакая не оригинальная. Её можно встретить в документации. Например, похожая схема есть в документации на источник опорного напряжения REF3025, в разделе 9.2.
Как я писал в первой части — у нас не будет в явном виде источника опорного напряжения. Моя плата Arduino nano старая и контуженая. На выходе REF - ноль, а как вход он просто не работает. Кроме того, напряжение на выходе 5В зависит от того как запитывать плату. Если запитывать от внешнего источника, то на выходе будет 5 Вольт, если подключить USB, то напряжение идет напрямую с порта и становится в районе 5.25-5.5В. Соответственно напряжение после делителя на резисторах R1 и R2 также будет меняться. То есть наше опорное напряжение слегка плавает. Если не принимать специальных мер, то вольтметр будет показывать разные напряжения в зависимости от того как он запитан.
Поэтому мы поступим следующим образом:
1. Переключим входы АЦП А0 и А1 в дифференциальный режим;
2. На вход А1 подадим наше плавающее «опорное», а на вход А0 подадим измеряемое напряжение.
Таким образом мы без всяких вычислений получим «опорное» минус измеренное. Останется только поделить на коэффициент усиления, который у нас, как вы помните, меньше единицы. Если дифференциального входа нет, например, вы решите использовать АЦП Arduino. То «опорное» надо подать на отдельный вход АЦП, перед измерением основного значения измерять «опорное», потом измерять основное, дальше делать вычисления средствами микроконтроллера. Звучит запутано. Но на деле не так сложно. Конечно, всё существенно упрощается если у вас в схеме есть нормальный источник опорного напряжения.
Полная схема «Arduino style» выглядит не супер, но надеюсь, понятна:
В конце статьи будет ссылка на программу и схемы в высоком разрешении. Дзен очень сильно пережимает картинки.
Эта схема используется у меня в составе проекта, который я возможно когда-нибудь опубликую. Но это не точно.
Для статьи и оценки погрешности собрал вольтметр на макетной плате.
Как видно деталей чутка побольше чем заявлено в заголовке статьи.
Погрешность оценивал с помощью источника питания UNI-T UTP1306 и мультиметра UNI-T UT181A с заявленной погрешностью в диапазоне 600мВ-60В +-0.025%+5. Формально, с точки зрения метрологии, имея прибор более высокого класса, мы можем проверить прибор более низкого класса. Проверял в диапазоне 0-32В в прямой и обратной полярности.
Вот что у меня получилось:
"U реальное" — это напряжение на выходе источника питания измеренное прибором UNI-T UT181A. При измерении в обратной полярности минус не писал — и так понятно. Если взять самую большую измеренную погрешность — 0.21%, накинуть для уверенности до 0.25%. То можно сказать, что погрешность нашего вольтметра получилась не более 0.25% во всём диапазоне измерений. Я считаю, что для собранного на макетной плате «прибора» это очень не плохо. Поскольку наш вольтметр по большей части аналоговое устройство, то можно однозначно сказать, и это видно из таблицы, что он не линеен — т.е погрешность не одинаковая во всём диапазоне. На графике это выглядит вот так:
Видно, что наибольшая нелинейность наблюдается в диапазоне 0-9В. Вполне вероятно, еще немного поработав со схемой, можно улучшить показатели, но вопрос: а надо? На мой взгляд не очень. На этом решил остановиться. Заснял небольшое видео, которое даёт представление как это работает в динамике:
В этой заметке я не буду разбирать программный код — он достаточно примитивен. В скетче по ссылке есть комментарии, которые помогут разобраться что к чему. Если совсем непонятно, то задайте вопрос в комментариях.
Плюс ко всему микроконтроллер может быть любой. Главное понять принцип согласования АЦП с внешним миром, а уж на каких компонентах это реализовывать, дело десятое.
Несмотря на то, что схема предельно проста у неё есть хороший потенциал. Например, легким движением программного кода можно сделать TrueRMS вольтметр для переменного тока в диапазоне 0-32В. Если будете повторять оригинальную схему с АЦП ADS 1115, то частотный диапазон без существенного снижения точности будет в районе 400Гц. Если же использовать АЦП Arduino, то частотный диапазон можно существенно расширить — до 5-10кГц точно. Но я готовых решений давать не буду. Думайте собственной головой. Также на базе этой схемы можно создать недорогой многоканальный вольтметр, который можно использовать для диагностики и ремонта компьютерных блоков питания. Конечно, схему надо будет немного переделать. Для этого потребуется источник опорного напряжения на 2.5В, например, REF3025. Несколько одноканальных операционных усилителей, например AD8628. Количество усилителей равно количеству каналов вашего вольтметра, но не больше чем количество каналов АЦП вашего контроллера. Внешний АЦП в данном случае будет не нужен. Впрочем, если вас устроит 4 канала или наоборот надо больше, то АЦП можно оставить. Резисторы 0.1% доступны как в Чип и Дип, так и на Алиэкспресс. В общем проблем со сборкой аналоговой части быть не должно. Программная часть тоже не должна вызвать затруднений.
У вольтметра есть одна интересная особенность — калибровка нуля при загрузке. Путем применения небольшой хитрости можно измерять разброс напряжений, например в батарейной сборке. Для этого надо выбрать батарею с максимальным или минимальным напряжением, подключить её к вольтметру, и включить питание. Напряжение батареи будет сохранено в память вольтметра, и все дальнейшие измерения будут вестись относительно него. Таким образом мы сразу сможем увидеть насколько напряжение на других батареях больше или меньше референсного. Калибровочное значение сохраняется до следующей перезагрузки.
Уверен, если дать фантазии разгуляться, то область применения схемы можно еще более существенно расширить. «Простая схема с огромным потенциалом» - так надо было назвать статью. Я прекрасно понимаю, что сейчас никто особо не собирает какие-то схемы, тем более приборов. Многое можно купить. Но если вдруг возникнут вопросы или дополнения, то вы всегда сможете использовать комментарии. Сразу скажу, что отвечать на вопросы типа «у меня есть другой микроконтроллер, как мне переделать схему на него» я не буду. Помощь зала не должна заменять собственную голову. На этом всё.
Скетч для Arduino, спецификация элементов и схемы в высоком разрешении доступны по ссылке.
По традиции: не стесняйтесь создавать какие-либо устройства для своих нужд и публиковать статьи.