Датчик переменного напряжения для ардуино

Измерение переменного напряжения с помощью ZMPT101B и Arduino

Измерение переменного напряжения с помощью ZMPT101B и Arduino

В этой статье расскажу как безопасно измерить переменное напряжение бытовой сети 220 Вольт с помощью модуля ZMPT101B и Arduino UNO. Модуль ZMPT101B основан на маломощном трансформаторе, который гальванический развязывает силовую часть от слаботочной и делать безопасным с ним работу.

Технические параметры

► Измеряемое напряжение: 0 — 1000 В;
► Напряжение изоляции: 4000 В;
► Ток обмоток: 2 мА;
► Напряжение питания: 4 .. 12 В;
► Индикация питания: Светодиод;
► Габариты: 50 x 19 х 23 мм;
► Вес: 25 грам.

Общие сведенья

Основной и главный элемент модуля, это трансформатор ZMPT101B производства Qingxian Zeming Langxi Electronic. По сути, для изменения необходим только токоограничивающий резистор на первичной цепи и резистор на вторичной цепи. А вся остальная часть схемы сдвигает измеряемое напряжение в положительную сторону, чтобы не было отрицательного напряжения и усиливаем его, собранна данная схема на микросхеме LM385.

Назначение контактов:
GND, VCC — Питание модуля 5 В;
OUT — Аналоговый вывод.

Подключение датчика переменного напряжения ZMPT101B к Arduino

Необходимые детали:
► Arduino UNO R3 x 1 шт.
► Датчик переменного напряжения ZMPT101B x 1 шт.
► Провод DuPont, 2,54 мм, 20 см, F-M (Female — Male) x 1 шт.
► Кабель USB 2.0 A-B x 1 шт.

Описание:
В данном примере покажу схему подключения датчика ZMPT101B к Arduino UNO R3, так же, приведу небольшую программу для калибровки датчика. А в конце статьи попробуем сравнить показания с датчика ZMPT101B и мультиметра.

Подключение:
Первым делом, необходимо подключить аналоговый выход OUT с датчика ZMPT101B к Arduino UNO (выводу А0), затем подключаем питание GND и VCC к GND и +5V. Теперь можно подключается силовую часть, для этого вывода L и N подключаем к сети 220В.

Внимание:
При подключении к переменному напряжению 220 вольт, помните о техники безопасности.

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

Вольтметр переменного тока на Arduino Uno

В этом проекте мы рассмотрим создание вольтметра переменного тока на основе платы Arduino Uno, которым можно будет измерять напряжение переменного тока в вашей квартире. Выводить измеренное напряжение мы будем в окне монитора последовательной связи (serial monitor) Arduino IDE.

Внешний вид вольтметра переменного тока на Arduino Uno

Создание цифрового вольтметра значительно проще создания аналогового вольтметра поскольку в случае аналогового вольтметра нам будут необходимы уверенные знания в таких физических параметрах как крутящий момент, потери на трение и т.д. В то время как для создания цифрового вольтметра нам будет нужен просто ЖК дисплей или даже экран вашего компьютера (в нашем рассматриваемом случае) чтобы вывести измеренное значение напряжения. Также на нашем сайте вы можете посмотреть проект цифрового вольтметра от 0 до 25 В на микроконтроллере AVR.

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

  1. Плата Arduino Uno (купить на AliExpress).
  2. Трансформатор 12-0-12.
  3. Диод 1N4007 (купить на AliExpress).
  4. Конденсатор 1 мкФ (купить на AliExpress).
  5. Резисторы 10 кОм, 4,7 кОм (купить на AliExpress).
  6. Полупроводниковый стабилитрон 5v (диод Зенера — Zener diode) (купить на AliExpress).
  7. Соединительные провода.

Работа схемы

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

Схема вольтметра переменного тока на Arduino Uno

В схеме необходимо сделать следующие соединения:

  1. Соедините высоковольтную часть трансформатора (220V) с источником напряжения, а его низковольтную часть (12v) — с делителем напряжения в схеме.
  2. Соедините резистор 10 кОм последовательно с резистором 4,7 кОм. Убедитесь в том, что на вход схемы напряжение будет поступать с именно с резистора 4,7 кОм (не перепутайте резисторы).
  3. Соедините диод как показано на схеме.
  4. Подсоедините конденсатор и стабилитрон как показано на схеме.
  5. Соедините отрицательный вывод диода с контактом A0 платы Arduino.

Примечание : обязательно соедините землю Arduino с точкой, показанной на рисунке, иначе схема не будет работать.

Трансформатор для нашего проекта
Мультиметр для проверки работы нашего вольтметра Пример работы вольтметра на мониторе ПК

Зачем нужен делитель напряжения

Поскольку мы используем трансформатор 220/12 это значит что на его низковольтной стороне будет напряжение 12 В, которое не подходит для питания платы Arduino (не подходит в качестве ее входного напряжения). Поэтому мы и используем делитель напряжения чтобы получить подходящее напряжение для платы Arduino.

Зачем нужны диод и конденсатор

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

Но напряжение на выходе диода не будет “гладким” (ровным) и будет содержать большие пульсации, которые нежелательно (в нашем случае) подавать на аналоговый вход платы Arduino. Поэтому в схему и включен конденсатор чтобы сглаживать пульсации напряжения на выходе диода.

Назначение стабилитрона

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

Принцип работы вольтметра переменного тока на основе Arduino

Принцип работы нашего проекта составляют следующие действия:

  1. Входное высоковольтное напряжение понижается до напряжения примерно 12 В, приемлемого для работы низковольтных схем.
  2. С выхода делителя напряжения на резисторах мы получаем напряжение, пригодное (по номиналу) для подачи на контакт платы Arduino. Максимальное измеряемое схемой напряжение мы получим с помощью ее симуляции (см. ниже).
  3. Поступающее напряжение (аналоговое) поступает на аналоговый контакт A0 платы Arduino. С помощью аналогово-цифрового преобразования (АЦП), доступного на контакте A0, это входное напряжение преобразуется в число от 0 до 1023. 0 В будет соответствовать 0, а 5 В – 1023.
  4. Плата Arduino конвертирует это значение с выхода АЦП в соответствующее значение напряжения на входе схемы (формула приведена ниже в статье).

Симуляция работы схемы

Моделирование работы схемы было произведено в симуляторе Proteus.

Симуляция работы вольтметра при входном напряжении 311 В

Нахождение максимального входного напряжения осуществлялось методом проб.

При пиковом максимальном переменном напряжении равном 440 В (311 r.m.s, Rated Maximum Sinusoidal — Максимальная (предельная) синусоидальная мощность) напряжение на входе контакта A0 было равно 5 Вольтам, то есть максимуму. То есть наша схема может измерять максимум 311 r.m.s напряжения (440 В пикового напряжения).

Симуляция работы вольтметра при входном напряжении 285 В

Моделирование производилось для различных величин входного напряжения – от 220 r.m.s до 440v.

Исходный код программы

Значение, получаемое с контакта A0, мы будем записывать в переменную m:

m=pinMode (A0,INPUT) ; // режим работы контакта a0 – на ввод данных

Как следует из результатов симуляции схемы, максимальное напряжение 5 В на контакте A0 (1023 после преобразования) достигается при напряжении на входе схемы равном 311 В. То есть значение с выхода АЦП 1023 будет соответствовать 311 Вольтам на входе схемы. Следовательно, чтобы рассчитать значение напряжения на входе схемы, можно использовать формулу:

n=(311/1023)*m Вольт или n=(m*0.304177).

Далее вычисленное по этой схеме измеренное значение напряжения на входе схемы мы будем выводить в окне монитора последовательной связи (serial monitor). Более подробно все эти процессы показаны на видео, приведенном в конце статьи.

Serial.print(» analog input «) ; // выводим строку “analog input” в окно монитора последовательной связи
Serial.print(m);// выводим значение напряжения на входе контакта A0

Далее выводим измеренное значение переменного напряжения на входе схемы.

Serial.print(» ac voltage «) ; // выводим строку “ac voltage” в окно монитора последовательной связи
Serial.print(n) ; // выводим значение напряжения на входе схемы

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

Далее приведен полный текст программы.

Измерение электроэнергии. Часть 1. Измерение напряжения и тока

image

Понятно что весь цикл будет посвящён системам переменного тока, но быстро пробежимся и по цепям постоянного тока, так как это может нам пригодиться при разработке источников питания постоянного тока. Возьмем к примеру классический понижающий преобразователь с ШИМ:

Рис 1. Понижающий преобразователь с ШИМ
Нашей задачей является обеспечение стабилизированного выходного напряжения. Кроме того, на основании информации с датчика тока возможно контролировать режим работы дросселя L1, не допуская его насыщения, а также реализовывать токовую защиту преобразователя. И честно говоря, вариантов установки датчиков особо и нет.
Датчик напряжения в виде резистивного делителя R1-R2, который единственный способен работать на постоянном токе, устанавливается на выходе преобразователя. Как правило специализированная микросхема преобразователя имеет вход обратной связи, и прилагает все усилия для того, чтобы на этом входе (3) оказался определённый уровень напряжения, прописанный в документации на микросхему. Например 1,25В. Если наше выходное напряжение с этим уровнем совпадает — все хорошо — мы напрямую подаем выходное напряжение на этот вход. Если нет, то устанавливаем делитель. Если нам надо обеспечить выходное напряжение в 5В, то делитель должен обеспечивать коэффициент деления 4, т. е. Например R1 = 30к, R2 = 10к.
Датчик тока обычно устанавливается между источником питания и преобразователем и на микросхему. По разности потенциалов между точками 1 и 2, и при известном сопротивлении резисторы Rs возможно определить текущее значение тока нашего дросселя. Устанавливать датчик тока между источников и нагрузкой не самая хорошая идея, так как конденсатор фильтра будет отрезан резистором от потребителей импульсных токов. Установка резистора в разрыв общего провода тоже нге сулит ничего хорошего — будет два земляных уровня с которыми возиться то еще удовольствие.
Проблемы падения напряжения можно избежать путем использования бесконтактных датчиков тока — например датчиков холла:

Рис 2. Бесконтактный датчик тока
Однако есть более хитрый способ измерения тока. Ведь на транзисторе точно также падает напряжение и через него течет тот же самый ток что и индуктивность. Следовательно, по падению напряжения на нем можно также определить текущее значение тока. Честно говоря, если посмотреть на внутреннюю структуру микросхем преобразователей, например, от Texas Instruments — то такой способ встречается так же часто как и предыдущие. Точность такого способа конечно не самая высокая, но для работы токовой отсечки этого вполне достаточно.

Рис 3. Транзистор в качестве датчика тока
Аналогично поступаем в других схемах подобных преобразователей, будь то повышающий или инвертирующий.
Однако необходимо отдельно упомянуть о трансформаторных прямоходовом и обратноходовом преобразователях.

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

1.2 Подключение датчиков в однофазные цепи переменного тока

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

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

Рис 6.Подключение трансформаторных и бесконтактных датчиков тока и напряжения

1.3 Подключение датчиков в многофазные цепи сетей переменного тока

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

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

Рис 8.Использование трансформаторов напряжения в трехфазной сети

2 Действующее значение тока и напряжения

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

Рис 9. Серия мгновенных значений напряжения
Наша задача — произвести подсчет действующего значения. Для начала воспользуемся формулой интеграла:
(1)
В цифровой системе приходится ограничиваться неким квантом времени, так что мы переходим к сумме:
(2)
Где — период дискретизации нашего сигнала, а — число отсчетов за период измерения. Где-то здесь я в видео начинаю втирать дичь про равенство площадей. Надо было выспаться в тот день. =)
В микроконтроллерах MSP430FE4252, которые применяются в однофазных электросчетчиках Меркурий, за период измерения равный 1, 2 или 4 секунд производится 4096 отсчетов. На T=1с и N=4096 мы и будем опираться в дальшейнем. Более того, 4096 точек в секунду позволят нам использовать алгоритмы быстрого преобразования фурье для определения гармонического спектра вплоть до 40 гармоники, как того требует ГОСТ. Но об этом в следующей серии.
Набросаем алгоритм для нашей программы. Нам требуется обеспечить стабильный запуск АЦП каждую 1/8192 секунды, так как у нас два канал и измерять мы будем эти данные попеременно. Для этого настроим таймер и сигнал прерывания будет автоматически перезапускать АЦП. Все АЦП так умеют.
Писать будущую программу будем на arduino, так как она у многих под рукой. У нас пока чисто академический интерес.
Имея частоту системного кварца 16МГц и 8-разрядный таймер (чтобы жизнь медом не казалась) нам необходимо обеспечить частоту срабатывания хоть какого прерывания таймера с частотой 8192Гц.
Печалимся по поводу того что 16МГц цело не делится как нам надо и итоговая частота работы таймера 8198Гц. Закрываем глаза на погрешность в 0,04% и все равно считываем по 4096 выборок на канал.
Печалимся по поводу того, что прерывание по переполнению в arduino занято расчетом времени (отвечает за millis и delay, так что это работать нормально перестанет), так что пользуемся прерыванием по сравнению.
А еще внезапно понимаем, что сигнал к нам приходит биполярный, и что msp430fe4252 с ним прекрасно справляется. Мы же довольствуемся униполярным АЦП, поэтому на операционном усилителе собираем простой преобразователь биполярного сигнала в униполярный:

Рис 10.Преобразователь биполярного сигнала в униполярный
Причем наша задача обеспечить колебание нашей синусоиды относительно половины опорного напряжения — тогда мы либо отнимем половину диапазона либо активируем опцию в настройках АЦП и получим знаковые значения.
В Arduino 10-разрядный АЦП, поэтому из беззнакового результата в пределах 0-1023 будем вычитать половину и получим -512- 511.
Проверяем модель, собранную в LTSpiceIV и убеждаемся, что все работает как надо. В видеоматериале дополнительно убеждаемся экспериментально.

Рис 11.результат моделирования. Зеленым исходный сигнал, синим — выходной

Скетч для Arduino для одного канала

void setup() < autoadcsetup(); DDRD |=(1<double urms = 0; double utemp = 0; int umoment = 0; int N = 0; int flag = 0; void loop() < if (flag)< flag = 0; Serial.println(urms); >> int i = 255; void autoadcsetup() < //set up TIMER0 to 4096Hz //TIMER0_OVF will be the trigger for ADC /*normal mode, prescaler 16 16MHz / 64 / 61 = 4098 Hz 0.04% to 4096Hz*/ TCCR0B = (1 ISR(TIMER0_COMPA_vect) < if (PIND & (1<else < PORTD |=(1<TCNT0 = 0; > ISR(ADC_vect) < if( ( UCSR0A & (1<else < PORTD |=(1<> > > 

Программа написана в среде Arduino IDE для микроконтроллера ATmega1280. На моей отладочной плате первые 8 каналов разведены для внутренних нужд платы поэтому используется канал ADC8. Возможно использовать данный скетч и для платы с ATmega168, однако необходимо выбрать правильный канал.
Внутри прерываний передергиваем пару служебных пинов чтобы наглядно видеть рабочую частоту оцифровки.
Пару слов о том, откуда взялся коэффициент 102. При первом запуске с генератора подавался сигнал различной амплитуды, с осциллографа считывалось показание действующего значения напряжения, а из консоли забиралось рассчитанное значение в абсолютных единицах АЦП.

Umax, В Urms, В Counted
3 2,08 212
2,5 1,73 176
2 1,38 141
1,5 1,03 106
1 0,684 71
0,5 0,358 36
0,25 0,179 19

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

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

Представленную прошивку, а также другие прошивки для данной серии (так как видеоматериалы я снимаю быстрее чем подготавливаю статьи) вы найдете в репозитории на GitHub: github.com/radiolok/arduino_rms_count
Что касается разработки электросчетчика, за основу будет взят референс от TI SimpleLink WiFi CC3200 SmartPlug, новость о котором буквально на днях прилетела мне на почту. Мне очень нравится микроконтроллер CC3200, поэтому мы разработаем бустерпак для существующего ланчпада и реализуем все интересующие нас возможности. Не забудем сделать и так, что это сносно работало и на других микроконтроллерах.

В комментарии приглашается progchip666, для замечаний и дополнений по материалу, а также smart_alex как ранее интересовавшийся вопросом измерения тока и напряжения именно с помощью Arduino.

  • измерение электроэнергии
  • напряжение
  • arduino