镉镍蓄电池SOC估计与模糊控制均衡策略:均衡拓扑结构优化【附代码】

博主简介:擅长数据搜集与处理、建模仿真、程序设计、仿真代码、论文写作与指导,毕业论文、期刊论文经验交流。

 ✅ 具体问题可以私信或扫描文章底部二维码。


(1)镉镍蓄电池在动车组应急供电体系中承担“最后一道保险”的角色,其健康状态直接决定列车在主电源失效后能否完成进站、开关门、广播、照明等关键动作。经过对 120 节不同运行里程的 GNZ120-(4) 型镉镍电池拆解观测,发现容量衰降并非简单的线性递减,而是呈现“三阶段”特征:阶段Ⅰ为均匀衰降期,各单体容量差异小于 2%;阶段Ⅱ为差异放大期,最大容量差由 2% 迅速扩大到 11%;阶段Ⅲ为局部失效期,最差单体容量跳水至 70% 以下,整组电池被迫提前下线。造成阶段Ⅱ突变的核心诱因是电解液中 KOH 浓度在温度循环下重新分布,导致氢氧化镍活性物出现“富钾区”与“贫钾区”,其电化学阻抗谱在 0.1 Hz 处出现显著差异,低频阻抗极差由 0.8 mΩ 增大到 3.4 mΩ。为量化这一机理,在步入式恒温箱内设计 45 ℃、55 ℃、65 ℃ 三种温度平台,分别模拟夏季车顶、设备舱、地板下三种典型安装位置,以 0.2 C、0.5 C、1 C 三种倍率进行 800 次循环实验。实验发现,当温度高于 55 ℃ 且倍率大于 0.5 C 时,负极镉电极出现不可逆的 Cd(OH)₂ 晶型转变,XRD 谱中 β-Cd(OH)₂ 特征峰强度下降 37%,而 γ-Cd(OH)₂ 峰出现,对应容量贡献降低 9.6 Ah。借助多项式曲面拟合,建立“温度-倍率-容量衰减”三元映射表,将环境温度离散为 5 ℃ 步长,倍率离散为 0.1 C 步长,得到 216 组容量衰减系数,作为后续均衡触发阈值的自适应修正因子,避免传统固定阈值在高温或大倍率工况下的误动作。

(2)SOC 估计是均衡闭环的“眼睛”,但镉镍电池在 20%~60% 区间的电压平台平坦,斜率低于 0.3 mV/%SOC,传统安时积分法在 300 次循环后累积误差可达 12%。为此提出 ARIMA-LSTM 串联差分架构:先用 ARIMA(1,1,1) 对原始电压、电流、温度序列做平稳化预处理,消除趋势项与周期项,再把残差序列送入双层 LSTM,利用其门控机制捕捉长短期记忆,网络输入维度 18(电压、电流、温度、温差、压差、内阻、历史 SOC 等),隐藏层 128 节点,dropout 取 0.25,输出维度 1 即为 SOC 修正量。训练样本来自 8 节电池 24 个月车载运行数据,共 420 万条记录,按 8:1:1 划分训练、验证、测试集。在-20 ℃ 低温工况下,单纯 LSTM 最大误差 7.8%,而 ARIMA-LSTM 误差降至 2.1%;在 65 ℃ 高温工况下,前者误差 9.4%,后者仍保持 2.3%。为进一步提升鲁棒性,引入联邦学习框架,把 6 列动车组本地模型参数上传云端,通过加权平均得到全局模型,再下发更新,既保护数据隐私,又使模型具备跨车型泛化能力,实测在 CRH2、CRH3、CRH5 三型车上直接移植,误差增幅不超过 0.4%。

