Сегодня на нашем операционном столе очередное гениальное изобретение компании ClimateGuard — девайс под не менее гениальным названием CG Charger BQ. Расшифровке того, что же всё-таки скрывается под этими загадочными буквами BQ (что означают буквы CG постоянные читатели моего блога уже знают) и посвящена эта статья.

Перед нами умная зарядка для аккумулятора и модуль питания для различных DIY устройств с возможностью микроконтроллерного управления по интерфейсу I2C. Это формальное определение назначения этого модуля, но после ознакомления с даташитом BQ25895 и экспериментов с самим модулем я могу сказать, что это невероятно продвинутая микросхема управления питанием, которая при соответствующем подходе сможет удовлетворить любые ваши прихоти по обеспечению питанием ваших гаджетов.

Правда для осмысленной работы с BQ25895 вам понадобятся пара высших образований в Computer Science (смайл) и… эта статья...

Немного теории


Перед тем, как переходить к знакомству с самим модулем CG Charger BQ, нужно сказать несколько слов о сердце этого модуля — микросхеме BQ25895. Как я уже заметил, это невероятно продвинутая микросхема с даташитом на 60+ страниц, множеством параметров и взаимозависимых режимов работы различных подсистем. Фактически это такой микроконтроллерный комбайн, который предназначен для связи источника питания (простого или с поддержкой протоколов быстрой зарядки), аккумуляторной батареи (ток заряда до 5А) и нагрузки в виде питания самого вашего гаджета и управляемой силовой линии 5В/3А для зарядки внешних устройств.

В целом, это можно назвать ультимативным решением для менеджмента и дистрибуции питания в системе из сетевого источника, аккумулятора, питаемого устройства (устройств). Изюминка в данном случае заключается в том, что микросхема BQ25895 является полностью программируемой и управляемой по интерфейсу I2C и вы, как системный программист, можете делать с ней всё, что угодно и реализовывать сколь угодно прихотливые сценарии энергораспределения в вашей системе.

Разумеется, столь замечательный чип как BQ25895 не мог пройти мимо профессиональных разработчиков электроники и решения на его основе применяются в современных смартфонах, блоках питания, видеокамерах, пауэрбанках, бесперебойниках, солнечных зарядках и прочих устройствах и гаджетах.

Обратной стороной этого праздника жизни является сложность. BQ25895 имеет множество подсистем, настроек и режимов работы и разобраться во всём этом не так просто. Ниже представлена максимально упрощённая блок-схема работы BQ25895.



Здесь наглядно видно, что чип BQ25895 является «распределяющим хабом» питающего и зарядного напряжения (тока) между сетевым источником питания (POWER), аккумулятором (BATTERY) и нагрузкой (LOAD). А вот логику этого распределения и режимы работы можно программировать при помощи микроконтроллера (MCU) с интерфейсом I2C.

Характеристики


Ниже представлены основные характеристики BQ25895, которые дают хорошее представление о том, с чем мы имеем дело. Это далеко не полный перечень характеристик — для перечисления всех нужно было бы переписать тут весь даташит.

  • Диапазон входных напряжений: 3,9–14В
  • Ограничение тока по входу: 100мА–3,25А
  • Автоматическое определение USB SDP, CDP, DCP и нестандартных адаптеров
  • Определение максимальной входной мощности без перегрузки адаптера
  • Преобразователь с зарядным током до 5А
  • КПД преобразователя: 91–93%
  • Boost Mode с регулируемым напряжением 4,5–5,5В (ток до 3,1А)
  • Интегрированный АЦП для мониторинга напряжений, токов и температур
  • Управление распределением мощности VDC, Narrow VDC (NVDC)
  • Поддержка режимов Ship Mode (поставка/хранение), Wake Up и Full System Reset
  • Автономный режим и режим управления по I2C
  • Точность регулировки напряжения заряда: ±0.5%
  • Точность регулировки тока заряда батареи: ±5%
  • Точность регулировки входного тока: ±7.5%
  • Встроенный датчик температуры чипа (с подсистемой реагирования)
  • Подключение внешнего термодатчика для аккумулятора
  • Режим Watchdog

Вышеприведённое краткое перечисление характеристик BQ25895 только подтверждает тезис о том, что при помощи этого чипа вы можете реализовать любой каприз по энергопитанию своего DIY гаджета.

Немного подробнее


Теперь немного углубимся в богатый внутренний мир BQ25895 и тут прежде всего нужно сказать, что у этой микросхемы есть два режима работы — автоматический и «ручного управления» по I2C.

Автоматический режим (Default Mode). BQ25895 может работать полностью автономно, без какого-либо управления по I2C. В этом случае микросхема устанавливает набор настроек по умолчанию и применяет для работы стандартные (определённые производителем) алгоритмы взаимодействия между своими подсистемами.

