专栏文章目录传送门:返回专栏目录
Hi, 我是你们的老朋友,主要专注于嵌入式软件开发,有兴趣不要忘记点击关注【码思途远】
目录
1. 前言
2. 芯片简介
2. 系统原理设计
2. 设备树相关
本文实操是基于Android11 系统下i.MX8MQ环境下:
-
cpu: i.mx8mq
-
Kernel version:kernel 5.4
-
开发板:imx8mq-librem5-devkit
1. 前言
根据前一章节讲解相关Power Supply子系统,本章节将以一个实际例子进行说明,重点说明充电芯片与电量计这两个部分。
介绍之前先介绍一些相关的概念知识;
充电模式:
充电模式 (Charging Mode) | 描述 (Description) | 适用情况 (Applicability) |
---|---|---|
恒流充电 (Constant Current) | 充电电流保持恒定,电池以恒定速率充电 | 适用于电池的初期充电,能够更快地达到一定电荷状态 |
恒压充电 (Constant Voltage) | 充电电流逐渐减少,电压保持恒定以避免过充 | 适用于电池的后期充电,避免过充和过热 |
脉冲充电 (Pulse Charging) | 在恒定电流和恒定电压充电模式之间切换,提高充电效率 | 适用于快速充电,可以提高充电速度和效率 |
阶段充电 (Step Charging) | 初始充电电流较低,逐渐增加,减少充电过程中的热量产生 | 适用于大容量电池,减少充电过程中的发热和压力 |
温度补偿充电 (Temperature-Compensated Charging) | 根据电池温度调整充电策略,以保持最佳充电效率和寿命 | 适用于各种环境温度下,优化充电性能和电池寿命 |
快速充电 (Fast Charging) | 增加充电电流和电压以实现更快的充电速度 | 适用于快速充电需求,可以在短时间内充满电池 |
自适应充电 (Adaptive Charging) | 根据电池状态和健康情况自动调整充电策略,以优化充电性能 | 适用于不同电池类型和容量,实现最佳充电性能和寿命 |
为什么会有这么多种充电模式?
答:充电模式是充电管理芯片用来控制和管理电池充电过程的不同工作状态。不同的充电模式可以根据电池的状态和需求,采取不同的充电策略,以达到更高的充电效率、更长的电池寿命或其他特定的目标。
快充协议:
快充协议,主要涉及到不同手机制造商采用的不同技术和协议。以下是一些主要的快充协议以及它们的一些特点,以便进行对比:
快充协议 (Fast Charging Protocol) | 版本 (Version) | 最大功率 (Maximum Power) | 描述 (Description) |
---|---|---|---|
Qualcomm Quick Charge | Quick Charge 1.0, 2.0, 3.0, 4, 4+, 5 | 18W (QC 1.0), 36W (QC 2.0), 18-20W (QC 3.0), 100W (QC 4+), 100W+ (QC 5) | 通过调整电压和电流以实现快充,版本逐渐提升功率和效率 |
MediaTek Pump Express | PE1.0, PE2.0, PE3.0, PE4.0 | 10W (PE1.0), 20W (PE2.0), 30W (PE3.0), 45W (PE4.0) | 根据电池状态和温度动态调整充电速度 |
USB Power Delivery (USB PD) | USB PD 2.0, USB PD 3.0, USB PD 3.1, USB PD 3.1 PPS | 最高100W (USB PD 2.0), 最高100W (USB PD 3.0), 最高240W (USB PD 3.1) | 通用标准,支持更高功率的充电 |
Oppo VOOC | VOOC 1.0, VOOC 2.0, VOOC 3.0, VOOC 4.0 | 5V/4A (VOOC 1.0), 5V/5A (VOOC 2.0), 5V/6A (VOOC 3.0), 10V/6.5A (VOOC 4.0) | 通过增加电流实现快充 |
Huawei SuperCharge | SCP 1.0, SCP 2.0, SCP 3.0 | 22.5W (SCP 1.0), 40W (SCP 2.0), 66W (SCP 3.0) | 高电压高电流充电技术 |
Samsung Adaptive Fast Charging | 无版本号 | 15W (最大) | 根据设备状态调整充电策略 |
对于快充能够到达多少W,支持什么协议,对于选择充电芯片就比较重要了。
为什么会有那么多种充电协议?
不同厂家存在竞争,营销策略,技术保护等等
以下内容将重点介绍充电芯片,电量计两个方面:
开发板:imx8mq-librem5-devkit
充电芯片:bq25896
电量计芯片:MAX17055
2. 芯片简介
bq25896 是德州仪器(Texas Instruments)公司生产的一款高度集成的锂电池充电管理芯片。它是一款用于移动设备、嵌入式系统以及一些便携式应用的充电管理解决方案。bq25896 在一颗芯片内部集成了多个关键的功能模块,以实现高效的充电控制和管理,同时提供了一些配置选项,使其适应不同的应用场景。
以下是 bq25896 的一些主要特性和功能:
高度集成的设计:bq25896 集成了充电管理所需的多个功能模块,包括电流和电压调节、充电模式控制、温度监测、电池状态检测等。这种高度集成的设计减少了外部元件的数量,降低了电路板的复杂性和成本。
多种充电模式:bq25896 支持多种充电模式,如恒流充电、恒压充电、脉冲充电等。这使得充电过程可以根据不同的电池类型和状态进行优化,以提高充电效率和电池寿命。
可编程电流和电压限制:bq25896 允许用户通过配置来设定最大充电电流和电压,以适应不同类型和容量的电池。
温度监测和保护:内置的温度监测电路可以实时检测电池温度,当温度超过设定的阈值时,bq25896 可以触发保护措施,以确保充电过程的安全性。
电池状态检测:bq25896 可以监测电池的电压、电流和温度等状态信息,实时反馈电池的健康状态,有助于提供更准确的充电控制。、
USB 快充支持:bq25896 支持一些 USB 快充协议,如 USB Power Delivery(USB PD)和 Qualcomm Quick Charge 等,可以实现更快的充电速度。
硬件保护功能:bq25896 集成了多个硬件保护功能,如过温保护、过压保护、过流保护等,以确保充电过程的安全性和稳定性。
低功耗模式:bq25896 提供了低功耗模式,以降低待机状态下的功耗,延长系统的电池续航时间。
简化原理图
MAX17055
Maxim MAX17055单节电池电量计是一款工作电流低至7μA的电量计,实施了Maxim ModelGauge™ m5 EZ算法。ModelGauge m5 EZ通过消除电池特征化要求让电量计的应用更加轻松,并且简化了主机软件互动。ModelGauge m5 EZ 稳健算法可为大多数锂电池和应用提供针对电池多样性的容限。ModelGauge m5 EZ算法将库仑计数器的短期精度和线性度与基于电压的电量计的长期稳定性以及温度补偿相结合。
MAX17055可自动补偿电池老化、温度和放电速率。该器件还可提供精确的充电状态(SOC的百分比)以及以毫安时 (mAh) 计的剩余容量。随着电池接近电量耗尽临界区,ModelGauge m5算法会激活特殊补偿以消除任何错误。它还提供了三种报告电池寿命的方法:容量降低、电池电阻增加以及码表。
2. 系统原理设计
系统这里主要介绍三个部分,一个是充电芯片,电量计,还有一个是TYPE-C芯片
TPS65982 是 USB Type-C 和供电 (PD) 控制器;BQ25895作为充电芯片,MAX17055作为电量计芯片,它们的配置都通过I2C进行通信配置,有Soc进行对寄存器的设置。
电路图
2. 设备树相关
首先查看设备数相关设置:
vim ./arch/arm64/boot/dts/freescale/imx8mq-librem5-devkit.dts
charger@6b { /* bq25896 */compatible = "ti,bq25890";reg = <0x6b>;pinctrl-names = "default";pinctrl-0 = <&pinctrl_charger>;interrupt-parent = <&gpio3>;interrupts = <25 IRQ_TYPE_EDGE_FALLING>;ti,battery-regulation-voltage = <4192000>; /* 4.192V */ //设置的电池充电过程中的调整电压,单位为微伏ti,charge-current = <1600000>; /* 1.6A */ //充电电流设置ti,termination-current = <66000>; /* 66mA */ //终止电流设置ti,precharge-current = <130000>; /* 130mA */ //预重电流ti,minimum-sys-voltage = <3000000>; /* 3V */ //最小系统电压ti,boost-voltage = <5000000>; /* 5V */ // 提升电压ti,boost-max-current = <50000>; /* 50mA */ //提升最大电流};
从设备树查看,很多都是设置相关的电流电压值,这些值的匹配都需要根据实际情况进行填入;
从代码从probe查看
bq25890_probedevm_regmap_init_i2c //创建一个适用于I2C总线的寄存器映射,用于与充电控制芯片的寄存器进行通信bq25890_get_chip_version //获取充电控制芯片的版本信息,用于后续的操作和识别bq25890_fw_probe //读取设备属性,可能包括固件版本bq25890_hw_init // 初始化芯片,设置寄存器相关devm_request_threaded_irq //中断配置bq25890_power_supply_init // power supply 设备的注册,将传输bq25890的信息
在bq25890设置了一个中断检测是否充电,`power_supply_desc
结构体的填充:
static const struct power_supply_desc bq25890_power_supply_desc = {.name = "bq25890-charger",.type = POWER_SUPPLY_TYPE_USB,.properties = bq25890_power_supply_props,.num_properties = ARRAY_SIZE(bq25890_power_supply_props),.get_property = bq25890_power_supply_get_property,
};
关于bq25890的重要信息都要提供给power supply
max17055设备树:
bat: fuel-gauge@36 {compatible = "maxim,max17055";reg = <0x36>;interrupt-parent = <&gpio3>;interrupts = <20 IRQ_TYPE_LEVEL_LOW>;pinctrl-names = "default";pinctrl-0 = <&pinctrl_gauge>;maxim,over-heat-temp = <700>; //过热温度的阈值maxim,over-volt = <4500>; //过压的阈值maxim,rsns-microohm = <5000>; //电池内阻的值};
对于这个max 17055设备树,主要设置了一个中断引脚,设置一些最大温度,最大电压,还有电池内阻值,这些一般都需要根据实际电池进行设置。
根据probe查看:
max17042_probedevm_regmap_init_i2c //用于与I2C总线上的寄存器进行通信devm_power_supply_register //将会注册power supplydevm_request_threaded_irq
power_supply_desc结构体
static const struct power_supply_desc max17042_psy_desc = {.name = "max170xx_battery",.type = POWER_SUPPLY_TYPE_BATTERY,.get_property = max17042_get_property,.set_property = max17042_set_property,.property_is_writeable = max17042_property_is_writeable,.external_power_changed = max17042_external_power_changed,.properties = max17042_battery_props,.num_properties = ARRAY_SIZE(max17042_battery_props),
};
设备启动成功后,就可以通过/sys/class/power_supply看到类似的设备:
通过sysfs可以看到power supply 的寄存器相关信息
能查看这些基本上就可以成功了。
后续有机会介绍bq2570a等更复杂的充电芯片和电量计。