NXP i.MX8系列平台开发讲解 - 3.14 Linux 之Power Supply子系统(二)

专栏文章目录传送门:返回专栏目录

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 ChargeQuick Charge 1.0, 2.0, 3.0, 4, 4+, 518W (QC 1.0), 36W (QC 2.0), 18-20W (QC 3.0), 100W (QC 4+), 100W+ (QC 5)通过调整电压和电流以实现快充,版本逐渐提升功率和效率
MediaTek Pump ExpressPE1.0, PE2.0, PE3.0, PE4.010W (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 VOOCVOOC 1.0, VOOC 2.0, VOOC 3.0, VOOC 4.05V/4A (VOOC 1.0), 5V/5A (VOOC 2.0), 5V/6A (VOOC 3.0), 10V/6.5A (VOOC 4.0)通过增加电流实现快充
Huawei SuperChargeSCP 1.0, SCP 2.0, SCP 3.022.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等更复杂的充电芯片和电量计。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/22737.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

代码随想录算法训练营第十三天| 102. 二叉树的层序遍历、226.翻转二叉树、101. 对称二叉树

102. 二叉树的层序遍历 题目链接&#xff1a;102. 二叉树的层序遍历 文档讲解&#xff1a;代码随想录 状态&#xff1a;dfs没写出来&#xff0c;bfs不知道如何分层 import java.util.*;public class BinaryTreeLevelOrderTraversal {// 用于存储每一层的节点值List<List<…

Etcd Raft架构设计和源码剖析2:数据流

Etcd Raft架构设计和源码剖析2&#xff1a;数据流 | Go语言充电站 前言 之前看到一幅描述etcd raft的流程图&#xff0c;感觉非常直观&#xff0c;但和自己看源码的又有些不同&#xff0c;所以自己模仿着画了一下&#xff0c;再介绍一下。 下图从左到右依次分为4个部分&…

Windows 宿主机访问 VirtualBox 虚拟机中创建的 docker 容器中的 mysql8.0 的数据

一、场景需求 在开发环境中&#xff0c;一般使用 windows 系统进行开发&#xff0c;但需要在 linux 系统中创建运行 mysql8.0 的 docker 容器中进行测试&#xff08;win10特定版本或win11才能安装 docker&#xff09;&#xff0c;为了方便还需要在 windows 系统中通过 SQLyog …

植物大战僵尸杂交版2.0.88最新版+防闪退工具V2+修改工具+高清工具

植物大战僵尸杂交版&#xff0c;不仅继承原作的经典玩法&#xff0c;而且引入了全新的植物融合玩法&#xff0c;将各式各样的植物进行巧妙的杂交&#xff0c;孕育出前所未有、功能各异的全新植物。 创新的杂交合成系统 游戏引入了创新的杂交合成系统&#xff0c;让玩家可以将不…

Unity DOTS技术(五)Archetype,Chunk,NativeArray

文章目录 一.Chunk和Archetype什么是Chunk?什么是ArchType 二.Archetype创建1.创建实体2.创建并添加组件3.批量创建 三.多线程数组NativeArray 本次介绍的内容如下: 一.Chunk和Archetype 什么是Chunk? Chunk是一个空间,ECS系统会将相同类型的实体放在Chunk中.当一个Chunk…

DP读书:《ModelArts人工智能应用开发指南》(一)人工智能技术、应用平台

怎么用ModelArts人工智能应用 训练底座训练案例 盘古矿山模型Main config.py 训练底座 训练案例 盘古矿山模型 Main 下面是快速助手 https://support.huaweicloud.com/qs-modelarts/modelarts_06_0006.html 准备开发环境 在ModelArts控制台的“ 开发环境 > Notebook”页面…

【C#学习笔记】属性和字段

文章目录 前言属性和字段的区别字段访问修饰符和关键字定义变量类型的定义变量命名变量的赋值 属性 不同的使用情况 前言 最近在工作的过程中常常会觉得自己在程序设计方面的能力还是有欠缺。例如一直对于变量的声明感到不足&#xff0c;在工作中为了图方便总是直接public定义…

声音突破:so 索

小孩儿看完武侠剧&#xff0c;就决定从二楼往地面上跳&#xff0c;年轻的老妈看到了&#xff0c;就在那里骂&#xff0c;喝斥不准逞能&#xff0c;不许乱来&#xff0c;不许跳。但小孩子不听话&#xff0c;心里全是影视剧的画面&#xff0c;那叫一个侠之能也&#xff0c;于是飞…

面向长文本处理的键值缓存压缩技术:智能压缩,无损性能,免微调

随着输入长度的增加&#xff0c;大型语言模型&#xff08;LLMs&#xff09;中的键值&#xff08;KV&#xff09;缓存需要存储更多的上下文信息以维持性能&#xff0c;这导致内存消耗和计算时间急剧上升。KV缓存的增长对内存和时间效率的挑战主要表现在两个方面&#xff1a;一是…

元宇宙数字藏品交易所,未来发展的大趋势

随着科技的飞速进步&#xff0c;元宇宙以其独特的魅力为数字世界绘制了一幅前所未有的宏伟蓝图。在这一宏大的背景下&#xff0c;数字藏品交易所作为连接虚拟与现实的桥梁&#xff0c;正以其卓越的优势&#xff0c;引领着数字藏品市场迈向新的高度。 首先&#xff0c;元宇宙为…

【相关概念】经济金融中的Momentum

张张张三丰de思考与总结&#xff1a; 最近做的期货价格泡沫中&#xff0c;一直在说&#xff0c;momentum&#xff0c;momentum&#xff0c;momentum&#xff0c;那么究竟什么是momentum呢&#xff1f; 目前&#xff0c;在有关期货价格泡沫的研究文献中&#xff0c;一般都是研究…

本轮牛市新趋势,跟随The First捕捉牛市Alpha

与以往牛市“百花齐放”的繁荣景象相比&#xff0c;本轮牛市颇具独特走势&#xff0c;呈现出了资金集中度高、财富聚集效应小的特点&#xff0c;绝大部分加密资产甚至跑不赢BTC的涨幅幅度。而以往大放色彩的公链币价值币的走势&#xff0c;甚至比不过牛尾才爆发的MEME币。这使得…

Java项目之消息队列(手写java模拟实现mq)【三、MQ的核心类-消息类的存储(用文件存储消息)】✔ ★

Java项目之MQ 七. 消息存储设计设计思路为什么要用文件存储文件存储结构queue_data.txt ⽂件格式:queue_stat.txt ⽂件格式: 创建 MessageFileManager 类定义一个内部类, 来表示该队列的统计信息 Stat实现统计⽂件Stat读写&#xff08;文本文件的读写&#xff09;InputStream—…

python爬虫入门教程(一)

上一篇文章讲了爬虫的工作原理&#xff0c;这篇文章以后就要重点开始讲编程序了。 简单爬虫的的两个步骤&#xff1a; 使用HTTPRequest工具模拟HTTP请求&#xff0c;接收到返回的文本。用于请求的包有: requests、urllib等。 对接收的文本进行筛选,获取想要的内容。用户筛选文…

JavaScript-内存分配,关键字const

内存空间 内存分为栈和堆 栈&#xff1a;由操作系统自动释放存放的变量值和函数值等。简单数据类型存放在栈中 栈会由低到高先入后出 堆&#xff1a;存储引用类型 &#xff08;数组&#xff0c;对象&#xff09; 对象会先将数据存放在堆里面&#xff0c;堆的地址放在栈里面 关键…

VMD-PSO-LSTM单维时序预测模型(单输入单输出)-附代码

VMD-PSO-LSTM单维时序预测模型&#xff08;单输入单输出&#xff09; 1&#xff09;首先对原始单维数据进行VMD分解&#xff0c;分解为K个模态分量和1个残差分量 2&#xff09;将各个模态分量输入模型&#xff0c;建立模型进行预测 3&#xff09;将各个预测结果相加得到最终…

clickhouse(十五、存储优化实践)

文章目录 背景问题定位优化方式排序键设计写入顺序压缩算法 DoubleDeltaLowCardinality避免使用Nullable 总结 背景 clickhouse集群容量告警&#xff0c;项目中某些表占据大量的存储空间&#xff0c;借此机会对ck的存储优化进行实践学习&#xff0c;并通过多种方式测试验证优化…

React(五)useEffect、useRef、useImperativeHandle、useLayoutEffect

(一)useEffect useEffect – React 中文文档 useEffect hook用于模拟以前的class组件的生命周期&#xff0c;但比原本的生命周期有着更强大的功能 1.类组件的生命周期 在类组件编程时&#xff0c;网络请求&#xff0c;订阅等操作都是在生命周期中完成 import React, { Com…

【前端】响应式布局笔记——flex

二、Flex Flex(FlexiableBox:弹性盒子&#xff0c;用于弹性布局&#xff0c;配合rem处理尺寸的适配问题)。 1、flex-direction:子元素在父元素盒子中的排列方式。 父级元素添加&#xff1a;flex-direction: row; 父级元素添加&#xff1a;flex-direction: row-reverse; 父…