Также BQ25895 имеет встроенный (и настраиваемый) Watchdog, который постоянно мониторит активность I2C интерфейса и в случае неактивности в течение определённого времени сбрасывает микросхему в автоматический режим работы.

Режим «ручного управления» (Host Mode). Как только по интерфейсу I2C приходит команда управления, BQ25895 переходит в режим Host Mode, когда программист (алгоритм в MCU) может управлять работой BQ25895 и как угодно её настраивать.

Конкретные значения настроек и алгоритмов в автоматическом режиме можно посмотреть в даташите. Если коротко — это типовые базовые «безопасные» настройки для обслуживания нагрузки при питании от сети и подключённом аккумуляторе.

Ниже представлена немного более подробная схема подключения основной периферии к BQ25895.



Здесь:

Input (VBUS) — входное питание от адаптера или USB с поддержкой протоколов быстрой зарядки 3,9-14 В (3 А).

Host — управляющий MCU с интерфейсом I2C и несколькими управляющими GPIO (наш контроллер).

OTG — линия для зарядки внешних устройств 5В, 3,1 А (например, телефонов или планшетов).

SYS — линия для питания собственно нашего девайса (настраиваемые 3,5-4,5 В)

BAT — линия зарядки подключённого аккумулятора с максимальным током до 5 А.

TS — контакт для подключения внешнего термодатчика (для контроля температуры заряжаемого аккумулятора).

Режимы работы


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

Если кратко, то BQ25895 (динамически или по программе) проверяет и тестирует входную линию VBUS и определяет тип и качество подключённого питающего адаптера и его возможности по поддержке протоколов быстрой зарядки.

Одновременно BQ25895 контролирует состояние подключённого аккумулятора и его «фазовое состояние» во время зарядки.

Также BQ25895 контролирует состояние своих выходных линий.

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

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

Для того, чтобы читатель не «поплыл» и окончательно не потерял нить повествования, на этом мы с теоретической частью закончим и перейдём непосредственно к герою нашего повествования — CG Charger BQ.

CG Charger BQ


Теперь переходим к рассмотрению творения компании ClimateGuard — «модулю бесперебойного питания CG Charger BQ v1.0», основанного как раз на микросхеме BQ25895(M). По старой доброй традиции, для CG Charger BQ в открытом доступе отсутствует принципиальная схема, поэтому все свои выводы и предположения нам придётся делать основываясь на партизанских методах, разглядывая модуль при помощи лупы, и тыкая в него щупами тестера.

Примечание. Насколько я понял, компания ClimateGuard сама пока не очень разобралась с тем, какую микросхему (BQ25895 или BQ25895M) запаивать в свои девайсы. В моём распоряжении имеется плата с установленным чипом BQ25895M, но это что-то вроде технологической ошибки и в дальнейшем ClimateGuard планирует устанавливать на платы микросхемы BQ25895 (но это не точно — лучше об этом справиться в самой компании ClimateGuard).



На обратной стороне платы радует монументальная маркировка внешних контактов — ошибиться и что-то спалить тут решительно невозможно (однозначно плюс).



Сам производитель презентует CG Charger BQ следующим образом:

«CG_bq — универсальная плата контролер питания для автономных высоконагруженных встраиваемых систем. Плата обеспечивает бесперебойную подачу питания от сети или аккумулятора.»

Ок, читаем дальше:
  • Используемая микросхема Texas Instruments BQ25895
  • Поддержка литий-ионных аккумуляторов 1S (3.7В)
  • Максимальный ток заряда аккумулятора – 5А
  • Наличие постоянно включенного выхода 3.3В – 500 мА
  • Наличие управляемого выхода 5В – 3А
  • Ток потребления в режиме покоя с включенной линией 5В – 1500 мкА
  • Ток потребления в режиме покоя с выключенной линией 5В – 30 мкА
  • Наличие I2C интерфейса для управления процессом заряда и питания
  • Защита аккумулятора от переразряда
  • Защита аккумулятора от переполюсовки
  • Наличие USB-C разъема
  • Расположение выходных разъемов совместимо с макетными платами
  • Компактные размеры – 19*22 мм

Неплохо, но поскольку мы заранее подготовились и стали (пока несертифицированными) но уже специалистами по BQ25895, то у нас возникает несколько вопросов.

Вывод INT


Микросхема BQ25895 ведёт очень бурную жизнь и внутри неё постоянно возникает множество событий (например, изменение режимов различных подсистем и т. п.), которые требуют немедленного реагирования со стороны управляющего MCU. Постоянно опрашивать BQ25895 со стороны контроллера на предмет «а не произошло ли какое-то важное событие?», как вы сами понимаете, совершенно не комильфо.

