В прошлой части статьи о разработке PowerBank для ноутбука мы остановились на изготовленном макете, измеренном КПД и пониманием того, что делать дальше. А дальше нужно было оживлять железку. Поэтому представляю вашему вниманию часть вторую: ПО макета.



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

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

Отсюда видно, что придется писать ПО для управляющего МК (STM32F042), а также конфигурировать систему контроля Li-ion аккумуляторов + зарядное устройство (BQ40Z60). Я начал со второго, потому как считал эту часть наиболее сложной.
Для программирования контроллера BQ40Z60 нам понадобится:
— Адаптер EV2400 и EV2300(готовый или самодельный). У меня с прошлых проектов остался EV2300, поэтому я использовал его.
— Программа Battery Management Studio (bqStudio).
Подключается адаптер по шине SMBus, для подключения я оставил точки подпайки на линиях SMBD и SMBC.(Не самое практичное решение — потом понял, что надо было ставить разъем).

После танцев с бубном BQ40Z60 определилась в Battery Management Studio. Причиной тому был спящий режим в который входит контроллер при отсутствии подтяжки на шине SMBus и отсутствии обращения к нему. Просыпается он при подключении ЗУ.
Далее займемся непосредственно настройкой чипа BQ40Z60. Сказать, что у него много регистров — ничего не сказать. Настроек миллион. Поскольку конфигурирование — долгий и сложный процесс(для описания нужна отдельная статья) я опишу его вкратце.

После запуска появляется главное окно Battery Management Studio

Вкладка Data memory содержит большое количество полей в которые мы должны внести параметры батарей и режимы работы контроллера.

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


Для моих 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 увидел в таблице

тип вывода Output и с чистой совестью оставил его болтаться в воздухе. Проблемы пришли после спайки платы: вроде все настройки перебрал (а на тот момент сомнений было очень много), но не работает — не включались зарядный и разрядный транзисторы. После 2х дней сомнений/раздумий/проб и ошибок я заметил, что бит FUSE_EN не установлен и решил «спросить у людей» и когда я запостил вопрос ко мне пришло озарение

Глядя на схему отладочной платы я предположил, что вывод 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 и делал это очень давно, то я попросил программиста набросать для меня простенькую отладку. Для макета на скорую руку получилось следующее:


Это все работы, которые были проведены на стадии макета. Далее в планах(а поскольку я описываю уже проведенные операции, то часть работ уже сделана) передача ТЗ конструктору для разработки/изготовления корпуса PowerBank, исправление ошибок/доработка схемы, переделка платы под корпус, доработка ПО. После этого устройство будет похожим на товар и, после доведения, станет товаром в прямом смысле этого слова. В следующих частях статьи мы рассмотрим этапы и основные сложности процесса перехода от макета к готовому изделию, работу по корпусированию, рассмотрим стоимости различных решений и операций, оптимизацию, а также увидим конечный результат.

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


  1. RomanStrlcpy
    28.04.2016 17:31

    К сожаления я не могу задать вопрос в коментариях к первой статье, поэтому тут:

    Если я правильно понял, то для накачки PowerBank используется Step-Down, а для высасывания энергии из PowerBank исползуется Step-Up.
    Step-Down вроде имеют лучшие характеристики по сравнению со Step-Up, да и тот из кого высасывают энергию чуствует себя лучше при меньшем токе.
    Не было ли мыслей сделать ключик, который позволил бы использовать Step-Down и при зарядке и при разрядке PowerBank?


    1. vladimir_open-dev
      28.04.2016 17:45

      Думаю у меня не получиться использовать Step-Down BQ40Z60 для работы и зарядки одновременно. Он работает автоматически и я к нему доступа не имею.


  1. x893
    28.04.2016 17:43

    Интересная вещь. Будет на github размещено?


    1. vladimir_open-dev
      28.04.2016 17:43

      Будет.


  1. nothern_wind
    28.04.2016 18:32

    Отличная идея! я как раз над чем-то похожим работаю. только хочу сделать не повербанк, а что-то типа универсального низковольтного ИБП(хотя в названии сильной разницы нету), в виде одной платы, к который можно подключить любой аккумулятор и (почти) любой зарядник или просто блок питания, и сделать выходное регулируемое напряжение от 3 до 30 В (к примеру) и какой-нибудь интерфейс для контроля и управления, не только заряда аккумулятора но и выходного напряжения и тока и т.д. и т.д… в общем — наполеоновские планы.


    1. vladimir_open-dev
      28.04.2016 18:33
      +3

      Это утопия — в таком устройстве слишком мало маневра для универсализма. Когда дойдет до дела вы это поймете.


    1. MartinX
      28.04.2016 20:46
      +2

      Скорее всего, вы повторяете лабораторный блок питания, правда работающий от низкого напряжения…


  1. nothern_wind
    28.04.2016 19:13

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


  1. 15432
    28.04.2016 20:43

    Я как-то мечтал о аккумуляторе для бука на 3*18650 с возможностью быстрой замены оных. Снял крышку, засадил свежие аккумуляторы, включил. И никаких потерь КПД на преобразование 14-19-14.


  1. MartinX
    28.04.2016 20:58

    Хорошая идея, рад, что устройство все еще имеет статус открытой разработки (раз на github будет выложено). В случае телефона все понятно, что он на то и мобильный. Однако в случае ноута вижу два минуса: ноут видя внешний источник питания, отключает свои внутренние системы экономии; заряд внутренней батареи не эффективен и будет уменьшение автономности (хотя еще не все ноуты имеют встроенные батареи, можно и снять). Однако для тех, кто не хочет брать бизнес-ноуты с двумя батареями и что-то мудрить — это отличное решение. Кстати, вы не думали как будете решать проблему того, что нынче ноуту недостаточно подачи разности потенциалов так сказать, а хочется знать, что она производится оригинальным™ блоком питания?

    Так же интересно почему вы хотели использовать микроконтроллер с архитектурой MCS-51 (странно, что не нашли. они все еще в ходу, хотя полно интересных и современных камней вроде использованного STM)? Встроенный USB контроллер не был использован для упрощения написания прошивки (не надо делать свой мост UART <-> USB)?

    У меня есть идея прокачать свой ноутбук, докинув еще банок 18650 под дно ноутбука и подключить их к родной батарее. Только есть сомнение в том, что родной контроллер батареи хорошо отнесется к такому (а они в ноутбуках очень умные, в статье это показано. это не тупо платы защиты для лития, которые ограничивают ток/напряжение заряда/разряда в некоторых пределах). Ну и не примут ли за бомбу, если мне приспичит взять его в ручную кладь в самолет :).


    1. vladimir_open-dev
      28.04.2016 21:29

      О проблеме детекта оригинального зарядника я пока не думал — у меня ASUS там такой проблемы нет, в случае яблока или других недобросовестных производителей надо будет изучать вопрос.
      MCS-51 я никогда использовать не планировал — я просто не умею с ними работать. STM32F030 и 042 одни из самых дешевых процов сейчас. Мост UART <-> USB действительно использовался для упрощения софта на этапе прототипа.

      По вашей идее могу сказать, что контроллер АКБ не примет ваше усовершенствование и в лучшем случае будет работать как работал, в худшем заблокирует батарею…


      1. Firz
        29.04.2016 15:45

        В случае яблока все довольно просто — определение происходит по коннектору(magsafe 1/2), которым подключается блок питания к ноутбуку. Соответственно, если есть кабель с таким коннектором, просто подключаете его к ноутбуку и не важно что на другом конце кабеля(да и к самому блоку питания от такого коннектора идет только + и -).
        p.s. Естественно, коннектор нужен от(для) соответсвующего блока питания, т.к. у яблока 3 типа блоков питания с разным выходным напряжением.


        1. vladimir_open-dev
          29.04.2016 17:34

          Если есть в наличие провод с разъемом, то естественно проблем никаких.


  1. ofmetal
    28.04.2016 21:13

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

    Я смотрю тут сильно хитрая система для заряда ячеек.
    Чем она лучше, чем тупая зарядка обычным DC-DC преобразователем со стабилизатором тока?

    Сам так заряжаю самосборный повербанк 3s7p (из 18650-ых LG D1, 3Ач на банку, химия LiCoO2, соотв. 4.35В макс.), около 230Вт*ч. На DC-DC выставил 13.05 В, ток 6А (больше — опасно, греется очень, КПД падает с ростом тока), который питается от ноутбучного зарядника, 19В. Выглядит не очень красиво, но работает неплохо.


    1. vladimir_open-dev
      28.04.2016 21:33
      +1

      Это полноценная батарея с блекджеком и всем остальным… здоровье, заряд, напряжения, токи — все можно мониторить + микросхема контролирует ячейки и следит, чтоб они работали в нормальном режиме.

      > Чем она лучше, чем тупая зарядка обычным DC-DC преобразователем со стабилизатором тока?
      Я думаю всем, кроме цены.

      Кто балансирует ваш повербанк? Кто следит за напряжениями ячеек? Кто отключит в случае превышения 4,35В? И тд…


      1. ofmetal
        28.04.2016 22:42

        За балансировкой ячеек следит симметричная BMS, чтобы не перезарядилось вдруг чего лишнего, или наоборот не разрядилось слишком, плюс защита от КЗ. Получается очень удобно: в небольшой коробочке хранятся сами аккумы (3*7=21 банка), BMS и экранчик-ваттметр на верхней грани, показывающий текущее состояние дел (А, В, А*ч, %, заряд/разряд). С моей стороны к этой коробочке остаётся подключить лишь соответствующий DC-DC (понижайка для зарядки или повышайка для разряда). При заряде стабилизатор тока обеспечивает классическую CC-CV, т.е. сначала идёт 6А при минимально возможном напряжении. По приближении напряжения к 13.05В, сила тока начинает постепенно снижаться до 0. Возможно тот хитроумный зарядник на финальном этапе как-то поумнее действует. А так тут всё просто очень получается.

        Один минус у моей коробочки, в самолёты её могут не взять, там ограничение обычно 100 или 160 Вт*ч. Зато в поезда — самое оно :)


        1. vladimir_open-dev
          28.04.2016 22:47

          А что за экранчик такой который состояние дел показывает?


          1. ofmetal
            28.04.2016 23:19

            Вот такой примерно: http://li-force.ru/catalog/vattmetr/lcd-ваттметр-ty01.html
            Их полно там всяких: http://li-force.ru/catalog/vattmetr.html


            1. vladimir_open-dev
              28.04.2016 23:47

              Это все игрушки…


  1. jabr
    29.04.2016 02:51

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

    Хотел спросить у знающих людей — если я хочу заменить ячейки 18850 в аккуме для ноута это чем-то чревато?
    В если новые ячейки будут большей емкости? Просто полагал, что при заряде контроллер должен периодически мониторить напряжение на заряжаемой ячейке, а уж сколько времени уйдет на полный заряд — 2 часа или 6 контроллеру должно быть фиолетово (при условии конечно, если напряжение в принципе растет)…


    1. vladimir_open-dev
      29.04.2016 09:05
      +1

      контроллер помнит состояние каждой ячейки АКБ и при замене будет продолжать считать их старыми, поэтому замена ничем не чревата, но и эффекта она не даст.


      1. jabr
        04.05.2016 06:09

        Что такое «помнит состояние»?
        Допустим у меня есть убитый аккумулятор из ячеек 18850. Напряжение ячеек меньше 3v, одна ячейка убита вообще в ноль. Я ставлю новые разряженные до 3v. Контроллер не будет их заряжать?

        Как вообще контроллер определяет, надо заряжать ячейку или нет? У меня есть ImaxB6 и модельные аккумы. Как я понимаю, контроллер ImaxB6 периодически замеряет напряжение на конкретной банке и соответственно, при Vбанки <4,2v подает на нее ток. Общая емкость аккумулятора может быть 1500мAH, а может и 5000mAH — неважно, будет заряжать до 4,2v на банку.

        В чем отличие контроллера ноутбука? Там в контроллере по времени заряда ограничение, или по току или еще как?


        1. vladimir_open-dev
          04.05.2016 09:07

          контроллер запоминает сколько мач он заливал в старую банку и больше этого числа заливать не будет


          1. jabr
            04.05.2016 09:59

            Спасибо. Теперь понятно, как контроллеры убивают батарею.


            1. vladimir_open-dev
              04.05.2016 10:37

              Странный вывод, но все-равно пожалуйста.


              1. jabr
                05.05.2016 03:01

                Почему странный? По опыту использования, реальная емкость всегда меньше номинальной. И если контроллер будет считать именно номинальную емкость (а не напряжение до 4,2v), получается, что он всегда будет недозаряжать аккумулятор?


                1. vladimir_open-dev
                  05.05.2016 09:02

                  Он и то и то считает. Там сложная система — в двух словах не описать


  1. dmitryp
    29.04.2016 12:44
    -2

    BQ40Z60 лишнее, при наличии в схеме STM32


    1. vladimir_open-dev
      29.04.2016 14:15

      И как вы предлагаете одно другим заменить?


  1. fareloz
    29.04.2016 15:51

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


  1. mrigi
    30.04.2016 22:02

    А можно в двух словах зачем всё так усложнять и чем связки 5S батарея + bms + балансирующая зарядка вам не достаточно? К чему тут МК и преобразователь вообще?


    1. vladimir_open-dev
      01.05.2016 11:05

      Все зависит от того, что вы вкладываете в слово BMS…


      1. mrigi
        01.05.2016 17:41

        Ну наличие преобразователя наврядли зависит от того что я вкладываю в слово BMS. Имхо — он тут совсем лишний. 5 ячеек последовательно фактически идеально вписываются в 19 вольт напрямую с минимальной погрешностью. Зачем терять КПД.
        Начет BMS — то же, что и большинство китайцев — разные защиты. Но на самом деле там нужна только защита от глубокого разряда, и то пожалуй только если сам ноутбук это не умеет отслеживать. А защиту от КЗ отдельных ячеек делать как в Тесле — с помощью «предохранителя», а именно обычного тонкого проводника, перегорающего при превышении определенного тока. Чем проще, тем лучше.


        1. vladimir_open-dev
          01.05.2016 18:25

          У вас смешались люди, кони…
          1) Li-ion ячейка работает от 3 до 4,2В, тогда 5 ячеек будет от 15 до 21В и вы считаете, что это есть 19В с минимальной погрешностью?
          2) То, что китайцы считают за BMS — вовсе не BMS. На самом деле там нужна защита от перезаряда, переразряда, перегрева, заряда при низкой/высокой температуре, перегрузке по току(очень желательно восстанавливаемая) + инструменты для просмотра состояния батареи. В противном случае батарея прослужит ~100-200 циклов и в мусор. Как вы хотели, чтоб это отслеживал ноутбук я вообще не представляю…


          1. mrigi
            01.05.2016 20:24

            Отнюдь, у меня ничего не смешалось. Да, разброс напряжений приемлемый в экстремальных точках и хороший в рабочем диапазоне. В крайних значениях батарея находится не долго, так как порядка 80% емкости батареи приходится на диапазон 3.6-4V, а это колебания всего ±1V или 5% от 19V.
            Перезаряд — задача вашего зарядного устройства, в самой батарее это излишне. Глубокий разряд — да, нужен. Защита от перегрева особо не нужна. Для этого ставятся предохранители, описанные выше. Это же решает вопрос защиты по току так как ток это фактически единственное, что вашу батарею нагревает в реальных условиях эксплуатации. Нет, можно наверно придумать фантастические сценарии с зарядкой под палящим солнцем или на раскаленной плите, но какова вероятность такого? Да и спасет ли отключение зарядки в этих случаях вообще?
            Если ваш МК считает оставшуюся ёмкость какими-то умными алгоритмами и где-то отображает, то да — это определенно достойное ему применение. Но стоит ли доплачивать за это $70+? На уровне стоимости батареи на 240Wh… Когда основные защиты можно реализовать за сущие копейки.
            А пугалки про циклы не нужны, если батарею не разряжать глубже чем нужно и зарядка хорошая, то как бы всё будет точно так же как и с контроллером.
            Про отслеживание ноутбуком я чего-то сперва подумал, что вы хотите подключать свой банк вместо основной батареи. Моя ошибка, так что nvm.
            Но всё равно интересно, спасибо за статью.


            1. vladimir_open-dev
              01.05.2016 20:51

              мне нечего вам ответить на это. Блажен, кто верует…