Agkz.ru - игровой новостной портал
Датчик напряжения и тока. Исправляем недостатки Imax.

Датчик напряжения и тока. Исправляем недостатки Imax.

  • Цена: $7.71
  • цена за 3 шт.

    У нас будет свой контроллер заряда/разряда. С экраном и графиками!

    Датчик напряжения и тока. Измеряет напряжения до 26 вольт и токи до 3,2 амера. Отличительной особенностью является то, что он подсоединяется по шине IIC, что дает ряд преимуществ. Он лучше, чем аналоговые датчики, защищен от помех, он не занимает аналоговый вход контроллера, он определяет сразу три величины: ток, напряжение и мощность.

    У меня есть зарядка для аккумуляторов — Imax B6 mini. Хороший, в принципе, аппарат, я им даже автомобильный аккумулятор заряжал. Но долго, конечно. А уж разряжает он совсем медленно: максимальный ток 400мА. Можно заряжать аккумуляторы и обычным лабораторным блоком питания, он умеет и СС и CV, но увы, он не подсчитает отданный в аккумулятор ток. Было время, я прилаживал USB доктора, чтобы подсчитать емкость, но это, конечно же, временная мера. Все равно он не строил графиков зарядки, он не мог отключать зарядное устройство при достижении нужного напряжения, он не мог отключать нагрузку при просадке напряжения во время тестового разряда.

    Наконец, дошли руки сделать штуковину, которая будет все это делать. Заказал три датчика. Модули и датчики я всегда заказываю по 2-3 штуки, это удобно: один экземпляр для работы, один для тестирования и отладки, один запасной.

    Вот что приехало:

    Датчик напряжения и тока. Исправляем недостатки Imax.

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

    Датчик напряжения и тока. Исправляем недостатки Imax.

    Сделано аккуратно, детальки лежат ровненько, флюс смыл, любо-дорого посмотреть.

    Датчик напряжения и тока. Исправляем недостатки Imax.

    На плате сама микросхема сенсора, один конденсатор, батарея резисторов и шунт 0,1Ом. Имеются две площадочки, на которые можно посадить соплю из припоя, чтобы изменить адрес устройства по шине IIC.

    В большие отверстия впаиваем колодку.

    Датчик напряжения и тока. Исправляем недостатки Imax.

    Маленькие для подключения гребенки: SDA и SDL — шина I2C, плюс и земля — питание, два остальных дублируют силовой вход датчика.

    Что же из себя представляет микросхема датчика: Обратимся к первоисточнику: https://cdn-shop.adafruit.com/datasheets/ina219.pdf. Тут приведена схема с пояснением принципов работы:

    Датчик напряжения и тока. Исправляем недостатки Imax.

    Сигнал с шунта и с входного напряжения попеременно через переключатель подается на усилитель, затем на АЦП, после значения напряжения складываются в регистр напряжения, значения тока — в регистр тока. Произведение двух значений — в регистр мощности. Далее по интерфейсу IIC все это отдается в ответ на запрос.

    С теорией все понятно, переходим к практике. Я соединил проводами этот датчик, Ардуино Про Мини, ЖК дисплей 1602 и релюшку. Все это сложил в распаячную коробку и запитал от микро-юсб гнезда. Наружу вывел две пары проводов: одна для источника тока, вторая для потребителя. Вот что у меня получилось:

    Датчик напряжения и тока. Исправляем недостатки Imax.

    Датчик напряжения и тока. Исправляем недостатки Imax.

    Написал небольшой скетч. Вот он:

    ina219.ino
    
    
    ///////////////////////////////////////////////////////////////////////
    //
    // Battery charge/discharge controller:
    // - writes a log with voltage, current, power and capacity
    // - switches off the load when max or min voltage achieved
    // Based on INA219 sensor connected to IIC bus
    //
    // components:
    // 1) ardiono Pro Mini/Nano/Uno
    // 2) relay
    // 3) 1602 LCD display
    // 4) INA 219 sensor
    // 5) OpenLog module to store a log file - optional
    //
    // © tykhon, 2018
    //
    ///////////////////////////////////////////////////////////////////////
    #include <Wire.h>
    #include <LiquidCrystal_I2C.h>
    #include <Adafruit_INA219.h>
    const int relay_pin = 2; // pin to connect relay
    // const float minimal_voltage = 3.2; // minimal voltage to switch off the load
    const float minimal_voltage = -1.0; // minimal voltage to switch off the load
    const int window_sec = 5; // update LCD and log interval
    float voltage = 0;
    float current = 0;
    float power = 0;
    float voltage_display = 0.0;
    float current_display = 0.0;
    float power_display = 0.0;
    float voltage_sum = 0.0;
    float current_sum = 0.0;
    float power_sum = 0.0;
    float capacity = 0.0;
    float shuntvoltage = 0;
    float busvoltage = 0;
    int counter = 0;
    int seconds = 0;
    int minutes = 0;
    boolean working = true;
    unsigned long timelastinstance;
    unsigned long now;
    // LiquidCrystal_I2C lcd(0x27,16,2);
    LiquidCrystal_I2C lcd(0x3F,16,2);
    Adafruit_INA219 ina219;

    void setup() {
    Serial.begin (9600);
    lcd.init();
    lcd.clear();
    lcd.setBacklight(HIGH);
    pinMode(relay_pin, OUTPUT);
    ina219.begin();
    shuntvoltage = ina219.getShuntVoltage_mV();
    busvoltage = ina219.getBusVoltage_V();
    voltage = busvoltage + (shuntvoltage / 1000);
    if (voltage > minimal_voltage) {digitalWrite(relay_pin, HIGH);}
    else {working = false; lcd.setCursor(0, 1); lcd.print("OFF");};
    }
    void loop() {
    if (working){
    now = millis();
    if ((now - timelastinstance) >= 1000) {
    timelastinstance = now;
    shuntvoltage = ina219.getShuntVoltage_mV();
    busvoltage = ina219.getBusVoltage_V();
    current = ina219.getCurrent_mA();
    power = ina219.getPower_mW();
    voltage = busvoltage + (shuntvoltage / 1000);

    voltage_sum += voltage;
    current_sum += current;
    power_sum += power;
    counter += 1;
    seconds += 1;
    if (seconds >= 60) {
    minutes+=1;
    seconds = 0;
    };

    if (counter >= window_sec) {
    voltage_display = voltage_sum/float(counter);
    current_display = current_sum/float(counter);
    power_display = power_sum/float(counter);
    capacity += current_display*window_sec/3600.0;
    voltage_sum = 0.0;
    current_sum = 0.0;
    power_sum = 0.0;
    String seconds_display = String(seconds);
    if (seconds < 10){seconds_display = '0'+seconds_display;};
    String minutes_display = String(minutes);
    if (minutes < 10){minutes_display = '0'+minutes_display;};
    String dataString = minutes_display+":"+seconds_display+" U= "+String(voltage_display)+" I= "+String(current_display)+" P= "+String(power_display)+" mAh= "+String(capacity);
    dataString.replace(".",",");
    dataString.replace(" ","t");
    Serial.println(dataString);
    lcd.setCursor(0, 0);
    lcd.print(" ");
    lcd.setCursor(0, 0);
    lcd.print(voltage_display,2);
    lcd.print("V");
    lcd.setCursor(8, 0);
    lcd.print(" ");
    lcd.setCursor(8, 0);
    lcd.print(current_display,0);
    lcd.print("mA");
    lcd.setCursor(0, 1);
    lcd.print(" ");
    lcd.setCursor(0, 1);
    lcd.print(power_display,0);
    lcd.print("mW");
    lcd.setCursor(8, 1);
    lcd.print(" ");
    lcd.setCursor(8, 1);
    lcd.print(capacity,0);
    lcd.print("mAh");
    counter = 0;
    if (voltage_display <= minimal_voltage) {
    digitalWrite(relay_pin, LOW);
    lcd.setCursor(0, 1);
    lcd.print(" ");
    lcd.setCursor(0, 1);
    lcd.print("OFF");
    working = false;
    };
    };
    delay(10);
    };
    };
    }

    Для работы используется библиотека от Adafruit, ее можно найти вот тут: https://learn.adafruit.com/adafruit-ina219-current-sensor-breakout/downloads

    Работает прямо из коробки: скачиваем, распаковываем с папку с библиотеками Ардуины, запускаем пример из папки с библиотекой, работает сразу и без танцев с бубном.

    Скетч выдает в порт значения напряжения, тока, мощности и емкости батареи. Примерно вот так:

    
    
    39:00 U= 4,08 I= 404,66 P= 1624,40 mAh= 254,40
    39:05 U= 4,08 I= 397,22 P= 1592,40 mAh= 254,95
    39:10 U= 4,08 I= 404,82 P= 1644,40 mAh= 255,51

    Далее мне захотелось проверить точность прибора. Подключаем источник опорного напряжения.

    2,5 вольт:

    Датчик напряжения и тока. Исправляем недостатки Imax.

    5,0 вольт:

    Датчик напряжения и тока. Исправляем недостатки Imax.

    7,5 вольт:

    Датчик напряжения и тока. Исправляем недостатки Imax.

    10 вольт:

    Датчик напряжения и тока. Исправляем недостатки Imax.

    Ну просто замечательно! Идеальная точность! Конечно, можно было бы посмотреть что там в третьем знаке после запятой, но мне совершенно достаточно двух.

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

    Подключаем аккумулятор как источник тока и лампочку как нагрузку. Вот лампочка горит:

    Датчик напряжения и тока. Исправляем недостатки Imax.

    А вот напряжение перешло выставленный минимальный порог и реле отключило лампу:

    Датчик напряжения и тока. Исправляем недостатки Imax.

    Работает!

    Теперь сверим показания Imax и прибора на датчике INA219:

    Датчик напряжения и тока. Исправляем недостатки Imax.

    Совпадение очень хорошее!

    Если вместо адаптера com-usb к ардуино подключить модуль OpenLog, то все, что выводилось в компорт, будет складываться в текстовый файл на флешку. Потом этот текстовый файл можно загрузить в Exel и построить график заряда-разряда. Иногда это бывает очень полезно, когда аккумулятор полуживой, то график его зарядки перестает быть ровненькой горкой. Как правило, сначала напряжение взлетает, потом падает, потом снова нарастает, но уже спокойнее. Аккумулятор может начать греться. Так что график — вещь полезная.

    Вот график зарядки аккумулятора от Imax:

    Датчик напряжения и тока. Исправляем недостатки Imax.

    А вот от самоделки:

    Датчик напряжения и тока. Исправляем недостатки Imax.

    Что хочется сказать в заключении:

    Датчик очень неплох, нравится и удобный интерфейс и точность. Хорошо бы ток был побольше, ампер 10 бы. Но это можно сделать и самому, заменив шунт и программно умножая показания на коэффициент.

    Товар предоставлен для написания обзора магазином. Обзор опубликован в соответствии с п.18 Правил сайта.