На этот случай инженерами Texas Instruments (которые, определённо, знают своё дело и не зря едят свой хлеб) предусмотрен пин INT, который на плате CG Charger BQ… просто никуда не выведен и недоступен нам, что, мягко говоря, очень прискорбно.

Получается, что поуправлять режимами работы CG Charger BQ по интерфейсу I2C мы сможем, но сделать это полноценно и «по уму» у нас это без вывода INT не получится.



Выводы OTG и /CE


На плате CG Charger BQ также отсутствуют внешние выводы для подключения к микроконтроллеру OTG (разрешение Boost Mode) и /CE (разрешения зарядки, Charge Enable). Я пока не успел проверить, но скорее всего они «наглухо» установлены в разрешающее состояние, что принудительно ограничивает нашу свободу управления CG Charger BQ со стороны микроконтроллера.

Вывод TS


Как я уже отметил выше, у BQ25895 есть специальный вывод для подключения термодатчика контроля температуры заряжаемого аккумулятора. А вот у платы CG Charger BQ этот вывод отсутствует для подключения, что лишает нас удовольствия полностью безопасно заряжать аккумулятор.

В случае практического применения CG Charger BQ можно озаботиться и как-то подпаяться к выводам TS и REGN чипа BQ25895 (и навесить соответствующую обвязку), но лучше было бы, конечно, если бы производитель платы предусмотрел соответствующие контакты в разъёме на плате.

Вывод 3V3


Ну и ещё из замеченного по плате CG Charger BQ (напомню, что схема нам недоступна), судя по всему, производитель просто «навесил» линейный стабилизатор 3,3 В на выходную линию SYS и вывел на разъём пин «3V3».

Программирование


Ок, с теорией мы более-менее разобрались, но как программировать это чудо техники? С какой стороны, собственно, надо подходить к BQ25895, чтобы запрограммировать её работу через интерфейс I2C?

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

Еще по поводу библиотеки bq2589x я могу заметить, что написана она, несомненно, грамотным специалистом, но почти полностью лишена комментариев и какой-либо систематизации, поэтому нам обо всём придётся догадываться самостоятельно (зато альцгеймер нам не будет страшен). Я, в свою очередь, постараюсь в этой статье в какой-то степени компенсировать этот недостаток.

Итак, чтобы грамотно (и в своих интересах) запрограммировать работу BQ25895, нужно понимать две основные вещи: назначение и смысл хранящихся в регистрах BQ25895 данных (настроек) и алгоритмику работы и взаимодействия между собой различных подсистем BQ25895.

Всего BQ25895 содержит 14 (HEX) 8-битных регистров, назначение и смысл хранимых в которых данных можно узнать из даташита. Алгоритмика работы BQ25895 также достаточно ясно описана в даташите. Всё это можно было бы перевести и прокомментировать, но это явно выходит за рамки одной статьи. Поэтому здесь я сосредоточусь на практических примерах программирования BQ25895 при помощи вышеозначенной библиотеки.

Собираем стенд


Для экспериментов соберём небольшой, но очень функциональный (смайл) стенд. В качестве управляющего контроллера будем использовать первую попавшуюся под руки плату (первой под руки попалась плата WeMos D1 mini на ESP8266). Разумеется, вместо ESP8266 можно было бы использовать любой другой микроконтроллер.
  • Плата CG Charger BQ
  • WeMos D1 mini (ESP8266)
  • Аккумулятор 18650 3,7В 4000(1500) мАч
  • Зарядка Baseus GaN5 Pro Fast Changer
  • USB тестер Fnirsi FNB58
  • Электронная нагрузка DL24
  • Тестер UNI-T UT61E+



Общий принцип такой: подключаем к компьютеру ESP8266 и отслеживаем в Serial мониторе всю активность и все диагностические сообщения системы. Одновременно мы можем проводить различные эксперименты по подаче питания, его отключению, увеличению и уменьшению нагрузки, изменению настроек BQ25895 и т. д.



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

Приводим библиотеку bq2589x в порядок


Библиотека bq2589x совершенно не документирована и не систематизирована — там просто все функции накиданы в кучу без каких-либо комментариев. А учитывая, что BQ25895 — это довольно сложное устройство с развесистым даташитом, то разобраться во всём этом очень непросто.

Ниже я представляю (отсортированный по назначению) список функций библиотека bq2589x с осмысленными комментариями, из которых можно понять что же эти функции делают.

// BQ2589X
// -------------------------------------------------

bq2589x(args);
~bq2589x();

int begin();
int begin(TwoWire *theWire);
int begin(uint8_t addr);
int begin(uint8_t addr, TwoWire *theWire);

int init_device();
int detect_device(bq2589x_part_no *part_no, int *revision); // REG14 BQ25890=0x03, BQ25892=0x00, BQ25895 = 0x07

int reset_chip();              // REG14 Register Reset, сброс регистров
int enter_ship_mode();         // REG09 BATFET OFF управление ключом батареи для транспортировки устройства

// READ/WRITE
// -------------------------------------------------

int read_byte(uint8_t *data, uint8_t reg);
int write_byte(uint8_t reg, uint8_t data);
int update_bits(uint8_t reg, uint8_t mask, uint8_t data);

// WATCHDOG
// -------------------------------------------------

int set_watchdog_timer(uint8_t timeout); // REG07 настройка сторожевого таймера 00:запрет, 01:40сек*, 10:80сек, 11:160сек
int disable_watchdog_timer();            // REG07
int reset_watchdog_timer();              // REG03 сброс сторожевого таймера 0*:нормальный режим, 1:сброс (возврат счетчика таймера к 0 после сброса)

// ADC
// -------------------------------------------------

int adc_start(bool oneshot);   // REG02 управление запуском преобразования АЦП, по умолчанию не активно
int adc_stop();
int adc_read_battery_volt();   // REG0E VBAT напряжение батареи от 2.304V* (0000000) до 4.848V (1111111)
int adc_read_sys_volt();       // REG0F VSYS напряжение питания системы от 2.304V* (0000000) до 4.848V (1111111)
int adc_read_vbus_volt();      // REG11 VBUS от 2.6V* (0000000) до 15.3V (1111111)
int adc_read_temperature();    // REG10 TS напряжения термодатчика в процентах от REGN. От 21% *(0000000) до 80% (1111111)
int adc_read_charge_current(); // REG12 IBAT ток зарядки (когда VBAT>VBATSHORT) от 0mA* (0000000) до 6350mA (1111111)

// VBUS
// -------------------------------------------------

bq2589x_vbus_type get_vbus_type(); // REG0B Регистр статуса VBUS 000:No (источник не подключен), 001:USB Host SDP, 010: CDP(1.5A), 011: DCP(3.25A), 100:AHVD (MaxCharge)(1.5A), 101:неизвестный (500mA),110:нестандартный (1A/2A/2.1A/2.4A), 111:OTG

// Cостояниt высокого сопротивления (HIZ)
int enter_hiz_mode();                  // REG00 режим HIZ 0:запрещено 1:разрешено
int exit_hiz_mode();
int get_hiz_mode(uint8_t *state);

// Input Current Optimizer (ICO), определение точки максимальной мощности входного источника без его перегрузки
int enable_ico(bool enable);           // REG02 разрешение оптимизатора входного тока
int force_ico();                       // REG09 принудительный запуск оптимизатора входного тока 
int check_force_ico_done();            // REG14 ICO work/done

int force_dpdm();                      // REG02 принудительный запуск детектирования D+/D-
int enable_auto_dpdm(bool enable);     // REG02 Automatic D+/D- Detection Enable, разрешение автоматического детектирования D+/D-

int use_absolute_vindpm(bool enable);  // REG0D REG13 Установка предела входного напряжения
int set_vindpm_offset(int offset);     // REG01 VINDPM_OS смещение предела входного напряжения. 600mV* (00110). От 0mV до 3100mV. Минимальный порог VINDPM 3.9V, максимальный порог 15.3V
int set_input_volt_limit(int volt);    // REG0D Absolute VINDPM Threshold Offset, абсолютное смещение порога VINDPM 2.6V

int read_idpm_limit();                 // REG13 Dynamic Power Management current limit. Ограничение входного тока при включенном ICO. От 100mA* (0000000) до 3.25A (1111111)
int set_input_current_limit(int curr); // REG00 Разрешить ножку ILIM

// Генерации протокола импульса тока VBUS, чтобы обмениваться данными с AHVA
int pumpx_enable(int enable);          // REG04 Current pulse control Enable, разрешение управления импульсом тока
int pumpx_increase_volt();             // REG09 разрешение управления импульсом тока для повышения напряжения
int pumpx_increase_volt_done();        // REG09 PUMPX_UP work/done
int pumpx_decrease_volt();             // REG09 разрешение управление импульсом тока для понижения напряжения
int pumpx_decrease_volt_done();        // REG09 PUMPX_DN work/done
    
// OTG/BOOST
// -------------------------------------------------

