Как измерить фазовый угол между напряжением и током в сети с помощью Arduino

Как измерить фазовый угол между напряжением и током в сети с помощью Arduino

Если ты хочешь понять, насколько эффективно работает твой электроприбор — например, нагреватель, двигатель или инвертор — тебе нужно знать не только, сколько тока и напряжения проходит через цепь, но и в каком соотношении они находятся друг к другу по фазе. Это и есть фазовый угол. Он показывает, насколько нагрузка индуктивная или ёмкостная. В бытовой сети 220 В 50 Гц это может быть от 0° (чисто резистивная нагрузка) до 90° (чисто индуктивная или ёмкостная). А если угол — 45°, значит, у тебя смешанная нагрузка, и коэффициент мощности уже не 1, а около 0.7. Это значит, что часть энергии просто «гуляет» туда-сюда, не выполняя полезной работы. И если ты хочешь это измерить — не тратя деньги на дорогой ваттметр или анализатор качества электроэнергии — Arduino тебе в помощь.

Почему это важно?

Представь, что у тебя есть стиральная машина с асинхронным двигателем. Она потребляет 1 кВт активной мощности, но если фазовый угол — 60°, то полная мощность — уже 2 кВА. Твой счётчик покажет 1 кВт·ч, но провода, автомат и трансформатор на подъезде греются от 2 кВА. Если ты не знаешь фазовый угол — ты не знаешь, насколько эффективно работает твоя система. А если ты делаешь энергоаудит, оптимизируешь ПЛК, или просто хочешь понять, почему у тебя «сгорает» конденсатор в фильтре — без измерения фазы ты слеп.

С коммерческими приборами всё просто: берёшь Fluke 435, подключаешь, читаешь. Но если ты хочешь сделать датчик для мониторинга в реальном времени, встроить его в самодельный инвертер, или просто понять, как это работает — Arduino + два датчика и пара строк кода — твой лучший выбор.

Что тебе понадобится

  • Arduino Uno или Nano (любой с аналоговыми входами и частотой дискретизации хотя бы 10 кГц)
  • Датчик напряжения: резистивный делитель (например, 470 кОм + 10 кОм) для снижения 220 В до 5 В
  • Датчик тока: токовый трансформатор (например, SCT-013-030, 30 А/1 В) или шунт (0.1 Ом, 5 Вт) — выбор зависит от тока
  • Операционный усилитель (опционально): для смещения сигнала тока на 2.5 В, если используешь шунт
  • Конденсаторы и резисторы для фильтрации (100 нФ, 10 кОм)
  • Паяльник, мультиметр, breadboard или печатная плата

Важно: Никогда не подключай Arduino напрямую к сети 220 В! Всё, что связано с высоким напряжением, должно быть гальванически развязано. Делитель — это не развязка. Это только снижение. Для безопасности используй оптопару или трансформатор напряжения, если работаешь с постоянным мониторингом. Но для разового замера — делитель с изоляцией от корпуса и заземлённым экраном — допустим, если ты понимаешь риски.

Как измерить фазовый угол: пошагово

  1. Подключи датчик напряжения. Сделай делитель: 470 кОм от фазы к Arduino, 10 кОм от Arduino к нулю. На выходе делителя — напряжение 5 В (пик) при 310 В пикового входного. Добавь конденсатор 100 нФ параллельно 10 кОм — это фильтр, чтобы убрать высокочастотные помехи.
  2. Подключи датчик тока. Если используешь SCT-013 — подключи его на вторичную обмотку, а выход иди на вход Arduino через резистор 10 кОм и конденсатор 100 нФ. SCT-013 выдаёт переменный сигнал 0–1 В при 30 А. Но Arduino не может измерять отрицательные напряжения — значит, нужно сдвинуть сигнал на 2.5 В. Для этого подключи резисторы 10 кОм от 5 В к входу и от входа к земле — получится делитель 2.5 В. Это и есть «смещение».
  3. Если используешь шунт (0.1 Ом, 5 Вт), то на нём падение напряжения — 0.1 В на 1 А. Усилитель с коэффициентом 25 (например, LM358) поднимет это до 2.5 В. Затем добавь смещение на 2.5 В — и получишь сигнал 0–5 В, соответствующий 0–25 А. Это точнее, чем токовый трансформатор, но требует гальванической развязки (оптопара или изолирующий усилитель).
  4. Запусти Arduino. Считывай напряжение и ток одновременно с частотой не ниже 5 кГц. Лучше — 10–20 кГц. Это нужно, чтобы за один период 50 Гц (20 мс) захватить минимум 100–200 точек. Чем больше точек — тем точнее угол.
  5. Найди нули и пики. Определи моменты, когда напряжение пересекает ноль (с ростом). Затем найди момент, когда ток пересекает ноль (с ростом). Разница во времени между этими моментами — это и есть сдвиг фазы. Переведи его в градусы: угол = (Δt / T) * 360°, где T = 20 мс (период 50 Гц).
  6. Уточни с помощью корреляции. Лучший способ — взять 10 периодов, построить выборку напряжения и тока, и найти сдвиг, при котором их корреляция максимальна. Это даст точность до 0.5°, даже при шумах.

Сравнение датчиков: токовый трансформатор vs шунт

Критерий Токовый трансформатор (SCT-013) Шунт (0.1 Ом)
Гальваническая развязка Да Нет
Погрешность 1–3% 0.5–1%
Частотный диапазон До 1 кГц До 100 кГц
Нагрев Нет Да (при токе >10 А)
Сложность подключения Просто Сложнее (нужен усилитель)
Стоимость 5–10 $ 1–2 $ + усилитель
Подходит для Бытовая техника, до 30 А Инверторы, высокочастотные системы, точные измерения

Если ты измеряешь стиральную машину — берём SCT-013. Если ты тестируешь светодиодный драйвер с частотой переключения 100 кГц — берём шунт. Для большинства бытовых задач трансформатор — идеально. Он безопаснее и проще.

Что выбрать в зависимости от ситуации

  • Если ты просто хочешь понять, почему у тебя «плохой» коэффициент мощности — используй SCT-013 + делитель напряжения. Просто, безопасно, работает. Точность ±2° — достаточно для бытового анализа.
  • Если ты делаешь энергоаудит дома или в офисе — добавь Wi-Fi (ESP8266) и отправляй данные в Google Sheets. Запускай измерение раз в минуту — и ты увидишь, когда включается кондиционер и как он «тянет» фазу.
  • Если ты тестируешь инвертер или ПИД-регулятор двигателя — нужен шунт + усилитель + быстрая выборка (20 кГц). Иначе ты не увидишь искажений на фронтах.
  • Если ты хочешь сделать автоматическое отключение при плохом коэффициенте мощности — добавь реле и алгоритм: если угол > 45° (коэффициент < 0.7) — включи конденсаторную батарею.

Частые ошибки — и как их избежать

  • Ошибка 1: Подключаешь датчик напряжения без фильтра. Помехи от ламп ДРЛ, светодиодов, зарядок — искажают ноль. Результат — сдвиг фазы на 10–20°. Решение: всегда ставь LC-фильтр (конденсатор 100 нФ + резистор 10 кОм) на входе.
  • Ошибка 2: Считаешь фазу по пику, а не по нулю. Пик тока может быть сдвинут из-за нелинейности нагрузки (например, диодный мост). А ноль — всегда чистый. Используй только пересечение нуля с положительным склоном.
  • Ошибка 3: Используешь Arduino с частотой 1 кГц. За 20 мс ты получишь всего 20 точек. Нет точности. Минимум — 5 кГц, лучше 10 кГц. На Uno можно добиться 10–15 кГц с помощью прямого доступа к регистрам (без analogRead()).
  • Ошибка 4: Не учитываем задержку в датчике. SCT-013 имеет задержку до 1 мс. Это 18° на 50 Гц! В спецификациях указано — но многие пропускают. Используй компенсацию: сдвинь сигнал тока на 1 мс вперёд в коде.
  • Ошибка 5: Забыл про смещение. Если не поднять сигнал тока на 2.5 В — Arduino будет считывать только положительные полуволны. Ты не увидишь фазу вообще. Обязательно делай смещение.

Как лучше сделать: практические рекомендации

  • Используй библиотеку TimerOne — она позволяет точно управлять частотой сэмплинга. Без неё analogRead() работает неравномерно.
  • Собери всё на печатной плате — даже простой феномен «шум от проводов» может дать погрешность 3–5°. Токовые провода должны быть короткими, а земля — общей точкой.
  • Калибруй на известной нагрузке. Возьми лампу накаливания — это чисто резистивная нагрузка. Фазовый угол должен быть 0°. Если у тебя — 2° — значит, есть систематическая ошибка. Исправляй смещением в коде.
  • Проверяй на 3 нагрузках: лампа (0°), дрель (40–50°), конденсатор (–80–90°). Если твой код правильно показывает эти значения — он рабочий.
  • Считай коэффициент мощности — это не просто угол. Он равен cos(φ). Если угол 30° — коэффициент 0.87. Если 60° — 0.5. Это то, что реально влияет на счётчик.

Пример кода (основа)

Вот минимальный рабочий фрагмент:

#include <TimerOne.h>

volatile int voltageSample = 0;
volatile int currentSample = 0;
volatile unsigned long timeVoltageZero = 0;
volatile unsigned long timeCurrentZero = 0;
volatile bool voltageCrossed = false;
volatile bool currentCrossed = false;

const int VOLTAGE_PIN = A0;
const int CURRENT_PIN = A1;
const float SAMPLE_RATE = 10000; // 10 кГц
const float PERIOD = 0.02; // 20 мс = 50 Гц

void setup() {
  Serial.begin(115200);
  Timer1.initialize(1000000 / SAMPLE_RATE); // 100 мкс = 10 кГц
  Timer1.attachInterrupt(sampleSignals);
  pinMode(VOLTAGE_PIN, INPUT);
  pinMode(CURRENT_PIN, INPUT);
}

void sampleSignals() {
  voltageSample = analogRead(VOLTAGE_PIN);
  currentSample = analogRead(CURRENT_PIN);

  // Порог для нуля: ~512 (2.5 В) ± 50
  if (voltageSample > 562 && voltageSample < 462 && !voltageCrossed) {
    timeVoltageZero = micros();
    voltageCrossed = true;
  }
  if (currentSample > 562 && currentSample < 462 && !currentCrossed) {
    timeCurrentZero = micros();
    currentCrossed = true;
  }
}

void loop() {
  if (voltageCrossed && currentCrossed) {
    long deltaT = timeCurrentZero - timeVoltageZero;
    float phaseAngle = (deltaT / (PERIOD * 1000000.0)) * 360.0;
    float powerFactor = cos(phaseAngle * 3.14159 / 180.0);
    
    Serial.print("Фаза: ");
    Serial.print(phaseAngle, 1);
    Serial.print("°, КМ: ");
    Serial.println(powerFactor, 3);
    
    voltageCrossed = false;
    currentCrossed = false;
  }
  delay(100); // Обновление раз в 100 мс
}

Этот код — база. Он не учитывает задержку датчика, не фильтрует шум, не усредняет по нескольким циклам. Но он работает. Добавь усреднение по 10 периодам — и точность поднимется до ±1°.

Что делать дальше

Ты измерил фазовый угол. Что дальше?

  • Если угол > 45° — подумай о компенсации. Добавь конденсатор параллельно нагрузке. Для 1 кВт при 60° нужен конденсатор ~30 мкФ на 220 В.
  • Если угол меняется — значит, нагрузка нестабильна. Возможно, включается двигатель или инвертор. Следи за пиками.
  • Если угол — отрицательный (ток впереди напряжения) — у тебя ёмкостная нагрузка. Это редко в быту, но бывает в светодиодных драйверах.
  • Если угол — 0°, но мощность низкая — значит, нагрузка неактивна. Проверь, включён ли вообще прибор.

Самое главное — ты теперь можешь видеть, что происходит в цепи. Не по косвенным признакам, не по показаниям счётчика, а напрямую. Ты не просто измеряешь — ты понимаешь.

Сделай один замер — и ты уже не будешь смотреть на свою стиралку, как на «чёрный ящик». Ты увидишь, как она работает. И это — первая ступень к настоящему пониманию электрики.

Информация в статье носит ознакомительный характер. Работа с сетевым напряжением требует знаний по электробезопасности. При выполнении измерений используй изолированные инструменты, соблюдай правила работы с высоким напряжением и проконсультируйся с квалифицированным электриком, если сомневаешься в своих действиях.

radio-blog.ru — электроника и технологии