13 February 2014

Измерение тока в домашней сети

DIY
Существует целый класс устройств под названием Ethernet Relay, которые позволяют удаленно управлять подключенной нагрузкой через сеть. Большинство из них достаточно дорогие – ближе к 100 долл., и заведомо уступают по цене и по гибкости настройки связке, скажем, Raspberry Pi + PiFace. А что если задача не только включать-выключать нагрузку, но и измерять протекающий ток? Для этого требуется собственно датчик (на шунте или эффекте Холла) и АЦП (Raspberry Pi не содержит встроенного АЦП). В качестве датчика можно взять недорогой ACS712, а в качестве АЦП, например, ADC-Pi.

ADC-Pi мне не понравился по двум причинам:
  • при той частоте измерений, которая требуется для определения силы переменного тока в сети, этот АЦП дает очень большую погрешность (скорее всего я до конца не разобрался с регистрами)
  • используя этот АЦП в связке с Raspberry Pi под Linux сложно обеспечить необходимую стабильность периода измерений. Устанавливать и настраивать RTOS Linux только для этой задачи мне показалось слишком сложным предприятием, тем более что есть более простое и проверенное решение: Arduino

У всех Arduino уже есть АЦП (8-битный, но этого вполне достаточно), скетчи для Arduino исполняются с необходимой стабильностью, для связи с Raspberry Pi есть различные варианты, самый простой из которых – USB кабель. Ну и конечно, привлекательная цена.

Связка, которую я использовал, приведена на картинке.

Измерение силы тока представляется несложной задачей, если бы не одно «но»: физические датчики «шумят». На рисунке приведен пример фактических и расчетных показателей тока для моей схемы при 512 последовательных измерениях.


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

Попытка номер раз


Формула переменного тока (кто забыл – см. wiki)

i=Im sin(ωt+ψ)

где:

Im – максимальное значение тока
ω – угловая частота
t – время (порядковый номер) изменения
ψ – начальная фаза тока

Можно попытаться найти необходимые параметры, используя аналитические инструменты. И тут нас ждет приятный сюрприз: осенью прошлого (2013) года компания Wolfram выпустила версию своего замечательного пакета Mathematica для Raspberry Pi. Бесплатно (для домашнего использования). И мы можем применить его для анализа данных, считанных с датчика.

Пример вызова пакета расчета в Raspberry Pi:

pi@raspi ~ $ wolfram -script calc_current.wl datafile=/tmp/data.csv

Сам скрипт calc_current.wl ниже с комментариями:

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

data=Import[$CommandLine[[4]]]

Когда данные прочитаны, можно проделать анализ Фурье (Fast Fourier Transform) для того чтобы определить, приблизительно, количество циклов синусоиды на имеющейся выборке. Зависимость силы тока от времени нелинейна, и приблизительная угловая скорость, рассчитанная по FFT и переданная в качестве начального значения, резко увеличит шансы подобрать правильные параметры синусоиды.

fourier=Take[Abs[Fourier[data[[All,2]]]],{2,256}]

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

topcycle=Ordering[fourier,-1]
avg=Mean[fourier]
top=fourier[[topcycle[[1]]]]
If[top < 10 * avg, Print["No AC"]; Exit[]]

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

nlm=NonlinearModelFit[data, a Sin[b x + c]+d, {a,{b, 2 Pi * topcycle[[1]] / 512}, c, d},x]

Зная физические характеристики АЦП (размерность 1024, базовое напряжение 5V) и датчика (в моей версии 0.185V / A), можно вычислить эффективную силу тока:

imax=Abs[nlm["BestFitParameters"][[1]][[2]]] / (1024 / 5 * 0.185)
Print["Imax=", imax]
iefc=imax / Sqrt[2]
Print["Iefc=", iefc]
Print["Power=", iefc * 230]

Предложенный метод работает в большинстве случаев. Количество измерений, когда NonlinearModelFit не смогла верно подобрать параметры синусоиды, составило около 5 процентов. Однако каждое измерение требует много времени – у меня в среднем 5 секунд – для запуска приложения wolfram. Поэтому…

Попытка номер два


Поскольку частота переменного тока в сети стабильна и составляет (в России) 50 Гц, угловую скорость можно вычислить заранее и вместо нелинейной регрессии получить регрессию линейную. В самом деле,



или



Дифференцируя по X и Y, получаем систему линейных уравнений:



Решая систему по Крамеру, получим значения коэффициентов:



Тогда по теореме Пифагора максимальное значение тока составит:



Arduino-скетч, который реализует данный алгоритм, можно найти на Github-е. Метод обеспечивает хорошую точность измерений: для схемы на рисунке измеренное значение тока составляло стабильно 0.13A, что соответствует потреблению 29.9 Вт при напряжении 230V. Номинал лампочки, которая служила нагрузкой, 30 Вт.

Кстати, для Arduino также есть шилды с реле и весь функционал управления и мониторинга нагрузки можно реализовать на этой платформе. Raspberry Pi в таком случае будет использоваться только для организации удобного пользовательского интерфейса, например, через веб-сервер и как шедулер.
Tags:Raspberry PiArduinoпеременный ток
Hubs: DIY
+34
51.4k 201
Comments 29
Top of the last 24 hours