Реклама на сайте DatasheetsDatasheets

KAZUS.RUN - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Книги и журналы
FAQ по электронике

  Datasheets
Поиск SMD
Онлайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Схемы и проекты
Принципиальные схемы
  Программы
Каталог сайтов
Калькуляторы
  Форумы по электронике
Удаленная работа
Помощь проекту


Амперметр переменного тока True RMS на Arduino и трансформаторе тока


15 000 000 даташитовпоиск по параметрам · аналоги · заводские PDFНайти даташит →

Самодельный амперметр переменного тока на Arduino Uno: ток нагрузки снимается трансформатором тока, слабый сигнал с шунта усиливает прецизионный операционный усилитель с автоматическим выбором диапазона, а микроконтроллер вычисляет истинное среднеквадратичное значение.

Назначение и состав

Прибор измеряет переменный ток нагрузки с помощью платы Arduino Uno и трансформатора тока 50/5. Результат выводится на ЖК-индикатор 1602 и одновременно передаётся в компьютер, где его можно смотреть в мониторе последовательного порта.

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

Current measurement using Arduino and current transformer circuit
Нажмите для увеличения (6300x2575)

В схеме одна общая земля: это GND платы Arduino, которая на схеме обозначена U7. Резисторы нужны с малым допуском, 1% или точнее. Чем меньше допуск, тем выше точность прибора. Основные компоненты (на схеме могут быть указаны параметры, не вошедшие в этот перечень):

  • Arduino Uno или аналог, например Arduino Nano;
  • 2 x ОУ MCP6V02 (U1, U6);
  • буферизованный источник опорного напряжения MCP1501-20 (U8);
  • сдвоенный аналоговый ключ TS5A23166 (U5);
  • LDO-стабилизатор LT1761-SD (U3);
  • LDO-стабилизатор отрицательного напряжения LT1964-SD (U4);
  • изолированный DC-DC преобразователь B0505S-2W (U2);
  • шунт 7,5 мОм (R1);
  • резисторы: 3 x 100 кОм (R9, R12, R14), 2 x 22 кОм (R11, R13), 2 x 20 кОм (R16, R17), 7 x 10 кОм (R5, R6, R10, R15, R19, R20, R22), 2 x 100 Ом (R7, R18);
  • подстроечный резистор 10 кОм (R24);
  • конденсаторы: 5 x 10 мкФ (C2, C5, C6, C11, C12), 2 x 2,2 мкФ (C16, C17), 9 x 0,1 мкФ (C1, C3, C4, C7, C8, C9, C10, C14, C15).

Трансформатор тока и шунт

Трансформатор тока (ТТ) — это измерительный трансформатор. Он понижает ток в число раз, обратное коэффициенту трансформации, поскольку витков во вторичной обмотке больше, чем в первичной. Типовой номинальный вторичный ток сегодня составляет 5 А или 1 А. Встречаются и ТТ с меньшим вторичным током, например 20 или 40 мА. Задача ТТ — передать «образ» тока на измерительный прибор, устройство защиты или подобную аппаратуру.

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

bzct18al current transformer 50/5a ratio

В конструкции применён ТТ BZCT18AL (T1 на схеме). Его номинальный первичный ток 50 А, вторичный 5 А, коэффициент 50/5 = 10, полная мощность 0,5 ВА (подойдёт и ТТ большей мощности). Сквозь окно трансформатора пропускают провод, питающий нагрузку, причём только один из двух проводов однофазной нагрузки. Если продеть оба провода, фазу и ноль, ТТ покажет 0 А: магнитные поля двух токов в сумме дают ноль. Можно использовать и другие ТТ (20/5, 75/5, 100/5 и т. п.), но тогда нужно поправить коэффициент в программе, то есть константу CT_RATIO.

Вторичная обмотка нагружена на шунт сопротивлением 7,5 мОм (0,0075 Ом) с номинальным током 10 А. Можно взять шунт другого номинала, но его сопротивление ограничено мощностью, которую способен отдать ТТ. При 0,5 ВА допустимо не более 20 мОм (0,5 ВА = 0,02 x 5^2, где 5 А — номинальный вторичный ток). При 1 ВА допустимо до 40 мОм, без учёта прочих потерь, например в проводах. Для лучшей точности сопротивление шунта стоит выбирать малым. Кроме допустимого тока шунта, учитывайте его номинальную мощность: P = R x I^2, где R — сопротивление шунта, I — номинальный вторичный ток ТТ.

