· 48 min read

UPS 开发笔记:硬件篇

All-in-One Home Lab Server 一般都会有一个搭档叫 UPS。今天正式开始研究如何做一个适合自己的 UPS。 本文就记录下选型、设计、初步实现的过程,给自己备个案,后面调整和迭代会方便点。

三年前,我搭建了一个 Home Lab Server,跑了 All in One。当时就想着要搞个 UPS。 想买但是找不到锂电池小体积的产品,所以就想着试试自己搓一个。 当时补了些电路基础知识,上手搓了一个实验板本后,就换了新的机子,功耗太高不太敢继续搞了,也没时间研究。 现在我也算是业余时间自学三年,搓了好多东西,经验至少攒了点。更重要的是我现在有时间搞了,可以开始填坑了。

设计目标

为了应对临时短期停电导致服务器重启,以及意外断电导致持久化存储器的数据和硬件可能的损坏。

这三年我的 AIO 因为断电坏过硬盘坏过数据,靠每日备份走到了今天,是备份让我有了拖延的勇气!

我的 AIO 主力是一台 AMD Ryzen™ R5-5900HX mini PC,插了俩内存、俩 NVME SSD、一个 2.5寸 HDD。DC in 功耗还没测,不过我计划根据原装电源的 19V \times 6.32A \approx 120W 来设计额定输出功率。

另外我还有一个三年前使用的 J4125 工控小主机,这个功耗就很低了,输入电压 DC 12V。我计划设计上支持 12V 或 19V 输入输出,电流支持 6.5A。先用 J4125 进行真机测试,然后再用 5900HX 做最后测试,希望不要 BOOM!

这样的话,电源接口会设计三个:

  • DC IN。使用 5525 DC 接口,12V ~ 19V、6.5A。
  • USB-C。使用 PD 12V ~ 20V 电压输入,5 A。(主要为了方便测试)
  • DC OUT。使用 5525 DC 接口,12V ~ 19V、6.5A。

另外,为了更好地了解实时情况,会设计一个小屏幕用来显示一些信息:

  • 输入电压、电流、功率
  • 输出电压、电流、功率
  • 充电状态、电流、温度

再配合一个蜂鸣器来发出提示:

  • 市电离线(周期性提示)
  • 电量不足(急促持续提示)
  • 充电提醒

为了最大程度降低风险,充电需要用户手动批准。毕竟锂电池充电阶段风险会相对高些。这个 UPS 定位是 HomeLab 适用的储能产品,家肯定是每天要回的。国内基建真的稳,现在一年也停不了几次电,所以有人值守地充电综合来看应该没问题。当然这部分我计划是软件实现的,最后手动还是自动就写固件里了。

整个系统工作流程就是:

graph TD
    Start[系统启动] --> CheckPower{检查市电状态}
    CheckPower -->|市电在线| NormalMode[进入正常供电模式]
    CheckPower -->|市电离线| BatteryMode[切换至电池供电]
  
    NormalMode --> DisplayInput[显示输入电压/电流/功率]
    NormalMode --> DisplayOutput[显示输出电压/电流/功率]
    NormalMode --> CheckVoltage{检查电池电压}
    CheckVoltage -->|低于开始充电电压| RequestCharge[请求用户批准充电]
    CheckVoltage -->|高于或等于开始充电电压| CheckForceCharge{检查用户是否要求立即充电}
    RequestCharge -->|用户批准| StartCharging[开始充电]
    CheckForceCharge -->|用户要求立即充电| StartCharging
    RequestCharge -->|用户未批准| Standby[保持待机]
    CheckForceCharge -->|用户未要求| Standby
    StartCharging --> ShowCharge[显示充电状态/电流/温度]
    StartCharging --> MonitorSafety{监控充电安全}
    MonitorSafety -->|异常| AlarmError[蜂鸣器急促提示]
    MonitorSafety -->|正常| ContinueCharge[继续充电]
  
    BatteryMode --> AlarmOffline[蜂鸣器周期性提示市电离线]
    BatteryMode --> ShowBatteryOutput[显示输出电压/电流/功率]
    BatteryMode --> CheckBattery{检查电池电量}
    CheckBattery -->|电量充足| MaintainOutput[维持输出]
    CheckBattery -->|电量不足| AlarmLow[蜂鸣器急促持续提示]
    AlarmLow --> ProtectMode[要求主机关机]
  
    MaintainOutput --> OutputPower[输出至 DC OUT]
    ContinueCharge --> ChargeDone[充电完成]
    ChargeDone --> AlarmDone[蜂鸣器提示充电完成]
    AlarmDone --> ReturnStandby[返回待机状态]

选型

电池组

选择磷酸铁锂电池

储能选择磷酸铁锂(LiFePO4)电池组。磷酸铁锂电池相对三元锂电池:

优势

  1. 高安全性:UPS需长时间运行,LiFePO4 的热稳定性降低事故风险。
  2. 长寿命:高循环次数适合频繁充放电场景,降低维护成本。
  3. 温度适应性:宽工作温度范围适合不同环境。
  4. 环保:无稀有金属,符合绿色能源趋势。

劣势

  1. 能量密度低:相较 NMC,体积/重量更大,可能影响便携性。
  2. 电压平台低:3.2V单体需更多串联以达 UPS 所需电压,增加 BMS 复杂度。

电池组选择串联

