В прошлой части статьи о разработке 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.
-Когда устройство выключено, МК находится в режиме 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, исправление ошибок/доработка схемы, переделка платы под корпус, доработка ПО. После этого устройство будет похожим на товар и, после доведения, станет товаром в прямом смысле этого слова. В следующих частях статьи мы рассмотрим этапы и основные сложности процесса перехода от макета к готовому изделию, работу по корпусированию, рассмотрим стоимости различных решений и операций, оптимизацию, а также увидим конечный результат.
Автор: vladimir_open-dev