Меню

Acs712 arduino измерение постоянного тока



Digitrode

цифровая электроника вычислительная техника встраиваемые системы

Arduino и датчик тока ACS712

Датчик Холла для Arduino

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

В этом проекте мы расскажем о датчике тока ACS712, о том, как работает датчик тока на основе эффекта Холла и, наконец, о том, как соединить датчик тока ACS712 с Arduino.

Микросхема датчика тока ACS712

Датчик тока ACS712 является продуктом Allegro MicroSystems, он может использоваться для точного измерения как переменного, так и постоянного тока. Этот датчик основан на эффекте Холла, а ИС имеет встроенное устройство с эффектом Холла. На выходе датчика тока ACS712 выдается аналоговое напряжение, пропорциональное переменному или постоянному току (в зависимости от того, что измеряется).

ACS712 доступна в 8-выводном корпусе SOIC, и на следующем рисунке показана ее схема контактов (распиновка ACS712).

IP+ – это плюсовая клемма для измерения тока, IP- – это минусовая клемма для измерения тока, GND – это сигнальная земля, FILTER – для подключения внешнего конденсатора, VIOUT – аналоговый выход, VCC – питание.

Существует три варианта датчика ACS712 в зависимости от диапазона его измерения тока. Оптимизированные диапазоны: +/- 5А, +/- 20А и +/- 30А. в зависимости от варианта чувствительность на выходе также изменяется следующим образом: ACS712 ELC-05 (+/- 5A) чувствительность 185 мВ/А, ACS712 ELC-20 (+/- 20A) чувствительность 100 мВ/А, ACS712 ELC-30 (+/- 30A) чувствительность 66 мВ/А.

Как упоминалось ранее, ASC712 основана на эффекте Холла. В микросхеме имеется медная полоса, соединяющая контакты IP+ и IP- внутри. Когда некоторый ток протекает через этот медный проводник, создается магнитное поле, которое определяется датчиком Холла.

Затем датчик Холла преобразует это магнитное поле в соответствующее напряжение. В этом методе вход и выход полностью изолированы.

Схема датчика тока на основе ACS712

Стандартная схема применения с использованием датчика тока ASC712 приведена в его техническом описании, и на следующем изображении:

Модуль датчика тока ACS712

Используя один из вариантов ИС ACS712 (5А, 20А или 30А), несколько производителей разработали платы модуля датчика тока ASC712, которые могут быть легко подключены к микроконтроллеру, такому как Arduino. На следующем рисунке показана плата датчика тока ASC712, используемая в этом проекте.

Как видите, это довольно простая плата с несколькими компонентами, включая микросхему ASC712, несколько пассивных компонентов и разъемов. Эта конкретная плата состоит из ASC712 ELC-30, то есть диапазон этой платы +/-30A.

Подключение ACS712 к Arduino (схема)

Измерение напряжения (постоянного напряжения) с помощью Arduino очень просто. Если ваше требование состоит в том, чтобы измерять напряжение меньше или равное 5 В, то вы можете напрямую измерять с помощью аналоговых выводов Arduino. Если вам нужно измерить более 5 В, то вы можете использовать простую сеть делителя напряжения или модуль датчика напряжения.

Когда дело доходит до измерения тока, Arduino (или любой другой микроконтроллер) нуждается в помощи в виде специального датчика тока. Итак, сопряжение датчика тока ACS712 с Arduino помогает нам измерять ток с помощью Arduino. Поскольку ASC712 может использоваться для измерения переменного или постоянного тока, проект с Arduino может быть реализован для измерения того же.

Принципиальная схема подключения датчика тока ACS712 к Arduino показана на следующем рисунке.

Код программы взаимодействия Arduino и датчика тока ACS712

Работа датчика тока ACS712 с Arduino

Подключите все согласно принципиальной схеме и загрузите код в Arduino. В коде есть небольшой расчет для измерения тока. Во-первых, если предположить, что напряжение VCC-ASC712 составляет 5 В, то при отсутствии тока, протекающего через клеммы IP + и IP-, выходное напряжение на VIOUT ACS712 составляет 2,5 В. Это означает, что вам нужно вычесть 2,5 В из напряжения, измеренного на аналоговом выводе.