根据中学物理的说法,我们可以简单、近似地认为多个电池串联电压相加,并联电流能力相加。我们的目标电压是至少 12V 输出,为了减少电压转换损耗,应该选择将电池串联,以获得更高的电池组输出电压。

但是问题随之而来,由于每颗电池内阻和初始能量不可能完全相同,所以多串电池组需要对每颗电池进行电压均衡,以免日积月累,出现部分电池过充过放,最终造成容量下降,电池损坏。如果还没有电池组保护电路,那甚至会引发更严重的安全问题。 据说磷酸铁锂电池接近满电时的电压相比三元锂电池的接近满电时的电压,区别比较小,这对电池均衡电路是一个不小的挑战。三年前好像这个很是个有点难搞的时,现在似乎没看到相关问题了。而且比较令人愉快的是,保护芯片方案好像也好找多了,不知道是我懂得玩了还是时间出手解决了一切。

为什么要均衡可以看看火先生的视频:锂电池均衡是干啥用的,主动均衡和被动均衡有什么区别?

电池组保护方案

目前找到下面几款芯片:

型号支持串数适合的电池种类均衡电流I2C 支持充电管理
BQ769203S-5S磷酸铁锂(LiFePO4)、三元锂(NMC)、钛酸锂(LTO)50mA(被动)原生支持,稳定,读取电压、电流、温度需外接充电芯片(如BQ24610,CC/CV,最大 6A)
CW12743S-5S磷酸铁锂(LiFePO4)、三元锂(NMC)60mA(被动)原生支持,需固件配置,读取电压、电流、SOC集成基本 CC/CV 充电控制(最大 5A,需外接 MOSFET 增强)
LTC6810-23S-6S磷酸铁锂(LiFePO4)、三元锂(NMC)、其他锂电池200mA(被动)原生支持,稳定,支持 I2C/SPI,读取高精度电压、温度需外接充电芯片(如LTC4015,CC/CV,最大 10A+)

BQ76920

我感觉 BQ76920 好像是一个比较合适的选择,TI 资料看着确实舒服些,价格也比较低,唯一的问题是可能只能买到翻新的。具体型号是 BQ7692003PWR

BQ76920 特性

BQ76920 功能框图

功能上满足我们的需求。那么剩下的就是两个问题需要确认下,一是是否支持磷酸铁锂电池,二是放电电流是否适配。

Overvoltage (OV) and undervoltage (UV) protections are handled digitally, by comparing the cell voltage readings against the 8-bit programmed thresholds in the OV and UV registers.

The OV threshold is stored in the OV_TRIP register and is a direct mapping of 8 bits of the 14-bit ADC reading, with the upper 2 MSB preset to “10” and the lower 4 LSB preset to “1000”. In other words, the corresponding OV trip level is mapped to “10-XXXX-XXXX–1000”. The programmable range of OV thresholds is approximately 3.15 to 4.7 V, but this is subject to variation due to the (GAIN, OFFSET) linear equation used to map the ADC values.

The UV threshold is stored in the UV_TRIP register and is a direct mapping of 8 bits of the 14-bit ADC reading, with the upper 2 MSB preset to “01” and lower 4 LSB preset to “0000”. In other words, the corresponding UV trip level is mapped to “01-XXXX-XXXX–0000”. The programmable range of UV thresholds is approximately 1.58 to 3.1 V, but this is subject to variation due to the (GAIN, OFFSET) linear equation used to map the ADC values.

ProtectionUpper 2 MSBMiddle 8 BitsLower 4 LSB
OV10Set in OV_TRIP Register1000
UV01Set in UV_TRIP Register0000

过压(OV)和欠压(UV)保护是通过数字方式实现的,通过将电池电压读数与OV和UV寄存器中编程的8位阈值进行比较。

OV阈值存储在OV_TRIP寄存器中,是14位ADC读数的8位直接映射,高2位MSB预设为“10”,低4位LSB预设为“1000”。换句话说,相应的OV跳闸电平被映射为“10-XXXX-XXXX–1000”。OV阈值的可编程范围大约为3.15至4.7V,但这个范围会因用于映射ADC值的(增益,偏移)线性方程而有所变化。

UV阈值存储在UV_TRIP寄存器中,是14位ADC读数的8位直接映射,高2位MSB预设为“01”,低4位LSB预设为“0000”。换句话说,相应的UV跳闸电平被映射为“01-XXXX-XXXX–0000”。UV阈值的可编程范围大约为1.58至3.1V,但这个范围会因用于映射ADC值的(增益,偏移)线性方程而有所变化。

保护类型高2位MSB中间8位低4位LSB
OV10在OV_TRIP寄存器设置1000
UV01在UV_TRIP寄存器设置0000

上面是 BQ76920 的数据手册片段,下面是磷酸铁锂(LiFePO4)电池一些电压范围。

参数电压范围保护板设置
标称电压3.2V/单体-
满充电压3.60-3.65V/单体3.65V(4S: 14.6V)
放电截止电压2.50-2.80V/单体2.50V(4S: 10.0V)
工作电压范围2.80-3.60V/单体-
过流保护-12A
过温保护-60°C

可以看到 BQ76920 是能够保护磷酸铁锂电池的。

根据公式计算,假设 DC-DC 输出转换电路的效率是 85%,放电电路最大会是在电池组电压在:

\begin{align} W_{out} &= 120W / 85\% \approx 140W \\ V_{out} &= 2.5V \times 4 = 10V \\ I_{out} &= W_{out} / V_{out} = 140W / 10V = 14A \end{align}

BQ76920 数据手册的典型应用示例中,使用 5mΩ 的电阻实现了 10A 的放电能力。

BQ76920 配置过流电流时,实际上是配置电流感应电阻两端的电压差,所以我们可以根据需要调整感应电阻器的阻值来适应不同的电流。 根据功能框图和简化应用,能看到功率路径上都是连接在外围器件上,放电和充电开关场效应管也是外部集成的,所以在电流方面限制不大。 BQ76920 支持并联多个场效应管来获得更大电流的支持。

电池组与保护板体积

我们选择使用 4 节 26650 电池。我计划购买四个预焊接镍片单节电池,直接并排焊接到 PCB 的一面上。这样长宽高就是:

\begin{align} L = 65mm \\ W = 26mm \times 4 = 104mm \\ H = 26mm + 1.6mm = 27.6mm \\ \end{align}

PCB 只能白嫖 100mmx100mm,所以保护板大概会做成 70 mm 宽、100 mm 长的。然后电池横向焊接在上面。

设备外壳

我计划使用公模铝合金外壳,看起来就很安全,散热也好。外壳侧面不开孔,IO 面使用阻燃的 3D 打印模型。

我找了一圈,大概确定使用 8838150 (mm) 的公模外壳。电池组+保护板作为一个模块,大概占用后面 110mm 的空间,还剩下 80mm40mm34mm 的空间给其余组件使用。

外壳确定后,我也大概确定了项目会分成几个 PCB 进行设计。

  1. 电池组模块(电池 + 保护板)
  2. 电池充电和 DC-DC 模块
  3. 双电源切换和电源 IO 模块(可能带有其他电压的转换输出)
  4. 控制模块(屏幕、按键、MCU)

充电控制器

BQ24610

BQ24610 1 节至 6 节电池的独立同步降压电池充电器控制器

BQ24610 芯片简介

BQ24610 是 Texas Instruments 推出的一款高效同步开关模式电池充电管理芯片,专为 1-6 节锂离子/锂聚合物电池设计。支持 5V 至 28V 输入电压,最大充电电流达 10A,采用 24 引脚 VQFN 封装。

主要特性

  • 高效充电:NMOS-NMOS 同步降压架构,效率 >92%,支持 600kHz/800kHz/1.2MHz 可调频率。
  • 灵活控制:通过外部电阻设置充电电压(精度 ±0.5%)和电流(精度 ±3%),支持涓流、恒流、恒压充电模式。
  • 安全保护:输入过压、电池过压、短路保护,NTC 温度监测,可编程安全计时器。
  • 电源管理:动态电源路径选择,支持无电池系统供电,低静态电流(待机 25µA,关断 1.2µA)。
  • 状态监控:通过 STAT1/STAT2 引脚输出充电状态,CE 引脚控制充电启用。

典型应用:便携设备、工业备份电源、太阳能充电系统。

简化原理图

BQ24610 简化原理图

这款芯片带有电源路径选择功能,通过连接外部场效应管就能控制外部适配器或电池给系统供电,省得我再单独找电源路径选择芯片了。

BQ24610 并没有针对磷酸铁锂电池进行优化,但它是比较通用型的锂电池充电器,能够设置充电电压,所以算得上是兼容。全部外部 MOSFET,应对 UPS 的设计功率应该没问题。

更新:为了支持 12V 电源和 3 串以上电池组,所以还不能使用仅支持降压充电的芯片。

BQ25703A

BQ25703A: 一款德州仪器(TI)推出的I2C控制、NVDC架构的多化学电池充电管理IC,适用于笔记本等便携设备的高效电源解决方案。

BQ25703A 是一款由 Texas Instruments (TI) 推出的电池充电控制器。它是一款同步升降压 (buck-boost) 电池充电控制器,旨在为 1 到 4 节串联电池(最高支持 19.2V)提供灵活的充电解决方案。该芯片支持多种输入源,包括 USB Power Delivery (USB PD) 和传统适配器,并能自动检测输入源类型。它集成了 I²C 接口,允许系统微控制器配置充电参数、监控充电状态以及系统电源管理。BQ25703A 常用于笔记本电脑、平板电脑、便携式电源以及其他需要高效电池充电和系统电源路径管理的应用中。

更新:本来是准备使用 4 串电池,后面为了降低电流,改用 5 串了。

BQ25730

BQ25730: 一款同步 NVDC 升降压电池充电控制器,支持 1-5 节电池充电,具备电源路径管理和 USB-C PD OTG 功能。

BQ25730 是 Texas Instruments (TI) 推出的一款同步升降压 (buck-boost) 电池充电控制器。与 BQ25703A 类似,它也支持广泛的输入电压范围和多种电池节数配置,通常用于需要灵活电源输入和高效电池充电的应用。BQ25730 同样集成了电源路径管理功能,允许系统在不通过电池的情况下直接从适配器供电,同时为电池充电。它也具备通信接口(如 I²C),方便系统进行配置和状态监控。这类芯片广泛应用于各种便携式电子设备、工业设备和储能系统中,以优化充电效率和系统整体电源管理。

BQ25730 应用示意图

DC-DC 模块