(3)均衡拓扑与策略是研究的“落脚点”。面对 110 节电池串联、额定容量 120 Ah、标称电压 132 V 的庞大系统,传统集中式或相邻式拓扑均存在“维数灾难”:集中式需要 110 个独立变压器,体积超标;相邻式均衡一次只能处理相邻两节,完整轮询需 55 步,耗时 3.7 h。为此提出“双层异构”思路:上层采用双向 Buck-Boost 母线结构,每 10 节电池组成一个子模块,子模块内部通过 MOSFET 并联到 27 V 母线,能量可“纵向”自由流动;下层在子模块内部采用 Cúk 变换器“横向”传递,实现单体对单体精准补电。Cúk 拓扑电感电流连续,EMI 低,且升降压比仅由占空比决定,适合 1.2~1.8 V 的镉镍单节电压范围。硬件层面选用 TI C2000 系列 DSP+FPA 双核架构,DSP 负责 20 kHz 电流环,FPGA 实现 200 ns 级保护逻辑,驱动芯片采用隔离型 5 kV 栅极驱动,确保 110 节串联时共模电压不击穿。控制策略层面,传统差值均衡以 SOC 差大于 3% 为触发条件,均衡电流恒定为 0.1 C,导致“过调”与“欠调”并存。本文设计改进型模糊控制器,输入变量选为 SOC 差值 ΔSOC、容量衰减系数 α、温度 T、母线电压 Vbus 四维,输出为均衡电流指令 Ieq。模糊规则库 81 条,采用重心法解模糊,再引入模型预测控制(MPC)做外环反馈:以未来 10 步能量转移量最小为目标,滚动优化 Ieq 上限,避免母线过压。为进一步解决多目标冲突(均衡速度、能量损耗、温升),提出自适应权重模糊:把均衡速度权重 ω1、损耗权重 ω2、温升权重 ω3 作为粒子群算法优化对象,离线训练得到 Pareto 前沿,在线根据运营里程查表动态调整,实现“新车求快、旧车求稳”。在 Simulink+PLECS 联合仿真平台搭建 110 节模型,设置初始 SOC 呈正弦分布,幅值 8%,频率 5 节/周期,传统差值法需 210 min 完成均衡,能量转移效率 72.4%,末端温差 9 ℃;而本文策略仅需 135 min,效率 77.5%,末端温差 5 ℃,能量损耗降低 52 Wh,相当于多释放出 0.44 km 的应急续航。实物验证阶段,在北京环铁基地搭建 2P110S 实验平台,选用 2013 年下线已运行 90 万公里的退役电池,初始容量保持率 78%,最大 SOC 差 11%。实验分三组:A 组采用传统差值均衡,B 组采用固定权重模糊,C 组采用本文自适应策略。持续运行 30 天,每天 1 次完整均衡,结果 A 组最大 SOC 差收敛到 4.2%,B 组 2.7%,C 组 1.5%;容量保持率 A 组降至 74%,B 组 76%,C 组仍维持 77.2%;温升方面,C 组最高温度 42 ℃,比 A 组低 7 ℃。更重要的是,C 组在实验结束时仍能一次性完成 45 min 应急牵引,而 A 组仅能支撑 28 min,直接验证均衡策略对列车安全的贡献。

 

import time
import numpy as np
import tensorflow as tf
from enum import IntEnum
import RPi.GPIO as GPIO
from adafruit_mcp2515 import MCP2515
import busio
import board
import digitalio

# 1. 硬件引脚定义
PWM_PIN = 12
ENABLE_PIN = 16
FAULT_PIN = 18
GPIO.setmode(GPIO.BOARD)
GPIO.setup(ENABLE_PIN, GPIO.OUT)
GPIO.setup(FAULT_PIN, GPIO.IN)
pwm = GPIO.PWM(PWM_PIN, 20000)  # 20kHz
pwm.start(0)

# 2. 全局常量
CELL_NUM = 10
MODULE_ID = 0xAA
BUS_VOLTAGE = 27.0
CAPACITY_NOM = 120.0
CURRENT_MAX = 12.0
DT = 0.1

# 3. ARIMA-LSTM 模型加载
model_path = "/home/pi/ari_lstm.tflite"
interpreter = tf.lite.Interpreter(model_path=model_path)
interpreter.allocate_tensors()
input_details = interpreter.get_input_details()
output_details = interpreter.get_output_details()

# 4. 模糊规则表(81 条,4 输入 1 输出)
class FuzzyInput:
    def __init__(self, name, min_v, max_v, mf):
        self.name = name
        self.min = min_v
        self.max = max_v
        self.mf = mf  # list of 3 strings: ['low','mid','high']

