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,一经查实,立即删除!

相关文章

基础复习---二进制补码

1.二进制补码表示法基于以下原理&#xff1a; 正数的补码&#xff1a;正数的补码与其原码&#xff08;即直接表示的二进制形式&#xff09;相同。 负数的补码&#xff1a;负数的补码是其绝对值的二进制表示&#xff08;即正数的补码&#xff09;&#xff0c;然后取反&#xff…

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

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

rocketmq No route info of this topic 问题排查

Broker配置项 autoCreateTopicEnable true 如果是单节点(master),注释掉这里的配置 #有三个值&#xff1a;SYNC_MASTER&#xff0c;ASYNC_MASTER&#xff0c;SLAVE&#xff1b;同步和异步表示Master和Slave之间同步数据的机制&#xff1b; #brokerRole SYNC_MASTER Pytho…

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] 土地分配 (100分) - 三语言AC题解(Python/Java/Cpp)

🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 💻 ACM银牌🥈| 多次AK大厂笔试 | 编程一对一辅导 👏 感谢大家的订阅➕ 和 喜欢💗 📎在线评测链接 土地分配(100分) 🌍 评测功能需要订阅专栏后私信联系清隆解…

阿里云盘手机批量修改文件名

背景 目前刷剧都会使用阿里云盘配合infuse,但是从网上找到的资源经常命名不符合Infuse的刮削规范,导致无法正确建立元数据,虽然PC端可以使用油猴脚本批量修改电视剧名称, 但是经常出现身边并没有电脑(或者电脑上没有油猴脚本)的情况,这时候用手机就很难批量修改文件名,虽然iph…

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

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

游戏心理学Day05

第三章 游戏即学习 《超级马里奥》是游戏史上的经典之作&#xff0c;我们都记得第一次踩到敌人&#xff0c;第一次顶碎砖块时的快乐&#xff0c;也记得为了通过某个关卡而付出的努力和艰辛。当我们掌握了规律和技巧之后&#xff0c;这些难题就不再是难题&#xff0c;因为我们习…

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…

JS包装类:循环中为什么建议用变量存储str.length进行循环判断?

前言 在Javascript通常我们在遍历一个字符串的时候通常使用的方式是 var str "abcdefg"; for(let i0;i<str.length;i){}但在最近的学习中&#xff0c;有人建议我最好应该是下面这样执行。 var str "abcdefg"; for(let i0,len str.length;i<len;i)…

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;于是飞…

llvm 常用命令备忘

执行 IR 上的指令合并优化 pass $ opt –S –instcombine testfile.ll –o output1.ll 执行无效参数优化 pass $ opt –S –deadargelim testfile.ll –o output2.ll C 语言生成 IR 文件 $ clang -emit-llvm -S multiply.c -o multiply.ll C 语言生成 IR 文件 $ clang -cc1 -…

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

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

使用JavaScript实现网页通知功能

如何使用js来实现网页通知功能。即使在用户浏览其他页面时&#xff0c;也能向他们推送通知信息。 废话不多说直接上代码 function showAutoNotification() {if ("Notification" in window) {Notification.requestPermission().then(function(permission) {if (permis…

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

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

Vue 的服务端渲染(SSR)有哪些钩子可以用

在 Vue 的服务端渲染&#xff08;SSR&#xff09;过程中&#xff0c;并不会执行完整的生命周期钩子&#xff0c;只有一部分钩子会在服务器端执行。以下是 Vue SSR 中支持的生命周期钩子&#xff1a; beforeCreate&#xff1a;在实例初始化之后&#xff0c;数据观测 (data obser…