Теперь, чтобы рассчитать ток, разделите это значение на чувствительность датчика (185 мВ / A для датчика 5A, 100 мВ / A для датчика 20A и 66 мВ / A для датчика 30A). Это все реализовано в коде.

Источник

Датчики тока для работы с Ардуино

Главное преимущество микроконтроллера по сравнению со многими средствами управления оборудованием — универсальность. Можно не только отдавать с его помощью конечные команды на включение двигателей, зажигания ламп, или произведения каких-либо действий, но и выполнять определенные «логические» реакции в зависимости от изменившихся внешних условий. Последняя возможность предоставляется в первую очередь внешними датчиками и уже во вторую ветвлениями внутренней программы. В сущности, микроконтроллер — миниатюрный компьютер, ограниченный по мощности, но обладающий определенными плюсами, изначально направленными на применение его в комплексе с различной аппаратурой. Сюда относятся не только контролирующие цепи, но и различные сенсоры, предоставляющие информацию самому логическому блоку. В контексте статьи речь пойдет об одном из ярких представителей названого класса устройств — Ардуино и датчике тока ACS712, специально разработанного в целях совместного с ним использования.

Практические ниши применения

Несмотря на определенные ограничения сенсора, ниши в которых он действительно пригодится весьма широки. Посудите сами — в сущности, потребление электроэнергии возникает единовременно с моментами включения устройств, находящихся на линии. А сам сенсор именно в это время начинает регистрировать показания. То есть датчик тока с Arduino можно использовать не только, как конечный измеряющий прибор, но и в качестве контролирующей части, определяющей активацию какого-либо оборудования. Самый простой пример — обычная лампа. Совместив микроконтроллер с датчиком света и тока можно добиться того, что будет не только производиться активация освещения в темный период времени, но и станет отправляться сигнал пользователю, если источник видимого излучения выйдет из строя. Или, другим примером может стать контроль физического состояния насоса, двигателя, а также любого электрического прибора, потребляющего энергию.

Опять же. Применяя Arduino одновременно с ACS712, как наиболее распространенным датчиком тока платформы, можно использовать микроконтроллер именно в роли детектирующего прибора, который в зависимости от определенного времени производит замер потребления конечной сети. Или как очень «умный» мультиметр, с возможностью построения On-line графиков на дополнительно соединенном к аппарату экране или внешнем компьютере.

ACS712 на основе эффекта Холла

Описываемый датчик построен на основе эффекта Холла. Представьте себе проводящую пластину, к двум сторонам которой подключены полюсы источника тока. На боковых ее гранях напряжение регистрироваться не будет, так как количество «дырок» поступающей энергии с одной стороны равно сумме электронов с другой. Ситуация изменится, если на поверхность начнет действовать магнитное поле. На боковые грани пластины при нем начнет идти часть тока линии, который можно замерить. Его количество станет пропорционально равному воздействию, а значит доступным к определению. Именно названый эффект и лежит в основе работы датчика Холла.

Технологически, в ACS712 сенсор настоящего типа представлен микросхемой SOIC-8, со следующим расположением контактов:

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

Конечно, в контексте платы дополняющей Arduino, электрические контакты выполнены с более удобным расположением соединяющих проводников:

Два контакта одной стороны устройства предназначены для подключения его в разрыв цепи прохождения тока нагрузки, другие три – целям соединения к самому микроконтроллеру. Здесь OUT связывается с любым аналоговым входом Arduino, на VCC подается +5В питания, GND с общей землей.

Читайте также:  Классификация средств измерения расхода газа

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

Технические характеристики

Рассмотрим характеристики платы ACS712 более подробно, естественно с разделением их в зависимости от возможностей различных моделей:

  • Питание — 5В;
  • потребляемый ток — 0,11А;
  • сопротивление по шинам — до 1,2 мОм;
  • вид измеряемой характеристики — постоянный или переменный ток;
  • температурный режим работы — от –40 до +85°С;
  • дополнительные индикаторы — присутствует светодиод поступления тока на питание устройства;
  • размеры (в среднем) — 31 x 13 мм;
  • критичная сила тока, приводящая к пробою устройства — 50А.