int enable_otg();                 // REG03 Boost (OTG) Mode Configuration 0:OTG запрещен, 1*:OTG разрешен 
int disable_otg();                // REG03 Boost (OTG) off
void bq2589x_set_otg(int enable); // OTG on/off
int set_otg_volt(uint16_t volt);  // REG0A BOOSTV смещение напряжения режима повышения напряжения. От 4.55V до 5.51V, по умолчанию 5.126V (1001)
int set_otg_current(int curr);    // REG0A 500, 700, 1100, 1600, 1800, 2100, 2400, 1300*mA (REG00 IINLIM)

// CHARGE
// -------------------------------------------------

int enable_charger();             // REG03 разрешения зарядки. 0:запрещена, 1*:разрешена
int disable_charger();            // REG03 запрещение зарядки
int set_charge_current(int curr); // REG04 предел тока быстрой зарядки от 0mA (0000000) до 5056mA (1001111). 2048mA* (0100000)
int set_term_current(int curr);   // REG05 предел тока завершения зарядки от 64mA до 1024mA. По умолчанию 256mA (0011)
int set_prechg_current(int curr); // REG05 IPRECHG смещение предела тока предварительной зарядки от 64mA до 1024mA. 128mA* (0001).
int set_chargevoltage(int volt);  // REG06 смещение предела напряжения зарядки от 3.840V (000000) до 4.608V (110000). 4.208V* (010111)
int get_charging_status();        // REG0B Статус зарядки. 00: нет, 01: Pre-charge (< VBATLOWV), 10: Fast быстрая зарядка, 11: Done, зарядка завершена.
int enable_term(bool enable);     // REG07 Charging Termination Enable, разрешение завершения зарядки
bool is_charge_done();            // REG0B Зарядка завершена
int enable_max_charge(bool enable); // REG02 разрешение детектирования адаптера MaxCharge, разрешение работы протокола DCP

Ок, переходим к практическим экспериментам с CG Charger BQ и BQ25895 и посмотрим как мы сможем применить на практике все полученные знания.

Базовый скетч


Начнём мы с простого, чтобы удостовериться, что вся эта система работает и может взаимодействовать с управляющим контроллером (ESP8266) — попробуем получить от микросхемы её тип и ревизию.

/*
  BQ25895(M) info test
*/

#include <bq2589x.h>
#include <Wire.h>

bq2589x mycharger;

void setup() {
  Serial.begin(115200);
  Serial.println();
  Serial.println(F("Start BQ25895(M) info test..."));
  
  Wire.begin();
  mycharger.begin(&Wire);

  bq2589x_part_no part;
  int rev = 0;
  
  mycharger.detect_device(&part, &rev);
  
  Serial.print(F("Part: ")); Serial.println(partNo(part));
  Serial.print(F("Revision: ")); Serial.println(rev);
}

String partNo(byte pn) {
  String s = "?";
    switch (pn) {
      case 0: s = "BQ25892"; break;
      case 3: s = "BQ25890"; break;
      case 7: s = "BQ25895"; break;
    }
  return s;
}

void loop() {
 
}

Ок, в принципе система работает, значит можем далее проводить эксперименты.



Данные о напряжении (ADC)


Теперь попробуем получить информацию об уровне напряжения на основных линиях модуля питания (VBUS, BAT, SYS).

/*
  BQ25895(M) ADC test
*/

#include <bq2589x.h>
#include <Wire.h>

bq2589x mycharger;

void setup() {
  Serial.begin(115200);
  Serial.println();
  Serial.println(F("Start BQ25895(M) ADC test..."));
  
  Wire.begin();
  mycharger.begin(&Wire);
  delay(10);
   
  mycharger.adc_start(false);

  Serial.print(F("VBUS: ")); Serial.println(mycharger.adc_read_vbus_volt());
  Serial.print(F("BAT: "));  Serial.println(mycharger.adc_read_battery_volt());
  Serial.print(F("SYS: "));  Serial.println(mycharger.adc_read_sys_volt());
  Serial.print(F("TS: "));  Serial.println(mycharger.adc_read_temperature());
}

void loop() {

}

И это тоже работает. Здесь цифры 5100 на линии VBUS означают напряжение 5,1 В.



Продвинутый пример


Теперь давайте создадим несколько более продвинутый пример работы с BQ25895. Попробуем повзаимодействовать с модулем питания в динамике и посмотреть как он реагирует на внешние воздействия.

/*
  BQ25895(M) dynamic test
*/

#include <bq2589x.h>
#include <Wire.h>

unsigned long last_change = 0;
unsigned long now = 0;

bq2589x mycharger;

void setup() {
  Serial.begin(115200);
  Serial.println();
  Serial.println(F("Start BQ25895(M) dynamic test..."));
  
  Wire.begin();
  mycharger.begin(&Wire);
  delay(10);
}

