![](https://habrastorage.org/files/368/fcc/f59/368fccf5979c4932a392b911139c892b.png)
Перерыв между частями получился довольно большим — все силы были брошены на проект быстрозарядного внешнего аккумулятора, который сейчас собирает поддержку на boomstarter.
Продолжим.
Для того, чтобы понять какие микросхемы нам придется программировать посмотрим на структурную схему макета
![](https://habrastorage.org/files/87a/3e9/68e/87a3e968e1dc4112a6e96f5375e7b2f8.png)
Отсюда видно, что придется писать ПО для управляющего МК (STM32F042), а также конфигурировать систему контроля Li-ion аккумуляторов + зарядное устройство (BQ40Z60). Я начал со второго, потому как считал эту часть наиболее сложной.
Для программирования контроллера BQ40Z60 нам понадобится:
— Адаптер EV2400 и EV2300(готовый или самодельный). У меня с прошлых проектов остался EV2300, поэтому я использовал его.
— Программа Battery Management Studio (bqStudio).
Подключается адаптер по шине SMBus, для подключения я оставил точки подпайки на линиях SMBD и SMBC.(Не самое практичное решение — потом понял, что надо было ставить разъем).
![](https://habrastorage.org/files/90a/c7d/ddf/90ac7dddfa184d8498d418b786c853fa.png)
После танцев с бубном BQ40Z60 определилась в Battery Management Studio. Причиной тому был спящий режим в который входит контроллер при отсутствии подтяжки на шине SMBus и отсутствии обращения к нему. Просыпается он при подключении ЗУ.
Далее займемся непосредственно настройкой чипа BQ40Z60. Сказать, что у него много регистров — ничего не сказать. Настроек миллион. Поскольку конфигурирование — долгий и сложный процесс(для описания нужна отдельная статья) я опишу его вкратце.
После запуска появляется главное окно Battery Management Studio
![](https://habrastorage.org/files/8c5/bb5/610/8c5bb561090943eebcb578c4b6891727.png)
Вкладка Data memory содержит большое количество полей в которые мы должны внести параметры батарей и режимы работы контроллера.
![](https://habrastorage.org/files/d9a/b9a/c2a/d9ab9ac2ac5140debab0ccb00a154b92.png)
На вкладке Chemistry можно попробовать отыскать готовые калибровки для используемых ячеек.
![](https://habrastorage.org/files/fad/140/d49/fad140d49cbd4e4d8837098da6af29f1.png)
Для моих YOKU LP 5558115 3500mAh готовых калибровок не оказалось (кстати калибровки постоянно обновляются). Нашел похожие YOKU LP 656193 4000mAh. Смекнув, что про имеющиеся пакеты я все равно ничего не знаю, выбрал этот профиль.
Затем во вкладке Data memory я настроил:
Calibration: калибровочные значения для вольтметров(ячейки, батареи и внешнего адаптера), сопротивление датчика тока, калибровочные значения для датчика температуры.
Settings: включение защит, терморезисторов, светодиодов, спящего режима, конфигурации батареи.
Protections: настройка порогов защит(напряжение, время, температура), настройка порогов напряжения внешнего адаптера.
Permanent Fail: настройка порогов срабатывания необратимых ошибок(таких при которых дальнейшая работа батареи невозможна).
Advanced Charge Algorithm: настройка зарядного устройства(токи, напряжения для разных диапазонов температуры, признак окончания заряда, балансировка).
Gas Gauging: настройка блока определения уровня заряда(паспортные емкость/напряжение ячеек, сопротивление проводов, статистика).
Power: настройка режимов работы контроллера.
PF Status: состояние статусных бит Permanent Fail защит.
System Data: поля для данных производителя.
SBS Configuration: настройка порогов срабатывания триггера Alarm, основные данные о батарее(серийный номер, дата производства, производитель, имя, химия).
LED Support: настройка режима свечения индикаторных светодиодов.
Black Box: черный ящик (история изменения статусных бит защит).
Lifetimes: статистика батареи.
Ra Table: таблица внутренних сопротивлений ячеек.
В процессе настройки я изменял далеко не все поля, но для старта этого хватило.
С этой частью схемы был только один аппаратный косяк связанный с выводом 21-AFEFUSE микросхемы. Произошло это вот как:
Схему я драл с отладочной платы за исключением микросхемы вторичной защиты и пережигаемого предохранителя. У BQ40Z60 за пережигание предохранителя отвечает 21 вывод AFEFUSE (так я думал). Поэтому я посмотрел 5 страницу даташита BQ40Z60 увидел в таблице
![](https://habrastorage.org/files/f1c/964/667/f1c964667aa042cdae2a1d63122e9b67.jpg)
тип вывода Output и с чистой совестью оставил его болтаться в воздухе. Проблемы пришли после спайки платы: вроде все настройки перебрал (а на тот момент сомнений было очень много), но не работает — не включались зарядный и разрядный транзисторы. После 2х дней сомнений/раздумий/проб и ошибок я заметил, что бит FUSE_EN не установлен и решил «спросить у людей» и когда я запостил вопрос ко мне пришло озарение
![](https://habrastorage.org/files/13b/a37/caf/13ba37caf5564b55896121eb247369e0.jpg)
Глядя на схему отладочной платы я предположил, что вывод AFEFUSE может быть также входом, что подтвердилось разделом 9.3.2.4 стр.24, где написано, что если вывод не используется, его нужно соединить с землей. Я это сделал пинцетом и все заработало. Через 5 минут мне ответили на e2e.com — ответ четкий и правильный, я высказал свое «фи» по поводу ошибки в таблице выводов — обещали поправить в следующих версиях документации.
Чтобы поставить точку в настройке контроллера я прогнал 2 обучающих цикла полный заряд/разряд + релаксация (заняло в общем 30 часов).
Теперь перейдем к программированию STM32F042. На этапе макета от этого процессора требовалось совсем не много:
— Управлять преобразователем напряжения, обрабатывать кнопки.
— Уходить как можно глубже в сон, чтоб не разряжать батарею.
— Считывать основные параметры АКБ из контроллера(напряжение, ток, уровень заряда, температура, текущее состояние, количество циклов, время до полного заряда/разряда) и выводить их в ПК через USART (поскольку на плате уже стоял преобразователь CP2102). Хоть процессор и содержит USB на борту, в макете я его не использовал, да и делался макет под 051 МК, но я не смог его купить.
Управление преобразователем сводилось к выставлению двух выводов(включение и режим работы), подачи ШИМ (с последующей RC фильтрацией) на вывод задания частоты преобразования микросхемы LTC3780 (в итоге установил частоту на максимум — 400кГц), и вход мониторинга сигнала PowerGood. Но даже тут я умудрился наступить на грабли. Баг был плавающий и возникал когда Power Bank долго полежит выключенным, выражался в том, что он просто не включался. Проблема заключалась в том, что я сначала включал прерывание на сигнал PowerGood от LTC3780, а затем включал саму микросхему(EN). Получалось, что прерывание срабатывало еще до старта преобразователя и выключало его. Переставил события местами и добавил задержку — проблема исчезла. В остальном этот функционал дался легко.
Было решено сделать пользовательский интерфейс с 1 кнопкой и 5 (6) светодиодами (хотя на плате макета было 2 кнопки и 10 светодиодов). Работает он следующим образом:
Устройство выключено -> кратковременное нажатие (<500 мс) — анимация уровня заряда на 4 светодиодах.
Устройство выключено -> долговременное нажатие (>500 мс) — включение устройства (загорается 5ый светодиод).
Устройство выключено -> подключение ЗУ -> анимация уровня заряда на 4 светодиодах до окончания процесса заряда.
Устройство включено -> кратковременное нажатие — анимация уровня заряда на 4 светодиодах.
Устройство включено -> долговременное нажатие — выключение устройства.
Устройство выключено -> ток потребления меньше 50 мА более 3 мин. — выключение устройства.
Это позволило убрать из устройства 27 элементов.
Опыт реализации спящих режимов на STM32F0xx у меня уже был, поэтому на большие грабли я тут не рассчитывал. Для оптимизации потребления я первым делом заменил LDO 3,3В на mcp1703 с малым током собственного потребления (нужно было не драть с отладки, а сразу ставить его). Размер, цена, потребление, обвес — все меньше, чем у LP2951.
Спасибо пользователю Hardegor за правку по поводу LDO для Li-ion 4s нельзя использовать mcp1703 в силу низкого входного напряжения. Я использовал для химии LiFePo4 — там этой проблемы нет. Будьте внимательны!!!
-Когда устройство выключено, МК находится в режиме STANDBY и реагирует только на нажатие кнопки или подключение ЗУ. Потребление в таком режиме составляет 108 мкА (100 из них потребляет BQ40Z60).
-При включенном устройстве процессор большинство времени (кроме моментов индикации и опроса BQ40Z60) находится в режиме STOP с потреблением 1,5 мА (1 мА это светодиод). В моменты опроса и индикации ток потребления колеблется от 4,5 до 9 мА.
-При подключенном USB МК в режиме RUN на 48 Мгц, потребление 15 мА. В будущем сделаю питание МК в этом режиме от USB.
Самой большой потенциальной проблемой был опрос BQ40Z60. С SMBus я не работал и до последнего надеялся, что SMBus это I2C 1в1(частично это так, ведь физический уровень у них одинаков), но оказалось, что канальный уровень сильно разнится и это порождало ряд трудностей. Здесь описывать отличия SMBus от I2C я не буду, а приведу ссылку на довольно грамотную статью. На этапе макета я не стал ввязываться в борьбу с SMBus (к слову как программист я на много слабее, чем как схемотехник) и поскольку команды отправки и приёма байта в SMBus и I2C совпадали полностью, я использовал только их. В итоге из BQ40Z60 я считывал SOC, SOH, Current, CellVolt, TimeToFull, TimeToEmpty. В зависимости от значений регистров изменялся режим работы(выдавались предупреждения, любо происходило выключение).
Ну и на стороне ПК конечно была необходима программа, способная отображать считанные с АКБ данные в удобном виде. Поскольку графические интерфейсы я мог только в Borland C++ Builder и делал это очень давно, то я попросил программиста набросать для меня простенькую отладку. Для макета на скорую руку получилось следующее:
![](https://habrastorage.org/files/62e/18d/c55/62e18dc550c04870a8d51acb5dda6691.png)
Это все работы, которые были проведены на стадии макета. Далее в планах(а поскольку я описываю уже проведенные операции, то часть работ уже сделана) передача ТЗ конструктору для разработки/изготовления корпуса PowerBank, исправление ошибок/доработка схемы, переделка платы под корпус, доработка ПО. После этого устройство будет похожим на товар и, после доведения, станет товаром в прямом смысле этого слова. В следующих частях статьи мы рассмотрим этапы и основные сложности процесса перехода от макета к готовому изделию, работу по корпусированию, рассмотрим стоимости различных решений и операций, оптимизацию, а также увидим конечный результат.
Комментарии (36)
nothern_wind
28.04.2016 18:32Отличная идея! я как раз над чем-то похожим работаю. только хочу сделать не повербанк, а что-то типа универсального низковольтного ИБП(хотя в названии сильной разницы нету), в виде одной платы, к который можно подключить любой аккумулятор и (почти) любой зарядник или просто блок питания, и сделать выходное регулируемое напряжение от 3 до 30 В (к примеру) и какой-нибудь интерфейс для контроля и управления, не только заряда аккумулятора но и выходного напряжения и тока и т.д. и т.д… в общем — наполеоновские планы.
vladimir_open-dev
28.04.2016 18:33+3Это утопия — в таком устройстве слишком мало маневра для универсализма. Когда дойдет до дела вы это поймете.
MartinX
28.04.2016 20:46+2Скорее всего, вы повторяете лабораторный блок питания, правда работающий от низкого напряжения…
nothern_wind
28.04.2016 19:13Я это понял, уже, по этому и написал про «наполеоновские планы», в том смысле что это на самом деле утопия. придётся как-то искать золотую середину между универсальностью, габаритами, стоимостью, и простотой и надёжностью
15432
28.04.2016 20:43Я как-то мечтал о аккумуляторе для бука на 3*18650 с возможностью быстрой замены оных. Снял крышку, засадил свежие аккумуляторы, включил. И никаких потерь КПД на преобразование 14-19-14.
MartinX
28.04.2016 20:58Хорошая идея, рад, что устройство все еще имеет статус открытой разработки (раз на github будет выложено). В случае телефона все понятно, что он на то и мобильный. Однако в случае ноута вижу два минуса: ноут видя внешний источник питания, отключает свои внутренние системы экономии; заряд внутренней батареи не эффективен и будет уменьшение автономности (хотя еще не все ноуты имеют встроенные батареи, можно и снять). Однако для тех, кто не хочет брать бизнес-ноуты с двумя батареями и что-то мудрить — это отличное решение. Кстати, вы не думали как будете решать проблему того, что нынче ноуту недостаточно подачи разности потенциалов так сказать, а хочется знать, что она производится оригинальным™ блоком питания?
Так же интересно почему вы хотели использовать микроконтроллер с архитектурой MCS-51 (странно, что не нашли. они все еще в ходу, хотя полно интересных и современных камней вроде использованного STM)? Встроенный USB контроллер не был использован для упрощения написания прошивки (не надо делать свой мост UART <-> USB)?
У меня есть идея прокачать свой ноутбук, докинув еще банок 18650 под дно ноутбука и подключить их к родной батарее. Только есть сомнение в том, что родной контроллер батареи хорошо отнесется к такому (а они в ноутбуках очень умные, в статье это показано. это не тупо платы защиты для лития, которые ограничивают ток/напряжение заряда/разряда в некоторых пределах). Ну и не примут ли за бомбу, если мне приспичит взять его в ручную кладь в самолет :).vladimir_open-dev
28.04.2016 21:29О проблеме детекта оригинального зарядника я пока не думал — у меня ASUS там такой проблемы нет, в случае яблока или других недобросовестных производителей надо будет изучать вопрос.
MCS-51 я никогда использовать не планировал — я просто не умею с ними работать. STM32F030 и 042 одни из самых дешевых процов сейчас. Мост UART <-> USB действительно использовался для упрощения софта на этапе прототипа.
По вашей идее могу сказать, что контроллер АКБ не примет ваше усовершенствование и в лучшем случае будет работать как работал, в худшем заблокирует батарею…Firz
29.04.2016 15:45В случае яблока все довольно просто — определение происходит по коннектору(magsafe 1/2), которым подключается блок питания к ноутбуку. Соответственно, если есть кабель с таким коннектором, просто подключаете его к ноутбуку и не важно что на другом конце кабеля(да и к самому блоку питания от такого коннектора идет только + и -).
p.s. Естественно, коннектор нужен от(для) соответсвующего блока питания, т.к. у яблока 3 типа блоков питания с разным выходным напряжением.vladimir_open-dev
29.04.2016 17:34Если есть в наличие провод с разъемом, то естественно проблем никаких.
ofmetal
28.04.2016 21:13> На вкладке Chemistry можно попробовать отыскать готовые калибровки для используемых ячеек.
Я смотрю тут сильно хитрая система для заряда ячеек.
Чем она лучше, чем тупая зарядка обычным DC-DC преобразователем со стабилизатором тока?
Сам так заряжаю самосборный повербанк 3s7p (из 18650-ых LG D1, 3Ач на банку, химия LiCoO2, соотв. 4.35В макс.), около 230Вт*ч. На DC-DC выставил 13.05 В, ток 6А (больше — опасно, греется очень, КПД падает с ростом тока), который питается от ноутбучного зарядника, 19В. Выглядит не очень красиво, но работает неплохо.vladimir_open-dev
28.04.2016 21:33+1Это полноценная батарея с блекджеком и всем остальным… здоровье, заряд, напряжения, токи — все можно мониторить + микросхема контролирует ячейки и следит, чтоб они работали в нормальном режиме.
> Чем она лучше, чем тупая зарядка обычным DC-DC преобразователем со стабилизатором тока?
Я думаю всем, кроме цены.
Кто балансирует ваш повербанк? Кто следит за напряжениями ячеек? Кто отключит в случае превышения 4,35В? И тд…ofmetal
28.04.2016 22:42За балансировкой ячеек следит симметричная BMS, чтобы не перезарядилось вдруг чего лишнего, или наоборот не разрядилось слишком, плюс защита от КЗ. Получается очень удобно: в небольшой коробочке хранятся сами аккумы (3*7=21 банка), BMS и экранчик-ваттметр на верхней грани, показывающий текущее состояние дел (А, В, А*ч, %, заряд/разряд). С моей стороны к этой коробочке остаётся подключить лишь соответствующий DC-DC (понижайка для зарядки или повышайка для разряда). При заряде стабилизатор тока обеспечивает классическую CC-CV, т.е. сначала идёт 6А при минимально возможном напряжении. По приближении напряжения к 13.05В, сила тока начинает постепенно снижаться до 0. Возможно тот хитроумный зарядник на финальном этапе как-то поумнее действует. А так тут всё просто очень получается.
Один минус у моей коробочки, в самолёты её могут не взять, там ограничение обычно 100 или 160 Вт*ч. Зато в поезда — самое оно :)vladimir_open-dev
28.04.2016 22:47А что за экранчик такой который состояние дел показывает?
ofmetal
28.04.2016 23:19Вот такой примерно: http://li-force.ru/catalog/vattmetr/lcd-ваттметр-ty01.html
Их полно там всяких: http://li-force.ru/catalog/vattmetr.html
jabr
29.04.2016 02:51>На вкладке Chemistry можно попробовать отыскать готовые калибровки для используемых ячеек
Хотел спросить у знающих людей — если я хочу заменить ячейки 18850 в аккуме для ноута это чем-то чревато?
В если новые ячейки будут большей емкости? Просто полагал, что при заряде контроллер должен периодически мониторить напряжение на заряжаемой ячейке, а уж сколько времени уйдет на полный заряд — 2 часа или 6 контроллеру должно быть фиолетово (при условии конечно, если напряжение в принципе растет)…vladimir_open-dev
29.04.2016 09:05+1контроллер помнит состояние каждой ячейки АКБ и при замене будет продолжать считать их старыми, поэтому замена ничем не чревата, но и эффекта она не даст.
jabr
04.05.2016 06:09Что такое «помнит состояние»?
Допустим у меня есть убитый аккумулятор из ячеек 18850. Напряжение ячеек меньше 3v, одна ячейка убита вообще в ноль. Я ставлю новые разряженные до 3v. Контроллер не будет их заряжать?
Как вообще контроллер определяет, надо заряжать ячейку или нет? У меня есть ImaxB6 и модельные аккумы. Как я понимаю, контроллер ImaxB6 периодически замеряет напряжение на конкретной банке и соответственно, при Vбанки <4,2v подает на нее ток. Общая емкость аккумулятора может быть 1500мAH, а может и 5000mAH — неважно, будет заряжать до 4,2v на банку.
В чем отличие контроллера ноутбука? Там в контроллере по времени заряда ограничение, или по току или еще как?vladimir_open-dev
04.05.2016 09:07контроллер запоминает сколько мач он заливал в старую банку и больше этого числа заливать не будет
jabr
04.05.2016 09:59Спасибо. Теперь понятно, как контроллеры убивают батарею.
vladimir_open-dev
04.05.2016 10:37Странный вывод, но все-равно пожалуйста.
jabr
05.05.2016 03:01Почему странный? По опыту использования, реальная емкость всегда меньше номинальной. И если контроллер будет считать именно номинальную емкость (а не напряжение до 4,2v), получается, что он всегда будет недозаряжать аккумулятор?
vladimir_open-dev
05.05.2016 09:02Он и то и то считает. Там сложная система — в двух словах не описать
fareloz
29.04.2016 15:51У меня всегда вызывают уважение люди, которые разбираются в таких вещах, делают чертежи и понимают физические приципы. Спасибо за статью.
mrigi
30.04.2016 22:02А можно в двух словах зачем всё так усложнять и чем связки 5S батарея + bms + балансирующая зарядка вам не достаточно? К чему тут МК и преобразователь вообще?
vladimir_open-dev
01.05.2016 11:05Все зависит от того, что вы вкладываете в слово BMS…
mrigi
01.05.2016 17:41Ну наличие преобразователя наврядли зависит от того что я вкладываю в слово BMS. Имхо — он тут совсем лишний. 5 ячеек последовательно фактически идеально вписываются в 19 вольт напрямую с минимальной погрешностью. Зачем терять КПД.
Начет BMS — то же, что и большинство китайцев — разные защиты. Но на самом деле там нужна только защита от глубокого разряда, и то пожалуй только если сам ноутбук это не умеет отслеживать. А защиту от КЗ отдельных ячеек делать как в Тесле — с помощью «предохранителя», а именно обычного тонкого проводника, перегорающего при превышении определенного тока. Чем проще, тем лучше.vladimir_open-dev
01.05.2016 18:25У вас смешались люди, кони…
1) Li-ion ячейка работает от 3 до 4,2В, тогда 5 ячеек будет от 15 до 21В и вы считаете, что это есть 19В с минимальной погрешностью?
2) То, что китайцы считают за BMS — вовсе не BMS. На самом деле там нужна защита от перезаряда, переразряда, перегрева, заряда при низкой/высокой температуре, перегрузке по току(очень желательно восстанавливаемая) + инструменты для просмотра состояния батареи. В противном случае батарея прослужит ~100-200 циклов и в мусор. Как вы хотели, чтоб это отслеживал ноутбук я вообще не представляю…mrigi
01.05.2016 20:24Отнюдь, у меня ничего не смешалось. Да, разброс напряжений приемлемый в экстремальных точках и хороший в рабочем диапазоне. В крайних значениях батарея находится не долго, так как порядка 80% емкости батареи приходится на диапазон 3.6-4V, а это колебания всего ±1V или 5% от 19V.
Перезаряд — задача вашего зарядного устройства, в самой батарее это излишне. Глубокий разряд — да, нужен. Защита от перегрева особо не нужна. Для этого ставятся предохранители, описанные выше. Это же решает вопрос защиты по току так как ток это фактически единственное, что вашу батарею нагревает в реальных условиях эксплуатации. Нет, можно наверно придумать фантастические сценарии с зарядкой под палящим солнцем или на раскаленной плите, но какова вероятность такого? Да и спасет ли отключение зарядки в этих случаях вообще?
Если ваш МК считает оставшуюся ёмкость какими-то умными алгоритмами и где-то отображает, то да — это определенно достойное ему применение. Но стоит ли доплачивать за это $70+? На уровне стоимости батареи на 240Wh… Когда основные защиты можно реализовать за сущие копейки.
А пугалки про циклы не нужны, если батарею не разряжать глубже чем нужно и зарядка хорошая, то как бы всё будет точно так же как и с контроллером.
Про отслеживание ноутбуком я чего-то сперва подумал, что вы хотите подключать свой банк вместо основной батареи. Моя ошибка, так что nvm.
Но всё равно интересно, спасибо за статью.
RomanStrlcpy
К сожаления я не могу задать вопрос в коментариях к первой статье, поэтому тут:
Если я правильно понял, то для накачки PowerBank используется Step-Down, а для высасывания энергии из PowerBank исползуется Step-Up.
Step-Down вроде имеют лучшие характеристики по сравнению со Step-Up, да и тот из кого высасывают энергию чуствует себя лучше при меньшем токе.
Не было ли мыслей сделать ключик, который позволил бы использовать Step-Down и при зарядке и при разрядке PowerBank?
vladimir_open-dev
Думаю у меня не получиться использовать Step-Down BQ40Z60 для работы и зарядки одновременно. Он работает автоматически и я к нему доступа не имею.