按照目前设计,外部适配器连接与电池二选一输入到 DC-DC 升降压电路,然后输出合适的电压输出给用电设备。这样一来,DC-DC 电路就是一直在工作了。

SC8701

我准备直接使用 SC8701 作为 DC-DC 控制器。通过电阻配置输出固定的电压。

设计

功率粗算

首先,根据下游设备的额定功率计算:P_{out} = V_{out} * I_{out} = 19V * 6.32A = 120.08W。 接下来,考虑 DC-DC 的效率,假设 DC-DC 的效率为 80%,那么 DC-DC 的功率为:P_{in} = P_{out} / 88% \approx 141W。直接取整数,就是 140W。这样电池需要能输出 140W 的功率。

电池组和保护板设计

电池组参数:

  • 标称电压: 5 * 3.2V = 16V
  • 最高电压: 5 * 3.65V = 18.25V
  • 最低电压: 5 * 2.5V = 12.5V
  • 容量: 3600mAh
  • 总内阻 (R_batt_int): 5 * 13.5mΩ = 67.5mΩ
  • 放电倍率: 3C = 3 * 3.6A = 10.8A (持续放电能力)

140W 输出下的电流:

  • 峰值电流 (发生在最低电压时): I_max = 140W / 12.5V = 11.2A(对比 4S: 峰值电流为 13.3A @ 10.5V)
  • 初始电流 (发生在较高电压时,例如 16V): I_initial = 140W / 16V = 8.75A。

峰值发热量计算 (发生在电流最大即 11.2A 时):

  • 电池发热 (P_batt = I² * R_batt_int):
    • P_batt_peak = (11.2A)² 0.0675Ω ≈ 125.44 0.0675 ≈ 8.47W

电芯电压节点连接

根据数据手册说明,电芯两端连接的电容 C_c 在 100nF 到 10 μF 之间,典型值是 1μF,电芯连接到 VCx 的电阻 R_c 的值在 10Ω 到 1kΩ 之间,典型值是 100Ω。我们选择典型值就好。

电芯外部输入电容电阻值

因为电芯电压不可能高于 5V,所以电容我选择耐压 10V 的。 按照数据手册的说明,内置的均衡电路,电流最大 50mA,最大功率是 W_{cmax} = 100Ω \times 50mA = 5mW $,远小于 0402 封装的 62.5mW,所以选 0402 封装的。

每个电芯平衡电流(内部)

检流电阻选择和相关寄存器配置

根据最大电流 11.2A 的输出,所以我计划过流保护设计上需要允许 12A,这个也是电池组极限了。下图是过流保护的寄存器配置可选值。

Overcurrent in discharge threshold setting

根据上面的寄存器配置说明,检流电阻分压的最大值有两个档位,使用放电截止电压带入计算,可以求出下表:

RSNS感应电压合适的电阻阻值对应的最大电流电阻功率
156mV5mΩ11.2A0.627W
161mV5mΩ12.2A0.744W
042mV3mΩ14A0.588W
039mV3mΩ13A0.507W
036mV3mΩ12A0.432W

这里我决定使用 3mΩ 的 1206 合金采样电阻,对应的 OCD_T 值设为 0xA (36mV),RSNS设为 0

保护场效应管

根据最大电流 12A 计算,留足降额和散热,应该考虑 持续电流 ≥20A 的 NCH FET。内阻需要考虑,大电流时散热问题还是比较重要的,尤其是这些器件会和电池是背靠背贴在 PCB 上的。最后我选择的是 NCEP4090GU: 一款N沟道超级沟槽功率MOSFET,适用于高频开关和同步整流,典型RDS(ON)为2.2mΩ(VGS=10V),工作温度可达150°C。

两颗背靠背保护 FET功耗是 P_fet_peak ≈ (14A)² * 0.0055Ω * 1.5 ≈ 113.85 * 0.00825 ≈ 0.94W。 1 这样看选择 NCEP4090GU 应该足够了。

我看大家的大功率保护板上都贴了不只一对的 FETs,我就设计了两对的位置。

UPS 电池保护板设计两对 FETs 位置

电池组放电温度

和 gemini-2.5-pro-exp-03-25 用简单的模型和最坏的条件得出下面的粗略结论:

在 35°C 环境温度下,要散发 11.9W 的热量,外壳的平均温度可能达到约 61°C。由于电池到外壳之间存在内部热阻(包括电池本身、导热垫及接触热阻),电池表面的峰值温度预计会比外壳平均温度高出约 4°C 或更多,达到约 65°C 左右。

可以明显看到这个情况比较糟糕,不过这个糟糕的状态是出现在电池放电的末期的极端情况,而末期应该是逐个虚拟机关机的时间,我相信功耗不可能达到这个情况,如果达到了,可以考虑通知主机立即关机。

不过这是最极端的情况,因为估算时使用的是适配器的额定输出功率 140W,主机正常使用的情况下,是不可能达到 140W 的,但是我还没有实测过功耗,根据 gemini 的估算,大概峰值功耗是在 70 ~ 110W,取 100W 计算,发热在 5.9W,则温度就能在 50°C 左右。后续上机测试看看,目前我就不去担心这个事了,温度保护设在 60°C 就断电。

高侧 FET 驱动器 BQ76200

本来没准备做高侧背靠背开关的,电池组 PCB 画完了才觉得不对劲,地不通呀!由于主控 MCU 是外接的,所以为了能在保护动作后还能继续通信,得改成高侧开关。