String vbusType() {
  String s = "?";
    switch (mycharger.get_vbus_type()) {
      case 0: s = "NONE";       break;
      case 1: s = "USB_SDP";    break;
      case 2: s = "CDP(1,5A)";  break;
      case 3: s = "DCP(3,25A)"; break;
      case 4: s = "MAXC";       break;
      case 5: s = "UNKNOWN";    break;
      case 6: s = "NONSTAND";   break;
      case 7: s = "OTG";        break;
    }
  return s;
}

void loop() {
  now = millis();

  if (now - last_change > 5000) {
    last_change = now;

    mycharger.reset_watchdog_timer();

    mycharger.adc_start(false);
    delay(10);

    Serial.print(F(" TYPE:")); Serial.print(vbusType());
    Serial.print(F(" VBUS:")); Serial.print(mycharger.adc_read_vbus_volt());
    Serial.print(F(" BAT:"));  Serial.print(mycharger.adc_read_battery_volt());
    Serial.print(F(" SYS:"));  Serial.print(mycharger.adc_read_sys_volt());
    Serial.print(F(" TS:"));  Serial.print(mycharger.adc_read_temperature());

    Serial.print(F(" Charging:"));
    switch (mycharger.get_charging_status()) {
      case 0: Serial.print(F("Not"));  break;
      case 1: Serial.print(F("Pre"));  break;
      case 2: Serial.print(F("Fast")); break;
      case 3: Serial.print(F("Done")); break;
    }
    
    Serial.print(F(" ChargerCurrent:"));  Serial.print(mycharger.adc_read_charge_current());
    Serial.print(F(" IdmpLimit:"));       Serial.print(mycharger.read_idpm_limit());
    Serial.println();
  }
}

Ниже представлен отчёт о реагировании BQ25895 на динамические воздействия и изменение состояния входных и выходных линий. (Нужно понимать, что это реакция при текущих настройках — вся прелесть BQ25895 заключается в том, что мы можем как угодно её программировать.)



Здесь:

1. Исходное состояние. Подключён адаптер питания Baseus GaN5 Pro Fast Changer и аккумулятор 18650 3,7В 4000(1500) мАч. Микросхема определяет входной источник (DCP) и выставляет остальные параметры в соответствии со своими настройками (которые мы можем в той или иной степени изменять при желании).

2. Отключаем адаптер питания. Отключаем адаптер питания и в системе остаётся один источник энергии — аккумулятор 18650 3,7В 4000(1500) мАч. Микросхема переходит в режим OTG и выставляет остальные параметры в соответствии со своими настройками.

3. Нагрузка 1 А. При помощи электронной нагрузки DL24 создаём ток потребления по линии 5 В в 1 А (система питается от одного аккумулятора).

4. Адаптер и нагрузка. Снова подключаем адаптер питания Baseus GaN5 Pro Fast Changer, не снимая нагрузки в 1 А по линии 5 В.

Итого


Что тут можно сказать? Если вам нужен управляемый модуль питания для вашего гаджета, то BQ25895 — это то устройство, которое сможет удовлетворить любую вашу прихоть в этом отношении. Что же касается CG Charger BQ, то если компания ClimateGuard в следующих ревизиях этого модуля сделает доступными нам пины INT, OTG, /CE и TS, то его то мы и будем использовать в своих проектах.



Возможно, захочется почитать и это:


Комментарии (38)


  1. Breathe_the_pressure
    07.01.2024 11:14

    Сорян за базовый вопрос, а написали бы как эту библиотеку вкрячить в Ардуино ИДЕ? А то там миллион папок у них после установки.


    1. smart_alex Автор
      07.01.2024 11:14

      Это стандартная операция, по подключению библиотеки, которая описана в интернете сотни раз - просто погуглите (делается через Менеджер библиотек или вручную).


  1. NutsUnderline
    07.01.2024 11:14
    +3

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

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


    1. smart_alex Автор
      07.01.2024 11:14

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


  1. Dynasaur
    07.01.2024 11:14

    5 АМПЕР? Вот через эти слаботочные контактики? Как?


    1. Yuri0128
      07.01.2024 11:14
      +1

      Не знаю. А вдруг не сгорит.. сразу. Макс ток для такого контакта 3А.


  1. Dynasaur
    07.01.2024 11:14
    +1

    Я думаю, со временем кто-то напишет конфигуратор этой платки - берёшь, впаиваешь платку в девайс, подключаешься к ней по usb и в конфигураторе галочками выбираешь все параметры. И не надо двух образований в CS, а достаточно только одного :-)))


    1. arheops
      07.01.2024 11:14

      ... но это одно - embeded


    1. Yuri0128
      07.01.2024 11:14

      CP2112 в помощь. Но программу на комп придется самому написать.


  1. Dynasaur
    07.01.2024 11:14
    +1

    • Поддержка литий-ионных аккумуляторов 1S (3.7В)

    • Преобразователь с зарядным током до 5А

    • КПД преобразователя: 91–93%

    • Boost Mode с регулируемым напряжением 4,5–5,5В (ток до 3,1А)

    не такая уж она и универсальная - только для li-ion 1S, что в девайсах встречается не так часто. А если надо 2S, 3s, 4s, 10s2p - что гораздо чаще - то и всё. Заряжать одну банку током 5А - перебор. Там 1А за глаза.


    1. Yuri0128
      07.01.2024 11:14
      +1

      Я думаю, что больше 50% всех маломощных устройств на литии - на 1s. Одних только телефонов куча......туча....


    1. OldFashionedEngineer
      07.01.2024 11:14
      +1

      Прикупил на алике пару литиевых Акимов в формате шоколадки. Спокойно заряжаются током 3 А. Если две параллелить, 6А зарядка нужна. Как раз на bq чипе мастерю


  1. okhsunrog
    07.01.2024 11:14
    +1

    Есть ещё неплохой аналог - IP5209, эта микруха по I2C ещё и State of Charge умеет отдавать


    1. smart_alex Автор
      07.01.2024 11:14

      У меня есть ещё платка CG Charger IP на IP5306, так что, возможно, будет статья и о ней.


      1. sim2q
        07.01.2024 11:14

        У IP530x,510x,520x,5219,5318 проблема, что ток зарядки фиксированный, пробовал от отчаяния ставить резистор на вход (мне нужно было заряжать очень мелкую батарейку), но корректно зарядка так и не заработала


    1. Astroscope
      07.01.2024 11:14

      Есть ещё неплохой аналог

      А что посоветуете сильно попроще для самоделок, чтобы с одной стороны что-то, с другой 5V0 и/или 3V3 для устройств типа Arduino/ESP32/STM32 с минимальным (по току) обвесом, а с третьей - какая-то LiIon батарея, которой более 2A точно не понадобится?


      1. okhsunrog
        07.01.2024 11:14
        +6

        Собирал недавно схему питания для простенького проекта на IP5305. Элементарный чип, минимальная обвязка, конфигурация с помощью резисторов. Уровень заряда может через светодиоды сообщать, можно подключать от 1 до 4 светодиодов. Всего 1 дроссель, через него и понижает напряжение для зарядки Li-Ion, и повышает до 5в для питания микроконтроллера. Есть возможность подключения кнопки питания, с помощью которой включается/выключается повышайка. В выключенном состоянии потребление минимальное. Защита от кз присутствует, и не только, можно глянуть в даташите подробнее. Понижайку до 3.3в можно сделать с помощью любого линейного регулятора, тот же AMS1117-3.3, мониторинг напряжения на аккумуляторе - делитель напряжения + ЦАП, встроенный в микроконтроллер. Да, будет чуть подсаживать аккумулятор, но если там около 100кОм в делителе - то не особо критично. Либо просто по светодиодам, котороые подцепить к микрухе. Схема выходит простейшая, можно развести на одном слое и сделать плату хоть лутом/фоторезистом, что я и проделывал. Идеально для простых самоделок. Но если что-то посложнее - я бы уже искал контроллер питания с I2C, чтобы был поумнее.

        Фото простой электронной открытки с IP5305 (фоторезист)
        Криво, косо, в лучших традициях "успеть сделать за ночь"
        Криво, косо, в лучших традициях "успеть сделать за ночь"


        1. smart_alex Автор
          07.01.2024 11:14

          Стильный девайс у вас получился :) мне нравится.


        1. Astroscope
          07.01.2024 11:14

          Плюс и спасибо!


        1. sim2q
          07.01.2024 11:14

          Как вы решили проблему зарядки током в 1А (для 5305) для такой крохотной батарейки?
          ps предполагаю, что положились на ограничение тока в самом USB...
          делал зарядку для тестера, корректно победить не смог


          1. okhsunrog
            07.01.2024 11:14

            Зарядный ток получается чуть больше 1С (емкость аккумулятора 850 мАч), 1А там вполне допустим, слегка больше рекомендуемого 1С. Не ограничиваю источником тока. Нагрева аккумулятора при зарядке замечено не было. Увы, конкретно в этом чипе регулировка зарядного тока не предусмотрена.


  1. ciuafm
    07.01.2024 11:14

    Для DIY не особо нравится. Я бы хотел модуль USB-C 5-12 v который заряжает буферную батарею 1S-4S в любой комбинации и отдает от 1.8 до 9.0 вольт от батареи или если есть питание - от usb. Настройка lvUart или i2c желательно 1.8/3.3/5.0, вывод тока зарядки, ёмкости батареи, тока и напряжения нагрузки туда же. Внешние ключи, зарядка до 25w, нагрузка хотя бы 20w. И мне кажется он обойдется не сильно дороже чем плата управления современного павербанка.


    1. NekitGeek
      07.01.2024 11:14

      Ещё пару лет назад думал о плате зарядки для 1-4s аккумов с повышающе-понижающим преобразователем, поддержкой протоколов быстрой зарядки и настройкой тока. Пока что настолько универсальных решений нет, хотя некоторые сподвижки в этом направлении есть.


      1. HMNemo
        07.01.2024 11:14

        Я не только думал о таком, я прототип собрал. 15 Вт в любую сторону от 5В до 24В. До 1S-5S, любого типа: Li-ion, Li-pol, LiFePO4 и т.д. Активная балансировка. Это был январь 2022, микросхемы от TI, доставка с Digi-Key. Короче не взлетела разработка.


      1. BigBeaver
        07.01.2024 11:14

        Лет много назад делал схему, которая при подключении usb перекоммутирует 3S сборку из последовательной в параллельную. Полностью аналогово.


  1. vagon333
    07.01.2024 11:14

    А насколько разумно объединять несколько независимых пар (18650-BQ25895) последовательно и параллельно?
    Т.е. каждой 18650 по отдельному контроллеру.


    1. Yuri0128
      07.01.2024 11:14

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

      Последовательно? А зачем - тогда уж проще что-нить более адекватное ибо невыгодно схемотехнически выходит.


  1. max_house
    07.01.2024 11:14
    +5

    Дружище, спасибо за критику! У нас как раз заканчивается первая версия платок bq. Добавим доступность выходов. Мы ее сделали сначала для внутренних проектов и там эти выводы не использовали) честно говоря даже в голову не пришло они будут кому то нужны, соре, исправим!). Делали платку которая и заряжает и выдать может прилично, и питание 5в и 3.3 сразу чистое, более менее, (таких модулей не видел в продаже, обычно надо гирлянду фильтров городить или преобразователь 3.3 ставить отдельно, причем не всегда есть возможность энергоэффективный поставить ldo) поэтому и подёргал компанию выпустить.


    1. smart_alex Автор
      07.01.2024 11:14
      +1

      Вот и производитель подтянулся - можно задавать вопросы напрямую.


    1. smart_alex Автор
      07.01.2024 11:14

      Пожелания для новой версии: сделайте маленький разъём для подключения к управляющему MCU где-нибудь сбоку, а сами питающие контакты сделайте помощнее. Можно сделать отдельный разъем для подключения термодатчика.


    1. smart_alex Автор
      07.01.2024 11:14
      +2

      И ещё пожелание: не забывайте про поддержку ваших продуктов. Выпустили железку - выпустите актуальный качественный даташит и снабдите своё изделие туториалами, библиотеками и примерами кода.


    1. smart_alex Автор
      07.01.2024 11:14
      +3

      И по поводу засекречивания схем - "срисовать" любое ваше изделие можно за один день - скрывать схемы не имеет никакого смысла и только сокращает количество ваших клиентов и вашу прибыль.

      Берите пример с компании Kincony - все схемы открыты и это не мешает им иметь операционную деятельность и прибыль, навскидку, на несколько порядков превышающую вашу.


  1. Erion_guit
    07.01.2024 11:14

    А можно ли с ее помощью организовать нормальный индикатор заряда на малину?


  1. BigBeaver
    07.01.2024 11:14
    +1

    Столько наворотов, а USB DATA не пробрасывается...


  1. maniak26
    07.01.2024 11:14

    На tp4056 если правильно помню реализован алгоритм зарядки из глубокого разряда (если на акб меньше 3 вольт, подаётся ток 100ма, а по достижению 3.7 вольт уже до 1А зарядка продолжается). Тут в авто режиме подобного не предусмотрено?


  1. Mike-M
    07.01.2024 11:14

    инженерами Texas Instruments (которые, определённо, знают своё дело и не зря едят свой хлеб)

    Как же приятно читать статью, в которой описано хоть что-то не китайское!

    Вопрос по теме: можно ли вместо аккумулятора подключить ионистор? Или у TI для этого есть другой чип?


  1. shadrap
    07.01.2024 11:14

    Спасибо! Интересная микра! И цена нормальная и обвязка не дорогая. Пора менять 4056)


  1. smoluks4096
    07.01.2024 11:14

    Довольно странное решение сделать в чипе D+ и D- и не сделать СС. Считай, все фишки USB C, особенно constant power, которое бы здесь пригодилось, они не реализовали. Ну такое...