
О сколько нам открытий чудных
...
Судя по результатам голосования и комментариям к предыдущей статье, к вопросу контроля АКБ у самых простых ИБП есть некоторый интерес. Данная статья - продолжение данной темы.
Сейчас прототип собран на макетной плате (токовый шунт к которому подключено два АПЦ). Измеритель напряжения и тока INA3221, как рекомендовали в комментариях к предыдущей статье, я решил не использовать, так как дискретность его измерений 8мВ даже выше, чем у 12-битного АПЦ обычного микроконтроллера (для ESP32 получается точность измерения около 6мВ).
Первый вариант прошивки с тестом работы ADC получился буквально за пять минут (в качестве основы взял обычный пример кода для работы с ADC). И хотя вначале я немного промазал с номиналами резисторов у предварительного делителя (забыл, что опорный источник питания у ESP32 всего 1,1В), но после замены резисторов делителя на макетной плате АЦП заработал корректно.
После этого решил оценить корректность и точность измерения напряжения на токовом шунте при зарядке и разрядке АКБ (как при реальной работе ИБП) и вот тут вылезло несколько очень интересных проблем, про которые мне захотелось написать (из-за этого и такой эпиграф), тогда как сама статья - это фиксация результатов работы макета контроллера и очередной Хабрахак для публикации итоговых выводов в виде статьи на Хабре, что бы результатами моего труда могли воспользоваться и другие хорошие люди :-).
Про АЦП
Для опытов использовал компоненты, которые были под рукой: токовый шунт 75мВ на 30А, а в качестве основы измерительного модуля - ESP32-C3. Так как его напряжение питания должно быть не выше 6В, то потребовался еще дополнительный DC-DC преобразователь.
Предварительный делитель напряжения для АЦП сделал с коэффициентом 49/2 на номиналах 47кОм и 2кОм, чтобы его с запасом хватило для АКБ на 24В, так как опорный источник питания у ESP32 всего 1,1В.

Это отладочный вывод при выключенном ИБП. Имеется небольшой разброс в измерениях на разных каналах ADC, но этого результаты измерений без какой либо статистической обработки.
Про USB
Однако при работающем ИБП вылезла неожиданная проблема в виде частых обрывов связи по USB. Связь может теряться почти сразу при включении источника бесперебойного питания или через 3-4 минуты, но потеря связи происходит всегда во время штатной работы устройства.

Изначально подобные проблемы связи по USB я связывал либо с самим модулем, либо с электромагнитными помехами при работе ИБП. Тем более, что основание для этого было очень серьезные. Ведь отладочный вывод по UART показывал наличие помех (не буквенные символы), тогда как сам микроконтроллер продолжал работать. Т.е. отваливается именно связь по USB, а раз в отладочном выводе UART появляются помехи, то я решил, что проблема именно в ЭМИ (что казалось бы очевидно).
Еще фотки:

Напряжение на АКБ с выключенным ИБП

Осциллограмма напряжения на АКБ при её зарядке. Размах пульсаций на АКБ около 7В

Осциллограмма напряжения на АКБ при работе ИБП от батареи (разрядка). Заметны пики потребления мощности для каждой полуволны питающего напряжения 220В / 50Гц.

Осциллограмма "тонкой структуры" напряжения на шунте при работе от АКБ (разрядка). Частота следования импульсов ШИМ у силового каскада ИБП - 20кГц

Отладочный вывод тестовой программы при зарядке АКБ.

Отладочный вывод тестовой программы при разрядке АКБ (ИБП работает от батареи).

Ток заряда примерно 2,8А (~7мВ на шунте 30А)

