1. BMS待机电流测量与基准评估

BMS待机电流测量与基准评估 学习卡片

任务定义

本案例目标为:搭建一个可复现的BMS待机电流测量环境,完成对测量基准(采样电阻与电流检测方案)的评估。具体需要完成:设计并实现一个基于精密采样电阻 + 运算放大器 + ADC的微安级待机电流测量电路,给出关键参数计算、PCB布局要点、测量步骤与判定标准,并提供一个用于数据采集与基准评估的Python脚本。

测量原理与电路设计

BMS待机电流通常为10~100µA量级,需选用低失调电压的运放与高精度采样电阻。本设计采用差分放大拓扑,采样电阻置于电池负极与负载地之间,运放将采样电阻上的压降放大后送入ADC。

参数符号数值说明
采样电阻Rsense1Ω ±0.1%25ppm/°C,低热电动势
运放增益G100由Rf/Ri决定
运放失调电压Vos≤5µV斩波型运放(如ADA4522)
ADC分辨率N16位参考电压Vref=2.5V
测量范围Irange0~25mA覆盖待机与浅休眠电流

电路连接:电池正极→负载→采样电阻→电池负极。运放差分输入跨接在采样电阻两端,输出接ADC。增益设定电阻Ri=1kΩ,Rf=100kΩ,构成G=100的差分放大器。

关键参数计算

最小可分辨电流:I_min = V_ref / (2^N × G × R_sense) = 2.5 / (65536 × 100 × 1) ≈ 0.38µA
满量程电流:I_fs = V_ref / (G × R_sense) = 2.5 / (100 × 1) = 25mA
失调等效电流误差:I_os_err = V_os / R_sense = 5µV / 1Ω = 5µA

由计算可知,运放失调电压导致的5µA误差是主要基准误差源,需通过校准消除。本案例在软件中实现两点校准(零点与已知电流点)。

PCB布局要点

  • 采样电阻采用四线开尔文连接,避免焊盘铜箔电阻引入误差;
  • 运放差分输入走线等长且靠近采样电阻,减少噪声拾取;
  • 模拟地与功率地单点连接,ADC参考电压使用独立LDO供电;
  • 采样电阻下方禁止铺铜,防止温度梯度产生热电动势。

数据采集与基准评估代码

以下Python脚本通过串口读取ADC原始值,执行两点校准,并计算待机电流与测量不确定度评估:

import serial
import time
import numpy as np

# 配置参数
RSENSE = 1.0          # 采样电阻(Ω)
GAIN = 100.0          # 运放增益
VREF = 2.5            # ADC参考电压(V)
ADC_BITS = 16
ADC_MAX = 2**ADC_BITS - 1

# 校准数据:在校准模式下获取
CAL_ZERO_ADC = 32768      # 零电流时ADC读数(实测校准)
CAL_KNOWN_ADC = 35000     # 注入100µA时ADC读数(实测校准)
CAL_KNOWN_I = 100e-6      # 已知校准电流(A)

def adc_to_voltage(adc_val):
    return adc_val * VREF / ADC_MAX

def calibrate(zero_adc, known_adc, known_i):
    """两点校准,返回增益系数k与零点偏移b"""
    v_zero = adc_to_voltage(zero_adc)
    v_known = adc_to_voltage(known_adc)
    # 输出电压 = k * I + b
    k = (v_known - v_zero) / known_i
    b = v_zero
    return k, b

def measure_current(adc_val, k, b):
    """将ADC读数转换为电流值"""
    v_out = adc_to_voltage(adc_val)
    i_measured = (v_out - b) / k
    return i_measured

def evaluate_baseline(ser, num_samples=100):
    """采集样本并评估基准稳定性"""
    raw_values = []
    for _ in range(num_samples):
        line = ser.readline().decode().strip()
        if line.isdigit():
            raw_values.append(int(line))
        time.sleep(0.01)
    
    if len(raw_values) < 10:
        raise RuntimeError("串口数据不足,请检查连接")
    
    adc_array = np.array(raw_values)
    k, b = calibrate(CAL_ZERO_ADC, CAL_KNOWN_ADC, CAL_KNOWN_I)
    currents = (adc_to_voltage(adc_array) - b) / k * 1e6  # 转换为µA
    
    result = {
        'mean_ua': float(np.mean(currents)),
        'std_ua': float(np.std(currents)),
        'min_ua': float(np.min(currents)),
        'max_ua': float(np.max(currents)),
        'peak_to_peak_ua': float(np.ptp(currents)),
        'adc_raw_mean': float(np.mean(adc_array)),
        'calibration_k': k,
        'calibration_b': b
    }
    return result

if __name__ == "__main__":
    # 串口配置示例:Linux下为/dev/ttyUSB0,Windows为COM3
    ser = serial.Serial('COM3', 115200, timeout=1)
    time.sleep(2)  # 等待设备稳定
    
    # 进入待机模式后采集
    print("请将BMS置于待机状态,按回车开始测量...")
    input()
    
    stats = evaluate_baseline(ser, num_samples=200)
    print(f"待机电流均值: {stats['mean_ua']:.2f} µA")
    print(f"标准差: {stats['std_ua']:.2f} µA")
    print(f"峰峰值: {stats['peak_to_peak_ua']:.2f} µA")
    print(f"校准系数 k={stats['calibration_k']:.6e}, b={stats['calibration_b']:.6e}")
    
    # 基准评估判定
    if stats['peak_to_peak_ua'] < 2.0:
        print("判定:基准稳定,测量系统满足待机电流评估需求")
    else:
        print("判定:基准波动过大,检查屏蔽与接地")
    
    ser.close()

测量步骤与验证方法

  1. 按电路图连接硬件,采样电阻串入电池负极回路;
  2. 断开负载,使BMS进入待机模式;
  3. 运行校准程序,记录零电流ADC值与注入100µA已知电流时的ADC值;
  4. 将校准值填入脚本对应变量,运行测量脚本采集200个样本;
  5. 观察输出:若待机电流均值在10~100µA范围内且峰峰值小于2µA,判定测量基准合格;
  6. 使用六位半万用表(如Keysight 34461A)串联验证,误差在±5%以内即通过。

验证判定标准

本案例的通过标准为:测量系统能够稳定分辨1µA级别的电流变化,且200次采样峰峰值不超过2µA。若实际测量中噪声过大,应检查采样电阻焊接质量、运放供电去耦电容(需在VCC与GND间放置0.1µF与10µF电容)以及屏蔽线接地情况。

BMS待机电流测量系统连接与信号链路 电池 3.7V B+ 负载/系统 BMS电路 (待机模式) R_sense 1Ω 0.1% B- 开尔文检测线 运放 G=100 ADA4522 ADC 16位 MCU 校准/计算 UART PC端Python 评估脚本 校准电流源 100µA ±0.05% 校准注入点 测量链路:采样电阻压降 → 差分放大 → ADC → MCU校准 → 串口输出 最小分辨率:0.38µA | 满量程:25mA | 校准后误差:<±1µA ■ 功率路径 ┅ 开尔文检测 ┅ 校准注入 ■ 信号链路 关键节点