Shunt resistor FL-2C 10A/75mV

Автор использовал шунт FL-2C 10A/75mV. При токе 10 А на нём падает 75 мВ, откуда по закону Ома сопротивление 75/10 = 7,5 мОм. Этот шунт выбран за точность 0,5%, низкую цену и удобство для самодельной конструкции. Падение напряжения на шунте очень мало, поэтому способ монтажа заметно влияет на итоговую точность. Размещать шунт на печатной плате нужно так, как рекомендует его даташит.

При номинальном вторичном токе 5 А на шунте падает 37,5 мВ. Один вывод шунта соединён с общим проводом (GND), другой — со входом ОУ U1.

Входной усилитель с переключаемым усилением

U1 — это микросхема MCP6V02 фирмы Microchip. В ней два независимых ОУ с автоподстройкой нуля (auto-zero) и выходом rail-to-rail. У этих ОУ очень малы напряжение смещения, его дрейф и входной ток, поэтому они хорошо подходят для конструкций, где важна точность.

Первый ОУ включён повторителем напряжения, и на его выходе тот же сигнал, что на шунте. Входное сопротивление повторителя очень велико, поэтому он не влияет на напряжение на шунте. Второй ОУ работает инвертирующим усилителем с переменным коэффициентом усиления. Он нужен потому, что столь слабый сигнал Arduino прочитать не сможет. Коэффициент усиления (18, 180 или 1800) Arduino выбирает автоматически.

Усиление переключает аналоговый ключ TS5A23166 (U5) от Texas Instruments. Его сопротивление в открытом состоянии равно 0,9 Ом. Это пренебрежимо мало по сравнению со 100 кОм или 10 кОм. В корпусе два ключа. Первый замыкается (NO1 соединяется с COM1) при подаче логической единицы на вход IN1. Второй (NO2 с COM2) замыкается при единице на IN2. Сигналы IN1 и IN2 приходят с выводов 2 и 3 Arduino Uno соответственно.

На упрощённой схеме U1 показан как два ОУ, а U5 — как два ключа S1 и S2:

op amp gain control circuit
  • оба ключа разомкнуты: K = 900k / 0,5k = 1800;
  • замкнут S1: K = (900k // 100k) / 0,5k = 90k / 0,5k = 180;
  • замкнуты оба: K = (900k // 100k // 10k) / 0,5k = 9k / 0,5k = 18.

Если нет резистора 500 Ом (R2), его можно составить из двух резисторов по 1 кОм, включённых параллельно. Точно так же 900 кОм (R8) получают из двух параллельных резисторов по 1,8 МОм.

Двуполярное питание ±1,5 В

U1 и U5 питаются двуполярным напряжением +1,5 и -1,5 В. Это необходимо, потому что на входе переменный сигнал. При однополярном питании отрицательная полуволна была бы срезана.

  • Около +1,5 В даёт LDO-стабилизатор LT1761-SD (U3) от Analog Devices. На его вход подаётся 5 В с платы Arduino. Выходное напряжение задают резисторы R13 = 22 кОм и R14 = 100 кОм на выводе ADJ, расчётная формула приведена в даташите LT1761.
  • Около -1,5 В формирует стабилизатор отрицательного напряжения LT1964-SD (U4) от Analog Devices с входным напряжением -5 В. Делитель на выводе ADJ состоит из R11 = 22 кОм и R12 = 100 кОм, формула есть в даташите LT1964.
  • -5 В для U4 берут с изолированного DC-DC преобразователя B0505S-2W (U2), который питается от Arduino. У него 5 В на входе и 5 В на выходе, причём выход гальванически развязан со входом. Если соединить плюсовой вывод выхода с GND схемы, на минусовом выводе относительно GND будет -5 В.

Сопряжение с Arduino: сдвиг уровня, опорное напряжение, индикатор

АЦП Arduino не умеет измерять отрицательные напряжения. Поэтому переменный сигнал с U1 нужно целиком поднять в положительную область, то есть добавить постоянную составляющую и не изменить при этом усиление. Этим занимается ещё один каскад на MCP6V02 (U6), где задействован только один ОУ. Каскад фильтрует сигнал и добавляет смещение 1,024 В, его коэффициент усиления равен 1. U6 питается 5 В от Arduino: вывод 8 подключён к 5V, вывод 4 — к любому GND платы. Вместо MCP6V02 здесь подойдут и другие ОУ, например MCP6022 (MCP6021) или MCP6062 (MCP6061).

Перед аналоговым входом A0 сигнал проходит RC-фильтр нижних частот на R21 и C14. Его частота среза f = 1/(2 x пи x R x C) = 23,4 кГц.

Точное напряжение 2,048 В для опорного входа АЦП даёт MCP1501-20 (U8), который тоже питается 5 В от Arduino. Его выход после фильтрации подключён к выводу AREF. Смещение 1,024 В равно половине этого опорного напряжения, поэтому сигнал располагается посередине шкалы АЦП.

ЖК-индикатор 1602 (2 строки по 16 символов) показывает ток нагрузки, протекающий через ТТ. Подключение к Arduino:

  • RS — цифровой вывод 4;
  • E — вывод 5;
  • D4 — вывод 6, D5 — вывод 7, D6 — вывод 8, D7 — вывод 9;
  • VSS, RW, D0, D1, D2, D3 и K — на GND;
  • VEE — на движок подстроечного резистора R24 (регулировка контраста);
  • VDD — на 5V Arduino, A — на 5V через резистор 330 Ом.

Выводы A (анод) и K (катод) подключают светодиод подсветки.

Алгоритм измерения и программа

Программа проверена на Arduino Uno. Она вычисляет среднеквадратичное значение симметричного переменного сигнала на входе A0 и измеряет только переменный ток. Если через шунт течёт постоянный ток, индикатор покажет 0.00 A, потому что постоянная (средняя) составляющая всегда вычитается из входного сигнала.

Среднее значение (оно же постоянная составляющая) в дискретном времени равно сумме всех отсчётов, делённой на их число:

mean value equation

Среднеквадратичное значение в дискретном времени вычисляется так:

RMS value equation

Микроконтроллер ATmega328P платы Uno содержит 10-разрядный АЦП. При опорном напряжении 2,048 В код 1023 соответствует 2,048 В, а код 0 соответствует 0 В. Таким образом, одна единица кода равна 2 мВ.

Диапазоны переключаются так. Если действующее напряжение на A0 превышает 600 мВ, Arduino уменьшает усиление, замыкая ключи. Если оно падает ниже 60 мВ, Arduino увеличивает усиление, размыкая ключи. 600 мВ соответствуют току нагрузки 0,444 А при усилении 1800 и 4,44 А при усилении 180. 60 мВ соответствуют 4,44 А при усилении 18 и 0,444 А при усилении 180. Отсюда получаются диапазоны:

  • K = 1800 — до 0,444 А;
  • K = 180 — от 0,444 до 4,44 А;
  • K = 18 — свыше 4,44 А.

Один цикл программы выглядит так. Сначала 512 отсчётов АЦП с паузой 200 мкс сохраняются в массив. По ним находится среднее, затем среднеквадратичное отклонение от среднего, которое умножением на 2 (2048/1024) переводится в милливольты. Если напряжение вышло за пороги, усиление переключается и цикл начинается заново. Если нет, результат делится на текущий коэффициент усиления, и получается напряжение на шунте. Это напряжение делится на сопротивление шунта (закон Ома), что даёт ток вторичной обмотки. Затем ток умножается на коэффициент ТТ, и получается ток нагрузки. Он выводится на индикатор и в последовательный порт, после чего следует пауза 500 мс.

/************************************************************************
 *
 * AC Current measurement with Arduino and current transformer.
 * Calculated RMS current values are printed on 1602 LCD screen and serial monitor.
 * This is a free software with NO WARRANTY - Use it at your own risk!
 * http://simple-circuit.com/
 *
 ************************************************************************/

#include <LiquidCrystal.h>   // include Arduino LCD library

// LCD module connections (RS, E, D4, D5, D6, D7)
LiquidCrystal lcd(4, 5, 6, 7, 8, 9);

// define analog channel input
#define INPUT_CHANNEL  A0
// define autoranging control pins
#define CH0  2
#define CH1  3
// other definitions
#define CT_RATIO   10    // current transformer ratio 50/5 = 10
#define SHUNT_RES  7.5   // shunt resistor connected to CT secondary = 7.5 milli Ohm

// variables
byte gain;
const uint16_t gain_table[3] = {1800, 180, 18};
const uint16_t n = 512;   // total number of samples (readings)
int16_t r_array[n];       // readings array

void setup(void)
{
  Serial.begin(9600);
  pinMode(CH0, OUTPUT);
  pinMode(CH1, OUTPUT);

  lcd.begin(16, 2);      // set up the LCD's number of columns and rows
  lcd.setCursor(0, 0);   // move cursor to column 0, row 0 [position (0, 0)]
  lcd.print("RMS Current =");

  gain = 0;
  gain_set(gain);
  analogReference(EXTERNAL);  // set positive reference voltage to external
}

void gain_set(uint16_t g)
{
  switch(g)
  {
    case 0:
      digitalWrite(CH0, LOW);
      digitalWrite(CH1, LOW);
      break;
    case 1:
      digitalWrite(CH0, HIGH);
      digitalWrite(CH1, LOW);
      break;
    case 2:
      digitalWrite(CH0, HIGH);
      digitalWrite(CH1, HIGH);
  }
}

void loop()
{
  float dc_offset = 0;
  float rms_voltage = 0;

  // read voltage at INPUT_CHANNEL 'n' times and save data to 'r_array'
  for (uint16_t i = 0; i < n; i++)
  {
    r_array[i] = analogRead(INPUT_CHANNEL);
    delayMicroseconds(200);
  }

  // calculate signal average (DC offset)
  for (uint16_t i = 0; i < n; i++)
    dc_offset += r_array[i];

  dc_offset = dc_offset / n;

  // calculate AC signal RMS value
  for (uint16_t i = 0; i < n; i++)
  {
    rms_voltage += sq(r_array[i] - dc_offset);
  }

  rms_voltage = rms_voltage / n;

  // calculate Arduino analog channel input RMS voltage in millivolts
  rms_voltage = 2 * sqrt(rms_voltage);   // 2 = 2048/1024

  if (rms_voltage > 600.0 && gain < 2)
  {
    gain++;
    gain_set(gain);
    return;
  }
  else if (rms_voltage < 60.0 && gain > 0)
  {
    gain--;
    gain_set(gain);
    return;
  }

  // calculate RMS voltage across the shunt resistor in mV (remove op amp gain)
  rms_voltage /= gain_table[gain];

  // calculate current passing through the shunt resistor by applying Ohm's Law (in Amps)
  float rms_current = rms_voltage / SHUNT_RES;
  // now we can get current passing through the CT in Amps
  rms_current = rms_current * CT_RATIO;

  char _buffer[8];
  if (rms_current < 10.0)   // if current < 10 Amps
    sprintf(_buffer, " %1u.%02u A", (uint8_t)rms_current, (uint16_t)(rms_current * 100) % 100);
  else
    sprintf(_buffer, "%2u.%02u A", (uint8_t)rms_current, (uint16_t)(rms_current * 100) % 100);

  // print data on the LCD
  lcd.setCursor(0, 1);
  lcd.print(_buffer);

  // send data to Arduino serial monitor
  Serial.print("RMS Current = ");
  Serial.println(_buffer);
  Serial.println();

  delay(500);

}

// end of code.

Испытания

Arduino current measurement hardware circuit
Нажмите для увеличения (1280x720)

Макет проверяли на разных нагрузках с токами примерно до 10 А. Часть проводов между Arduino Uno и самодельной платой припаяна прямо с обратной стороны обеих плат. Так устраняются небольшие паразитные напряжения и помехи, которые возникают из-за плохого контакта проводов-перемычек в гнёздах разъёмов Arduino. Показания прибора сравнивали с токовыми клещами UNI-T UT219DS, и автор больше доверяет своему амперметру на Arduino.

Похожие материалы на сайте

Форум радиолюбителейтысячи решённых схем, вопросов и советов — спроси и найдиНа форум →


Реклама на сайте

KAZUS.RUN — 15 000 000 даташитов, поиск по электронным компонентам




© 2003—2026 «KAZUS.RUN - Электронный портал»