BQ76920 和 BQ76200 的数据手册相互推荐了对方做搭配,我也就懒得找了,能买得到就行,所以就使用 BQ76200 作为高侧 FET 驱动。

下文会将 BQ76200 直接称作 “FET 驱动器”,实在是因为 BQ76200 太容易和 BQ76920 混淆了……

BQ76200: 德州仪器(TI)的高压电池包前端充放电高侧NFET驱动器,用于电池管理系统。

BQ76200 简化原理图

设计上保留了预充电电路,但是我短期内应该不会使用这部分电路,主要是充电控制器芯片支持预充电功能,所以至少预充电功能不用这部分电路也能做。 更主要的是这个预充电使能只能由保护板外部的逻辑电平使能,BQ76920 并不支持控制,这导致保护逻辑依赖 MCU 的处理,有点增加项目复杂度了,可靠性也不好说,后续要实现还得看看 BQ76920 配合程度如何,比如是否支持欠压时完全禁止 CHG 和 DSG,不然就更复杂了。

充电和电源路径管理

我找了几款充电 IC,最后找到了 BQ25730 和 BQ25731。这两款支持 1 ~ 5S 的锂电池的自动升降压充电。现在以 BQ25730 进行设计,之后如果想替换成 BQ25731,硬件部分可以不需要改(除了 BAT FET 需要短接)。

检流电阻配置

BQ25730 支持分别在适配器输入端和电池充电端使用 5mΩ 或 10mΩ 电阻来适应 15.2A 或 8.2A 的应用。

这里我选择 R_{AC} = 10mΩ 适应 3A 以内的充电或者 6.32A 的 PTM 模式,R_{SR} = 5mΩ 适应 11.2A 的放电。需要配置 ChargeOption1 Register (I2C address = 31/30h) 的 [3:2] 位为 10b。

ChargeOption1 RSNS_X

CELL_BATPRESZ 配置

由于 BQ25730 默认适合标准锂离子电池,他的配置针对 4.2V 每节电池使用的。想要适应包括磷酸铁锂在内的其他种类电池,需要使用 I2C 进行配置。

CELL_BATPRESZ 配置我们选择 4S 的配置,避免意外情况下过充。

BQ25730 CELL_BATPRESZ

BQ25730 CELL_BATPRESZ 配置电阻

ILIM_HIZ 与输入限流配置

我计划限制 3A 输入,瞅了眼电阻,选了 3.125A 限流。

ILIM_HIZ 输入限流配置电阻

IADPT 配置与电感选择

为了减少发热,我选择的开关频率是 400kHz,所以设置 187kΩ 电阻。

BQ25730 IADPT 配置

对应的补偿阻容是:

BQ25730 Compensation Configuration

BQ25730 电感相关配置原理图

功率 MOSFET 选择

我找了三款 NCH MOSFET,下面是对比:

特性NCEP4045GU (典型)NCEP4090GU (典型)NCEP40T13GU (典型)
R_DS(on)6.0 mΩ2.2 mΩ1.8 mΩ
Q_g17.6 nC40 nC49 nC
Q_gd3.1 nC7.2 nC5 nC
R_θJC4.5 °C/W1.47 °C/W1.56 °C/W
FOM_top18.6 mΩ·nC15.84 mΩ·nC9 mΩ·nC
FOM_bottom105.6 mΩ·nC88 mΩ·nC88.2 mΩ·nC
td(on)6 ns7.5 ns10 ns
tr2.8 ns4.0 ns3 ns
td(off)23 ns37 ns34 ns
tf3 ns7.5 ns3 ns
总关断时间 (td(off)+tf)~26 ns~44.5 ns~37 ns
参考价格0.87 元1.08 元1.27 元
死区≤40ns裕量充足不适合 (典型关断时间44.5ns已超过40ns,存在直通风险)有一定裕量

BQ25730 的死区时间是 40 ~ 50ns(来源 TI 论坛)。这下就只能选 NCEP4045GU 或 NCEP40T13GU了。为了温度,我选 NCEP40T13GU。

BATFET 选择

BATFET 就是那个由 BATDAV 控制的、连接在电池和 VSYS 之间的 PCH FET。这里得考虑使用内阻小点的。我找了下选择了 NCE30P50G: 无锡新洁能生产的-30V/-50A P沟道增强型功率MOSFET。

  1. 类型匹配: NCE30P50G 是一款 P沟道 MOSFET,符合 BQ25730 对 BATFET 的驱动要求。
  2. 电压满足: 其漏源电压 (Vds) 额定值为 -30V,满足 5S LiFePO4 电池应用所需的 ≥ 30V 安全裕量。
  3. 驱动兼容: 输入电容 (Ciss) 典型值为 3.59nF,小于 BQ25730 驱动能力要求的 5nF,确保有效开关。
  4. 电流充裕: 连续漏极电流 (Id) 额定值为 -50A,远大于系统最大电池放电电流需求(约 10A)。
  5. 低导通损耗: 在 BQ25730 典型栅极驱动电压 (Vgs = -10V) 下,其导通电阻 (Rds(on)) 典型值仅为 4.4mΩ,最大 7mΩ,有助于降低电池放电路径的损耗和发热。
  6. 封装适宜: 采用 DFN 5x6 EP 封装,具有良好的散热性能,适合功率应用。

电感选择

