Table of Contents

Где и что измерять?

Измерение процесса зарядки мобильного устройства следует начинать с базовых понятий: что и где мы измеряем. Ответ на вопрос “что?” проще, мы измеряем силу тока и напряжение, а также зависящие от них потребленная энергия, мгновенная мощность и уровень заряда аккумулятора. Вопрос “где?” сложнее, потому что содержит несколько точек для измерения. Поступившись точностью, мы смешаем воедино аппаратные и программные точки измерения.

Выход блока питания

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

Разъем телефона

Вторая точка - это измерение непосредственно у входа в телефон. Разница с первой точкой только в падении напряжения. Для малых токов несущественно, а для условных 2-5A уже заметно. На кабеле 1+ (их кабели рассчитаны на высокие токи) на 6.5A напряжение падает с 9.2V до 8.8V. Это 2.6W, немного. Но на плохом кабеле можно получить намного большую потерю мощности. Ток в двух точках одинаков. Так что при использовании одного кабеля смысла снимать показания в двух точках нет, можно разово оценить показания потерь. Измерение около телефона полезнее, потому что это те параметры, которые использует микросхема управления зарядкой в телефоне для тонкой подстройки параметров зарядки в случае PPS или SVOOC. Показательный пример: управвление зарядкой svooc в телефоне (дальше будем использовать термин BMS) управляет напряжением, которое выставляет зарядка так, чтобы в телефон попадало напряжение, равное напряжению на аккумуляторе. Сама зарядка в теории может снять напряжение с аккумулятора (если прекратит зарядать и измерит напряжение), но ей самой сложно скорректировать падение на кабеле.

Разъем аккумулятора

Самые важные показатели - это ток и напряжение на самом аккумуляторе. Эти показатели могут сильно отличаться от значений на кабеле, преобразованием тока и напряжения занимается BMS (battery management system). BMS должно подавать на аккумулятор напряжение, сопоставимое с напряжением на нём (3.7-4.4V) и допустимый ток. Преобразование входных параметров в целевые - это большая и сложная тема, которая пытается одновременно решить вопрос эффективной передачи большой мощности по кабелю и минимизацию потерь при преобразованию параметров. Для понимания того, как реализовывают быструю зарядку можно посмотреть видео: Как реализована быстрая зарядка.

Еще одна ожидаемая особенность параметров на аккумуляторе - это то, что там учитывается и процесс заряда и процесс разряда, то есть суммарный ток равен разности токов зарядки и тока потребления сточностью до знака. Потому что знак силы тока может быть положительным для расхода и отрицательным для зарядки. К сожалению, до снятия показаний на аккумуляторе нельзя добраться без вскрытия телефона. Поэтому мы будем смотреть на то, что можно получить из софтверных источников, из логов Андроида.

Лог Андроида

Мы немного изменим порядок извлечения данных, потому что для понимания того, что можно извлечь из низкоуровневых логов нужно понять, что не так с высокоуровневыми. Под высокоуровневыми мы понимаем то, что можно получить из штатного BatteryManager API. Это уровень, который используют приложения AccuBattery и Battery guru. При этом данные, которые получает этот уровень могут отличаться от того, что реально измеряется на аккумуляторе. Вот два простых примера

Устройство Напряжение в APIНапряжение на проводеТок в APIТок на проводеДетали
OnePlus 13 U_battery/2 U_batteryI_batteryI_battery Напряжение батареи с двумя ячейками показывается в пересчете на ячейку
OnePlus Pad 3 U_battery U_battery*2 I_battery I_battery/2 Батарея с одной ячейкой, но BMS уменьшает напряжение с увеличением тока

Видно, что параметры, которые видит BM API подгоняются под правдоподобные значения с точки зрения “ожидаемых” значений. Но эти “ожидаемые” значения могут вызывать вопросы. На 1+13 возвращается напряжение, приведенное к одной ячейке из двух и фактический ток. Это приводит к тому, что приложения вычисляют половину фактической переданной в телефон энергии. То есть в случае 1+13 параметры на проводе у телефона совпадают с параметрами на аккумуляторе (поэтому svooc и не греет телефон) и отличаются от параметров в статистике BM API. В случае 1+Pad 3 мы получаем другой эффект. С точки зрения принятой энергии вопросов нет, уменьшение напряжения на проводе компенсирует увеличение тока на аккумуляторе. В этом случае параметры на проводе отличаются от параметров в BM API. И мы можем догадываться, что параметры в BM API скорее всего совпадают с тем, что можно измерить на аккумуляторе. В рамках одного вендора мы можем увидеть два разных подхода к данным, которые получает андроид. У подходов есть общее - напряжение приводится к одной литиевой ячейке, а вот возвращаемый ток всегда честный. Но в случае батареи из двух ячеек это приводит к неправильному учёту энергии. В AccuBattery/BatteryGuru есть опции для коррекции возращаемых значений в случае двухячеечных батарей, но и эти параметры следует выставлять с пониманием фактической конфигурации ячеек батареи. В 15-16 версиях андроида в логе (adb logcat) есть универсальная запись с параметрами аккумулятора. Эта запись совпадает с тем, что показывают AccuBattery/BatteryGuru и может быть использовано для дальнейшей обработки.

healthd : system healthd: battery l=87 v=4523 t=38.8 h=2 st=2 c=-2931 fc=5920000 cc=122 chg=a

Лог низкоуровнего драйвера

На некоторых устройствах есть возможность изучать параметры, которыми оперирует сервис вендора. Эти параметры полезны для понимания того, как коррелируют параметры на аккумуляторе и в логе андроида, а также увидеть дополнительные параметры, которые не транслируются на уровень андроида. Примером может послужить очень полезная запись из лога 1+13, в котором уровень зарядки и время до 100% присутствует в двух видах: то, что учитывает сервис и то, что он показывает на экране

charge_time: type=svooc,reserve_soc=0,soc=19,ui_soc=21,current=8092,avg=8100,not_chg_cnt=0,stable_cnt=12,fcc=5908,fcc_ratio=99,delta=1,debug=0,region=7,ttf=1912(00:31:52),ui_ttf=2178(00:36:18)