Иногда возникают ситуации, когда нужно произвести оценку потребляемой мощности, причем схема должна быть компактной. В этом случае можно воспользоваться чипом ACS712, работа которого основана на эффекте Холла. Это один из инвазивных способов снятия информации о энергопотреблении, т.е. нужно один из проводов разрезать и подключить к входам ACS712. Пример неинвазивного датчика тока рассмотрен в статье.
В случае с снятием данных трансформатором тока, резать провод не нужно. Есть разъемные трансформаторы. Но этот способ считывания данных энергопотребления более дорогой.
Для тестов с ACS712 я использовал следующие компоненты:
- Плата ACS712. Цена порядка 1,2 USD за 30A вариант. Приобретал здесь.
- Wemos D1 Mini (ESP8266). Наиболее удобная плата. Доступна на Aliexpress.
- Миниатюрный блок питания 5V, 700 мА. Приобретал в этом магазине по 0,75 USD.
Схемотехника
Соединение модулей несложное. Немного подробнее остановлюсь на резистивном делителе R1-R2.
АЦП ESP8266 измеряет напряжение от 0 до 1 Вольта. На плате Wemos D1 mini распаян резистивный делитель 220 кОм (верхняя часть плеча) и 100 кОм. Входное напряжение будет делится на 3.2, т.е. при 3.2 V на входе A0 на ADC чипа ESP8266 будет 1 V.
5A Module | 20A Module | 30A 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 |
Variant | ACS712ELC-05A | ACS712ELC-10A | ACS712ELC-30A |
Max voltage,V | VCC/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, поскольку есть девиация за счет использования не прецизионных резисторов в делителе напряжения.
Результаты работы кода представлены на графике. Первый, длинный Скачок в энергопотреблении — это включение чайника. Вода уже довольно горячая, чайник быстро закипает и отключается. Второй пик — это повторное включение чайника.
Видно, что при отключенном чайнике присутствует небольшой уровень шума. По замерам порядка 0,2 A. При включеном чайнике замеренный ток колеблется в районе 8,6 A. Высокоточный мультиметр Uni-T UT16E показывает величину чуть больше 8 A. Т.е. разница порядка 0,6 А, что довольно неплохо. Если откалибровать нулевое значение, добавив соотвествующий поправочный коэффициент (ZeroCorrection), то погрешность измерения уменьшится.
Опять-же, не забываем, что используется 30А ACS712. На 20А измеренные значения будут точнее. Вот, например, результаты измерения энергопотребления двухкомпрессорного холодильника Bosch с помощью ACS712 20A. Все отсчеты с амплитудой менее 0.1А я считаю шумом и зануляю.
Судя по всему короткие всплески над основным пиком — это включение компрессора в морозильной камере на короткие промежутки времени. Охлаждение же основной холодильной камеры требует регулярного включения компрессора.
Примерно если оценить потребляемую мощность P=220V * 0.4A =88 Ватт для холодильника с классом энергопотребления A++.
Полезные ссылки
- Аналог ACS712 — MCS1803: https://www.monolithicpower.com/en/mcs1803.html
- Аналог ACS712 — INA219: https://www.ti.com/lit/ds/symlink/ina219.pdf
- Обзор INA219: https://robotchip.ru/obzor-modulya-toka-i-napryazheniya-ina219/
- Китайский датчик тока на эффекте Холла MagnTek MT9523 аналог ACS712.
- Датчик тока на эффекте Холла Melexis MLX91220 5V аналог ACS712.
- Датчик тока на эффекте Холла Melexis MLX91221 3.3V аналог ACS712.
- Китайский датчик тока на эффекте Холла Cosemi CH701 аналог ACS712. Cosemi CH701 datasheet.
- http://robotosha.ru/electronics/basics-electro-measurements.html — азы расчета Vrms и пр.
- http://www.referencedesigner.com/rfcal/cal_04.php — раcчет Vrms.
- http://henrysbench.capnfatz.com/henrys-bench/arduino-current-measurements/acs712-arduino-ac-current-tutorial/
- http://esp8266-projects.org/2015/06/mailbag-arrival-acs712-current-sensor-html/
Уведомление: Неинвазивный датчик тока | Жизнь, бизнес и IT
Уведомление: Мониторинг энергопотребления электрооборудования на ESP8266 | Жизнь, бизнес и IT