| 概览 近年来,笔记本电脑等移动设备已实现可高达100W充电,采用可使充电连接器通用化的USb PD的应用已经越来越多。另外,同时采用有线充电加无线充电(无线供电)两种充电方式的趋势也有增无减。然而,要满足USB PD这类的大范围功率需求,例如要想从5V的充电器向2节电池(=8.4V)充电,系统必须添加升压功能。另外,同时采用两种充电方式,需要再增加充电IC和外置部件,并通过微控制器来控制充电切换,这些在工程实践中复杂度与成本都会带来不小的压力。 应对这些问题,ROHM新推出了一款电池充电IC:BD99954GW/MWV。该芯片以1-4节电池为对象,利用升降压控制生成3.07-19.2V的充电电压,同时支持最先进的USB PD系统的电池充电IC。实现ROHM独创、业界首发的充电系统双输入功能,且搭载充电适配器判定功能,无需微控制器控制即可进行充电切换。另外,不仅支持USB PD标准,还支持当今最普及的USB BC1.2充电标准。可轻松实现USB充电、无线供电、AC适配器充电等充电方式,非常有助于创建更便捷的充电环境。 随着无线充电技术渐渐普及,大多数现代的充电器需要兼容有线无线两种输入源。这样的电路使用BD99954来搭建,可以省去传统设计方法中的切换电路: 
 图 使用BD99954来设计双输入电源 BD99954GW、BD99954MWV具有以下两个特点,非常有助于创建更便捷的充电环境: (1)业界首创支持双系统充电。双输入方式,使两种充电方式的导入更容易。而且还搭载充电适配器判定功能,无需微控制器即可进行充电切换。双输入充电系统无需搭载并调整(充电路径切换、防止电流逆流)单独处理时所需的外置部件、晶体管和电阻器,不仅安装面积更小,还有利于大大减轻设计负担。 (2)升降压控制,支持最先进的USB PD系统。利用升降压控制,从5-20V(USB PD的最大电压)中的任意电压均可生成电池充电所需的充电电压。例如,进行2节电池(=8.4V)的充电时,20V输入时可降压后进行8.4V充电,5V输入时可升压后进行8.4V充电。 另外,关于USB充电标准,不仅支持USB PD,还支持当前最普及的USB BC1.2,因此可支持从以往的USB充电到USB PD充电的多种充电方式。本文利用ROHM公司为该芯片开发的评测板: BD99954MWV Evaluation Kit对这个芯片的功能做一个评测,探索一下其使用方法与功能上的一些特色。 首先看看该BD99954开发板: 
 图 开发板及其主要组成部分 注意,拿到的BD99954开发板为工程样品,所以有飞线的情况,实际上不影响对该芯片的功能评测。 硬件 原理图 
 图 原理图1(主要电路) 
 图 原理图2(USB转i2C部分) 因为分辨率的问题,原理图在页面上显示的不是很清楚,感兴趣的同学可以在文末的参考资源中找pdf格式文件进行查看。 整个原理图比较简单,没有什么好说的。主要组成部分就是两个芯片(BD99954+FT232HL)和一些无源器件。其中FT232HL是用来跟PC上的软件通信用的,所以整个开发板主要就是BD99954与无源器件。由此也可以看出BD99954集成度较高。 芯片 下面从芯片方面来分析一下此芯片,先看典型应用图: 
 图 BD99954典型应用图 再看芯片内部框图: 
 图 BD99954内部框图 从以上两图可见该芯片集成了电源管理电路中的一些常用单元,使最终的电路大大简化。 双输入自动切换 比如两个输入源如果要切换,以往的设计: 
 图 以往的双输入切换需要增加额外的切换电路 如果同样的功能使用BD99954来设计,则可大大简化,上图中的切换FET与电组可以省去: 
 图 使用BD99954设计的双输入切换 充电曲线 
 图 充电曲线 其中System Voltage为系统工作电压,如果电池电压低于该电压那么首先要使用涓流与预充模式将电池充到该电压。之后增加充电电流进入快充恒流模式,将电池充到预设的满充电压。此时电池并未充满,此时进入快充恒压模式直至电池电压是设置的VBAT的1.15倍即停止充电。此时电池可以认为被充满。上述的这些参数都可以通过I2C总线进行设置。此外为防止电池过热,芯片还可以通过电池的温度检测端对电池进行温度监控.温度过高时电流减半,电压按照三档设置的电压进行按温度输出。 
 
 图 恒流与恒压参数根据温度监控减小 GUI配置软件 厂家为此开发板专门配了GUI软件以方便迅速评估其功能,下载地址在文末的连接中。如何安装就不多说了,软件分三个界面: 
 图 充放电控制界面 
 图 直接控制寄存器界面 
 图 扩展控制界面 功能演示1:两路电源自动切换充电与放电 充电连接: 
 图 充电连接 放电连接与上类似,只是不接电池,由VSYS向外输出电压。 首先来观察双电源切换,断开VCC的5V输入,不接电池,仅仅在VBUS上接入20.5V的笔记本电源(经过改造),配置使其输出19.2V,软件配置如下: 
 图 实验一配置UI 注意几点:首先将模式调整成4S,也就是4节串联模式,否则芯片不允许输出这么高电压。其次输出电压那里理论上可以配置32752mV,但是芯片最高只能输出19200mV,所以配置高了会自动被软件设置上限。最后3,4所指之处分别为VBUS,VCC的监测指示灯,绿灯表示检测到输入。图中所示为仅仅有VBUS输入。 
 图 实验一结果 这里注意本人的这个万用表的精度欠佳,以下不另外解释。 现在将5V的VCC也接入,两个输入同时接入的情况下默认使用VBUS,这个也可以通过寄存器更改偏向使用哪个输入。 
 图 两个输入同时接入 
 图 此时依旧输出19200mV,意料之中 关掉VBUS,只接入VCC: 
 图 仅仅接入VCC(5V) 此时依旧输出19200mV,注意此时为boost模式。 
 图 VCC(5V)升压至19200mV输出 再来看看充电模式,该芯片可以对1-4级串联锂离子电池进行充电,作者分别做了实验,但是由于拍照较为麻烦,此处仅仅展示单节电池充电。 
 图 接入电池 注意如果该电池有温度电阻,可以接入上图中的绿色军品座子已利用温度电阻来防止过热情况,但作者手边没有这样的电池,暂且不实验这个功能。 对于充电,需要配置如下几个参数: 
 图 充电参数 1.涓充电压:小于此电压的电池要么是被保护了要么是过放了,在此电压之前需要涓流充电 2.预充电压:小于此电压需要预充 3.预充电流 4.快充电流 5.快充电压:到达此电压即可进入正常充电模式 6.涓流电流 7.终止电流,某些电池需要一定终止电流以防止漏电 8.配置好之后,按下此按钮,其转为绿色时即开始充电,同时右边的界面开始显示实际的充电曲线。 以上内容可以与上文的充电曲线一节配合参考。 功能演示2:电池反向供电 反向供电连接: 
 图 电池向外供电 当两个外接电源都关闭掉,这时需要电池向外反向供电。先关闭掉两个输入,注意此时要保持电池接入且高于3.8V,否则整个板子没有电源就无所谓控制或者供电了。 
 图 两个输出都断掉 反向供电的时候一定要确认两个输入都关闭了,否则就短路了,会烧坏器件的。 反向供电的配置在第二个界面,默认是关闭的,VCC,VBUS两个接口都可以配置输出。 
 图 反向输出配置 
 图 反向buck boost输出 功能演示3:自定义控制 根据上文所贴的原理图可知,官方的配置软件是通过USB转I2C接口来对BD99954芯片进行控制的。既然这样,如果要进行自定义的控制,用户可以另外使用主控芯片来通过I2C总线来进行。当然大多数应用不需要这种自定义通信,因为该芯片本身就具备常用检测与切换功能。本文只是展示一种可能,以供有高级自定义控制需求的用户参考。 另外提一下子,其实官方提供的GUI软件有脚本编程进行自定义控制的功能。但是可能是工程测试版本的原因,在本人电脑上一直不能成功运行。不过这也不是大问题,因为实际应用中要么完全不控制按照默认配置来工作,要么会通过外接的主控来通过I2C来控制。 
 图 MCR运行异常 BD99954的I2C设备地址为0x09,速率为10KHz到400KHz,其读写格式、波形分别如下图: 
 图 读word格式 
 图 写word格式 
 图 通信波形图 由此可见其通信跟一般的I2C器件没有什么不同,只要按照其命令格式即可通过I2C总线与之通信。该芯片命令集有三套:基本/扩展/调试,通过MAP_SET命令进行切换: 
 图 命令集切换图 具体的命令请查阅数据手册,此处不一一列出。 这里使用arduino Uno开发板与之通信。连接信号在J47上: 
 图 J47上的SCL/SDA信号 
 图 BD99954+Arduino Uno 这里以配置反向输出为7V为例,代码如下: //Arduino Uno control the BD99954 chip. //Author: zhanzr@foxmAIl.com #include #define BD_ADDR 0x09 //Bit 14 Trigger vrBOOST #define VIN_CTRL_SET 0x0A #define VRBOOST_SET 0x19 #define CHIP_ID 0x38 #define CHIP_REV 0x39 #define MAP_SET 0x3F void setup() { Wire.begin(); // join i2c bus (address optional for master) PInMode(LED_BUILTIN, OUTPUT); pinMode(7, INPUT); Serial.begin(115200); } void wr16(uint8_t cmd, uint16_t d16) { uint8_t dl = (uint8_t)d16; uint8_t dh = (uint8_t)(d16>>8); Wire.beginTransMIssion(BD_ADDR); // transmit to device Wire.write(cmd); Wire.write(dl); Wire.write(dh); Wire.endTransmission(); // stop transmitting] } uint16_t rd16(uint8_t cmd) { uint16_t ret16 = 0; Wire.beginTransmission(BD_ADDR); // transmit to device Wire.write(cmd); Wire.endTransmission(); // stop transmitting] Wire.requestFROM(BD_ADDR, 2); while (2 != Wire.available()) { digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN)); } uint8_t dl = Wire.read(); uint8_t dh = Wire.read(); ret16 = ((uint16_t)dh << 8) + dl; return ret16; } void loop() { uint16_t map_set = rd16(MAP_SET); Serial.println("MAP_SET:"); Serial.println(map_set, HEX); uint16_t tmp = rd16(CHIP_ID); Serial.println("CHIP_ID:"); Serial.println(tmp, HEX); tmp = rd16(CHIP_REV); Serial.println("CHIP_REV:"); Serial.println(tmp, HEX); tmp = rd16(VRBOOST_SET); Serial.println("VRBOOST_SET:"); Serial.println(tmp, HEX); wr16(VRBOOST_SET, 7000); tmp = rd16(VRBOOST_SET); Serial.println("VRBOOST_SET:"); Serial.println(tmp, HEX); tmp = rd16(VIN_CTRL_SET); Serial.println("VIN_CTRL_SET:"); Serial.println(tmp, HEX); delay(50000); } 输出: 
 图 通过I2C控制开发板输出 结论总结 BD99954集成度高,几乎囊括了笔记本/平板/智能手机等应用的电源管理的绝大多数功能,使工程师的设计负担大大减轻,产品稳定性也能随之提高。 
 
 |