序言:
写这篇博客的主要原因是因为公司的产品涉及到电池充放电管理,而且充电电压和电池电压可能会有多种组合,针对这种设计需求,发现目前流行的PD快充协议正好是多级电压,所以在TI支持PD快充的芯片中选择支持多节电池充放电管理的芯片。基于上述原因,选择了国内比较容易买到,价格也适中的bq25703。
从了解芯片到Demo板调试基本完成,林林总总共历时大约1个月,整理成博客也是为了日后有个参考。
好了,不多说,踩坑的日志开始~
涉及到的链接:
介绍bq25703:
官方的介绍大家可以参考芯片的DataSheet,我就不复制粘贴了,重点功能如下:
- 支持1~4节锂电池充电,或者其他自定义充电电压(1.024V~19.2V),自定义充电电流(0.064A~8.128A);
- 支持3.5V~24V宽电压输入
- 无论是否充电状态,都可以向系统提供自定义电压(这里有坑,后面会说);
- 可以反过来向输入接口输出自定义电压(OTG功能),所以常被用来做快充充电宝电源管理芯片(这里有坑,后面会说)
- 充放电等详细设置均通过内部寄存器的配置完成,使用I2C与控制芯片通讯
知道基本功能,下面介绍如何实现这些功能,附上Demo板的原理图截图,后面的设计都会根据这个图来介绍:
这个图和DataSheet中的推荐应用图完全一样(事实上也没有自由发挥的空间 (0.0))
简单介绍一下核心芯片bq25703外围电路的主要功能:
- P1为电源输入口,支持3.5V~24V宽电压输入,一般接在TYPE-C的接口上,负责充电时的输入和OTG时的输出
- R14是自己放置的采样电阻,后面加上运放后,目的是为了用单片机ADC功能呢获取到充/放电的电流大小和方向
- ACP与ACN中间的采样电阻是BQ25703要求的,也是为了采集充放电电流,但实际似乎没有输出(后面详解)
- Q1,Q2,Q3,Q4和L3共同组成BUCK-BOOST升降压电路,也是整个电路的核心,所以电感的电流尽可能选择的大一点,当然尺寸也要考虑在内,做Demo板当然无所谓尺寸,但是日后设计成形产品时,为了能够整体散热,能够让导热硅胶尽可能贴合MOS、芯片、电感,最终电感的选型肯定是尽可能的薄
- SYS这个地方就是为整个系统提供自定义电压的地方,如果是在笔记本或者平板当中使用,就是为整个主板供电的地方
- BAT+就是接电池正极的地方,可以是1~4节锂电池,也可以是特殊电压
- R20采样电阻就是BQ25703检测电池充放电电流的地方
- R23+R24就是负责在电路中设置为几节锂电池充电,具体的设置方法后面会说,图上的配置是为两节电池(8.4V)充电
电池保护部分:
因为Demo板的设计采用了18650电池,而且是无保护板的18650,所以需要DW01KA+两个SC8205S的NMOS作为保护。
实际上,这样的保护板常常出现在锂聚合物电池上,那个跟买来的电池总是包在一起的小小的条状保护板,基本都是类似的设计,这样的设计可以实现:
- 防止过充,电池电压上升超过4.3V就会断开电流流入电池的通路以阻止继续充电,但是放电依然畅通
- 防止过放,电池电压低于3.5V就会断开电流流出的通路,但是充电通路畅通
- 防止过流,在电流超过2A就会断开电流流出通路,然后很快恢复,继续检测是否过流,反复如此
各部分电压电流检测,由单片机内部ADC采样完成,又快又准:
从上到下依次是:
- 外部接入的电流大小及方向检测
- 外部接入电压检测
- 电池电压检测
- 电池充放电电流大小及方向检测
Q:电流检测在第二级运放的同相输入端为什么要接偏置电阻?
A:因为单片机的ADC只能检测0-5V,如果没有偏置电阻,那么至少有一个方向的电流是检测不到大小的,除非增加一路采样和运放,成本增加不说,还要多一路AD采样,编程和处理都会复杂;而且电流检测不需要太高精度,偏置后,两个方向都可以检测到电流大小,编程也方便
Q:为什么电压采样还要用运放,而且是直接电压跟随,并没有放大?
A:这里的运放主要起到保护作用,单片机ADC引脚最高输入不能超过5V,否则有击穿风险,所以用运放隔离了采样电压,保护芯片
上位机通讯部分:
采用CH340C作为与上位机通讯的串口,是因为外部电路太简单(只有一个电容),没有晶振,没有容易摔坏的风险
主控芯片:
主控芯片用的是新唐的NUC029单片机,采用ARM-M0构架,50MHz主频,64K编程空间,支持串口升级,内部EEPROM
软件部分:
bq25703这款芯片大部分功能都要通过I2C通讯,修改内部寄存器才能实现,所以务必需要至少一颗逻辑控制芯片负责通讯。
如果没有主控芯片,就连最基本的充电功能都无法实现(充电电流为0)
I2C的通信形式是标准,在网上有资料,大部分单片机也自带I2C接口,直接配置单片机寄存器就可以完成通讯
这里简单介绍一下通过I2C是如何控制bq25703
指令有两类:按地址写入数据,按地址读取数据
按地址写入数据: 开始→写地址+0→从机应答→写寄存器地址→从机应答→写寄存器数据→从机应答→结束
按地址读取数据: 开始→写地址+0→从机应答→写寄存器地址→从机应答→ 再次开始→写地址+1→从机应答→读取寄存器数据 →结束
读取数据都是一次一个地址读取的,写入数据大部分都是直接一次一个地址写入,但是如下4个寄存器,需要一次写入两个地址,而且必须遵循先写小端,再写大端的形式,且必须在一次I2C通讯中完成,通讯顺序如下:
开始→写地址+0→从机应答→写寄存器基址(偶数地址)→从机应答→ 写低位寄存器数据→从机应答→写高位寄存器数据→从机应 答→结束
需要这样操作的特殊寄存器如下:
- ChargeCurrent(0x02,0x03)充电电流
- MaxChargeVoltage(0x04,0x05)充满电压
- OTGVoltage(0x06,0x07)反向供电电压
- InputVoltage(0x0a,0x0b)最小输入电压
详细的寄存器表在DataSheet里有详细说明
上位机软件配合调试:
因为为大量的寄存器需要配置,那么如果每次试验数据都是使用串口调试,不够直观,也不够方便。
在TI官网上发现一个这个软件,是IT官方制作的,支持全系列芯片的寄存器管理软件,为什么我不用这个软件而是自己写呢?因为这个软件需要配套一个调试工具,类似烧录器,已经做好的调试板在官网也有,但是价格实在比较感人,最终决定自己写上位机软件,配合单片机,自己定的协议进行调试,所以这个工具用上,但是可以用来参考
自己做的开发板使用CH340C串口转USB设备,通过USB线与电脑相连,在系统中识别为CH340设备
通过串口调试工具,测试进行测试,确定所有寄存器都可以写入并且读取到对应的值,那么就开始上位机的编写
其实编写图形化软件,作为一个软件小白,似乎VB,MFC,QT等才是最优先的选择,但是,既然都是从头开始,为什么不选一个更加大胆的选择呢?
最终决定使用 Electron 开发上位机软件,效果如下
左侧可以看到所有的寄存器都被显示在表格里,而且通过颜色区别出当前的状态,点击可以改变寄存器的数值,实测下来方便了很多
实际调试:
那么硬件软件都准备好了,就开始激动人心的测试吧~
我这边的硬件测试环境除了Demo板以外,还有一个DC-DC的升降压可调模块作为输入,用来模拟DP快充的多级电压
插上电池 插上供电 调整输入为12V 插入上位机USB线 看到调试工具红红绿绿的小方块一个一个出现时,成就感还是很高的
紧接着发现充电电流是0A,VSYS为7.6V(与电池电压相同),电池也没有输入和输出电流
拔掉电池后,VSYS输出为6.14V