Схема вольтметра на Arduino UNO для двухполярного блока питания

Содержание

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

Используя универсальный микроконтроллерный модуль ARDUINO UNO и двухстрочный ЖК-дисплей типа 1602А (на основе контроллера HD44780) можно легко сделать двойной вольтметр.

В одной строке он будет показывать напряжение U1, в другой — напряжение U2. Но проблема в том, что аналоговые входы ARDUINO UNO могут принимать только положительные напряжения.

Таким образом, двойной вольтметр на ARDUINO UNO представляет собой аналог двух вольтметров, неразрывно соединенных своими отрицательными входами.

Измерения двухполярного напряжения

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

Как измерять двуполярное напряжение с помощью микроконтроллера, схема

Рис. 1. Как измерять двуполярное напряжение с помощью микроконтроллера, схема.

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

Для того чтобы вольтметр U2 показывал только положительное напряжения блока питания, нужно из его показания вычесть показания вольтметра U1.

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

Принципиальная схема

Схема вольтметра для двухполярного блока питания показана на рис. 2. Он предназначен для напряжений от 0 до ±50V.

Причем, напряжения разной полярности могут иметь различную величину. Как видно из схемы, к цифровым портам D2-D7 платы ARDUINO UNO подключен модуль жидкокристаллического индикатора Н1 типа 1602А. Питается ЖК-индикатор от стабилизатора напряжения 5V, имеющегося на плате стабилизатора напряжения 5V.

Принципиальная схема вольтметра на Arduino UNO для двухполярного блока питания

Рис. 2. Принципиальная схема вольтметра на Arduino UNO для двухполярного блока питания.

Измеряемые напряжения поступают на два аналоговых входа А1 и А2. Всего аналоговых входов шесть, — А0-А5, можно было выбрать любые два из них.

В данном случае, выбраны А1 и А2. Напряжение на аналоговых портах может быть только положительным и только в пределах от нуля до напряжения питания микроконтроллера, то есть, номинально, до 5V.

Поэтому, на входах установлены делители на резисторах R1-R4 и сами входы подключены к выходам двухполярного блока питания таким способом, как показано на рисунке 1.

Выход аналогового порта преобразуется АЦП микроконтроллера в цифровую форму. Для получения результата в единицах вольт, нужно его умножить на 5 (на опорное напряжение, то есть, на напряжение питания микроконтроллера) и разделить на 1024.

Для того чтобы можно было измерять напряжение более 5V, вернее, более напряжения питания микроконтроллера, потому что реальное напряжение на выходе 5-вольтового стабилизатора на плате ARDUINO UNO может отличаться от 5V, и обычно немного ниже, нужно на входе применить обычные резистивные делители.

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

К = R3 / (R1+R3) или К = R4 / (R2+R4),

соответственно для разных входов двойного вольтметра.

Очень любопытно то, что резисторы в делителях совсем не обязательно должны быть высокоточными. Можно взять обычные резисторы, затем измерить их фактическое сопротивление точным омметром, и уже в формулу подставить эти измеренные значения.

Получится значение К для конкретного делителя, которое и нужно будет подставлять в формулу. Кроме того, после выполнения измерений и вычислений напряжений, нужно будет из результата напряжения U2 вычесть результат измерения напряжения U1.

Чтобы показать реальные значения двухполярного напряжения на выходе блока питания.

Программа

Программа на языке C++ приведена в таблице 1.

Исходный код программы двуполярного вольтметра на Arduino UNO

Рис. 2. Исходный код программы двуполярного вольтметра на Arduino UNO.

LiquidCrystal lcd(2, 3, 4, 5, 6, 7); //порты для дисплея

int analogInput=l; //первый аналоговый вход А1

int analogInputl=2; //второй аналоговый вход А2

float vout; //значение с 1- входа

float voutl; //значение с 2- входа

float volt; //результат измерения с 1- входа

float voltl; //результат измерения с 2- входа

lcd.begin(16,2); //дисплей 16 символов 2 строки

vout=analogRead(analoglnput); //чтение значения 1- входа

voutl=analogRead(analoglnputl); //чтение значения 2- входа

volt=vout*5.0/1024.0/0.048; //вычисление результата 1- входа

voltl=voutl*5.0/1024.0/0.048-volt; //вычисление результата 2-входа

lcd.clear(); //очистка памяти дисплея

lcd.setCursor(0,0); //установка курсора на 1- строку

lcd.print("Ul = -"); //печать номера входа U1 =

lcd.print(volt); //печать результата 1- входа

lcd.print(" V"); //печать единицы измерения V

lcd.setCursor(0,1); //установка курсора на 2- строку

lcd.print("02 = +"); //печать номера входа U2 =

lcd.print(voltl); //печать результата 2- входа

lcd.print(" V"); //печать единицы измерения V

delay(500); //время индикации 0,5 секунды

