Измерения напряжения бытовой сети с помощью трансформатора и делителя напряжения на Arduino.

Что нам понадобиться:
1. Трансформатор у меня был в наличии 220/7 вольт.
2. 4 диода.
3. 2 резистора (т.к у меня выходное напряжение 7 вольт я использую 2 одинаковых резистора по 50 кОм).
4. Конденсатор электролитический (главное чтобы номинал был больше чем выходное напряжение трансформатора ).

Делитель напряжения расчитывается таким образом чтобы при напряжении в сети 270 вольт наш делитель не выдавал более 5 вольт. Иначе мы спалим нашу Arduino.

Код:

Калибровка:
Сначала я подключил всю схему и посмотрел сколько показывает наш analogRead (закомментированная строка) у меня было порядка 740, далее я измерил напряжение в сети мультиметром у меня в сети 215 вольт теперь делим 215/740 = 0.2905 это мой поправочный коэффициент.

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

Правила перепечатки

Понравилась статья?
Лучшей наградой для меня будет ваш комментарий !

Схема самодельного прибора на основе Arduino Uno, который предназначен для измерения частоты и напряжения в розетке с отображением результатов на дисплее 1602A . Прибор очень прост в изготовлении, благодаря применению готового модуля ARDUINO UNO.

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

Индикатором служит ЖК-дисплей типа 1602А, он стандартный, на основе контроллера HD44780. Обозначение 1602А фактически значит, что он на две строки по 16 символов в строке.

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

Прибор питается от электросети и измеряет вышеуказанные параметры. Источник питания одновременно служит и датчиком для получения данных о частоте и напряжении в электросети. Источник питания сделан на основе маломощного готового трансформатора Т1, у которого есть две одинаковые обмотки по 9V переменного напряжения каждая.

Рис. 1. Принципиальная схема измерителя частоты и значения напряжения в электросети, использованы Arduino Uno и 1602A.

Одна обмотка служит для получения напряжения питания. Переменное напряжение с неё поступает на выпрямительный мост на диодах VD1-VD4. Конденсатор С3 сглаживает пульсации выпрямленного напояжения.

На С3 полVчается постоянное напряжение около 12V, которое поступает на разъем для подачи питания на плату ARDUINO UNO, на вход имеющегося на этой плате стабилизатора напряжения 5V, которым и питается вся плата и индикатор Н1.

Другая вторичная обмотка трансформатора служит датчиком измерения параметров электросети. Переменное напряжение с неё через R1 поступает на формирователь импульсов с частотой электросети, выполненный на транзисторе VТ1 по схеме ключа. Эти импульсы поступают на цифровой порт D10 платы ARDUINO UNO.

Переменное напряжение сети измеряется при помощи выпрямителя на диоде VD5 и конденсаторе С2. Величина переменного напряжения в сети определяется по величине постоянного напряжения на этом конденсаторе и через настраиваемый делитель на резисторах R4 и R5 поступает на аналоговый вход А1 платы ARDUINO UNO.

Программа

Программа на C++ с подробными комментариями приведена в таблице 1. Для измерения частоты используется функция pulseln , которая измеряет в микросекундах длительность положительного либо отрицательного перепада входного импульса.

Рис. 2. Исходный код программы для измерения частоты и значения напряжения в электросети.

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

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

Затем, происходит вычисление полного периода в строке:

И потом, вычисление частоты в строке:

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

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

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

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

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

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

Затем, результаты измерений выводятся на ЖК-дисплей. Напряжение вносится в первую строку дисплея, а частота во вторую. Единицы измерения указаны как «V» и «Hz». Что касается измерения частоты, — налаживание не требуется вообще. А вот для измерения напряжения нужно откалибровать прибор по образцовому подстройкой резистора R5.

Тема вольтметра, наверное, вторая по популярности (заезженности) после «блинка». Но все же решился написать про свой способ измерения напряжения.
Естественно самым точным (при применении «голой» ардуины) будет способ с использованием внешнего опорного напряжения. Но на ProMini вывод для подключения AREF отсутствует, там он просто подключен через конденсатор к GND. Поэтому приходится, что-то придумывать.
Если «загуглите» тему «секретный вольтметр» то это как раз, то о чем я буду рассказывать.
Суть задачи в том, чтобы вначале используя внутреннее опорное напряжение 1.1V измерить напряжение питания контроллера Vcc, которое потом будет использовано как опорное напряжение.
Ниже показан примерный скетч, который это и выполняет. Скетч я закомментировал, поэтом особо расписывать тут не буду.

В строке 6 задаем значение опорного напряжения (в реале оно не всегда 1.1V и отличается у экземпляров МК). Для этого измеряем мультиметром напряжение Vcc на плате и корректируем VBG, пока расчетное значение не совпадет с реальным значением.
В строках 22 – 24 немного ускоряем работу АЦП.

Собственно функция измерения напряжения:

В строке 71 задаем вход АЦП на котором будем измерять напряжение:
А0 = 0000, А1 = 0001, А2 = 0010,А3 = 0011, А4 = 0100, А5 = 0101, А6 = 0110, А7 = 0111

Вот полученный результат:

Обратите внимание на выделенные участки, это замкнул вывод A0 на Vcc …

Смотрите также

Комментарии 23

Для точных значений использовать надо нормальные ADC, типа ads1115. 4 канала, 12 бит.

А еще проще пользоваться готовыми библиотеками, а не почти ассемблерным кодом. Хотя, некоторым нравиться возиться на низком уровне.

это вообще жесть…

Хотя мой вольтметр ардуины с гайверовской библиотекой дает точность 0.005 вольта до 5в, что вполне достаточно для большинства измерений.

Вам рабочий прототип сфотографировать? )
Да, например напряжение MAF идет с точностью 0.01 вольта, и он меряет его стабильно и без шума. С частотой 1кГц.

дает точность 0.005 вольта
MAF идет с точностью 0.01 вольта
?

зачем фотография, что на ней увижу?

как вы определяете, что без шума и какой там шум может быть?

Точность достаточная. ads1115 избыточна для 0.01 вольта.
Шум возникает в самом ADC ардуины. Как аналоговый, так и в процессе преобразования в цифру.
Берем источник напряжения — подключаем например на 4 аналоговых входа ардуины, снимаем замеры, выводим на экран, они одинаковые, совпадают с замером точным вольтметром и не пляшут. Собственно, это все. ProMini за 100р, LM358 как повторитель напряжения на входах и выходах.

Добрый день! Добавьте текст скетча и схему включения если не сложно. И если пользовались — как мерит мВ? Интересует диапазон от 0 до 40 мВ с точностью 1 мВ хотябы.

Скетч весь на скринах.
Схема — катушка последовательно нагрузке, датчик Холла стандартно.
Чувствительность не проверял.

Скетч весь на скринах — в этом и не удобство. Сейчас пробую этот вариант.
#define NUM_READS 100
byte load_pin=0; //пин нагрузки (аналоговый!)

byte butt_pin=11; //состояние кнопки
byte butt_gnd=12; //земля кнопки

const float typVbg = 1.39; // 1.0 — 1.2
float Voff = 1.5; // напряжение отсечки (для Li-ion=2.5 В, для LiPo=3.0 В)
float R = 124; //сопротивление нагрузки
float I;
float cap = 0; //начальная ёмкость
float V;
float Vcc;
float Wh = 0;
unsigned long prevMillis;
unsigned long testStart;

void setup() <
Serial.begin(9600); //открыть порт для связи с компом
>

void loop() <
Vcc = readVcc(); //хитрое считывание опорного напряжения (функция readVcc() находится ниже)
V = (readAnalog(load_pin) * Vcc) / 1023.000; //считывание напряжения АКБ
prevMillis = millis();
sendData(); // отправка данных

if (V = value) <
// j is insert position
break;
>
>
>
for (int k = i; k > j; k—) <
// переместить все значения выше текущего значения на одну позицию вверх
sortedValues[k] = sortedValues[k — 1];
>
sortedValues[j] = value; //insert current reading
>
//return scaled mode of 10 values
float returnval = 0;
for (int i = NUM_READS / 2 — 5; i = value) <
// j is insert position
break;
>
>
>
for (int k = i; k > j; k—) <
//переместить все значения выше текущего значения на одну позицию вверх
sortedValues[k] = sortedValues[k — 1];
>
sortedValues[j] = value; //insert current reading
>
//возврат масштабированного режима из 10 значений
float returnval = 0;
for (int i = NUM_READS / 2 — 5; i