优信里找了下,最大的 4.7μH 电感, DCR (Max) 都是标 ≤10mΩ 的,所以我折腾了下,找到了个 SRP1265A-4R7M。

SRP1265A-4R7M

看起来参数不错:

关键参数:

  • 电感值 (L): 4.7µH (±20%)
  • 饱和电流 (Isat): 28A
  • RMS 电流 (Irms): 13.5A
  • 直流电阻 (DCR Max): 8.4mΩ

评估:

  1. 饱和电流 (Isat): 28A 远大于预估的最大峰值电感电流 (~13.5A),提供了非常充足的裕量,能有效防止磁饱和,保证高负载和瞬态下的稳定性。优秀
  2. RMS 电流 (Irms): 13.5A 大于预估的最大 RMS 电感电流 (~11.2A),提供了约 20% 的温升裕量。这对于连续工作在额定功率附近是可接受的,但仍需关注实际散热设计。良好
  3. 直流电阻 (DCR): 最大 8.4mΩ,更低的 DCR 意味着更低的传导损耗 (约 1.05W @ 11.2A),有助于提高效率减少发热较好

BQ25730 的电源路径管理

外置电源路径管理

首先还是得提一下和 BQ25730 没啥关系的外置电源路径方案。这个方案也简单,在适配器电源的输入和电池的输出分别添加理想二极管或者是 OR-ing 电源路径选择器。这样就能实现双电源无缝切换了。

graph LR
    A[Adapter 12V~19V] --> D1[Ideal Diode];
    B[Battery 5S LiFePO4] --> DCDC[DC-DC SC8701];
    DCDC --> D2[Ideal Diode];
    D1 --> L[UPS OUT];
    D2 --> L;
NVDC

BQ25730 支持 NVDC,Narrow Voltage DC (狭窄电压直流) 技术。 Narrow VDC (NVDC) 是一种在电池管理系统中常用的电源路径管理架构。它的主要思想是,在系统同时连接外部适配器(Adapter)和电池时,通过精确控制电源路径,使系统总线(System Bus)的电压被稳定地钳制在一个相对狭窄的电压范围内。

这个场景对于后级电源转换器或芯片能直接让电池作为电源的场景下能一站式解决电源路径管理功能,不过对于需要输出固定电压的 UPS 来说就不合适了。但是咱这项目主要目的还是为了让特定设备拥有不会突然掉电的电源,所以这个其实有可能是可以直接输出给我的小服务器的,我感觉它是能支持 12.5 ~ 18.0 V 供电,不过没找到证据,等后面有时间测一下。

如果我的小服务器不能支持宽电压输入,那么只能在它后面增加 DC-DC 电路进行电压转换了。这样结果就是无论用哪路电源,都要经过两次 DC-DC 转换,并且两次转换的电压差不算小,势必会导致损耗惊人,然后被动散热肯定也是顶不住了。

使用这个方案可以不需要外置电源路径管理,并且能实现电池补充输出和剩余电流充电,非常适合在原装适配器和用电器中间插入的一个 UPS 的情况。如果我的小服务器能支持宽电压输入,这就是一个可选方案了。

graph LR
    A[Adapter 12V~19V] --> VBUS[BQ25730 VBUS];
    BQ25730 --> B[Battery 5S LiFePO4];
    B --> BQ25730;
    VBUS  --> BQ25730;
    BQ25730 --> DCDC[DC-DC SC8701]
    DCDC --> L[UPS OUT];
PTM

PTM (Power Transfer Mode),TI的专利技术,用于提高系统电源效率和电池快速充电。它能直接将适配器供电直通到负载。

PTM 介绍

PTM 示意图

我的理解是,使用 PTM,我同样可以不需要外置电源路径管理,并且只需要一次 DC-DC 转换。虽然使用适配器时还是会有 DC-DC 电路的损耗,但是由于电压差比较小,转换效率应该很高。

那么这个方案的问题就是充电效率比较差了。在这个方案下,电池充电是靠 BATFET 的线性工作来实现充电,对于 UPS 来说倒不是大问题,又不是天天停电,慢慢充也挺好的。

graph LR
    A[Adapter 12V~19V] --> VBUS[BQ25730 VBUS];
    BQ25730[BQ25730 PTM Mode] --> B[Battery 5S LiFePO4];
    B --> BQ25730;
    VBUS  --> BQ25730;
    BQ25730 --> DCDC[DC-DC SC8701]
    DCDC --> L[UPS OUT];

我觉得 PTM 适合和 NVDC 一起使用。充电时使用 NVDC,提升充电效率;非充电或重载时,使用 PTM 降低损耗。这样一来,如果 UPS 在 12V 模式下使用,也能实现升压充电,毕竟单纯 PTM 可没法升压充电。

OTG(FRS)

本来以为电源路径管理的方案已经差不多了了,后面确认 BQ25730 一些功能细节时,让我注意芯片支持的 USB-C PD 规范包括快速角色交换 (FRS)。之前以为这个切换会比较缓慢,即使他是快速角色切换,当我再次确认时发现,诶嘿,这个功能是可以避免瞬时断电,这可不就是 UPS 要做的吗?

如果能使用 OTG + FRS,那么我就能利用 BQ25730 的 DC-DC 电路直接在使用电池供电时对电池进行电压转换,那可是省板子、省器件、省空间,不得赢麻了?

