1. 双电源供电系统的设计动机与整体思路
1.1 为什么需要光伏与适配器双路输入
做嵌入式硬件或者便携储能设备的朋友,大概率都遇到过这样一个尴尬场景:设备同时支持太阳能板充电和DC适配器充电,但两路电源的电压范围、输出阻抗、动态响应完全不同。如果只是简单地把两路电源用二极管“或”在一起,会出现几个很烦人的问题——适配器插拔瞬间输出电压跌落导致后级MCU复位、光伏板在弱光下电压被适配器倒灌、两路同时接入时电流分配不可控。这些问题在实验室里可能不明显,一旦到了户外实际使用,就是“设备莫名其妙重启”“电池充不满”“光伏板发热”这类让人抓狂的故障。
BQ25798这颗芯片就是冲着这个痛点来的。它是TI推出的一款带MPPT(最大功率点跟踪)的升降压充电控制器,支持太阳能板和适配器双输入,内置动态电源路径管理(DPPM),能自动在两路输入之间做优先级仲裁,并且切换过程对后级负载几乎无感。换句话说,它把“双电源无缝切换”这件事从一堆分立MOSFET加比较器的复杂电路,集成到了一颗芯片加少量外围器件的方案里。
这个项目适合谁看?如果你正在做户外储能电源、太阳能充电宝、便携式IoT网关、农业传感器节点这类需要“有光就充、有适配器就优先用适配器”的设备,那这套方案基本可以直接抄作业。如果你只是好奇双电源切换的底层逻辑,文章里的原理拆解和参数计算过程也能帮你把这件事想明白。
1.2 方案选型:为什么是BQ25798而不是分立方案
在BQ25798出现之前,常见的双电源切换方案有三种。第一种是理想二极管控制器加背靠背MOSFET,比如LTC4412这类,优点是简单,缺点是只能做“或”逻辑,没有充电管理,也没有MPPT。第二种是用两颗独立的充电IC分别接光伏和适配器,输出端再做电源路径切换,缺点是BOM成本高、PCB面积大、两颗芯片之间的协调逻辑需要MCU介入。第三种就是BQ25798这种单芯片双输入方案,把充电控制、路径管理、MPPT、I2C通信全部集成。
我选BQ25798的核心理由有三个。第一,它的输入电压范围是3.6V到24V,覆盖了常见的5V适配器、12V适配器以及大多数18V光伏板的工作电压,不需要额外的预稳压。第二,它支持I2C编程,充电电压、充电电流、输入电流限制、MPPT工作点都可以通过寄存器动态调整,这意味着同一套硬件可以适配不同规格的光伏板和电池组,量产时不用改板。第三,它的动态电源路径管理可以在适配器插入时自动把系统负载切到适配器供电,同时根据适配器剩余能力给电池充电,适配器拔掉后瞬间切回电池供电,切换时间在微秒级,后级DC-DC完全感知不到。
注意:BQ25798的“无缝切换”指的是系统输出端(SYS引脚)的电压不会出现明显跌落,而不是说两路输入之间可以随意热插拔。光伏板输入端如果要做热插拔,建议在输入端加TVS和缓启动电路,否则光伏板插拔瞬间的电压尖峰可能触发芯片的过压保护。
1.3 系统框图和关键节点定义
整个系统的信号流向可以这样理解:光伏板和适配器分别经过输入滤波和电压检测,进入BQ25798的两路输入引脚(VAC1和VAC2)。芯片内部根据寄存器配置的优先级和输入电压有效性,决定用哪一路作为主输入。主输入经过升降压变换器后,一部分能量送到SYS引脚给系统负载供电,另一部分送到BAT引脚给电池充电。电池在输入不足时通过同一套升降压电路反向放电,维持SYS电压稳定。
关键节点有四个。VAC1接光伏板,VAC2接适配器,SYS接后级DC-DC或直接接负载,BAT接电池组。I2C总线接MCU,用于配置充电参数和读取状态寄存器。此外还有几个重要的检测点:输入电流检测电阻(AC1和AC2各自独立)、电池电流检测电阻、以及用于MPPT的输入电压分压采样。
这里有一个设计上的取舍需要说明:BQ25798的两路输入并不是完全对称的。VAC1通常配置为光伏输入,支持MPPT;VAC2配置为适配器输入,不支持MPPT但支持更高的输入电流。如果你把两路都接光伏板,那只有VAC1能做MPPT,VAC2只能做固定电压输入。这个细节在分配引脚时就要想清楚,不然后面改板很麻烦。
2. BQ25798核心寄存器配置与参数计算
2.1 输入优先级与切换阈值的寄存器设置
BQ25798的输入源优先级通过ChargeOption0寄存器(地址0x00)的bit[7:6]来配置。默认值是00,表示VAC1优先;如果设为01,则VAC2优先。对于光伏加适配器的场景,我通常把适配器设为优先,也就是VAC2优先。这样做的逻辑是:适配器是“稳定且充足”的能源,光伏是“波动且有限”的能源,优先用适配器可以延长电池寿命,光伏只在没有适配器时才全力工作。
切换阈值涉及两个关键参数:输入欠压锁定阈值(VINDPM)和输入电流限制(IIN_DPM)。VINDPM通过寄存器0x0B和0x0C配置,单位是mV,步进64mV。对于18V光伏板,我一般把VINDPM设在14V左右,这样弱光下光伏板电压跌到14V以下时,芯片会自动减小充电电流甚至暂停充电,避免光伏板被拉垮。对于12V适配器,VINDPM设在9V左右,留足余量。
输入电流限制通过寄存器0x0A配置,单位是mA,步进50mA。适配器这一路我通常设为适配器额定电流的80%,比如2A适配器设1.6A,留20%余量给系统负载波动。光伏这一路则根据光伏板的最大功率点电流来设,比如18V/10W的光伏板,最大功率点电流约0.55A,IIN_DPM就设500mA左右。
提示:VINDPM和IIN_DPM这两个参数是双电源切换“无感”的关键。如果VINDPM设得太低,光伏板在弱光下会被拉到很低电压,效率极差;如果设得太高,光伏板稍微有点阴影就停止充电。实测下来,VINDPM设在光伏板开路电压的75%到80%之间比较合适。
2.2 MPPT工作点扫描的实现逻辑
BQ25798的MPPT不是硬件自动追踪的,而是通过I2C让MCU定期扫描输入电压来实现的。具体做法是:MCU每隔几秒读取一次输入电压和输入电流,然后微调VINDPM寄存器,观察输入功率的变化。如果功率增加,就继续往同一方向调;如果功率减小,就反向调。这就是经典的扰动观察法(P&O),只不过执行者是MCU而不是芯片内部状态机。
扫描的步进和周期需要根据光伏板的特性来定。对于小功率光伏板(10W到50W),步进64mV、周期2到5秒比较合适。步进太大,工作点会在最大功率点附近震荡,平均效率下降;步进太小,追踪速度慢,光照快速变化时跟不上。我试过用32mV步进、1秒周期,在云层快速移动的场景下追踪效果反而不好,因为扰动太频繁导致输入电压一直在变,后级DC-DC的输入也跟着抖。
一个实用的优化是:在电池接近充满时降低扫描频率,因为这时候充电电流本来就小,MPPT的收益不明显,频繁扫描反而增加功耗。可以在MCU里加一个判断,当充电电流小于200mA时,把扫描周期从3秒延长到10秒。
2.3 充电电压和电流的参数计算过程
充电参数的计算取决于电池类型和容量。以3串锂离子电池为例,标称电压11.1V,满充电压12.6V。BQ25798的充电电压寄存器0x05和0x06的单位是mV,步进8mV。12.6V对应12600mV,写入值就是12600/8=1575,即0x0627。
充电电流寄存器0x03和0x04的单位是mA,步进50mA。假设电池容量是5000mAh,按0.5C充电,电流就是2500mA。写入值2500/50=50,即0x0032。但这里要注意,充电电流不能超过输入电流限制减去系统负载电流。如果适配器限流1.6A,系统负载平均300mA,那最大充电电流只能设1.3A。所以实际写入值应该是1300/50=26,即0x001A。
还有一个容易被忽略的参数是终止电流(Termination Current),寄存器0x07,单位mA,步进50mA。对于5000mAh电池,终止电流一般设0.05C到0.1C,也就是250mA到500mA。设得太小,充电时间会很长;设得太大,电池充不满。我一般设300mA,兼顾时间和容量。
| 参数 | 寄存器地址 | 计算值 | 写入值 | 说明 |
|---|---|---|---|---|
| 充电电压 | 0x05/0x06 | 12600mV | 0x0627 | 3串锂电满充 |
| 充电电流 | 0x03/0x04 | 1300mA | 0x001A | 受适配器限流约束 |
| 终止电流 | 0x07 | 300mA | 0x0006 | 约0.06C |
| 适配器输入限流 | 0x0A | 1600mA | 0x0020 | 2A适配器80% |
| 光伏输入限流 | 0x0A | 500mA | 0x000A | 10W光伏板 |
| 光伏VINDPM | 0x0B/0x0C | 14000mV | 0x00DB | 18V板75%开路电压 |
3. 外围电路设计与关键器件选型
3.1 输入滤波与电压采样电路
光伏板输入端和适配器输入端都需要滤波。光伏板因为线缆长、面积大,容易引入共模噪声,我一般在VAC1引脚前加一个共模电感加两个X7R陶瓷电容(10uF和100nF并联)。适配器输入端相对干净,但如果是插拔式适配器,插拔瞬间会有振铃,加一个TVS管(SMBJ30A)和22uF电解电容就能压住。
电压采样方面,BQ25798内部有输入电压ADC,但精度只有±2%,做MPPT扫描够用,做精确的输入功率计算就不太够。我在实际项目中会额外加一路分压采样到MCU的ADC,分压电阻用1%精度的金属膜电阻,上电阻100k、下电阻10k,分压比11:1。这样18V输入对应MCU端1.64V,在3.3V ADC量程内。分压电阻旁边并联100nF电容做RC滤波,截止频率约160Hz,能滤掉开关噪声但不会影响MPPT扫描的响应速度。
注意:分压电阻的功耗要算一下。18V输入、100k加10k串联,电流约0.16mA,上电阻功耗约2.9mW,用0603封装足够了。但如果输入电压可能到24V,上电阻功耗会到5.2mW,还是0603的范围内,不用换0805。
3.2 升降压电感与MOSFET选型
BQ25798是控制器架构,MOSFET和电感都是外置的。升降压拓扑需要四个MOSFET:两个上管、两个下管。选型时主要看三个参数:耐压、导通电阻、栅极电荷。耐压方面,输入最高24V,考虑开关尖峰,MOSFET耐压至少30V,我一般选40V的。导通电阻方面,充电电流3A左右,选10mΩ以内的就能把导通损耗控制在90mW以下。栅极电荷影响开关损耗,选Qg在10nC到20nC之间的比较平衡。
电感选型看饱和电流和直流电阻。升降压拓扑在输入输出电压接近时,电感电流纹波最大。以18V输入、12.6V输出、3A充电电流为例,电感电流平均值约2.1A,纹波按30%算约0.63A,峰值电流约2.4A。电感饱和电流至少要有3A,留20%余量。直流电阻选30mΩ以内的,否则导通损耗会很明显。感值方面,BQ25798推荐2.2uH到4.7uH,我一般用3.3uH,开关频率设在600kHz,这样电感体积和损耗比较平衡。
| 器件 | 型号示例 | 关键参数 | 选型理由 |
|---|---|---|---|
| 上管MOSFET | AO4406 | 40V/12mΩ/Qg=8nC | 低导通电阻,适合3A |
| 下管MOSFET | AO4406 | 同上 | 对称设计,简化BOM |
| 电感 | XAL5030-332 | 3.3uH/5.5A/21mΩ | 饱和电流足,DCR低 |
| 输入电容 | GRM31CR61E106 | 10uF/25V/X7R | 低ESR,耐压足 |
| 电池电流检测 | WSL2512R010 | 10mΩ/1% | 2512封装,功率余量大 |
3.3 I2C总线上拉与MCU接口
BQ25798的I2C地址由ADDR引脚决定,接地是0x6B,接VCC是0x6A。我一般接地,用0x6B。上拉电阻用4.7k,接3.3V。如果总线上还有其他I2C设备,上拉电阻可以共用,但要注意总线电容不要超过400pF。走线方面,SCL和SDA尽量等长,远离电感和MOSFET开关节点,如果实在避不开,中间加地线隔离。
MCU这边,我用的是STM32G030,I2C速率设100kHz。虽然BQ25798支持400kHz,但100kHz更稳,而且MPPT扫描对通信速率要求不高。中断引脚(INT)接到MCU的外部中断,当芯片检测到输入源变化、过温、过流等事件时,INT拉低,MCU在中断服务程序里读取状态寄存器,决定下一步动作。
提示:BQ25798的INT引脚是开漏输出,需要上拉。如果MCU的IO口支持内部上拉,可以用内部上拉省一个电阻,但内部上拉通常偏弱(40k左右),在噪声环境下可能误触发。我建议还是用外部4.7k上拉,稳一点。
4. 双电源切换实测与问题排查
4.1 适配器插入和拔出的动态响应
实测场景是这样的:系统带500mA负载,电池电压11.4V,光伏板在室内光照下输出约8V/0.3A。先只接光伏板,系统由光伏板经过BQ25798给负载供电,同时给电池充电。然后插入12V适配器,用示波器看SYS引脚电压。
实测波形显示,适配器插入后约200us内,SYS电压从光伏板供电时的11.2V切换到适配器供电时的12.1V,中间没有跌落,只有约50mV的过冲,持续不到10us。这个过冲是适配器插入瞬间的浪涌电流引起的,在适配器输入端加22uF电解电容后,过冲降到20mV以内。
拔掉适配器时,SYS电压从12.1V切回电池供电的11.4V,切换时间约150us,同样没有跌落。后级的3.3V DC-DC输出用示波器看,纹波始终在±20mV以内,MCU没有复位。这个结果说明BQ25798的动态电源路径管理确实做到了“无缝”。
但有一个细节要注意:如果适配器拔掉时电池电压低于VINDPM阈值,芯片会先进入欠压保护,SYS电压会短暂依赖电池放电维持。如果电池也接近过放,SYS电压可能跌落。所以电池过放保护阈值要设得比VINDPM低至少500mV,留足切换余量。
4.2 光伏板弱光下的MPPT震荡问题
室内测试时发现一个问题:光伏板在弱光下(输出电流小于100mA),MPPT扫描会导致输入电压在12V到16V之间来回跳,充电电流也跟着跳。用示波器看VAC1引脚,电压纹波有2V峰峰值。这个问题的原因是弱光下光伏板的输出阻抗很高,MPPT扰动观察法的步进64mV对应的功率变化很小,MCU的ADC噪声(±2LSB)会误判功率变化方向,导致工作点来回跑。
解决办法有两个。第一个是降低扫描步进,从64mV降到32mV,但这样追踪速度会变慢。第二个是加一个“死区”判断:如果功率变化小于某个阈值(比如5mW),就不调整VINDPM,保持当前工作点。我在MCU里加了死区判断后,弱光下的震荡基本消失,输入电压稳定在14.5V左右,充电电流稳定在80mA。
注意:死区阈值不能设太大,否则光照快速变化时追踪跟不上。我试过10mW死区,在云层遮挡恢复后,MPPT需要约15秒才能重新追踪到最大功率点。5mW死区下,恢复时间约8秒,比较平衡。
4.3 常见问题速查表
| 现象 | 可能原因 | 排查方法 | 解决措施 |
|---|---|---|---|
| 适配器插入后不充电 | VAC2优先级未配置 | 读0x00寄存器bit[7:6] | 设为01,VAC2优先 |
| 光伏板充电电流始终很小 | VINDPM设得太高 | 测VAC1电压,对比VINDPM | 降低VINDPM到开路电压75% |
| SYS电压在切换时跌落 | 电池过放保护阈值太高 | 测BAT电压和SYS波形 | 降低过放阈值,留500mV余量 |
| I2C通信失败 | 上拉电阻太大或总线电容大 | 测SCL/SDA上升沿 | 换2.2k上拉,缩短走线 |
| 芯片发热严重 | 电感DCR大或MOSFET导通电阻大 | 测电感两端压降 | 换低DCR电感,换低Rds(on) MOSFET |
| MPPT震荡 | 弱光下ADC噪声误判 | 看VAC1电压纹波 | 加功率变化死区判断 |
| 适配器拔掉后系统重启 | 切换时间过长或电池响应慢 | 测SYS电压跌落深度 | 加大SYS电容,检查电池连接 |
4.4 实操心得与避坑经验
第一个坑是输入电容的布局。BQ25798的VAC1和VAC2引脚旁边一定要放100nF陶瓷电容,而且离引脚越近越好,最好在5mm以内。我第一版板子把电容放在芯片背面,结果适配器插拔时芯片偶尔会复位。后来把电容移到正面,紧贴引脚,问题消失。这个电容的作用是吸收输入端的瞬态电流,布局不好等于没放。
第二个坑是电池电流检测电阻的走线。BQ25798的SRP和SRN引脚是差分输入,走线必须严格等长、平行、靠近,中间不能有过孔。我试过用普通走线,结果充电电流读数偏差超过10%。后来改成差分对走线,偏差降到2%以内。如果板子空间允许,检测电阻最好用四端子封装(开尔文连接),这样焊盘接触电阻不影响精度。
第三个坑是MPPT扫描和I2C通信的冲突。如果MCU在MPPT扫描期间频繁读寄存器,I2C通信的时钟噪声可能耦合到输入电压采样上,导致MPPT误判。我的做法是:MPPT扫描期间暂停I2C读取,扫描完成后再读状态。扫描周期3秒,I2C读取在扫描间隙完成,互不干扰。
第四个坑是光伏板的反向漏电流。晚上没有光照时,光伏板相当于一个反向偏置的二极管,如果BQ25798的VAC1引脚没有反向阻断,电池电流会通过光伏板漏掉。BQ25798内部有反向阻断MOSFET,但前提是VAC1电压低于VINDPM时芯片进入休眠。实测下来,晚上电池自放电电流约50uA,主要是芯片休眠功耗和采样电阻漏电流,可以接受。如果对自放电要求极高,可以在光伏板输入端加一个理想二极管。
最后分享一个调试技巧:BQ25798的状态寄存器(0x20到0x2F)包含了输入源状态、充电状态、故障标志等丰富信息。调试时不要只看充电电流,要养成读状态寄存器的习惯。比如0x20的bit[2:0]表示当前输入源是VAC1、VAC2还是电池,0x21的bit[7]表示MPPT是否在扫描。这些信息能帮你快速定位问题,比用示波器盲测效率高得多。