INA219: измеряем ток и напряжение в своём проекте — обзор и подключение
Зачем ставить датчик тока
Пока проект живёт на макетке, ток обычно оценивают на глаз: «серве надо до 700 мА, значит блок на два ампера хватит». Добавляется вторая нагрузка — питание проседает, плата перезагружается, а кто виноват, без измерения не понять. INA219 закрывает вопрос целиком: чип меряет падение на шунте (это ток), напряжение на шине и сам перемножает одно на другое, отдавая ватты по I²C. На ходовом модуле уже стоит шунт с маркировкой R100 — это 0,1 Ом, вся обвязка распаяна: четыре провода к контроллеру и две клеммы в разрыв плюсового провода.
Как он устроен
По datasheet TI (SBOS448G) чип включается в разрыв плюса: входы IN+ и IN− сидят по краям шунта и меряют падение до ±320 мВ. Диапазонов четыре — ±40, ±80, ±160 и ±320 мВ, выбираются битами PGA. Напряжение шины снимается с IN− относительно земли, причём 0–26 В — абсолютный максимум, даже когда в конфигурации выбрана шкала 32 В. Внутри — 12-битный сигма-дельта АЦП с частотой выборки 500 кГц: одно преобразование занимает 532 мкс, а с усреднением до 128 выборок — до 68,1 мс, зато шум давится в зародыше.
Ток и мощность чип отдаёт только после записи калибровки: Cal = trunc(0,04096 / (Current_LSB × R_шунта)), где Current_LSB — это максимум ожидаемого тока, делённый на 32768. Для штатного шунта 0,1 Ом и потолка 3,2 А выходит Current_LSB = 0,1 мА и Cal = 4096 — столько зашито в дефолтный профиль библиотеки Adafruit. Мощность считается внутри чипа: шаг регистра мощности равен двадцати шагам регистра тока. А пока калибровка не записана, регистры тока (04h) и мощности (03h) честно держат нули — это документированное поведение, а не брак.
Характеристики по datasheet TI
| Параметр | Значение |
|---|---|
| Диапазон шины | 0–26 В (шкалы АЦП 16 или 32 В; выше 26 В подавать нельзя) |
| Полная шкала шунта | ±40 / ±80 / ±160 / ±320 мВ (PGA /1…/8) |
| Разрешение | 12 бит; шаг шунта 10 мкВ, шаг шины 4 мВ |
| Точность тока | ±0,2% тип., ±0,5% макс. по температуре (A); у INA219B — ±0,3% макс. |
| Смещение входа | ±10 мкВ макс. при PGA /1, дрейф 0,1 мкВ/°C, CMRR от 100 дБ |
| Время преобразования | от 532 мкс (12 бит) до 68,1 мс (128 усреднений) |
| Питание | 3–5,5 В, 0,7 мА тип. (до 1 мА), в power-down 6–15 мкА |
| Адреса на шине | 16 штук (0x40–0x4F): выводы A0/A1 к GND, VS+, SDA или SCL |
| Интерфейс | I²C до 400 кГц (high-speed до 2,56 МГц), таймаут SMBus 28 мс |
| Температура | −40…+125 °C |
| Корпуса | SOIC-8, SOT-23-8 |
Подключение к Arduino и ESP32
- Шунт — в разрыв плюса. Плюс источника идёт на клемму VIN+ модуля, с клеммы VIN− провод уходит на плюс нагрузки. Минус источника, минус нагрузки и GND модуля сходятся в одну землю.
- Четыре провода к плате. Arduino Uno: VCC → 5V, GND → GND, SDA → A4, SCL → A5. ESP32: VCC → 3V3 (почему — ниже), GND → GND, SDA → GPIO21, SCL → GPIO22.
- Почему ESP32 — от 3,3 В. Порог логической единицы у INA219 равен 0,7 × VCC. При питании от 5 В это 3,5 В, и ESP32 со своими 3,3 В на SDA формально не дотягивается. При питании от 3,3 В порог падает до 2,31 В — всё честно. Сам чип от трёх вольт работает без ограничений.
- Что по силам. Шина до 26 В, ток до ±3,2 А со штатным шунтом (0,1 Ом × 320 мВ). Бортовая 12 В, литиевая банка, солнечная панель — пожалуйста; 36-вольтовые цепи и стартерные токи — уже нет.
Схема для кода ниже: источник питания плюс → VIN+, VIN− → нагрузка, земли вместе. VCC модуля — в 5V у Uno или в 3V3 у ESP32, SDA/SCL — по пинам из списка выше.
// INA219: напряжение, ток, мощность. Uno (A4/A5) и ESP32 (21/22).
// Библиотека: Adafruit INA219 из менеджера библиотек.
#include <Wire.h>
#include <Adafruit_INA219.h>
Adafruit_INA219 ina219;
void setup() {
Serial.begin(115200); // на Uno можно 9600
if (!ina219.begin()) { // адрес по умолчанию 0x40 (A0, A1 на GND)
Serial.println("INA219 не найден: проверь проводку и адрес");
while (1) delay(10);
}
// Профиль 32 В: Cal = 4096, Current_LSB = 0,1 мА при шунте 0,1 Ом
ina219.setCalibration_32V_2A();
}
void loop() {
float bus = ina219.getBusVoltage_V(); // напряжение на нагрузке
float mv = ina219.getShuntVoltage_mV(); // падение на шунте
float ma = ina219.getCurrent_mA(); // ток: считается после калибровки
float mw = ina219.getPower_mW(); // мощность: чип умножил сам
Serial.print("U="); Serial.print(bus); Serial.print(" В ");
Serial.print("I="); Serial.print(ma); Serial.print(" мА ");
Serial.print("P="); Serial.print(mw); Serial.println(" мВт");
delay(1000);
}
Частые ошибки
- Читают нулевой ток. Пока в регистр калибровки (05h) не записано значение, регистры тока и мощности равны нулю. Библиотека Adafruit делает запись в begin() и setCalibration(); если говоришь с чипом напрямую — сначала калибровка, потом чтение.
- Вешают модуль в минусовую линию. Ток он мерить сможет (чип двунаправленный), но напряжение шины считается от IN− до земли: на низком плюсе IN− сидит почти на нуле, и вместо 12 В на экране 0,0.
- Питают от 5 В и подключают к ESP32. VIH = 0,7 × VCC = 3,5 В — уровень ESP32 не гарантирован. Кормите модуль от 3V3: порог 2,31 В, и вопросов нет.
- Превышают 26 В на шине. «32 В» в конфигурации — разрядность шкалы АЦП, а не допуск входа. Двадцать четыре вольта мерить можно, тридцать шесть — деградация или смерть чипа.
- Держат максимальный ток часами. На 3,2 А на шунте 0,1 Ом рассеивается около ватта: маленький SMD-резистор греется, сопротивление уплывает, показания уходят. Для постоянных токов за три ампера — внешний шунт меньшего сопротивления и пересчёт Current_LSB и Cal.
- Верят цифрам без поверки. Сам чип точен (доли процента), а вот резистор на модуле бывает грубее. Даташит это понимает и даёт системную калибровку: измерь ток эталонным амперметром и подгони Cal — уравнение 6 из datasheet.
Куда встроить
В паре с зарядным TP4056 INA219 покажет реальный ток заряда и ёмкость, ушедшую в банку. А на выходе понижающего LM2596 или повышающего MT3608 честно ответит, сколько преобразователь отдаёт под нагрузкой и куда деваются обещанные амперы.
Информация собрана из открытых источников и паспортов производителей и не является истиной в последней инстанции. Характеристики, распиновку и совместимость проверяйте по документации конкретной партии модуля перед покупкой и подключением.