===== Где и что измерять? ===== Измерение процесса зарядки мобильного устройства следует начинать с базовых понятий: что и где мы измеряем. Ответ на вопрос "что?" проще, мы измеряем силу тока и напряжение, а также зависящие от них потребленная энергия, мгновенная мощность и уровень заряда аккумулятора. Вопрос "где?" сложнее, потому что содержит несколько точек для измерения. Поступившись точностью, мы смешаем воедино аппаратные и программные точки измерения. ==== Выход блока питания ==== Первая точка - выход из блока питания. Для измерения нужно подключить 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) и допустимый ток. Преобразование входных параметров в целевые - это большая и сложная тема, которая пытается одновременно решить вопрос эффективной передачи большой мощности по кабелю и минимизацию потерь при преобразованию параметров. Для понимания того, как реализовывают быструю зарядку можно посмотреть видео: [[https://www.youtube.com/watch?v=1nx_n-wEtII|Как реализована быстрая зарядка]]. Еще одна ожидаемая особенность параметров на аккумуляторе - это то, что там учитывается и процесс заряда и процесс разряда, то есть суммарный ток равен разности токов зарядки и тока потребления сточностью до знака. Потому что знак силы тока может быть положительным для расхода и отрицательным для зарядки. К сожалению, до снятия показаний на аккумуляторе нельзя добраться без вскрытия телефона. Поэтому мы будем смотреть на то, что можно получить из софтверных источников, из логов Андроида. ==== Лог Андроида ==== Мы немного изменим порядок извлечения данных, потому что для понимания того, что можно извлечь из низкоуровневых логов нужно понять, что не так с высокоуровневыми. Под высокоуровневыми мы понимаем то, что можно получить из штатного BatteryManager API. Это уровень, который используют приложения AccuBattery и Battery guru. При этом данные, которые получает этот уровень могут отличаться от того, что реально измеряется на аккумуляторе. Вот два простых примера ^Устройство ^Напряжение в API^Напряжение на проводе^Ток в API^Ток на проводе^Детали ^ |OnePlus 13 | U_battery/2| U_battery|I_battery|I_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)