然后,我在 TI 论坛上找到这么个帖子: BQ25730: How to build an UPS with BQ25730 and constant output voltage, independent of cell count. - Power management forum - Power management - TI E2E support forums

我觉得可以试试,预留下回到额外 DC-DC 电路的退路就好了。

graph LR
    A[Adapter 12V~19V] --> D1[Ideal Diode];
    D1[Ideal Diode] --> VBUS[BQ25730 VBUS];
    BQ25730[BQ25730 Charge / OTG] --> B[Battery 5S LiFePO4];
    B --> BQ25730;
    VBUS  --> BQ25730;
    VBUS --> L[UPS OUT];

预充电

BQ25730 支持预充电功能。

理想二极管

为了降低损耗,我还是决定尽量选择 OTG 或外部 OR-ing 的方案。

理想二极管基础知识(TI) MOSFET Selection Guide for Ideal Diode Controllers (Diodes)

理想二极管控制器选型总结

型号 (厂商)响应速度 (典型值)静态电流 (IQ, 典型值)推荐 R_{DS(ON)}主要优势缺点/考虑因素最终评估/选择
LM74700-Q1 (TI)0.45µs0.80µA20 ~ 50 mV / ILoad(Nominal)性能均衡, 电荷泵IQ 相对较高备选
LM74610-Q1 (TI)2.2μs0?IQ 极低, 电荷泵响应慢不支持线性调节
MX5050T (Maxin)18ns(C_{GATE}=0)
125ns(C_{GATE}=10nF)
260ns(C_{GATE}=47nF)
?30 ~ 100 mV / ILoad(Nominal)响应快, 国产, 性价比品牌/支持相对较弱可用
MX5050L (Maxin)18ns(C_{GATE}=0)
125ns(C_{GATE}=10nF)
260ns(C_{GATE}=47nF)
?20 ~ 100 mV / ILoad(Nominal)比 MX5050T 略贵,品牌/支持相对较弱选定

LM74700-Q1 挺好,就是贵,淘宝 17 元,MX5050T 和 MX5050L 能在 2 元和 4 元以内搞到。所以初步决定在 MX5050T 和 MX5050L 内选择了。

根据下一小节的内容,可以知道由于 UPS 电流比较大,所以应该选 V_{SD(REG)} 小的,MX5050T 是 30 mV,MX5050L 是 20 mV,在 6A 的情况下,MX5050T 的功率损耗是 180mW, 而 MX5050L 的功率损耗是 120 mW。看起来差距还是值得选择 MX5050L。

支持线性调节的理想二极管控制器栅极驱动

支持线性调节的理想二极管栅极驱动器模式转换

可以看到,支持线性驱动的控制器,能让理想二极管两端的电压差控制在一定的范围内,以实现更优雅地轻载关断。这会影响我们选择 MOSFET 的 R_{DS(ON)}。

理想二极管外部 MOSFET 选择

根据数据手册推荐,我们需要计算一下在正常负载时 MOSFET 两端之间的电压差:

V_{DS} = R_{DS(ON)} \times I_{LOAD}

适配器输入侧最大电流是 6.23 A,电池输出侧最大电流是 11.2 A。 分别计算 20 mV、30 mV 和 100 mV 的电压差,得到:

电流20 mV30 mV100 mV
1 A20\ m\Omega30\ m\Omega100\ m\Omega
2 A10\ m\Omega15\ m\Omega50\ m\Omega
3 A6.67\ m\Omega10\ m\Omega33.33\ m\Omega
4 A5\ m\Omega7.5\ m\Omega25\ m\Omega
5 A4\ m\Omega6\ m\Omega20\ m\Omega
6 A3.33\ m\Omega5\ m\Omega16.67\ m\Omega
6.23A3.21\ m\Omega4.82\ m\Omega16.05\ m\Omega
8 A2.5\ m\Omega3.75\ m\Omega12.5\ m\Omega
8.75 A2.38\ m\Omega3.69\ m\Omega12.04\ m\Omega
11.2A1.79\ m\Omega2.68\ m\Omega8.93\ m\Omega

在确定选什么 MOSFET 之前,看看上表。我们需要知道负载平常的电流是多少,不过我还没测,所以不知道。 现在就大概取额定的一半作为平时的负载,那么适配器输入侧就是 3A ->6.67 mΩ ~ 33.33 mΩ,电池输出侧就是 5A -> 4 mΩ ~ 20 mΩ。 这么看适配器输入侧选择 NCEP4045GU(6.0 mΩ) 就足够了,电池输出侧选择 NCEP40T13GU(1.8 mΩ)。 不过为了保持 BOM 简洁点,最后可能会统一用 NCEP40T13GU 了,等最后全部设计完再看看。

适配器输入保护

输入保护选电子保险丝而不是一次性保险丝

本来我准备直接上一个一次性贴片保险丝的,不过看了下,想要快熔断的只有方形表面贴装保险丝。

方形表面贴装保险丝

根据封装不同,常温阻值在 7 ~ 12 mΩ。由于输入电流额定 6.32A,感觉损耗有点高,毕竟直通输出模式下也串了不少 10mΩ 级别的器件,所以还是想省省,就看了看电子保险丝。下面是我找到的电子保险丝——TPS2490,对比普通一次性保险丝在 8 A 电流时情况:

方案 1: JFC0603-1800FS 一次性保险 方案 2: TPS2490 + 7mΩ 检流电阻 + NCEP40T13GU 电子保险丝

