Я разработал двунаправленный цифровой источник питания BUCK-BOOST, в котором с обеих сторон используется INA240A1 для высокосторонней дифференциальной выборки. MCU и драйвер затвора должны питаться от системы, поэтому реализовано двойное питание (Buck со стороны шины + Buck со стороны батареи, переключение через диодную схему ИЛИ).
Проблема: независимо от того, какая сторона питает систему, ток вспомогательного питания в конечном итоге протекает через шунт в цепи батареи, из-за чего при малых токах (<500 мА) погрешность измерения становится очень большой, а расчёт мощности и кулонометр работают совершенно неправильно.
Точку питания подключили не туда, братан. Подключи вход Aux Buck к стороне Shunt, ближайшей к клеммам батареи/шины (то есть к внешней стороне Shunt). Ни в коем случае не подключай к внутренней стороне Shunt (к стороне силовой цепи). В таком варианте ток вспомогательного питания вообще не проходит через измерительный резистор, а просто уходит напрямую через порт.
Если плата уже изготовлена и изменить её нельзя, сначала надрежь медную дорожку на входе Aux Buck резаком, а затем подпаяй перемычку прямо к входной клемме батареи и попробуй — измерения малых токов сразу станут намного чище.
Про то, что можно изменить в аппаратной части, уже написали выше; я добавлю со стороны ПО — вспомогательный ток на самом деле можно рассчитать и измерить, это не «чёрный ящик»:
Состав вспомогательного тока:
Статический ток MCU + периферии: по даташиту + измерения, в основном почти постоянная величина, например 30~80 мА
Ток драйвера затвора: I_gate = Q_g × f_sw × N (Q_g — заряд затвора MOSFET, f_sw — частота переключения, N — количество транзисторов). Например, если у вас 4 транзистора, Q_g=50 нКл, f=100 кГц, ток драйвера будет 4×50 нКл×100 к = 20 мА
Сложите эти две части и внесите поправку на КПД Buck — получите суммарный вспомогательный ток
Алгоритм компенсации:
Определить, какой Buck сейчас питает нагрузку (сравнить выходные напряжения двух Buck или считать состояние диодного ИЛИ)
Питание от аккумуляторного Buck: напрямую I_batt_real = I_shunt - I_aux_batt
Питание от шинного Buck (режим разряда): I_batt_real = I_shunt - P_aux/(V_batt×η), учтите, что P_aux нужно пересчитать по напряжению на стороне шины
Для кулонометра аналогично: в каждом цикле интегрирования вычитайте соответствующую величину эквивалентного заряда
Более надёжный вариант: последовательно включить небольшой шунт + INA199 (стоит копейки) на выходе вспомогательного Buck и измерять вспомогательный ток в реальном времени, динамически вычитая его в ПО. Это точнее теоретического расчёта, потому что ток драйвера меняется в зависимости от режима работы.
Ещё напомню: при токе <500 мА у вас и так плохое отношение сигнал/шум при выборке; смещение INA240A1 (уровня ±25 мкВ) на шунте 10 мОм даёт ошибку ±2,5 мА. При малых токах даже после компенсации не стоит рассчитывать на точность 1%; на аппаратном уровне можно немного увеличить сопротивление шунта.
Вспомогательный ток протекает по цепи battery+ → шунт → вспомогательный понижающий преобразователь → нагрузка → GND. Он проходит через шунт напрямую и арифметически добавляется к измеренному значению. Исправление: перенесите вход понижающего преобразователя на сторону клеммы батареи относительно шунта (выше по цепи). Тогда вспомогательный ток будет полностью обходить измерительный элемент. Нулевая стоимость, одно изменение трассировки.
Случай B — активен понижающий преобразователь со стороны шины, преобразователь в режиме разряда (батарея → шина):
Вспомогательное питание берётся от шины, но шина запитывается от батареи через ваш преобразователь. По закону сохранения энергии батарея отдаёт дополнительный ток, равный P_aux / (V_batt · η). Эта составляющая действительно протекает через шунт батареи — она физически реальна, а не является артефактом компоновки. Никакая перекоммутация её не уберёт.
Для случая B есть три инженерных варианта:
Компенсация на основе модели во встроенном ПО. Вспомогательная нагрузка хорошо предсказуема: ток MCU/статический ток (постоянный, измеряется один раз) плюс ток драйверов затворов, который в точности равен Q_g · f_sw · N на каждый коммутируемый канал. Вычитайте I_aux из показания шунта на каждом цикле управления и вычитайте эквивалентный заряд из интегратора кулонометра.
Прямое измерение. Второй малосигнальный монитор тока класса INA199 на вспомогательной шине даст актуальное точное значение для вычитания. Это намного лучше справляется с динамической составляющей тока драйверов затворов, чем статическая модель.
Архитектурная изоляция. Запитывайте MCU от независимого источника, а драйверы затворов — через изолированные DC-DC преобразователи. Это полностью устраняет связь ценой увеличения BOM и площади платы.
Также отмечу: при интересующих токах <500 мА проверьте, не вносит ли напряжение смещения INA240A1 на вашем номинале шунта сопоставимую ошибку. Компенсация не способна восстановить информацию, потерянную на уровне шума.
Все точки питания находятся вне высоковольтного шунта
Все мои точки питания находятся вне высоковольтного шунта, поэтому независимо от того, какая ступень используется как входная и работает ли система в режиме BUCK, система получает питание от входа и вообще не может измерять ток MCU, потому что в этот момент ток через шунт не проходит.
Однако в режиме BOOST MCU получает питание от точки с более высоким напряжением, из-за чего даже если на выходной стороне внешне нагрузка отсутствует, через шунт всё равно протекает ток MCU, что неудобно в режиме малых токов.
Если предположить, что все точки питания находятся внутри высоковольтного шунта
Независимо от того, какая ступень используется как входная, даже когда система не нагружена и нет выходного сигнала, на входе всё равно будет виден ток MCU. В условиях малой мощности это неудобно для расчёта КПД.
Виновата пара диодов Шоттки D17/D6, образующая схему «ИЛИ».
Ей всё равно, работаете вы в режиме Buck или Boost: она ориентируется только на то, «где напряжение выше». В режиме Boost напряжение выше на выходной стороне, поэтому вспомогательное питание начинает потреблять ток с выхода — но энергия на выходной стороне поступает со входа через повышающий индуктор, поэтому входной шунт неизбежно должен учитывать дополнительный ток P_aux/η.
Как исправить: заменить пассивную схему «ИЛИ» на активное переключение.
Используйте P-MOS + малосигнальный NMOS вместо D6 (или замените элементы с обеих сторон). MCU должен управлять включением и выключением в зависимости от текущего режима работы:
Режим Buck (высокое напряжение → низкое напряжение): включить MOS с высоковольтной стороны, отключить с низковольтной, вспомогательное питание брать с высоковольтной стороны
Режим Boost (низкое напряжение → высокое напряжение): включить MOS с низковольтной стороны, отключить с высоковольтной, вспомогательное питание брать с низковольтной стороны
Главный принцип: вспомогательное питание всегда берётся с «входной» стороны силового каскада. Токи силовой части и вспомогательного питания имеют один источник и одно направление, поэтому шунт измеряет их сумму; ток внешней нагрузки = суммарный ток − вспомогательный ток. Но ключевой момент в том, что при нулевой нагрузке показания шунта — это и есть реальный вспомогательный ток. Его можно точно вычитать в ПО, а не позволять автоматическому переключению схемы «ИЛИ» хаотично менять поведение с обеих сторон.
По сути, проблема заключается в том, что в двунаправленной топологии путь тока вспомогательного питания не может одновременно удовлетворять требованиям «чистоты измерений» и «энергия не проходит через шунт». Сейчас нарисую — станет понятно:
Сценарий A: точка питания находится снаружи шунта (ваш текущий вариант)
Режим Buck: напряжение на стороне входа выше → схема «ИЛИ» выбирает вход → ток вспомогательного питания отбирается до входного шунта → входной шунт остаётся «чистым» ✓
Режим Boost: напряжение на стороне выхода выше → схема «ИЛИ» выбирает выход → ток вспомогательного питания отбирается до выходного шунта → но выходная энергия поступает со входа → входной шунт видит дополнительный ток P_aux/(V_in·η) ✗
Сценарий B: точка питания находится внутри шунта
В любом режиме ток вспомогательного питания проходит через шунт → при нулевой нагрузке шунт никогда не показывает ноль ✗
Значит, одним только изменением места точки питания задачу не решить; нужно вводить «осведомлённость о режиме» или «физическую развязку».
Решение 1: активное питание с учётом режима (рекомендуется)
Как уже было сказано выше, вместо диодов используйте MOSFET-ключи, а MCU в зависимости от текущего режима — Buck или Boost — будет управлять тем, с какой стороны отбирать питание, чтобы вспомогательное питание всегда было подключено к стороне входа силового каскада.
Решение 2: программное вычитание в реальном времени (самый простой вариант)
Ток вспомогательного питания = статический ток MCU (порядка мА, почти постоянен) + ток управления затворами (Q_g·f_sw·N, пропорционален частоте переключения). Обе части можно точно смоделировать. В алгоритме управления:
I_load = I_shunt - I_aux / η_buck_aux
Кулонометр тоже должен выполнять это вычитание. Точность можно довести до менее 1%, это намного быстрее, чем переделывать железо.
Приятель, ты слишком усложняешь аппаратные отводы. Ты настроил систему так, что МК питает сам себя от той стороны, где напряжение выше. Это отличная и надёжная схема, чтобы «мозг» не отключался!
Но ты жалуешься, что математика «недружелюбная». Добро пожаловать в физику! В режиме Boost твой МК — это, по сути, нагрузка. Если перенести отводы внутрь шунтов, в режиме Buck у тебя будет ровно та же головная боль, только наоборот.
Не надо ради этого разрабатывать новую плату. Проведи быструю стендовую характеристику: измерь фактический ток, входящий в вывод 3 (VIN) твоего LMR38020, на разных частотах переключения. Сохрани это как таблицу поиска во flash-памяти.
Когда твой код рассчитывает КПД, просто используй: