
✅ 博主简介:擅长数据搜集与处理、建模仿真、程序设计、仿真代码、论文写作与指导,毕业论文、期刊论文经验交流。
✅ 具体问题可以私信或扫描文章底部二维码。
(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()

如有问题,可以直接沟通
👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇
1万+

被折叠的 条评论
为什么被折叠?



