BMS Simulink 所有算法基于Simulink开发 BMS算法包括:SOC计算,故障处理,模组状态监测,充放电控制 图一:Simulink模型 图二:Stateflow逻辑转换 图三:充电状态 图四:放电状态 图五:交付内容

BMS在电池管理系统里相当于大脑的角色,而Simulink就是给这个大脑搭神经网络的神器。直接甩开那些繁琐的手写代码,咱用模块拖拽就能把算法安排得明明白白。图一这个模型看着像乐高积木吧?每个小方块都藏着硬核算法,双击进去还能看见更细的电路级实现。

SOC计算这块绝对是技术活,Stateflow的状态机(图二)用起来贼溜。比如这个判断充电状态的转移条件:

function soc = calculateSOC(voltage, current, temperature)
    persistent coulomb_count;
    if isempty(coulomb_count)
        coulomb_count = 0;
    end
    coulomb_count = coulomb_count + current * 0.1; //0.1秒采样周期
    soc = coulomb_count / 3600; //转换成Ah
    soc = min(max(soc, 0), 100); //钳位在0-100%
end

这个库仑计法代码直接能生成C代码,注意里面的持久变量相当于静态变量。但实际项目里还得配合开路电压法做校准,不然电流积分漂到姥姥家去了。

故障处理模块就像个24小时值班的保安。过压检测逻辑在Stateflow里直接画成流程图,比写if-else清爽多了。比如这个热失控预警:

if any(cellVoltage > 4.25) && (packTemperature > 60)
    triggerFault('OVERTEMP_OVERVOLTAGE');
    setChargeMOSFET('OFF'); //立马关充电MOS管
end

这里用any函数处理电池组里任意单体异常,实战中还要加延迟触发防止误报。MOS管控制信号记得做互锁逻辑,避免上下管同时导通酿成惨剧。

充放电控制的状态切换(图三图四)特别像打游戏切大招。充电时得盯着温度曲线调电流,Simulink里用查表模块实现非线性控制:

chargeCurrent = interp1(temperatureTable, currentTable, packTemp, 'pchip');

这里用分段三次埃尔米特插值比线性插值平滑,避免电流突变引发继电器打火。放电时更刺激,突然有个单体电压暴跌就得启动负载切除,这时候看状态机的跳转速度能到毫秒级。

最后交付的东西(图五)除了模型文件,自动生成的代码带着完整的跟踪需求。比如这个代码注释:

/* Model step function */
void BMS_step(void)
{
    /* 对应需求文档REQ-023 */
    SOC_Calculate();
    /* 对应FMEA文档FMEA-045 */
    Fault_Check();
}

这种需求追溯在过车规认证时能救命。不过记得在模型里提前埋好traceability tag,不然生成代码后手动关联会累到怀疑人生。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