3

我正在尝试从 NDK 应用程序读取电池信息。我知道实现这一点的唯一方法是读出这些值/sys/class/power_supply。我的困难是我找到了多个“电池”类型的条目,但我不知道该使用哪一个。

在带有 KitKat 4.4.4 的 Nexus 10 上,我看到:

$ ls /sys/class/power_supply
ds2784-fuelgauge
manta-battery
smb347-battery
# other non-battery entries

所有三个都使用 type=Battery。例如:

$ cat /sys/class/power_supply/ds2784-fuelgauge/type
Battery

在 AndroidBatteryManager代码中,他们只是遍历电池设备并获取第一个具有所需条目的设备(http://androidxref.com/4.4.4_r1/xref/system/core/healthd/BatteryMonitor.cpp)。但是,在我的 Nexus 10 上,它们具有不同的值。例如,对于ds2784-fuelgauge/voltage_nowsmb347-battery/voltage_now

$ cat ds2784-fuelgauge/voltage_now
4153100
$ cat smb347-battery/voltage_now
4300000

ds2784-fuelgauge/voltage_now似乎定期更新(例如,当我开始计算繁重的任务时它会改变),但smb347-battery/voltage_now似乎是固定的。当我比较ds2784-fuelgauge/current_now和时,我看到了类似的效果smb347-battery/current_now

我的问题是:

  1. 为什么这里有多个 type=battery 条目?
  2. 我如何以一般方式区分它们?
  3. 我应该使用哪一个?

编辑

  • voltage_now修复了文件名中的错字
  • 强调所有三个设备的 type=Battery
4

2 回答 2

5

在 Android 设备上,您可能有多个电池,例如 RTC 或其他外围设备的备用电池。您是否已经对所有 3 个 sysfs 条目的类型文件进行了分类?对于所有 3 你得到“电池”?

考虑到 Android 需要电池的几个参数(见下文),我可能猜想它们在你得到的那 3 个 sysfs 文件中被分割。

例如,电量计是读取来自/流向电池的电流并计算剩余容量的硬件组件,因此从中读取容量文件应该为您提供百分比,但可能是从另一个文件中读取电压。

电池参数(即:/sys/class/power_supply/my_batt/status):

  • 状态:正在充电、正在放电、未充电、已满、未知
  • 健康(字符串):冷、死亡、良好、过热、过电压、未指定故障、未知
  • 存在(int):存在时为 1
  • 容量(int):97 表示 97%
  • voltage_now(以 uV 为单位)或 batt_volt(以 mV 为单位):4205000 表示 4205000 uV = 4.205 V
  • temp 或 batt_temp(十分之一°C):305 表示 30.5°C
  • 技术(字符串):锂离子
于 2014-12-16T11:22:43.427 回答
1

您的问题是关于使用哪个来源,以及大概如何以编程方式确定它。

对于所有安卓设备,您应该使用电量计。

连结 10:

根据source.android.com 关于测量 Android 设备功率的官方文档,对于您的 Nexus 10,您应该使用 Dallas Semiconductor DS2784 。SMB347在同一文档中 被列为电量计,尽管它可能是电池充电器。我这么说是因为芯片的数据表将其列为电池充电器,这可以解释为什么它具有恒定电压 (CV)。(CV 源在 4.2V 下运行,这是锂离子电池功率曲线的渐近高端。)

系统文件系统

您使用的是 Android 4.4.4。在撰写本文时,Android M 处于开发者预览阶段,并且 Android 5.1.1 已经发布。因此,如果您升级手机,/sys 文件系统 (SysFS) 的映射可能会有所不同。换句话说,YMMV。

ON BKG:锂电池

  • 几乎所有锂离子电池的最大/充电电压为 4.2V。
    2015 年一些较新的锂聚合物电池的最大值为 4.35V,而不是 4.2V。这是锂离子化学的结果(以及由于该领域的进步而被认为是可接受的电池电极退化)。

  • 锂离子电池从 100% 充电到 1% 或 0% 充电时,电压会发生很大变化。预期范围为 3.0V 至 4.2V。

  • 所有锂电池都不可恢复地损坏,如果它们放电过多,可能会造成潜在的火灾危险。正因为如此,使用锂*电池的设备必须有某种调节电路,这可能还由软件中的某些东西控制,而不仅仅是硬件/固件。截止电压介于 3.0V 和 3.6V 之间。所用截止电压的选择取决于安全性与容量设计选择,尽管电池在最后几个 100mV 放电时存储的电池能量非常低。功率曲线有点奇怪。请参阅放电曲线(电压与剩余容量的关系,以 mAh 表示),例如下面引用的数据表中的曲线。

  • 正因为如此,使用锂电池的现代设备必须使用诸如电量计之类的东西来报告当前电压。

参考:

数据表

峰会 SMB347 数据表

(没有足够的声望点)。另请参阅 18650 数据表,例如 Panasonic 18650 的数据表,其中 Panasonic 是众多锂*电池制造商之一,特斯拉更喜欢以行业设置的方式与之合作。

于 2015-09-08T03:59:24.420 回答