Модель мВ/А
ACS712 5A 185
ACS712 20A 100
ACS712 30A 66
ACS713 20A 185
ACS713 30A 133

Внутренняя электронная схема сенсора:

Ограничения ACS712

Основное смущающее пользователей ограничение — максимальный вольтаж измеряемого напряжения, равный 5В. В принципе, вопрос решается достаточно просто обычным делителем, позволяющим поднять значение характеристики практически до любого номинала.

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

Теперь, что касается чувствительности: чем датчик рассчитан на больший ампераж работы, тем она ниже. Что тоже нужно брать во внимание, при проектировании схем на основе ACS712. Отдельным вариантом тут выступает ACS713 30A, частично сохраняющий названую возможность за счет относительно удачной схемы.

Схемы подключения и организация работы

Градация аналогового сигнала Arduino составляет 1024 бит. Так как при отсутствии нагрузки сенсор в любом случае показывает 2,5В, значение по умолчанию порта, к которому подключена ACS712 будет 512, что необходимо учитывать при написании скетча микроконтроллера.

Переходя к практике, в начале стоит рассмотреть схему цифрового мультиметра на основе Arduino, от которой впоследствии и действовать, выполняя аналогичные подключения и общие принципы программирования для иных устройств.

и скетч для вывода показаний датчика:

#include

LiquidCrystal lcd (7, 6, 5, 4, 3, 2);
const int APIN = A3; // аналоговый пин подключения микроконтроллера
int SENS_ACS712 = 66; // Здесь задается чувствительность конкретного ACS712
int ADCV= 0;
int MINV = 2500;
double ADCVOL = 0;
double tVAL = 0;
void setup()
<
// Отладочная часть, при работе с экраном не используется
// Serial.begin(9600);
lcd.begin(16, 2);
lcd.print(» ACS823 SENS «);
lcd.setCursor(0,1);
lcd.print(» from ARDUINO «);
delay(2000);
>
void loop()
<
ADCV = analogRead(APIN);
ADCVOL = (ADCV / 1024.0) * 5000;
tVAL = ((ADCVOL — MINV) / SENS_ACS712);
// Отладочная часть, при работе с экраном не используется
// Serial.print(«Sens pure = » );
// Serial.print(ADCV);
lcd.clear();
delay(1000);
//lcd.display();
lcd.setCursor(0,0);
lcd.print(«ADC = «);
lcd.setCursor(12,0);
lcd.print(ADCV);
delay(2000);
// Отладочная часть, при работе с экраном не используется
//Serial.print(«\t mV = «);
//Serial.print(ADCVOL,3);
lcd.setCursor(0,0);
lcd.print(«V/mV = «);
lcd.setCursor(10,0);
lcd.print(ADCVOL,1);
delay(2000);
// Отладочная часть, при работе с экраном не используется
//Serial.print(«\t tVAL = «);
//Serial.println(tVAL,3);
lcd.setCursor(0,0);
lcd.print(«ACS712 = «);
lcd.setCursor(10,0);
lcd.print(tVAL,2);
lcd.setCursor(14,0);
lcd.print(«A»);
delay(2500);
>

Есть унифицированные библиотеки, производящие конвертацию показаний сенсора в понятные милливольты без самостоятельной разработки формул. Примером может послужить скетч, выполняющий аналогичные предыдущему действия, только вместо вывода на экран, полученные значения отправляются в COM-порт Arduino. С вычислительными целями применяется библиотека TroykaCurrent. Приведенный код применяется для измерения переменного тока, его модификация для постоянного помечена в тексте.

#include
#define APIN A3
ACS712 dataI(APIN);
void setup() <
Serial.begin(9600);
>
void loop() <
Serial.print(«Troyka value: «);
Serial.print(dataI.readCurrentAC());
// Если требуется постоянный, то используется
// конструкция Serial.print(dataI.readCurrentDC());
Serial.println(» A»);
delay(1000);
>

Теперь, что касается контроля, к примеру, функциональности двигателя. Внешний вид подключенного оборудования:

Кусок кода, который в цикле проверяет работу потребляющего устройства:

const int APIN = A3; // аналоговый пин подключения микроконтроллера
void setup() <
SetSerial(9600);
>
void loop() <
// для обычного контроля любого устройства потребления,
// знание конкретной характеристики объема расходуемого
// тока не важно, главное его определить и отправить
// сообщение в com-порт
if (analogRead(APIN)>2500)
Serial.print(«Device Active)
else
Serial.print(«Device in state OFF»);
delay(2000);
>

Естественно, что описанное ранее можно применить в отношении любого потребителя, даже к опросу срабатывания релейной группы. Принципиальная схема случая с двигателем:

Ну, и напоследок рассмотрим метод серьезного применения датчика ACS712 для контроля нагрузки домашней сети электропитания 220В, до 30А при допустимых потребителях 6 кВт. Несравненным плюсом конструкции служит вывод получаемой информации при помощи Ардуино в сеть, наглядным для человека образом, с графиками и в браузере. Достаточно набрать в подключенном к сети c Arduino компьютере адрес http://192.168.100.10. Единственное ограничение — требуется, чтобы интернет также был доступен. Последнее нужно для внешних компонентов, обрабатывающими числовые значения и выводящие графики.

Сам скетч, который приводится без изменений — уж очень хорошо реализована идея, можно обнаружить по адресу http://liccontrol.com/articles/web_monitor.ino

Вывод

Хотелось бы заметить, что сенсоры ACS712 с 2017 года больше не производятся. Взамен их правообладатель Allegro Microsystems выпускает модификацию ACS723, которая и поставляется на мировые рынки в текущий момент времени.

Видео по теме

Источник

Как подключить датчик тока к Arduino

Для проекта нам понадобятся:

Датчики тока, как следует из их названия, служат для измерения силы тока. Существуют датчики, которые основаны на различных физических эффектах и имеют различные особенности. В частности, рассматриваемый датчик ACS712 основан на эффекте Холла, датчик INA219 имеет в своём составе аналого-цифровой преобразователь (АЦП ), а датчик INA3221 – трёхканальный. Рассмотрим их по порядку.

Содержание:

1 Описание датчикатока ACS712

Датчик тока ACS712 – это датчик, который основан на эффекте Холла. Эффект Холла заключается в том, что когда через проводник, помещённый в магнитное поле, протекает электрический ток, в проводнике возникает напряжение. Это напряжение и служит индикатором силы тока: оно линейно зависит от силы тока. Ещё оно имеет небольшую зависимость от температуры окружающей среды и поддаётся влиянию внешних магнитных полей. Так, например, на графике ниже показана зависимость напряжения на выходе датчика ACS712 от силы протекающего тока (для одной из разновидностей датчика, об этом чуть ниже) при различных температурах:

Зависимость напряжения на выходе датчика ACS712 от силы тока

Модуль с датчиком ACS712 может выглядеть, например, так:

Модуль с датчиком тока ACS712 и схема подключения

Датчик ACS712 имеет следующие характеристики:

  • работает с постоянным и переменным током;
  • ток потребления – до 13 мА;
  • температура эксплуатации -40…+85 °C.

Существуют несколько разновидностей датчика ACS712, которые отличаются величиной измеряемого тока. Так, существуют разновидности с максимально измеряемым током 5, 20 и 30 А. Широкий диапазон измеряемых значений тока можно отнести к существенным преимуществам датчика ACS712. Перечисленные модификации имеют чувствительность 185, 100 и 66 мВ/А соответственно.

2 Подключение датчика тока ACS712 к Arduino

Как мы помним из курса школьной физики, для измерения тока необходимо пропустить ток через измерительный прибор, помещённый в разрыв между источником питания и нагрузкой. Соответственно, схема подключения датчика проста:

Читайте также:  Приборы для измерения характеристик тока
Вывод датчика ACS712 Назначение
VCC Питание, 5 В
GND Земля
OUT Аналоговый выход датчика, напряжение на котором линейно зависит от протекающего через датчик тока
IP+ Вывод 1 для подачи измеряемого тока
IP- Вывод 2 для подачи измеряемого тока

Выводы IP+ и IP- как раз и есть тот разрыв цепи, через который нужно пропустить интересующий ток. Если перепутать полярность, то измерения будут с обратным знаком.

Кстати, эта особенность – измерять ток как с положительным, так и отрицательным знаком, позволяет использовать датчик ACS712 для измерений переменного тока.

Таким образом, для подключения датчика ACS712 к плате Arduino используются 3 провода:

Схема подключения датчика тока ACS712 к Arduino

Выход сенсора VOUT подключим к любому аналоговому выводу Arduino, например, A0. В качестве нагрузки будем использовать двигатель постоянного тока.

Модуль с датчиком тока ACS712 подключён Arduino, нагрузка – двигатель постоянного тока

Либо вместо нагрузки можно использовать мощную лампу накаливания. Либо любую другую нагрузку.

Модуль с датчиком тока ACS712 подключён Arduino, нагрузка – 10 Вт лампа накаливания

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

3 Чтение показаний датчика тока ACS712с помощью Arduino

В скетче будем постоянно читать значение с порта A0 и выводить в монитор последовательных данных. Напомню, АЦП у разных плат Arduino имеет различную разрядность, обычно 10 или 12 бит. Подробнее здесь. Это означает, что с аналогового порта могут приходить значения от 0 до 2 10 = 1024 для 10-разрядного АЦП . Будем считать, что у нас датчик тока, диапазон измерений которого от -5 А до +5 А, а чувствительность 185 мВ/А.

Пояснение принципа вычисления силы тока

На практике значение на аналоговом выводе A0 не будет равняться точно 512. Поэтому, чтобы определить начало отсчёта, добавим в скетч примитивную калибровку. Калибровка будет заключаться в том, что некоторое количество раз прочитаем значение с аналогового порта A0 при отсутствии тока на датчике ACS712, и усредним его. Естественно, нагрузка на время калибровки должна быть выключена, чтобы ток не протекал через датчик.

Скетч для измерения постоянного тока датчиком ACS712 (разворачивается)

Загрузим скетч и плавно начнём поднимать напряжение и ток на нагрузке. Какое-то время подождём, а затем начнём уменьшать ток. В результате получим примерно такую картинку:

Вывод тока датчика ACS712 в монитор последовательного порта и его график

Как видно, аналоговый сигнал постоянно «прыгает». Чтобы этого избежать, следует добавить в скетч сглаживание. Для этого будем проводить подряд несколько измерений, а затем брать среднее арифметическое от них в качестве действительного значения. Заодно совместим начальную калибровку, т.к. она выполняется точно так же. Вот как изменится в результате скетч:

Скетч для измерения постоянного тока датчиком ACS712 со сглаживанием

Кстати, желательно вынести чувствительность датичка ACS712 в константу в начале скетча, чтобы можно было быстро изменить скетч для модификации датчика с другим диапазоном измерений.

В результате выполнения данного скетча картинка получается гораздо более приятная:

Сглаженный график тока, измеренного датчиком ACS712

Тот же самый принцип заложен в библиотеки для Arduino, которые оперируют с датчиком тока ACS712. Например, вот эта библиотека Troyka Current.

По результату эксперимента получается, что датчик ACS712 очень простой, но при этом довольно не точный. Гораздо точнее датчик тока, который мы рассмотрим в следующем разделе.

4 Описание датчика тока,напряжения и мощности INA219

Датчик INA219 – цифровой датчик тока, напряжения и мощности. Он позволяет измерять напряжения от 0 до 26 вольт и ток от 0 до 3,2 ампер. Питается датчик напряжением от 3 до 5,5 В. Существуют модули, полностью готовые к подключению к Arduino. Один из таких модулей GY-219:

Модуль GY-219 с датчиком тока INA219: назначение выводов и частей

Датчик INA219 выполняется в двух разновидностях: A и B. Последняя отличается повышенной точностью и меньшей погрешностью. На фото ниже как раз модификация INA219B.

Модуль GY-219 с датчиком тока INA219

Для конфигурирования датчика INA219 и для считывания показаний с него используется последовательный интерфейс I2C. Причём адрес на шине можно задать с помощью перемычек A0 и A1 на модуле. Допустимые адреса:

  • 0x40 (без перемычек);
  • 0x41 (с перемычкой A0);
  • 0x44 (с перемычкой A1);
  • 0x45 (установлены обе перемычки).

Соответственно, на одной шине IIC можно иметь до 4-х таких датчиков, подключённых одновременно.

5 Подключение датчика тока и напряжения INA219 к Arduino

Для начала пойдём простым путём: скачаем готовую библиотеку, загрузим в Arduino и посмотрим на результат. Существует несколько библиотек для работы с нашим датчиком. Предлагаю воспользоваться вот этой популярной библиотекой для INA219 от Adafruit. Скачаем её, установим стандартным образом и загрузим в Arduino скетч из примеров getcurrent.

Если скетч не компилируется, а в сообщениях об ошибках присутствуют какие-то недостающие компоненты (например, Adafruit_I2CDevice.h или Adafruit_BusIO_Register.h, то необходимо доустановить их. Проще всего это сделать так. Для этого способа требуется подключение к интернету на компьютере, где запущена среда разработки. Открыть в среде Arduino IDE менеджер библиотек: в меню Tools Manage Libraries…. Откроется окно Library Manager. В поле поиска следует ввести adafruit busio. Когда библиотека будет обнаружена и покажется в списке, нажать кнопку Install.

Установка недостающих библиотек через менеджер библиотек Arduino IDE

Подключим модуль GY-219 к Arduino по следующей схеме. SDA и SCL датчика можно подключить как к аналоговым входам A4 и A5 Arduino, так и к специально выделенным портам SDA и SCL (если они есть на вашей плате).

Схема подключения датчика INA219 к Arduino

В качестве нагрузки может быть любой источник, например, электромотор, лампа или просто мощный резистор. У меня это 5 соединённых параллельно 5-ваттных 16-омных резисторов. В качестве источника питания также может выступать любой из имеющихся у вас источников. Я буду использовать лабораторный источник питания.

Датчик INA219 подключён к Arduino

В результате выполнения скетча получится следующий вывод:

Результат работы скетча «GetCurrent» для датчика тока INA219

Отлично! Всё работает! Как говорится, бери – и пользуйся.

Данная библиотека позволяет также проводить калибровку датчика INA219 при необходимости. Подробности – в описании библиотеки и в самих исходниках (в файле Adafruit_INA219.cpp библиотеки даётся большое число пояснений).

6 Как читать данные сдатчика тока и напряжения INA219

Если посмотреть на обмен данными по шине I2C, который происходит при работе данного скетча (с помощью логического анализатора, конечно), то увидим следующее.

Осциллограмма чтения регистров датчика INA219

Чтобы понять, что здесь происходит, необходимо познакомиться с картой регистров датчика INA219. Датчик содержит всего 6 регистров. Все регистры 16-разрядные.

Карта регистров датчика тока и напряжения INA219

Адрес регистра Название регистра Назначение регистра Тип
0x00 Configuration Сброс всех регистров, настройка диапазона измерений, усиления PGA , разрешения АЦП и фильтрации. Чтение/Запись
0x01 Shunt voltage Хранит измеренное значение напряжения на шунтирующем резисторе 0,1 Ом. Чтение
0x02 Bus voltage Хранит измеренное значение напряжения шины. Чтение
0x03 Power Хранит измеренное значение мощности. Чтение
0x04 Current Содержит значение силы тока, протекающего через шунтирующий резистор. Чтение
0x05 Calibration Калибровочный регистр. Задаёт диапазон измерений и позволяет осуществлять калибровку системы. Чтение/Запись

Чтение регистров датчика тока INA219 с помощью FT2232H

Запустим программу SPI via FTDI, выберем в меню «Устройство» интерфейс I2C. Подключимся к порту A. Просканируем устройства на шине I2C. Программа найдёт устройство по адресу 64 (0x40), если конечно вы не меняли адрес перемычками A0 и A1. Выберем это устройство. В разделе «Чтение» зададим размер буфера 2 байта, напишем команду 00 и нажмём кнопку «Прочитать». Прочитанные данные будут в таблице, которая открывается по нажатию на кнопку с пиктограммой таблицы. Вот что мы увидим.

Чтение регистров датчика тока INA219 с помощью FT2232H и программы «SPI via FTDI»

Как вы уже наверное догадались, команда «0» означает адрес регистра, из которого мы хотим прочитать данные. А число 0x399F – это данные в нулевом регистре (регистр конфигурации). И это соответствует документации, т.к. после включения и загрузки микросхема INA219 имеет именно такую конфигурацию по умолчанию. Вот какую структуру имеет регистр конфигурации.

Структура конфигурационного регистра датчика тока INA219

В регистре конфигурации датчика INA219 присутствуют следующие части:

0x399F в двоичном виде это «001_11_0011_0011_111». Следовательно, значения по умолчанию после включения такие.

Для чтения других регистров необходимо сначала так же записать их адрес в поле «Чтение» «Команда», а затем прочитать 2 байта. Или можно записать номер регистра в поле «Запись» «Команда», а затем просто читать (не указывая адрес регистра в команде чтения).

К сожалению, последовательного чтения всех регистров микросхемы INA219 «за один проход» не предусмотрено.

Вернёмся к нашей осциллограмме. Мы видим на ней 6 циклов чтения (каждый начинается с зелёной точки ● и заканчивается тёмно-красной ● ). Сначала читаем регистр с напряжением шунта Vшунт. (адрес 0x01), который хранит значение 0x1957. Далее читаем значение регистра напряжения шины Vшины (0x02), в котором значение 0x19BA. Далее читаем регистр калибровки Cal (0x05) со значением 0x1000. Потом регистр тока шунта Iшунт. (0x04), в котором значение 0x1959. Потом снова читаем регистр калибровки Cal (0x05). И наконец читаем регистр мощности Pwr (0x03), в котором находится значение 0x042B. При этом монитор последовательного порта показывает следующее:

Вывод монитора порта в момент снятия осциллограммы с датчика INA219

Рассмотрим, как привести данные в регистрах «в человеческий вид». Нам интересны не все значения, а только напряжения и ток. Плюс регистр калибровки, который играет роль поправочного коэффициента.

Регистр Shunt Voltage (адрес 0x01) датчика INA219

Напряжение на шунте равняется тому значению, которое записано в регистре, поделённое на 100: Uшунта = Shunt_voltage/100 = 0x1957/100 = 64.87 (мВ) Для случаев, когда напряжение отрицательное, расчёт несколько сложнее. Это можно посмотреть в техническом описании (datasheet).

Регистр Bus Voltage (адрес 0x02) датчика INA219

Начнём с регистра, в котором записано напряжение шины, т.к. он самый простой. В текущий момент данные в нём это 0x19BA. Согласно всё тому же техническому описанию (datasheet на INA219), для преобразования значения в милливольты необходимо сделать следующее: Uшины = (0x19BA >> 3) × 32000 (мВ) / 8000 = 3292 (мВ).

Здесь 0x19BA это значение в регистре. Его нужно сдвинуть на 3 разряда вправо, т.к. данные о напряжении хранятся, начиная с 3-го разряда. 32000 (мВ) – это предел шкалы измерения (он указан в регистре конфигурации). А 8000 – это предел шкалы измерения в отсчётах. Получается 3292 (мВ) или 3.29 вольта, что мы и видим в выводе скетча в мониторе порта Arduino.‬

Регистр Current Register (адрес 0x04) датчика INA219

Значение тока рассчитывается тоже просто: I = 0x1959 × 0x1000 / 4096 = 6489.

Значение в регистре напряжения шунта 0x1959 умножается на значение регистра калибровки, который в нашем случае равен 0x1000. А затем результат делится на 4096 (что, кстати, то же самое, что 0x1000). То есть ток получается равным 6489. Но в каких единицах? Чтобы ответить на этот вопрос, необходимо определить параметр Current_LSB: Current_LSB = 0.04096 / 0x1000 / 0.1 (Ом) = 0.0001 Здесь 0x1000 – значение регистра калибровки, 0.1 (Ом) – сопротивление шунта, а 0.04096 – просто коэффициент. Теперь посчитанный ток нужно умножить на число Current_LSB, и получим 0.6489 (А) или 648,90 (мА). Такой ток мы видим и в мониторе.

Регистр Power (адрес 0x03) датчика INA219

Мощность рассчитывается как произведение напряжения на шине и тока: P = Uшины × I = 3292 (мВ) × 648.9 (мА) = 2136 (мВт)

Небольшое расхождение с выводом монитора Arduino связано с ошибкой округления. А именно, если посмотреть на вывод монитора порта, мы увидим, что значение напряжения на шине принято равным 3.29 В, в то время как в регистре записано 3.292 В. Из-за этого рассчитанное значение на 2 милливатта больше, чем показанное в выводе скетча.

7 Подключение трёхканального датчика тока и напряжения INA3221 к Arduino

Датчик тока INA3221 практически идентичен датчику INA219. Основное отличие состоит в том, что он имеет 3 измерительных канала вместо одного. Показания с них можно снимать независимо друг от друга. Будем использовать вот такую небольшую плату с датчиком:

Плата с датчиком INA3221

Подключается данный модуль к Arduino всего 4-мя проводами: два для питания, и ещё два – шина I2C.

Вывод модуля INA3221 Вывод Arduino Назначение
SDA A4 Данные шины I2C
SCL A5 Импульсы синхронизации шины I2C
VS +3.3V Питание
GND GND Общий

Подключение датчика INA3221 к Arduino Nano

Назначение остальных выводов модуля показано на приведённом рисунке и в таблице ниже.

Вывод модуля INA3221 Назначение
TC Цифровой выход оповещения о сбое таймингов (timing control alert).
WAR Цифровой выход оповещения о сбоях измерений (warning).
CRI Цифровой выход оповещения о критических сбоях (critical).
PV Цифровой выход оповещения о валидности питающего напряжения (power valid).
VPU Аналоговый вход подтягивающего напряжения для смещения выходных цепей определения валидности питания.
POW Аналоговый вход питания измеряемой нагрузки.
CH1, CH2, CH3 Порты для подключения измеряемых цепей.

Используем библиотеку для работы с датчиком INA3221. Поместим файлы с расширениями *.cpp и *.h в одну директорию, в ней же создадим файл с расширением *.ino и следующим содержимым:

Скетч для чтения показаний датчика INA3221

Загрузим данный скетч в память Arduino. Перед тем как подключать нагрузку, необходимо подать с источника питания напряжение на контакты POW и GND, расположенные с одного из краёв модуля. Это напряжение будет подаваться на нагрузку и оно в данном модуле общее для всех трёх измерительных каналов. Допустимый диапазон напряжений от 0 до 26 вольт. Я сейчас подам 5 В.

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

Теперь можно подключать нагрузку. Давайте нагрузим выходы модуля и посмотрим, что будет выводиться в монитор последовательного порта. Я подключу на канал 1 два параллельных резистора номиналом 4,3 кОм, что в сумме даст сопротивление 2,15 кОм. А на канал 3 – один резистор 4,3 кОм.

Датчик тока INA3221 с нагрузкой

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

Показания датчика тока INA3221 в мониторе COM-порта

Если мы подключим в измеряемую цепь амперметр, то убедимся, что показания цифрового датчика INA3221 довольно точно совпадают с показаниями амперметра.

Показания датчика тока INA3221 в сравнении с амперметром

Источник