專欄文章目錄傳送門:返回專欄目錄
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等更復雜的充電芯片和電量計。