Рубрики
Схемы на Arduino

Ваттметр на Arduino – измерение напряжения, тока и мощности

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

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

Необходимые компоненты

  1. Плата Arduino Nano (купить на AliExpress).
  2. Операционный усилитель LM358 (купить на AliExpress).
  3. Регулятор напряжения LM7805 (купить на AliExpress).
  4. ЖК дисплей 16х2 (купить на AliExpress).
  5. Шунтирующий резистор 0.22 ohm 2Watt.
  6. Подстроечный потенциометр 10 кОм (Trimmer pot) (купить на AliExpress).
  7. Резисторы 10 кОм, 20 кОм, 2,2 кОм, 1 кОм (купить на AliExpress).
  8. Конденсаторы 0,1 мкФ (купить на AliExpress).
  9. Тестируемая нагрузка.
  10. Перфорированная или макетная плата.

Работа схемы

Схема ваттметра на основе платы Arduino представлена на следующем рисунке.

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

Схема спроектирована для работы с напряжением в диапазоне 0-24V с током 0-1A – эти параметры специально подобраны для работы с Solar PV (солнечная фотоэлектрическая система). Но если вы поймете принципы работы этой схемы вы легко можете расширить диапазоны ее работы до необходимых вам. Основополагающий принцип работы этой схемы заключается в измерении напряжения и тока в нагрузке чтобы затем рассчитать потребляемую нагрузкой мощность. Значения всех измеряемых параметров будут отображаться на экране ЖК дисплея 16х2.

Далее рассмотрим работу по отдельности небольших элементов представленной схемы чтобы лучше понять ее работу.

Измерительный блок

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

Входное напряжение на этой схеме обозначено как Vcc. Как мы говорили ранее, схема спроектирована для измерения напряжений от 0V до 24V. Но плата Arduino не может измерять такие большие напряжения – она может измерять напряжения только в диапазоне 0-5V. Соответственно, мы должны преобразовать измеряемое напряжение в диапазоне 0-24V в диапазон 0-5V. Это преобразование как раз и осуществляется с помощью представленного делителя напряжения. Соответственно, и номиналы резисторов в схеме этого делителя (10 кОм и 2,2 кОм) как раз подобраны таким образом, чтобы преобразовывать диапазон 0-24V в диапазон 0-5V. Если вам нужно изменить диапазон измеряемых схемой напряжений вам всего лишь нужно изменить значения номиналов резисторов в представленной схеме делителя напряжения. Значение напряжение на выходе делителя напряжения можно рассчитать по хорошо известной формуле:

Vout = (Vin × R2) / (R1 + R2)

Преобразованное к диапазону 0-5V напряжение со средней точки делителя напряжения у нас на схеме обозначено меткой Voltage. В дальнейшем это преобразованное значение напряжения подается на аналоговый вход платы Arduino.

Далее мы должны измерять ток через нагрузку (LOAD). Поскольку микроконтроллеры могут считывать только аналоговые значения напряжения нам необходимо преобразовать значение тока в значение напряжения. Это можно сделать при помощи добавления шунтирующего резистора – в соответствии с законом Ома падение напряжения на нем будет пропорционально протекающему по нему току. Поскольку на шунтирующем резисторе падение напряжения будет очень маленькое мы будем использовать операционный усилитель чтобы усилить его. Схема для осуществления этого процесса показана на следующем рисунке:

Значение сопротивления шунтирующего резистора (SR1) в нашем случае равно 0.22 Ом. Как было указано ранее, наша схема спроектирована для измерения силы тока в диапазоне 0-1A, поэтому в соответствии с законом Ома при максимальном токе через нагрузку 1 А падение напряжения на нашем шунтирующем резисторе будет примерно 0.2V. Это напряжение мало для считывания микроконтроллером, поэтому мы используем операционный усилитель в неинвертированном усилительном режиме чтобы усилить это напряжение до значения, которое можно комфортно считать с помощью платы Arduino.

Операционный усилитель в неинвертированном режиме показан на вышеприведенной схеме. Усилитель спроектирован таким образом чтобы его коэффициент усиления составлял значение 21, итого получаем 0.2*21 = 4.2V. Формула для расчета коэффициента усиления представленного операционного усилителя выглядит следующим образом:

Gain = Vout / Vin = 1 + (Rf / Rin)

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

В нашем случае значение сопротивления резистора Rf равно 20 кОм, а значение сопротивления резистора Rin равно 1 кОм, что обеспечивает коэффициент усиления 21 для операционного усилителя. Далее напряжение с выхода операционного усилителя подается на RC фильтр, состоящий из резистора 1 кОм и конденсатора 0,1 мкФ. Данный фильтр предназначен для фильтрации нежелательных шумов. Далее отфильтрованное напряжение подается на аналоговый вход платы Arduino.

И, наконец, последний компонент который нам необходимо рассмотреть в блоке измерений нашей схемы – это регулятор напряжения. Поскольку мы подаем на вход схемы изменяемое напряжение нам необходимо стабилизированное напряжение +5V для питания платы Arduino и операционного усилителя. Это регулированное (стабилизированное) напряжение в нашей схеме обеспечивается с помощью регулятора напряжения 7805. Конденсатор добавлен на выход схемы регулятора для фильтрации шума.

Блок вычислений и отображения информации

В блоке измерений мы спроектировали схему чтобы конвертировать измеряемые значения и тока в диапазон напряжений 0-5V, которые непосредственно подаются на аналоговые входы Arduino. В этой же части схемы мы подсоединяем эти провода с напряжениями к плате Arduino, а также подключаем к плате Arduino алфавитно-цифровой ЖК дисплей для отображения результатов измерений. Схема этого блока представлена на следующем рисунке.

Как вы можете видеть из схемы, контакт с значением напряжения подключается к аналоговому контакту A3, а контакт со значением тока – к аналоговому контакту A4 платы Arduino. ЖК дисплей запитывается от напряжения +5V с регулятора 7805 и подключен к цифровым контактам платы Arduino в 4-битном режиме. Мы также используем потенциометр 10 кОм, подключенный к контакту Con ЖК дисплея чтобы регулировать его контрастность.

Объяснение программы для Arduino

Полный код программы приведен в конце статьи, здесь же мы рассмотрим его основные фрагменты.

Цель функционирования программы – считать значения аналогового напряжения с контактов A3 и A4 и рассчитать напряжение, ток и мощность, а потом отобразить все это на экране ЖК дисплея.

Вначале программы нам необходимо инициализировать используемые контакты: A3 и A4 для измерения напряжения и тока соответственно, и цифровые контакты 3, 4, 8, 9, 10 и 11 для подключения ЖК дисплея.

Далее внутри функции setup мы инициализируем ЖК дисплей и показываем на нем приветственное сообщение “Arduino Wattmeter”, ждем 2 секунды, а потом очищаем экран дисплея.

Внутри главной функции main мы будем использовать функцию analogread для считывания значений напряжения с аналоговых контактов A3 и A4. Плата Arduino имеет 10 битный АЦП (аналогово-цифровой преобразователь) поэтому на его выходе диапазон возможных значений составляет 0-1023. Это значение потом конвертируется в диапазон 0-5V с помощью его умножения на (5/1023). Поскольку в аппаратной части проекта мы преобразуем истинное значение напряжения из диапазона 0-24V в диапазон 0-5V и истинное значение тока из диапазона 0-1A в диапазон 0-5V. Поэтому в программе мы должны использовать умножитель чтобы конвертировать значения с выхода АЦП в истинные значения напряжения и тока. Коэффициенты для этого умножения можно теоретически рассчитать либо с помощью формул, описанных в разделе статьи «работа схемы», либо практически, зная значения измеряемых токов и напряжений. Второй подход представляется более точным, поэтому мы использовали именно его и у нас с его помощью получились коэффициенты умножения 6.46 и 0.239.

Как повысить точность измерений

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

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

Наконец, когда мы знаем значения тока и напряжения, мы можем рассчитать мощность по известной формуле P=V*I и затем отобразить все эти три значения на экране ЖК дисплея.

Тестирование работы проекта

Для сборки схемы мы использовали перфорированную плату как показано на рисунке ниже. Мы использовали зажимной контакт Phoenix чтобы соединить нагрузку и обычный контакт постоянного тока (normal DC barrel Jack) чтобы подключаться затем к источнику напряжения.

После того как аппаратная часть проекта готова, загрузите код программы в плату Arduino Nano. Потенциометром отрегулируйте контрастность ЖК дисплея. Чтобы протестировать работу схемы подключите нагрузку и источник питания. Напряжения источника питания должно быть не менее 6V поскольку плата Arduino требует для своей работы напряжения +5V. Если схема работает так, как надо, вы должны увидеть на экране ЖК дисплея значения измеренных напряжения и тока, а также значение рассчитанной мощности. Более подробно эти процессы показаны на видео, приведенном в конце статьи.

Для калибровки нашего ваттметра можно использовать какой-нибудь «заводской» ваттметр. Используя возможности платформы Arduino можно значительно улучшить функционал данного проекта – добавить в него логгер данных на SD карту, построение графика, уведомления о каких-нибудь ситуациях (например, когда значения напряжения и тока выйдут за пределы допустимых значений) и многое другое.

На нашем сайте вы также можете посмотреть похожие проекты:

Исходный код программы (скетча)

Видео, демонстрирующее работу ваттметра

27 ответов к “Ваттметр на Arduino – измерение напряжения, тока и мощности”

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

Там эти формулы есть, но их вывод просто не доведен до конца. Их нужно просто дополнить формулами для преобразования значения с выхода АЦП в истинное значение напряжения (тока). Например, верна формула: INPUT VOLTAGE = (ADC Value / ADC Resolution) * Reference Voltage. Аналогичная формула есть и для тока. Более подробно как пользоваться этими формулами описано в этой статье. Также можете посмотреть статью про цифровой амперметр на основе Arduino.

А как найти Reference Current для тока, который у вас равен 0.239. Через формулу для коэффициента усиления?

Reference Current равен такому значению тока в нашей схеме, при котором напряжение на входе АЦП будет равно 5 В. Отсюда и надо считать. А коэффициент 0.239 получился из-за того, что мы в нашей схеме фактически конвертируем ток в диапазоне 0-1A в напряжение в диапазоне 0-5V на входе АЦП. Это же все написано в статье.

У вас просто написано, что вы практически измеряли этот коэффициент, а теоретически то как?

Ну смотрите, если мы конвертируем ток в диапазоне 0-1A в напряжение в диапазоне 0-5V, то расчетное значение этого коэффициента будет равно 1/5=0,2. Если максимальный ток будет составлять, к примеру, 3А, то тогда и значение коэффициента будет равно 3/5=0,6

Спасибо за статью ! Делал такого же плана уже показометр, но с датчиком Холла, но не устроила точность показаний. Вот решил сделать с шунтом на 4 мОм, пришлось, правда, перессчитать цепь усиления ОУ .
У вас коэф усиления для шунта(220мОм) 21, я взял окого 122 для 4 мОм.
В итоге мне точность нравится больше с шунтом,чем с датчиком Холла (ACS712).
В любом случае такой показометр будет лучше китайских дешманских приборов )

Спасибо и вам что оценили мой труд. Ну и вы тоже молодец, достигли определенных успехов в этом направлении

Как можно повысить измеряемый ток до примерно 12 ампер (потолок в источнике 10)? Напряжение максимальное 50 вольт, для него я уже сделал блок установив резисторы на 10 и 100 кОм.

Уменьшить сопротивление шунта и выдерживаемую им мощность. Как вариант, поставить несколько шунтов в параллель

То есть я правильно понимаю что если заменю на вашей схеме шунт на chipdip.ru/product/75ship1-10-0.5 то всё должо работать? извиняюсь за такою дотошность просто в электронике профан

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

Здравствуйте, я в ардуино ноль можете помочь что нужно изменить в схеме или в прошивке что бы поднять порог измерения тока до 100А?

