В этой статье мы рассмотрим подключение датчика уровня заряда LiPo батареи MAX17043 к плате Arduino. Датчик MAX17043/44 можно использовать для измерения процента заряда литий-ионной или литий-полимерной батареи, а также скорости ее зарядки и разрядки. Аккумуляторы LiPo — отличный способ питания ваших проектов. Они маленькие, легкие и обладают довольно хорошей мощностью для своего размера. К сожалению, даже самые лучшие батареи со временем разряжаются.
Большинство обычных методов измерения уровня заряда батареи используют делитель напряжения для понижения напряжения чтобы АЦП (аналого-цифровой преобразователь) мог его считать. Но этот метод не является идеальным методом для измерения процента заряда батареи. Это связано с тем, что напряжение батареи быстро падает в начале, остается очень стабильным в течение длительного времени, а затем внезапно падает низко в конце срока службы. И, во-вторых, напряжение литий-ионных или литий-полимерных батарей не падает линейно.
Вот почему нам нужен точный метод линейного измерения процента заряда батареи. Измеритель заряда LiPo MAX17043 подключает вашу батарею к вашему проекту и использует сложный алгоритм для определения относительного состояния заряда и прямого измерения напряжения батареи A/D. Другими словами, он сообщает вашему микроконтроллеру, сколько «топлива» осталось в батарее. Датчик измерителя заряда LiPo MAX17043 взаимодействует с платой Arduino по интерфейсу I2C и сообщает процент заряда батареи, а предупреждающий контакт также сообщает вам, когда заряд падает ниже определенного процента.
Необходимые компоненты
- Плата Arduino Pro Mini (купить на AliExpress).
- Датчика уровня заряда батареи MAX17043 (купить на AliExpress).
- Модуль зарядного устройства аккумулятора TP4056 (купить на AliExpress).
- Модуль OLED дисплея SSD1306 128×64 с диагональю 0.96 дюйма и интерфейсом I2C (купить на AliExpress).
- Аккумулятор LiPo 3,7 В, 1000 мАч.
- Макетная плата.
- Соединительные провода.
Реклама: ООО "АЛИБАБА.КОМ (РУ)" ИНН: 7703380158
Датчика уровня заряда батареи MAX17043
Литиевые батареи 3,7 В обычно используются во многих проектах. Однако остаточная мощность и напряжение этих батарей крайне нелинейны. Мы можем оценить, полностью ли заряжена батарея или почти разряжена, только по ее напряжению. Отображение напряжения батареи в процентной функции крайне неточно из-за нелинейной разрядки.
Одноэлементный аккумуляторный датчик уровня заряда MAX17043 использует интерфейс I2C для простого сопряжения с микроконтроллерами. Он отличается сверхнизким рабочим током с отслеживанием в реальном времени относительного состояния заряда (SOC) аккумулятора с помощью запатентованного алгоритма Maxim. Это устраняет необходимость в повторном обучении от полного до пустого и ошибках накопления смещения.
Модуль также оснащен функцией прерывания оповещения о низком заряде батареи. Когда заряд батареи падает ниже заданного порога, вывод ALR генерирует падающий импульс для запуска внешнего прерывания контроллера. Вы найдете большую помощь в оценке срока службы батареи, узнав энергопотребление системы с этим модулем. Проверьте MAX17043 Datasheet для более подробной информации по данному датчику.
Особенности микросхемы MAX17043
- Запатентованный алгоритм Maxim
- Точные показания напряжения и оставшегося заряда литиевой батареи.
- Нет процесса повторного обучения заряду-разряду.
- Нет ошибок накопления смещения.
- Широкий диапазон входного напряжения, совместим с контроллерами 3,3 В и 5 В.
- Программируемый порог прерывания оповещения о низком уровне мощности.
- Защита от обратной полярности аккумулятора.
Технические характеристики
- Входное напряжение (VCC): 3,3 В~6,0 В.
- Входное напряжение батареи (BAT IN): 2,5 В~4,2 В.
- Тип батареи: 3,7 В литий-полимерная/литий-ионная батарея.
- Рабочий ток: 50 мкА.
- Точность: ±12,5 мВ.
Приложения
- Смартфоны.
- MP3-плееры.
- Цифровые фотокамеры.
- Системы GPS.
- Робототехника.
Схема проекта
Схема подключения датчика уровня заряда LiPo батареи MAX17043 к плате Arduino представлена на следующем рисунке.
Вместо использования Arduino UNO или Arduino Nano лучше использовать Arduino Pro Mini, поскольку Arduino Pro Mini может работать с более низким напряжением и с литиевыми батареями. Самый популярный модуль датчика уровня заряда MAX17043 производится компанией Sparkfun. Поэтому лучше использовать модуль датчика уровня заряда SparkFun LiPo. Для зарядки батареи модуль зарядки батареи TP4056 является более дешевой и лучшей альтернативой на рынке. Для отображения напряжения и процента батареи нам понадобится какой-нибудь дисплей, например 0,96-дюймовый дисплей SSD1306 I2C OLED. Для тестирования приложений вы можете использовать литий-ионную/полимерную батарею емкостью 500 мАч или 1000 мАч.
Модуль Sparkfun MAX17043 имеет 6 контактов: VCC, GND, SDA, SCL, QST и ALT. Подключите контакты SDA и SCL MAX17043 к контактам Arduino Pro Mini A4 и A5 соответственно. Подключите контакты VCC, GND и ALT MAX17043 к контактам Arduino Pro Mini RAW, GND и D2. Подключите литиевую батарею 3,7 В к разъему батареи модуля Sparkfun MAX17043. На верхней части модуля есть контакты + и – , которые следует подключить к входным контактам TP4056 + и – .
Для отображения состояния батареи мы использовали 0,96-дюймовый I2C OLED-дисплей с драйвером SSD1306 OLED. Подключите контакты SDA и SCL OLED-дисплея к контактам A4 и A5 Arduino Pro Mini. Подключите контакты VCC и GND OLED дисплея к контактам Arduino 3,3 В и GND.
Исходный код программы для взаимодействия MAX17043 с Arduino
Существует несколько библиотек arduino для сопряжения датчика MAX17043 с платой Arduino. Одна из библиотек написана porrey, другая lucadentella, и даже библиотека Sparkfun является популярной.
Но я предпочитаю библиотеку Nlamprian, которую легко использовать, переписывать и модифицировать.
Код также требует две библиотеки для OLED-дисплея. Загрузите библиотеки по следующей ссылке и добавьте их в папку Library Arduino.
1. Библиотека Adafruit GFX: https://github.com/adafruit/Adafruit-GFX-Library
2. Библиотека Adafruit SSD1306: https://github.com/adafruit/Adafruit_SSD1306
Скопируйте следующий код и загрузите его на плату Arduino Pro Mini с помощью преобразователя USB-TTL или любого модуля FTDI. Если у вас Arduino Uno или Arduino Nano, то на них программу можно загрузить через USB кабель.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 |
#include <SPI.h> #include <Wire.h> #include <LiFuelGauge.h> //https://github.com/nlamprian/LiFuelGauge #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h> #define SCREEN_WIDTH 128 // OLED display width, in pixels #define SCREEN_HEIGHT 64 // OLED display height, in pixels #define OLED_RESET 4 // Reset pin # (or -1 if sharing Arduino reset pin) #define SCREEN_ADDRESS 0x3C // 0x3D for 128x64, 0x3C for 128x32 Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); void lowPower(); LiFuelGauge gauge(MAX17043, 0, lowPower); volatile boolean alert = false; void setup() { Serial.begin(9600); // Initializes serial port if (!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) { Serial.println(F("SSD1306 allocation failed")); for (;;); // Don't proceed, loop forever } display.clearDisplay(); // Waits for serial port to connect. Needed for Leonardo only while ( !Serial ) ; gauge.reset(); // Resets MAX17043 delay(200); // Waits for the initial measurements to be made // Sets the Alert Threshold to 10% of full capacity gauge.setAlertThreshold(10); Serial.println(String("Alert Threshold is set to ") + gauge.getAlertThreshold() + '%'); } void loop() { Serial.print("SOC: "); Serial.print(gauge.getSOC()); // Gets the battery's state of charge Serial.print("%, VCELL: "); Serial.print(gauge.getVoltage()); // Gets the battery voltage Serial.println('V'); display.setCursor(0, 10); //oled display display.setTextSize(2); display.setTextColor(WHITE); display.print("SOC:"); display.print(gauge.getSOC()); display.print("%"); display.setCursor(0, 40); //oled display display.setTextSize(2); display.setTextColor(WHITE); display.print("VOL:"); display.print(gauge.getVoltage()); display.print("V"); display.display(); display.clearDisplay(); if ( alert ) { Serial.println("Beware, Low Power!"); Serial.println("Finalizing operations..."); gauge.clearAlertInterrupt(); // Resets the ALRT pin alert = false; Serial.println("Storing data..."); Serial.println("Sending notification..."); Serial.println("System operations are halted..."); gauge.sleep(); // Forces the MAX17043 into sleep mode while ( true ) ; } delay(2000); } void lowPower() { alert = true; } |
Тестирование работы проекта
После загрузки кода на плату Arduino Pro Mini на OLED-дисплее начнет отображаться напряжение батареи и уровень заряда в процентах.
Также откройте последовательный монитор, чтобы проверить напряжение и состояние батареи, если у вас нет OLED-дисплея.
После непрерывного использования литиевая батарея может разрядиться. В этом случае вы можете подключить кабель micro-USB к порту зарядки TP4056, чтобы зарядить батарею.
В большинстве литий-ионных аккумуляторов максимальное напряжение аккумулятора составляет 4,2 В. Чтобы достичь 100% заряда, необходимо зарядить аккумулятор до 4,2 В. Зарядка аккумулятора замедляется после того, как аккумулятор пересечет 4,0 В.
При критическом уровне заряда батареи происходит автоматическое отключение всех функций системы. Пороговое напряжение установлено в коде на уровне 10%. Вы можете изменить его на еще более низкое или высокое.
OLED по-прежнему будет показывать напряжение батареи и SOC в процентах. Но когда вы проверите Serial Monitor, вы получите гораздо больше информации.
Библиотеки и пояснения к кодированию
Ниже приведен список открытого интерфейса класса LiFuelGauge.
- LiFuelGauge(gaugeType ic); Создает экземпляр LiFuelGauge. Принимает в качестве аргумента тип IC. Либо MAX17043, либо MAX17044.
- LiFuelGauge(gaugeType ic, uint8_t intr, func f); То же, что и выше. Также присоединяет пользовательскую функцию f к прерыванию номер intr. Эти аргументы связаны с прерыванием ALRT. Функция f не должна принимать аргументов и возвращать значения.
- double getVoltage(); Возвращает измерение напряжения батареи. MAX17043: 0-5 В с разрешением 1,25 мВ. MAX17044: 0-10 В с разрешением 2,5 мВ.
- double getSOC(); Возвращает состояние заряда батареи в процентах от полной емкости. Разрешение 1/256%
- uint16_t getVersion(); Возвращает версию производства IC
- uint8_t getCompensation(); Возвращает значение, используемое для оптимизации производительности ИС для различных условий эксплуатации
- uint8_t getAlertThreshold(); Возвращает пороговое значение оповещения в процентах, ниже которого генерируется прерывание оповещения
- uint8_t setCompensation(uint8_t comp); Устанавливает значение, полезное для оптимизации производительности ИС для различных условий эксплуатации
- uint8_t setAlertThreshold(uint8_t thrd); Устанавливает пороговое значение оповещения, ниже которого генерируется прерывание оповещения. Допустимый диапазон: 1-32%. Пороговое значение по умолчанию: 4%.
- uint8_t clearAlertInterrupt(); После генерации прерывания оповещения сбрасывает прерывание. Никакое прерывание не будет сгенерировано повторно, пока SOC батареи не поднимется выше порога оповещения, а затем снова не опустится ниже него.
- uint8_t sleep(); Переводит микросхему в спящий режим. Все операции останавливаются.
- uint8_t wake(); Выводит ИС из спящего режима
- boolean sleeping(); Возвращает, находится ли микросхема в спящем режиме
- uint8_t quickStart(); Заставляет ИС перезапустить расчеты указателя уровня топлива
- uint8_t reset(); Заставляет микросхему полностью сбросить настройки