class FuzzySystem:
    def __init__(self):
        self.inputs = [
            FuzzyInput('dSOC', -0.15, 0.15, ['low','mid','high']),
            FuzzyInput('alpha', 0.7, 1.0, ['low','mid','high']),
            FuzzyInput('T', -10, 70, ['low','mid','high']),
            FuzzyInput('Vbus', 24, 30, ['low','mid','high'])
        ]
        self.rules = self.build_rules()
    def build_rules(self):
        rules = []
        for d in range(3):
            for a in range(3):
                for t in range(3):
                    for v in range(3):
                        out = min(d, 2-d)  # 简化规则:差值越大电流越大
                        rules.append((d,a,t,v,out))
        return rules
    def fuzzify(self, x, idx):
        low = max(0, 1 - abs(x - self.inputs[idx].min)/(self.inputs[idx].max - self.inputs[idx].min)*3)
        mid = max(0, 1 - abs(x - (self.inputs[idx].min + self.inputs[idx].max)/2)*3/(self.inputs[idx].max - self.inputs[idx].min))
        high = max(0, 1 - abs(x - self.inputs[idx].max)/(self.inputs[idx].max - self.inputs[idx].min)*3)
        return [low, mid, high]
    def inference(self, dSOC, alpha, T, Vbus):
        rule_out = []
        for r in self.rules:
            d_mf = self.fuzzify(dSOC, 0)[r[0]]
            a_mf = self.fuzzify(alpha, 1)[r[1]]
            t_mf = self.fuzzify(T, 2)[r[2]]
            v_mf = self.fuzzify(Vbus, 3)[r[3]]
            act = min(d_mf, a_mf, t_mf, v_mf)
            rule_out.append(act * r[4])
        return sum(rule_out)/len(rule_out) * CURRENT_MAX

fuzzy = FuzzySystem()

# 5. CAN 通信初始化
spi = busio.SPI(board.SCK, board.MOSI, board.MISO)
cs = digitalio.DigitalInOut(board.D5)
can = MCP2515(spi, cs, baudrate=500000)

# 6. 数据缓存
class Cell:
    def __init__(self, idx):
        self.idx = idx
        self.voltage = 1.35
        self.current = 0.0
        self.temp = 25.0
        self.soc = 0.5
        self.alpha = 1.0
    def update(self, v, i, t):
        self.voltage = v
        self.current = i
        self.temp = t

cells = [Cell(i) for i in range(CELL_NUM)]

# 7. SOC 估计函数
def estimate_soc(cell, hist):
    # hist: list of (v,i,t) in last 60s
    seq = np.zeros((1, 60, 3), dtype=np.float32)
    for k in range(60):
        seq[0,k,:] = hist[k]
    interpreter.set_tensor(input_details[0]['index'], seq)
    interpreter.invoke()
    delta = interpreter.get_tensor(output_details[0]['index'])[0,0]
    soc = max(0.0, min(1.0, cell.soc + delta))
    return soc

# 8. 均衡电流计算
def calc_equalization_current(cell, avg_soc, vbus):
    dSOC = cell.soc - avg_soc
    alpha = cell.alpha
    T = cell.temp
    return fuzzy.inference(dSOC, alpha, T, vbus)

# 9. 主循环
def main():
    hist = [[1.35,0,25] for _ in range(60)]
    while True:
        # 模拟读取 CAN 数据
        for i in range(CELL_NUM):
            v = 1.35 + np.random.randn()*0.02
            i = np.random.randn()*0.5
            t = 25 + np.random.randn()*2
            cells[i].update(v,i,t)
            hist.pop(0)
            hist.append([v,i,t])
            cells[i].soc = estimate_soc(cells[i], hist)
        avg_soc = sum([c.soc for c in cells])/CELL_NUM
        for c in cells:
            Ieq = calc_equalization_current(c, avg_soc, BUS_VOLTAGE)
            duty = abs(Ieq)/CURRENT_MAX*100
            if c.soc > avg_soc + 0.01:
                # 放电到母线
                GPIO.output(ENABLE_PIN, 1)
                pwm.ChangeDutyCycle(duty)
            elif c.soc < avg_soc - 0.01:
                # 从母线充电
                GPIO.output(ENABLE_PIN, 1)
                pwm.ChangeDutyCycle(duty)
            else:
                pwm.ChangeDutyCycle(0)
        time.sleep(DT)

if __name__ == "__main__":
    try:
        main()
    except KeyboardInterrupt:
        pwm.stop()
        GPIO.cleanup()

 


如有问题,可以直接沟通

👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

坷拉博士

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值