?

Log in

No account? Create an account

Евгений Музыченко

Previous Entry Share Next Entry
"Инновационный" метод отслеживания уровня заряда батареи
emuzychenko
Изучал свой Zopo C2 на предмет темпов разряда батареи и известной проблемы со скачком уровня при перезагрузке. Подключив через переходник USB Host нагрузку в 0.5 А, быстренько высадил батарею до 82%, после чего напряжение продолжало падать, а процент стоял насмерть. :) Когда дошло до 37xx, не выдержал и выключил телефон. После включения очень удивился, когда снова увидел 82%, а минут через пять, следя за напряжением, которое медленно росло (нормальное явление самовосстановления батареи после снятия повышенной нагрузки), удивился еще больше, поскольку процент начал падать. :)

Такое поведение возможно лишь в том случае, когда процент вычисляется не по напряжению, а по энергии, вытекающей из батареи при разряде (и втекающей в нее при заряде). Погуглив, нашел неофициальное подтверждение. Это объясняет глюки с уровнем заряда, но непонятно другое - на кой черт все это нужно. Безусловно, кто-то занимался разработкой, и даже наверняка получил ништяков за "инновацию", а на самом деле это - голимое вредительство. Даже в устройствах с неизвлекаемой батареей слежение за количеством энергии не позволит сколько-нибудь точно оценить доступную емкость, ибо на нее влияют и температура, и саморазряд, и деградация, и скорость заряда/разряда. А уж там, где батарею приходится извлекать для смены симки или TF-карты, придется как-то оценивать количество запасенной энергии по напряжению, в процессе работы корректировать, причем приемлемую точность можно получить лишь при глубоком разряде батареи, который ей противопоказан, а при частых поверхностных разрядах эта метода даст лишь среднюю температуру по больнице.

Единственный более-менее годный способ отражения уровня заряда у литиевых аккумуляторов - по напряжению на батарее. Поскольку в любом контроллере всегда прошиты константы как минимального напряжения, при котором устройство принудительно отключается (это уровень 0%), так и максимального, при котором отключается зарядная цепь (это уровень 100%), отображаемый уровень можно рассчитывать лишь по текущему и этим двум граничным напряжениям. Для улучшения линейности можно ввести таблицу поправок на мощность (при понижении напряжения батарея на ту же мощность отдает больший ток, отчего садится быстрее), но и только.

При таком отображении пользователь точно знает, что при 100% он имеет полный заряд, а при 1% аппарат очень скоро и неминуемо отключится. Соответственно, низкий уровень заряда побуждает экономить энергию и/или бежать к розетке. Со "следящим" же отображением вблизи нуля будет полная лажа: при достижении нуля телефон с примерно одинаковой вероятностью может как отключиться, так и проработать еще пару часов. Соответственно, делать предсказания по уровню заряда проблематично.

Попутно, перебирая программы, умеющие вести протокол заряда/разряда батареи, нашел Battery Log. Хорошая минималистическая программа, но вот регистрировать изменение напряжения на батарее в отрыве от изменения процентов она не умеет. :( Написал автору - вдруг добавит. :)

Попутно пытался разобраться с CPU Governors, чтобы понять логику подключения/отключения ядер в смартфоне. По умолчанию там стоит режим hotplug (ядра подключаются по мере роста загрузки, и отключаются при ее падении). После перезагрузки в OS Monitor и CPU-Z видно, что в простое отключаются все ядра, кроме нулевого, а нулевое снижает частоту до минимума (497250 кГц). Стоит хоть однажды попытаться поменять governor или минимальную/максимальную частоты с помощью любой из предназначенных для этого программ (CPU Master, SetCPU, No-Frills CPU Control и т.п.), даже после переключения обратно на hotplug и родной диапазон частот, уже не удается добиться отключения первого ядра - оно вместе с нулевым включено всегда, хотя и снижает частоту до минимума. Не говоря уже о том, что после смены режимов в этих программах порой отображаются разные диапазоны частот - похоже, они берут их из разных источников. Только перезагрузка возвращает нормальную логику hotplug - которая, к слову, для меня на данном этапе оптимальна.

Оказалось, что при наличии терминала (который у меня есть) параметры можно менять простым текстовым сообщением соответствующему виртуальному устройству. Классическая линуксовая техника. :)


  • 1
> перебирая программы, умеющие вести протокол заряда/разряда батареи, нашел Battery Log.


#! /bin/bash

FILE="/var/log/temperature/log_b.csv"

C=`cat /sys/class/power_supply/BAT0/energy_now`
D=`cat /sys/class/power_supply/BAT0/energy_full`
E=`cat /sys/class/power_supply/BAT0/energy_full_design`

echo $(date "+%Y,%m,%d,%H,%M"), $(( $C / 1000 )), $(( $D / 1000 )), $(( $E / 1000 )) >>$FILE


как-то так. скрипт в крон ежеминутно, а из лога тем же кроном через гнуплоть создаем страницу.

>снижает частоту до минимума (497250 МГц).

тут где-то десятичная точка пропущена -- 497 ГГц - это не очень минимум =)

Спасибо, но в телефон запихивать скрипт я, скорее всего, уже поленюсь. :)

Размерность действительно напутал, поправил. :)

  • 1