Для управления ЖК-индикатором решено было использовать порты с D2 по D7 платы ARDUINO UNO. В принципе, можно и другие порты, но я вот так, решил использовать именно эти. Для того чтобы индикатор взаимодействовал с ARDUINO UNO нужно в программу загрузить подпрограмму для его управления.

Такие подпрограммы называются библиотеками, и в программном комплекте для ARDUINO UNO есть много разных библиотек. Для работы с ЖК-индикатором на основе HD44780 нужна библиотека LiquidCrystal.

Поэтому программа (таблица 1) начинается с загрузки этой библиотеки:

Эта строка дает команду загрузить в ARDUINO UNO данную библиотеку. Затем, нужно назначить порты ARDUINO UNO, которые будут работать с ЖК-инди-катором. Я выбрал порты с D2 по D7. Можно выбрать другие.

Эти порты назначены строкой:

LiquidCrystal lcd(2, 3, 4, 5, 6, 7);

После чего, программа переходит собственно к работе вольтметра. Для измерения напряжения решено было использовать аналоговые входы А1 и А2.

Эти входы заданы в строках:

int analogInput=l; int analog!nputl=2;

Для чтения данных с аналоговых портов используется функция analogRead

Чтение данных с аналоговых портов происходит в строках:

Затем, производится вычисление фактического напряжения с учетом коэффициента деления делителя входного напряжения, и необходимости вычитания U2-U1:

Эта строка дает команду загрузить в ARDUINO UNO данную библиотеку. Затем, нужно назначить порты ARDUINO UNO, которые будут работать с ЖК-индикатором. Я выбрал порты с D2 по D7. Можно выбрать другие. Эти порты назначены строкой:

LiquidCrystal led(2, 3, 4, 5, 6, 7);

После чего, программа переходит собственно к работе вольтметра. Для измерения напряжения решено было использовать аналоговые входы А1 и А2.

Эти входы заданы в строках:

Для чтения данных с аналоговых портов используется функция analogRead

Чтение данных с аналоговых портов происходит в строках:

Затем, производится вычисление фактического напряжения с учетом коэффициента деления делителя входного напряжения, и необходимости вычитания U2-U1:

В этих строках число 5.0 — это напряжение на выходе стабилизатора платы ARDUINO UNO. В идеале должно быть 5V, но для точной работы вольтметра это напряжение нужно предварительно измерить.

Подключите источник питания и измерьте достаточно точным вольтметром напряжение +5V на разъеме POWER платы. Что будет, то и вводите в эти строки вместо 5.0, например, если будет 4.85V, строки будут выглядеть так:

На следующем этапе нужно будет измерить фактические сопротивления резисторов R1-R4 и определить коэффициенты К (указаны 0.048) для этих строк по формулам:

К1 = R3 / (R2+R3) и К2 = R4 / (R1+R4)

Допустим, К1 = 0.046, а К2 = 0.051, так и пишем:

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

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

Соответственно, они будут отмечены значками + и — перед числом. Таким образом, в текст программы нужно внести изменения соответственно фактическому напряжению на выходе 5-воль-тового стабилизатора платы ARDUINO UNO и согласно фактическим коэффициентам деления резистивных делителей.

После этого прибор будет работать точно и никакого налаживания или калибровки не потребует. Для работы вольтметра необходимо питание. Это постоянное напряжение от 7 до 12V, подаваемое на разъем для подачи питания, имеющийся на плате ARDUINO UNO.

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

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

Каравкин В. РК-12-19.

  • PCBWay — всего $5 за 10 печатных плат, первый заказ для новых клиентов БЕСПЛАТЕН.
  • Сборка печатных плат от $30 + БЕСПЛАТНАЯ доставка по всему миру + трафарет.
  • Проекты с открытым исходным кодом — доступ к тысячам открытых проектов в сообществе PCBWay!

Огромное спасибо за подробное описание решения данной проблемы!

Здравствуйте. Хочу собрать по этой схеме вольтметр с пассивным балансиром для двух АКБ 12в, соединенных последовательно.
У вас на схеме в обоих делителях стоят одинаковые резисторы R1=R2=180K, R3=R4=9,1K
При Uвых=5в; Uвх=Uвых *(R1+R4)/ R4 = 5*(180+9.1)/9,1=103,9в и на нуле и на +U, относительно -U
А ведь они должны быть разными!

Еще вы пишите, что "этот источник не должен быть связан с выходными напряжениями блока питания. Никак нельзя его минус соединять с нулем блока питания."
А на схеме R4, R3, -U и GND СОЕДЕНЕНЫ .

Здравствуйте.
При расчетах нужно использовать значения сопротивлений в Омах: 180к = 180000 Ом, 9.1к = 9100 Ом.
Метод измерения двух напряжений состоит в том чтобы измерить напряжение на первом канале, а потом на последовательно соединенных 1м и 2м канале. После этого простым вычитанием считается значение на 2м канале. Это нужно поскольку на входах микроконтроллера допустимы лишь положительные значения напряжения от 0 до +5В. Автор в статье насчет этого дал пояснение.

Схема с подключением батарей:

dvupolarniy-voltmetr-na-arduino-poyasnenie

Посмотрите что будет если общий вывод питания вольтметра (0V) соединить с общим выводом устройства, которое будет питаться о батарей — получится короткое замыкание батареи GB2.

Это ответ на второй ваш вопрос почему "Никак нельзя его минус соединять с нулем блока питания". А R4, R3, -U и GND соединены только в пределах схемы вольтметра на Arduino UNO.

GND устройства нельзя подключать к GND вольтметра!

Здравствуйте. Спасибо за ответ. Я уже разобрался и запустил свой скетч на ардуино нано.
Просто хочу указать на ОШИБКУ в схеме, чтобы другие не мучались.
Известная формула делителя напряжения Uвых = Uвх * R2 / Rобщ; где Rобщ = (R1 + R2) а R2 это нижний резистор в делителе. Для расчета резисторов для сборки 12+12в для Ugb2 Uвх=12в, Uвых=5в, для тока I root Апрель 21 2022

В схеме делителей напряжения ошибки нет. Номиналы резисторов должны быть одинаковы на каждый канал, иначе понадобится вносить поправочные коэффициенты в программе при вычислении значений напряжений. А1 и А2 — это аналоговые входы, не цифровые. Минимальное напряжение на них должно быть — 0В, а максимальное не более +5В. Поэтому напряжение 0.1В, 0.5В, 1.2В. 5В на входах А1 и А2 при считывании в программе будут представлены как некоторые числа, полученные с АЦП микроконтроллера.

Сопротивления резисторов 180К и 9.1К выбраны автором с запасом для того чтобы:
а) можно было безопасно измерять как маленькие так и большие напряжения.
б) чтобы через делители напряжения протекал маленький ток. Когда вольтметр будет подключен к батареям, то ток их разряда через резисторы будем небольшой. I=U/R=12В/(180000 Ом + 9100 Ом)=0,0000634 А.

При рассчитанных вами сопротивлениях R2 =10Ком, R1= 22k. R2=10k R1=47k на выходах делителей будет напряжение +5В, если батареи будут заряжены до 12В каждая.
Но при полном заряде на аккумуляторах напряжение немного превышает 12В, там может быть 13-14В. Напряжение после делителей превысит +5В и микроконтроллер Ардуино может выйти из строя.

При разных резисторах в делителях на каждый канал придется делать перерасчет и задавать в программе новые "коэффициенты деления К". Сейчас они в программе имеют значения 0.048.

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

Мне нужна точность до одной десятой. Я предпочел более понятные мне формулы, взяв входное напряжение напряжение с небольшим запасом т.е. 16в.
const float R1 = 21900; // делитель 1 АКБ 16в
const float R2 = 9960;
const float R3 = 47000; // делитель двух АКБ 28в
const float R4 = 9920;
const float Uref = 4.7;
int SensPin1 = 1;
int SensPin2 = 2;
int RelPin1 = 3;
int RelPin2 = 4;

float SensV1 = 0;
float OutpV1 = 0;
float SensV2 = 0;
float OutpV2 = 0;
float Uin1 = Uref * (R1 + R2) / R2;
float Uin2 = Uref * (R3 + R4) / R4;
void setup() <
Serial.begin(9600);
pinMode(RelPin1, OUTPUT); // Пин управляющий 1 реле
pinMode(RelPin2, OUTPUT); // Пин управляющий 2 реле
>
void loop() <
SensV1 = analogRead(SensPin1);
OutpV1 = (SensV1 * Uin1) / 1024.00;
// iOutpV1=int(OutpV1)*100;
SensV2 = analogRead(SensPin2);
OutpV2 = (SensV2 * Uin2) / 1024.00;
// iOutpV2=int(OutpV2)*100;
Serial.print("V1 (АКБ1) V2(общее) V2-V1 (АКБ2) comment-head"> #7 Вадим Апрель 22 2022

Здравствуйте. Я озадачился питанием самой ардуино.
На вашей схеме GND ардуино соединено с -U т.е. в моем случае, с минусом моего составного АКБ.
Я понимаю, что +VIN нельзя подключать к 0 нулю составного АКБ.
А можно ли +VIN соединить через DC/DC понижайку с +U и -U ?
Т.к. не хочется делать отдельный БП 220VAC / 5VDC для ардуино.

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

Еще одно дополнение к вашему проекту.
На дисплее ничего не видно, пока не поставил потенциометр на 10К для регулировки контрастности.
Средний вывод потенциометра надо припаять к V0 (3 нога), отключив ее от Gnd.
Один вывод потенциометра соединить на VDD(2 нога +5в), другой — на VSS(1 нога Gnd).


Источник: radiostorage.net