IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> 14.嵌入式控制器EC实战 SMBus读取电池信息并控制充放电 -> 正文阅读

[嵌入式]14.嵌入式控制器EC实战 SMBus读取电池信息并控制充放电


在EC中,除了使用SMBus读取温度传感器信息外,SMBus的另外一个用途是笔记本智能充放电管理,这路SMBus会与控制充放电的芯片和智能电池连接起来,通过读取智能电池的状态来控制充放电芯片对智能电池进行充放电管理,以电池充电管理芯片ISL88731CHRTZ-T为例进行介绍,具体的连接方式如下所示:

EC的同一路SMBus下挂在了两个从设备,分别是智能电池和充放电管理芯片,他们的地址分别是:

  • 充放电芯片ISL88731C的设备地址为 00010010,十六进制表示为0x12;
  • 智能电池的地址为0x16;地址宏定义如下:
#define SMBA_DEV1_ADDR              0x16    //Smart Battery
#define SMBA_DEV3_ADDR              0x12    //Smart Charger

1.充放电芯片初始化

充放电芯片ISL88731C的各个引脚及电路图:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7Lj0LlTh-1652761739581)(https://files.mdnice.com/user/30213/3ddd79aa-719c-42b3-8f9c-a0f216f60021.png)]

看到电路图中,EC_SMB_CK1和EC_SMB_DA1是直接连接到EC上面的,剩下需要关注的引脚有ACIN和ACOK,这里不过多的讲解硬件知识以及充电的具体过程,这里只介绍充放电芯片和EC的通信过程,首先适配器插入,插入后适配器电压通过ACIN输入到充放电芯片中,当充放电芯片正常工作后,会通过ACOK引脚输出一个高电平,这个引脚直接连接到了EC的GPIO引脚上,EC将该GPIO引脚设置为输入模式,当读取到该引脚为高电平时,EC会将内部用来表示适配器状态的信息更新为适配器插入,并通过SCI中断通知操作系统,适配器接入了。此时EC还需要进一步判断,如果此时电池插入了主板,则切换为适配器对主板供电,并根据电池的状态来判断是否对电池进行充电。

2.智能电池初始化

在笔记本电脑的智能电池中,一般有一个内部电芯,电池的内部电芯保护着电池并保存着电池的状态信息。

在主板上一般会留一个电池的接口座子,智能电池通过接口座子接入到主板,本主板的接口座子如下图所示:


在这里CLK_SMB和DAT_SMB和充放电芯片的SMBus是同一路,直接连接到了EC的SMBus,BATT_PRS在电池内部串联一个10K电阻直接接地,所以在电池插入座子后该引脚会拉低,这个引脚也会直接连接到EC的GPIO引脚,EC会将该GPIO引脚设置为输入模式,当EC检测到该引脚为低电平时,EC就知道了此时电池是存在的。

3.智能电池内部信息读取命令

通过智能电池规范手册可以得知,通过SMBus向电芯发送对应的命令可以得到对应的值,智能电池通过以下功能与SMBus主机、智能电池充电器以及通过SMBus连接的其他设备进行通信,功能说明如下:


在代码中的定义如下:

//-----------------------------------------------------------------------------
/*****************************************************************************/
/* EXTERNAL RAM AREA      (0x0100 ~ 0x01FF) **********************************/
/*****************************************************************************/
//-----------------------------------------------------------------------------
extern XBYTE    BAT1_ManufacturerAccess;    //_at_ BAT1_MemBase+0x00;
extern XBYTE    BAT1_BatteryMode;           //_at_ BAT1_MemBase+0x03;
extern XBYTE    BAT1_Temperature;           //_at_ BAT1_MemBase+0x08;
extern XBYTE    BAT1_Voltage;               //_at_ BAT1_MemBase+0x09;
extern XBYTE    BAT1_Current;               //_at_ BAT1_MemBase+0x0A;
extern XBYTE    BAT1_AverageCurrent;        //_at_ BAT1_MemBase+0x0B;
extern XBYTE    BAT1_MaxError;              //_at_ BAT1_MemBase+0x0C;
extern XBYTE    BAT1_RelativeStateOfChg;    //_at_ BAT1_MemBase+0x0D;
extern XBYTE    BAT1_AbsoluteOfCharge;      //_at_ BAT1_MemBase+0x0E;
extern XBYTE    BAT1_RemainingCapacity;     //_at_ BAT1_MemBase+0x0F;
extern XBYTE    BAT1_FullChargeCapacity;    //_at_ BAT1_MemBase+0x10;
extern XBYTE    BAT1_ChargingCurrent;       //_at_ BAT1_MemBase+0x14;
extern XBYTE    BAT1_ChargingVoltage;       //_at_ BAT1_MemBase+0x15;
extern XBYTE    BAT1_BatteryStatus;         //_at_ BAT1_MemBase+0x16;
extern XBYTE    BAT1_CycleCount;            //_at_ BAT1_MemBase+0x17;
extern XBYTE    BAT1_DesignCapacity;        //_at_ BAT1_MemBase+0x18;
extern XBYTE    BAT1_DesignVoltage;         //_at_ BAT1_MemBase+0x19;
extern XBYTE    BAT1_SpecificationInfo;     //_at_ BAT1_MemBase+0x1A;
extern XBYTE    BAT1_ManufactureDate;       //_at_ BAT1_MemBase+0x1B;
extern XBYTE    BAT1_SerialNumber;          //_at_ BAT1_MemBase+0x1C;
extern XBYTE    BAT1_ManufacturerName[];    //_at_ BAT1_MemBase+0x20;
extern XBYTE    BAT1_DeviceName[];          //_at_ BAT1_MemBase+0x21;
extern XBYTE    BAT1_DeviceChemistry[];     //_at_ BAT1_MemBase+0x22;
extern XBYTE    BAT1_ManufacturerData;      //_at_ BAT1_MemBase+0x23;

以上比较关注的命令有如下几个:

  1. Voltage(0x09),返回智能电池的电压值,单位是mV,电压值保将通过两个字节返回给EC,所以需要在SMBus读取命令中使用_SMB_RD_WORD协议来进行读取,意思是读取两个字节的内容,两个字节可以表示的电压范围在0—65535mV之间。
  2. Current(0x0A),返回智能电池能够提供(或接收)的电流值,单位为mA,同样是返回两个字节,所以需要在SMBus读取命令中使用_SMB_RD_WORD协议来进行读取,范围在-32768–32767之间,0–32767mA表示的是充电电流的大小,-32768–0mA,表示放电电流的大小。
  3. AverageCurrent(0x0b),返回智能电池的平均电流,单位是mA,同样是返回两个字节,所以需要在SMBus读取命令中使用_SMB_RD_WORD协议来进行读取,范围在-32768–32767之间,0–32767mA表示的是充电电流的平均大小,-32768–0mA,表示放电电流的平均大小。
  4. RemainingCapacity(0x0f),返回电池的剩余容量,同样是返回两个字节,所以需要在SMBus读取命令中使用_SMB_RD_WORD协议来进行读取,这里有两种单位表示方式,mAh和10mWh,这里需要根据Battery Mode的CAPACITY_MODE bit来判断,为0时用mAh表示,为1时用10mWh表示,范围都是0–65525。
  5. FullChargeCapacity(0x10),在充满电时电池容量,同样是返回两个字节,所以需要在SMBus读取命令中使用_SMB_RD_WORD协议来进行读取,这里有两种单位表示方式,mAh和10mWh,这里需要根据Battery Mode的CAPACITY_MODE bit来判断,为0时用mAh表示,为1时用10mWh表示,范围都是0–65525。
  6. BatteryStatus(0x16),返回智能电池的状态,同样是返回两个字节,所以需要在SMBus读取命令中使用_SMB_RD_WORD协议来进行读取,这个非常重要,在电池异常时需要根据这两个字节的内容来判断电池的状态信息,具体内容如下:

智能电池需要关注的信息大概就是上述六种,其他的等遇到了再进行讲解。

4.充放电管理芯片内部寄存器

充放电管理芯片内部的信息相对智能电池就比较简单,我们需要关注的信息大概就只有三个,分别是充电电压,充电电流和适配器的输入电流,在数据手册中列出如下:

  1. ChargeCurrent(0x14),可读可写,在实际的EC代码中一般只会进行写,两个字节表示所以使用_SMB_WR_WORD协议,write word,单位为mA,写入的值即是从放电管理芯片输出的充电电流大小;
  2. ChargeVoltage(0x15),可读可写,在实际的EC代码中一般只会进行写,两个字节表示所以使用_SMB_WR_WORD协议,write word,单位为mV,写入的值即是从放电管理芯片输出的充电电压大小;
  3. InputCurrent(0x3F),可读可写,在实际的EC代码中一般只会进行写,两个字节表示所以使用_SMB_WR_WORD协议,write word,单位为mA,写入的值即是接收适配器电流输入的大小;

5.充放电逻辑控制

这里假设电池和适配器都是接入了笔记本,并且电池是电量不满的状态。EC端通过充放电管理芯片的ACOK(高有效)判断到适配器的接入,通过智能电池的BATT_PRS(低有效)判断电池接入。

在电池和适配器都接入的情况下,电池进入充电状态,适配器除了给主板供电还需要智能电池充电。

5.1电池充电逻辑

在电池和适配器都接入的情况下,EC通过SMBus的read word协议来获得智能电池的剩余电池容量信息,代码如下:

{ _SMB_RD_WORD, _CMD_RemainingCapacity,     &BAT1_RemainingCapacity     },

EC通过SMBus的read word协议来获得智能电池的满充容量信息,代码如下:

{ _SMB_RD_WORD, _CMD_FullChargeCapacity,    &BAT1_FullChargeCapacity    },

通过两个参数相除可以获得电池的剩余电量百分比:

remaining_percent = BAT1_RemainingCapacity / BAT1_FullChargeCapacity;

  • 如果remaining_percent = 100%,停止智能电池的充电,适配器只对主板供电。

EC通过SMBus对充放电管理芯片内部的ChargeCurrent和ChargeVoltage设置为0来停止智能电池的充电。

  • 如果remaining_percent < 100%,电池进入充电状态,适配器除了给主板供电还需要智能电池充电。
    EC通过SMBus获取智能电池需要的充电电流和充电电压的值:
{ _SMB_RD_WORD, _CMD_ChargingVoltage,       &BAT1_ChargingVoltage       },
{ _SMB_RD_WORD, _CMD_BatteryStatus,         &BAT1_BatteryStatus         },

EC再通过SMBus将读读取到的智能电池需要的充电电流和充电电压写入到充放电管理芯片中,这样充放电管理芯片就可以输出智能电池需要的电流和电压来对自己进行充电了。

5.2电池放电逻辑

电池放电的条件:

  1. 适配器不存在;
  2. 电池电量大于断电电量;
    因为只要有适配器存在,电池是不会进行放电的。有些EC设置了当电量小于某个阈值(比如5%)时,会强制笔记本进入休眠状态,以此来保护电池。
  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2022-05-21 19:08:40  更:2022-05-21 19:08:42 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 0:50:23-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码