特性JFC0603-1800FS丝TPS2490
保护原理热效应熔断电流检测与主动关断 MOSFET
正常工作损耗约 0.45W (8A 冷态),实际损耗随温度升高显著增加典型约 0.56W,最大约 0.60W (8A 时,较稳定)
响应速度毫秒 ~ 数百微秒 (取决于过流大小,短路约 300µs,2倍过载约 11.7ms)微秒级 (主要取决于 TPS2490 快速故障响应,通常 1-5µs)
可恢复性不可恢复,需手动更换可恢复 (可配置自动重试或外部控制)
精度/可调性固定熔断特性,精度一般较高,电流限制阈值可配置
电路复杂度简单 (单个元件)相对复杂 (多个元件:控制器 IC, MOSFET, 检流电阻等)
成本较高
与 MCU 集成困难 (需额外电路检测状态)容易 (提供故障状态输出,可控)
对故障能量限制相对较弱 (响应慢,允许较大 I²t 通过)强 (响应快,有效限制故障 I²t)

由于我后续会使用 MCU 控制延迟闭合适配器输入来应对市电恢复初期不稳定的情况,使用 TPS2490 这种电子保险丝能省得我再单独搞个 FET 驱动。

TPS2490 检流电阻

我计划在适配器输入处增加一个检流电阻,给 TPS2490 和 INA226 共用。因为 INA226 允许自由选择检流电阻,所以检流电阻阻值就由 TPS2490 的要求确定。

R_{SNS,CLC} = \frac{V_{CL}}{I_{LIM}}

其中:

  • R_{SNS,CLC} 是感应电阻的阻值。
  • V_{CL} 是感应电阻上的电压差(典型值为 45 mV)。
  • I_{LIM} 是电流限制值。

7A 电流限制对应的阻值: 使用公式: R_{SNS,CLC} = \frac{V_{CL}}{I_{LIM}} 代入数值:V_{CL} = 45 \text{ mV} = 0.045 \text{ V}I_{LIM} = 7 \text{ A}R_{SNS,CLC} = \frac{0.045 \text{ V}}{7 \text{ A}} \approx 0.006428 \text{ Ω} = 6.43 \text{ mΩ} 所以,如果需要将电流限制设置为 7A,感应电阻的阻值大约需要是 6.43 mΩ

由于电阻阻值是离散的,检流电阻还需要和 INA226 共用,所以不方便用电阻分压器处理。我们不要求精准的过流阈值,所以可以适当调整电阻阻值。现在我们使用标准阻值带入公式计算:

感应电阻阻值 (R_{SNS,CLC})电流限制值 (I_{LIM})
5 mΩ9 A
6 mΩ7.5 A
7 mΩ6.43 A

看起来这三个阻值都很 OK,我计划使用 7mΩ 的检流电阻。由于我不知道也无从查证服务器主机的额定功率,所以我只能尽量避免直通模式下影响电流的能力上限。虽然一般来说主机不太可能需要接近电源额定输出的电流,不过我还是希望不要影响原来的情况,正常来说我应该换一个更大规格的电源适配器来连接 UPS,而不是使用服务器自带的电源,但是我不想花钱买新电源并且又多一个吃灰的旧电源,一切都是为了环保(bushi

TPS2490 设计工具

在设计中使用 MOSFET 安全工作区曲线(TI)

NCEP40T13GU 安全工作区 (Safe Operation Area, SOA)

我计划使用单个 NCEP40T13GU 作为 TPS2490 的 FET。

设计工具

设计完成后,结果是这样的:

TPS2490 for UPS 120

这样设计完看起来应该是能用的。

TPS2490 小结

我研究了半天,终于搞清楚 TPS2490 到底实现了啥功能。

首先是带有最大功率限制的限流功能,这个功能能实现软启动效果。

  1. 限流 热插拔或者电源刚上电时,TPS2490 后级电路可能带有电容之类的器件,会汲取大量电流,这时,带限流功能就会生效,控制 FET 在线性工作区间来控制输入电流。限流时间是由 Timer 引脚的电容设定的。

    显然,有一个问题不能忽略,就是 FET 并不能一直在线性区间工作时流过大电流。这时候就需要根据 SOA(Safe Operation Area)曲线来确定时间、I_DV_ds 三者的关系来保证 FET 不会完蛋。

2.功率限制 这里的功率限制是限制 FET 的功率,而不是系统的输入功率。这个功率限制能让低规格的 FET 在 SOA 内工作。代价就是软启动时间变长了。

然后就是过流跳闸。限流动作超过一定时间后,就会彻底关断 FET。TSP2490 需要重新上电或者重新将 EN 引脚由低电平转为高电平复位,TPS2491 会通过 10 倍的 Timer 时间自动重新循环复位。

Back to Blog

相关文章

查看更多 »

电子负载 Rev.3 开发笔记

上次做的电子负载 Rev.1,核心功能是没问题的,但是电压和电流读数不理想,可能还不是误差或者偏差,所以重新设计了两次电压电流检测方案,最终在 Rev.3 上改用 MCU 片上 OpAmp 做处理再送入 ADC,并修复和改进了一些地方。 Rev.3 目前硬件部分没什么问题了,这次另一个主要内容就是软件实现。搞上了 Web USB,效果还可以,无线部分估计要继续鸽了~