Ток разрядка около 6,7А (~16,7мВ на шунте 30А)
Однако потом при более подробном изучении даташита на используемый модуль вычитал, что есть ограничение на использование двойного питания, что описано в разделе External power supply:
Remember that when connecting the external power supply, you cannot access USB. USB and external power supply can only choose one.
т.е. можно использовать либо питание по USB, либо только внешне питания, тогда как у меня на макетной плате используются оба.
Однако ни отключение внешнего источника питания, ни замена модуля ESP32 на другой проблему не решила (т.е. дело не в конкретном модуле и не питании как таковом). Тайна немного развеялась после более внимательного изучения отладочного вывода по UART, где при подключении USB кабеля влезают следующие строки:
...
rst:0x15 (USB_UART_CHIP_RESET),
ESP-ROM:esp32c3-a0i1-20210207␍␊
Build:Feb 7 2021␍␊
rst:0x15 (USB_UART_CHIP_RESET),boot:0xd (SPI_FAST_FLASH_BOOT)␍␊
Saved PC:0x4038309c␍␊
SPIWP:0xee␍␊
...
Судя по всему, при подключении кабеля USB (не при подаче питания по USB, а именно из-за его инициализации интерфейса), происходит сбой, возможно из-за попытки перехода в режим программирования или по какой либо другой причине. А может быть из-за необходимости программно эмулировать работу USB порта с функцией обновления прошивки, да и аппаратная поддержка USB встречается далеко не у всех чипов ESP32.
И это косвенно подтверждается тем, что при использовании ESP32 Dev Kit, где интерфейс USB реализован через внешний конвертор на CP2102 и такой проблемы не возникает, правда и в даташите на Esp32 DevKit v1 не описано ограничение на питания только из одного источника:
Power to the DOIT Esp32 DevKit v1 is supplied via the on-board USB Micro B connector or directly via the “VIN” pin. The power source is selected automatically. The device can operate on an external supply of 6 to 20 volts. If using more than 12V, the voltage regulator may overheat and damage the device. The recommended range is 7 to 12 volts.
Про Bluetooth
После того, как вылезли неожиданные проблемы связи по USB решил сделать передачу данных по Bluetooth и ... не смог.
Оказывается, у микроконтроллера ESP32-C3 отсутствует Bluetooth Сlassic, а есть только Bluetooth LE. Но у Bluetooth LE нет профиля последовательного порта (Bluetooth Serial Port Profile).
Для проверки я запустил Bluetooth SPP на обычной ESP32, но после танцев с бубном при настройке RFCOMM для проброса COM-порта через Bluetooth, решил что эта шкурка не стоит выделки.
Настройка подключения COM порта через Bluetooth оказалась довольно сложной, но самое главное, все это очень не надежно в работе. Поэтому в конце концов решил, что гораздо проще в качестве беспроводного интерфейса использовать обычный WiFi.
Выводы по результатам макетирования
По результатам тестирования прототипа на макетной платы сделал для себя следующие выводы:
Полученные значения напряжений ADC согласуются с уровнем напряжения, измеренном непосредственно на токовом шунте мультиметром.
Точность измерения напряжения с помощью встроенного в микроконтроллер ADC достаточно для определения уровня заряда АКБ и для набора статистики его работы.
Измеренного напряжения на шунте, на первый взгляд, будет достаточно для определения режима работы ИБП (простой, зарядка или разрядка АКБ), а так же для приблизительной оценки зарядного и разрядного тока АКБ. (Сейчас в отладочном логе выводятся непосредственные данные АЦП без какой либо статистической обработки)
Для беспроводного интерфейса вместо Bluetooth SPP проще и удобнее использовать WiFi с обычным сетевым соединением.
Скорее всего USB не получится использовать для постоянной связи в компьютером. Может быть попробую поэкспериментировать с механизмами восстановления соединения (например, имитировать переключение USB кабеля). В противном случае буду использовать USB только для настройки параметров работы сетевых служб, после чего мониторить состояние АКБ по сетевому протоколу, например по SNMP. Это даже удобнее, т.к. у меня два ИБП стоят в других комнатах и нет возможности подключить их по USB кабелю.
Плата модуля
Плату решил сделать основе модуля ESP32-C3 SuperMini. Он очень понравился своей миниатюрностью и ценой. Если же кому то потребуется более стабильная связь по USB, то модуль ESP32-C3 SuperMini можно заменить на какой нибудь ESP32 Dev Kit с нормальным USB-UART преобразователем на CP2102 или же подключаться по линии связи RS485, что значительно надежнее (если по какой либо причине не хочется использовать WiFi).
Так как внешнее напряжение питания у модуля ESP32-C3 SuperMini не рекомендуется делать выше 7-8 вольт, а у ESP32 Dev Kit по даташиту оно вообще ограничено 5В от USB, то для платы пришлось делать схему питания.
Вначале я хотел взять какой нибудь готовый понижающий DC-DC преобразователей из большого набора DIY модулей. Но минимальная стоимость в рознице подобной платы 150-200 рублей (в том числе из-за стоимости пересылки), а это сопоставимо с ценой всех его комплектующих при реализации DC-DC преобразователя на плате. Тем более использовать вторую (а точнее третью) плату в подобном устройстве я посчитал перебором.
Самое интересное, что с модулем ESP32-C3 SuperMini ситуация диаметрально противоположная. Стоимость всех компонентов установленных на плате (микроконтроллер, кварц, Type-C разъем и десяток дискретных элементов), оказалась значительно выше, чем покупать такой модуль в рознице. Хотя если подумать, то в этом нет ничего удивительного. Подобные платы изготавливаются сотнями тысяч, если не миллионами штук и стоимость их комплектующих при таких объемах уменьшается кратно (если сравнивать с штучным производством плат для DIY проектов).
В результате получилась следующая концепция - несущая плата с односторонним монтажом, а вторая сторона платы используется для установки модуля ESP32-C3 SuperMini (как бутерброд :-) )
Несмотря на миниатюрность всей конструкции (удалось уложиться в прямоугольник 25х30мм), на плате удалось разместить не только DC-DC преобразователь, но и контакты для подключения внешнего датчик температуры DS18d20 (или любого другого с аналогичным подключением по 1-Wire по трёх или двух проводной схеме) и даже и RS485 интерфейс,
Внешний 3D вид печатной платы:


Еще на плату добавил схему для подключения внешней кнопки и транзистор для замыкания цепи на землю (имитация нажатия кнопки). Для чего - еще не знаю, но пусть будет, вдруг пригодится для каких нибудь других поделок или для имитации нажатия кнопки на ИБП.
Фрагмент схемы с 1-Wire, кнопкой, выходом и делителем для ADC


В настоящий момент заказал изготовление 10шт. плат в Китае, которые скоро уже должны привезти. Вышло немного дорого (чуть больше 1500 руб. за плату), но зато быстро и для личных целей приемлемо.
Если будут желающие подключится к проекту, то как будет готова программная часть, я выложу исходники на Гитхаб и могу выслать несколько лишних плат по себестоимости.