Оценка потребляемого тока на ACS712 и ESP8266

Иногда возникают ситуации, когда нужно произвести оценку потребляемой мощности, причем схема должна быть компактной. В этом случае можно воспользоваться чипом ACS712, работа которого основана на эффекте Холла. Это один из инвазивных способов снятия информации о энергопотреблении, т.е. нужно один из проводов разрезать и подключить к входам ACS712. Пример неинвазивного датчика тока рассмотрен в статье.

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

Для тестов с ACS712 я использовал следующие компоненты:

  • Плата ACS712. Цена порядка 1,2 USD за 30A вариант. Приобретал здесь.
  • Wemos D1 Mini (ESP8266). Наиболее удобная плата. Доступна на Aliexpress.
  • Миниатюрный блок питания 5V, 700 мА. Приобретал в этом магазине по 0,75 USD.

Схемотехника

Соединение модулей несложное. Немного подробнее остановлюсь на резистивном делителе R1-R2.

Схема соединения ACS712 c ESP8266 (Wemos D1 mini)
Схема соединения ACS712 c ESP8266 (Wemos D1 mini)

АЦП ESP8266 измеряет напряжение от 0 до 1 Вольта. На плате Wemos D1 mini распаян резистивный делитель 220 кОм (верхняя часть плеча) и 100 кОм. Входное напряжение будет делится на 3.2, т.е. при 3.2 V на входе A0 на ADC чипа ESP8266 будет 1 V.

5A Module20A Module30A Module
Supply Voltage (VCC)     5VDC    5VDC       5VDC
Measurement Range, A   -5 to +5   -20 to +20      -30 to +30
Voltage at 0A, V   VCC/2   VCC/2      VCC/2
Scale Factor, mV/A   185   100      66
VariantACS712ELC-05AACS712ELC-10A     ACS712ELC-30A
Max voltage,VVCC/2 + 0,925V (max3.4 V)VCC/2 + 2V VCC/2 + 1,98V

У модуля ACS712 на каждый ток есть свой scale factor. Например, 30А модулю каждому амперу соответствует 0,066 V выходного напряжения на ACS712. Соответственно, 30А * 0,066V = 1,98V — это вся шкала для измерений.

Поскольку ACS712 измеряет -I и +I, то к замеренному выходному напряжению добавляется постоянная составляющая, равная VCC/2. В моем случае при VCC = 5V получаем постоянную составляющую 2,5V. Это уровень 0, относительно которого будет отображаться замеренное измененение тока. Соответственно, максимальное напряжение на выходе при токе в 30А будет 2,5V + 1,98V = 4,48V.

Если подать напряжение 4,48V на A0, можно сжечь вход АЦП. Да и даже при нагрузке в 10А напряжение получится 0,066V*10A + 2,5V = 3,16V. Т.е. 10-битный ADC ESP8266 по верхней границе уйдет в предел в 1023 отсчет уже при 10А потребления нагрузки и измерять токи больше не получится.

Соответственно, на входе A0 нужно поставить ещё один резистивный делитель. По-правильному, нужно посчитать сопротивления, исходя из того, что параллельно нижнему плечу резистивного делителя будет сопротивление 100 кОм + 220 кОм = 320 кОм. Однако, учитывая значительное суммарное сопротивление 320 кОм им можно пренебречь.

В результате получим, что для трансформации 4,5 V соответствующих предельному значению 30 А в 3.2 V на вход A0 резистивный делитель будет состоять из резисторов: 10 кОм (верхнее плечо) и 22 кОм (нижнее). Если сделать подстраховку и рассчитать делитель для 5V, то резистор нижнего плеча должен быть примерно 18 кОм.

Программный код

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

Среднеквадратическим (RMS),  или эффективным значением является значение напряжения или тока, при котором на резистивной нагрузке рассеивается та же мощность, что и при постоянном напряжении или токе.

Vpp (Volts Peak to Peak) — размах напряжения сигнала.

Vpeak (Volts peak) — амплитуда синусоидального сигнала.

Vrms = 0,707*Vpeak.

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

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

В статье использован очень простой вариант измерения Vpp. За промежуток времени в 1 сек определяется максимальная и минимальная величина на выходе АЦП. Затем разница между максимальным и минимальным значением (размах) пересчитывается в напряжение и делится пополам, чтобы получить амплитуду sin (Vpeak).

Код в статье плох тем, что останавливает работу программы на секунду при побращении к функции Vpp. Это неприемлемо, если нужно собирать данные с различных датчиков.

const int sensorIn = A0;
int mVperAmp = 66; // use 100 for 20A Module and 66 for 30A Module and 185 for 5A Module

#define ADCSamples      1024.0 //1024 samples
#define maxADCVolt      5.0 //5 Volts
#define ZeroSample      ADCSamples/2
#define OneSampleVolt   maxADCVolt/ADCSamples
#define ZeroCorrection      0.2

double Voltage = 0;
double VRMS = 0;
double AmpsRMS = 0;

void setup(){ 
 Serial.begin(9600);
}

uint32_t start_time = 0;
int readValue = 0;
int maxValue = 0;
int minValue = ADCSamples;
void loop()
{
  if (millis() - start_time < 250)
  {
    readValue = analogRead(sensorIn);
    maxValue = (readValue > maxValue) ? readValue : maxValue;
    minValue = (readValue < minValue) ? readValue : minValue;
  }
  else
  {
    VRMS = (maxValue - minValue)/2 * OneSampleVolt * 0.707;
    AmpsRMS = (VRMS * 1000)/mVperAmp - ZeroCorrection;
    Serial.println("Amps RMS: " + String(AmpsRMS));
    maxValue = 0;
    minValue = ADCSamples;
    start_time = millis();
  }
}

В приницпе, можно не определять величину размаха, поскольку величина нуля нам известна Vcc/2. В отсчетах АЦП это будет 1024/2 при резистивном делителе 10 кОм +18 кОм. Однако, при таком подходе возникает проблема с калибровкой уровня 0, поскольку есть девиация за счет использования не прецизионных резисторов в делителе напряжения.

Замеры потребления электрочайника с помощью ACS712.

Результаты работы кода представлены на графике. Первый, длинный Скачок в энергопотреблении — это включение чайника. Вода уже довольно горячая, чайник быстро закипает и отключается. Второй пик — это повторное включение чайника.

Видно, что при отключенном чайнике присутствует небольшой уровень шума. По замерам порядка 0,2 A. При включеном чайнике замеренный ток колеблется в районе 8,6 A. Высокоточный мультиметр Uni-T UT16E показывает величину чуть больше 8 A. Т.е. разница порядка 0,6 А, что довольно неплохо. Если откалибровать нулевое значение, добавив соотвествующий поправочный коэффициент (ZeroCorrection), то погрешность измерения уменьшится.

Опять-же, не забываем, что используется 30А ACS712. На 20А измеренные значения будут точнее. Вот, например, результаты измерения энергопотребления двухкомпрессорного холодильника Bosch с помощью ACS712 20A. Все отсчеты с амплитудой менее 0.1А я считаю шумом и зануляю.

Мониторинг энергопотребления двухкомпрессорного холодильника Bosch с помощью датчика на эффекте Холла ACS712

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

Примерно если оценить потребляемую мощность P=220V * 0.4A =88 Ватт для холодильника с классом энергопотребления A++.

Полезные ссылки

Spread the love
Запись опубликована в рубрике IT рецепты с метками . Добавьте в закладки постоянную ссылку.

Добавить комментарий