Задача достаточно непростая, уж на очень большой ток вы замахнулись. А напряжение у вас какое будет? Нужно, как минимум, чтобы шунтирующий резистор выдержал такой ток.

Напряжение максимум 14 вольт, ток я с запасом написал по расчетам там будет 60А, источник питания 3 последовательных аккумулятора по заявлению производителя 30с

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

Здравствуйте. А если взять экран нокиа 5110 для ардуино и токовый датчик acs712, возможно на этих компонентах подобную схему сделать? А так же возможно ли сделать подсчет потребленной мощности за время пока включена схема?

Добрый день. Да, можно. Посмотрите вот эту статью — умный измеритель электроэнергии на ESP12 и Arduino. Если вам не нужно через сеть интернет контролировать измеряемую мощность, то из представленной статьи уберите ESP12. Подключение ЖК дисплея Nokia 5110 к Arduino рассмотрено в этой статье.

Есть вопрос по ОУ LM358 — в вашей схеме на него подается питание +5 вольт, а по даташиту на этот ОУ явно указано, что напряжение на выходе ОУ всегда будет на 1.5 вольта ниже напряжения питания (при однополярном включении, как у вас). Получается, что на выходе ОУ будет напряжение в диапазоне 0-3.5 вольта, хотя аналоговый вход ардуино, на который подается это напряжение, настроен на работу в диапазоне 0-5 вольт. То есть, фактически будет использоваться 70% диапазона. Это так и было задумано? Хотя есть ведь другие ОУ, работающие практически в диапазоне 0-Vcc, например MCP601 или MCP602 (у которых Vout всего на 0.1 вольта меньше напряжения питания)?

Добрый вечер. Приведенную схему, конечно же, можно улучшить — на данный момент в схеме использованы самые дешевые и массовые компоненты. Поскольку работа схемы и программы в данном проекте достаточно подробно описаны, то я надеюсь, что у желающих ее улучшить это не вызовет особых затруднений. С MCP601 и MCP602 к сожалению, опыта работы не имею, поэтому не могу сказать насколько они будут лучше или хуже использованной микросхемы LM358. Но если у вас получится сделать эту схему с использованием MCP601 или MCP602, буду признателен, если отпишетесь здесь о результатах

У меня немного другая задача — мне надо замерять ток потребления на устройстве, представляющем собой плату с микроконтроллером mega328p с батарейным питанием. Особенность этого устройства в том, что оно большую часть своего времени проводит в режиме сна, когда ток потребления должен составлять несколько микроампер. А в активном режиме ток потребления должен быть в диапазоне 10-50 миллиампер. Некоторые платы почему-то быстро разряжают батарейки и мне необходим измерительный инструмент для 2-х диапазонов: микроамперметры и миллиамперметры. Обычный тестер тут не годится, и я стал искать и нашел вашу схему. Она в чистом виде мне не подойдет, но подсказала идею. Я нашел, как это (измерение тока в 2-х диапазонах) реализовано в отладочной плате «ATtiny3217 Xplained Pro» (URL:https://www.microchip.com/developmenttools/ProductDetails/ATTINY3217-XPRO). Там есть файл «ATtiny3217 Xplained Pro Schematics» со схемами этой отладочной платы, в котором на 7-й странице размещена схема измерения тока. Вот эту схему я буду повторять.

PS
Я этот же текст по ошибке вставил сначала как обычный комментарий (07.05.2021 10:19), прошу его удалить.

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

Неммного неправильно вы поняли даташит. Имеется ввиду, что на входах ОУ при напряжении выше ,чем питание-1,5 вольта на выходе ОУ могут быть искажения , коэффициент усиления может стать нестабильным.
Этой бяки нет у Rail to Rail операционников, но они подороже лм358.
В вашем случае другая проблема куда сложней, а именно дискретизация ардуино. Встроенный АЦП иммет разрядность 10 бит, так что напрямую никакие микроамперы померять не удастся. Нужно брать отдельный модуль с 16-битным АЦП.

Ну или использовать, к примеру, плату STM 32 Blue Pill, там разрядность АЦП повыше чем у Ардуино будет

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *