Меряем напряжения сети с помощью микроконтроллера ESP8266 на языке microPython.

В данном уроке мы будем измерять напряжение в сети используя разделительный трансформатор который находиться на плате Arduino:

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

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

Данную формулу можно адаптировать под понятные вычисления микроконтроллера. Как мы видим, у нас идет вычисления суммы выборки амплитуды первой полуволны и второй, так как функция периодична, данная формула нас полностью устраивает. Единственно, — точность измерения зависит от количество выборок (точек амплитудного значения первой и второй полуволны), чем больше выборок мы сделаем, тем точнее у нас получаться данные. Если пренебречь временем работы АЦП, (так как мы рассматриваем сам принцип расчета напряжения sin формы) можно взять выборку каждую 1ms, таким образом у нас будет 20 точек. Так как частота у нас 50Гц, что составляет 20ms — мы как рас вписываемся со своими измерениями в один период.

Теперь пропишем алгоритм для расчета нашего напряжения(сразу напишу, что это лишь концепция, и сам алгоритм далек от идеального, но позволят понять саму суть измерения):

import time
from machine import Pin
#import ADC
import math

adc = machine.ADC(0)
list = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
Kv = 0
Uref1 = 559 # ADC ceredina
Uref2 = 661
while True:
time.sleep(0.2)
a=adc.read()
#print(a)
if (a >= Uref1) and (a<=Uref2) :
time.sleep_ms(1)
for i in range(9):
list[i]=adc.read()
time.sleep_ms(1)
time.sleep_ms(2)
for i in range(9):
list[i+9]=adc.read()
time.sleep_ms(1)
Kv = 0
for i in range (17):
Kv += list[i]*list[i]
Urez = math.sqrt((1/18)*Kv)
Urez = Urez * math.sqrt (3)*0.244
print (list)
print(Urez)