ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

PEMFC滑模控制:过氧比、温度与阴阳极压力协同

PEMFC滑模控制:过氧比、温度与阴阳极压力协同

1. 这套模型到底在控什么

质子交换膜燃料电池PEMFC的Matlab/Simulink滑模控制模型,我先说结论:它不是为了炫技,是为了把三个最闹心的变量同时摁住——过氧比、电堆温度、以及阴、阳极两侧的气体压力关系。我最初以为这就是一个电化学仿真,把能斯特方程和极化曲线公式抄进去就算完事,结果真正跑起来才发现,过氧比冲上去,温度跟着飘,阴极压力一顿抖,阳极氢气侧又因为压差变化来回波动,整个系统像个互相拉扯的弹簧矩阵。

1.1 想控住过氧比,先理解为什么它是个“比”

过氧比通常记作λ_O2,严格定义是阴极入口实际送入的氧气流量与电化学反应实际消耗的氧气流量之比。对空气供给系统来说,入口空气流量里只有约21%是氧气,而反应消耗掉的氧气由电堆电流决定。电流越大,消耗越快,如果空气流量跟不上,堆内氧气浓度会往下掉,电池电压瞬间被拖垮。反之,如果空气流量给得太多,虽然氧气充足,但压缩机功率白白浪费,而且进气量大会把膜吹干,质子传导率下降。所以过氧比不是越大越好,经典文献里常用2这个点作为参考值,低功率工况可以放宽到1.5附近,高功率工况一般争取压在2.0左右。

滑模控制在这个环节的意义很直接:空气供给系统是高阶、非线性、带明显滞后的对象,PID在最标准工况能调好,但负载一跳变、温度一浮动,PID参数就跟不上。滑模控制不依赖精确模型,只要你知道不确定性的界,就能把误差拉回滑模面。

1.2 温度控制为什么没有想象中好做

电堆工作温度直接影响膜含水量、反应动力学速率和水蒸气分压。温度太低,催化剂活性差,欧姆损耗也大;温度太高,膜脱水,甚至出现热点。车用工况下负载电流剧烈变化,产热功率瞬间波动,冷却回路又有很大的热惯性,所以温度通道本身就是一个大时滞、慢变、强耦合的对象。滑模控制在这里依然能打,但要注意:温度环的等效控制项往往要从热量平衡模型里推出来,不能只靠一个大增益开关硬生生地掰。

我习惯把温度控制拆成两层:外层是电堆平均温度,内层是冷却液流量或风扇占空比。外层用滑模输出一个需要的散热功率,内层再接一个流量控制回路。这样比直接拿温度误差去调冷却泵响应更稳定,因为散热功率和冷却液流量之间基本线性,内环做好之后,外环面对的就是一个“响应快得多的被控对象”。

1.3 阴极、阳极压力协调才是完整模型的收尾

标题里的“阴、阳”两个字,我理解成阴极侧与阳极侧的气体分压协调。阴极侧空气分压决定氧气分压,阳极侧氢气分压决定反应物供给,同时两侧压差又直接影响水在膜内的迁移方向。如果阴极压力远高于阳极,膜两侧机械应力大,寿命受影响;如果阳极压力反超,容易把氢气压穿到阴极侧,带来安全隐患。很多初学模型的人只做“过氧比+温度”双环,忽略阴阳极压力平衡,结果仿真里的膜水含量曲线错得离谱,还找不到原因。

真正完整的PEMFC控制模型,一般会同时包含四个控制输入:空压机电压或空气流量、冷却液流量、氢气供应阀门开度、阳极尾排阀开度。对应的被控量就是:过氧比、电堆温度、阴阳极压差、阳极氢气分压。这四大通道之间互有耦合,而滑模控制的好处就是对这种耦合有天然的不敏感性,只要干扰和耦合项的界能被估计出来,就不需要不停重调增益。

2. 在 Simulink 里面把 PEMFC 电堆“装”进去

从零搭一个能在 Simulink 里跑的 PEMFC 模型,有两条路:一条是大量借助 Simscape Electrical 里的燃料电池相关库,另一条是自己写方程和控制接口。我两轮都用过,最后还是推荐第二类“半物理方程模型”,也就是用 Simulink 的数学运算模块去实现电化学、流体、热平衡方程,再给控制算法留出干净的输入输出口。

2.1 为什么不全用现成库

Simscape 的燃料电池库并不是不好,问题是它把太多细节封装到了底层,你很难在中间插入滑模控制器需要的中间变量。比如过氧比需要实时读取阴极入口空气流量和氧消耗量,库模型内部可能并不直接给你这个信号;温度控制你又需要把冷却液带走的热量当作可操作量,库模型通常只给散热端温度,不给等效热流。强行从库里提取半隐藏变量,模型可读性会很差,调参时根本不知道控制器看到的是哪个物理量。

自建方程的好处是“透明、可控、好改”。我通常把电堆拆成四个子模块:电化学电压子模块、阴极气体动态子模块、阳极气体动态子模块、热动态子模块。每个子模块都有明确的输入输出,比如阴极气体动态子模块的输入是空压机空气流量和电耗氧速率,输出是阴极氧气分压、氮气分压和水蒸气分压。这样在接控制器时,过氧比、分压这些状态都随手可得,用来做滑模面电机开放式。

2.2 电化学电压方程先简化再耦合

电堆输出电压基本公式是:

U_cell = E_Nernst - η_act - η_ohm - η_conc

E_Nernst 是可逆电动势,它随温度、氢气分压、氧气分压、水分压变化;η_act 是活化极化损失,通常用塔菲尔公式描述;η_ohm 是欧姆损失,主要取决于膜电阻,而膜电阻又和膜水含量、温度强相关;η_conc 是浓度极化损失,在大电流工况下变得非常明显。

如果要做滑模控制,不需要把上面每一项的机理模型写得太复杂,但至少要在 0到额定电流 范围内把极化曲线趋势拟合得和真实电堆一致。我第一版只把活化过电位用一个固定塔菲尔斜率近似,结果在低电流区电压误差不大,但大电流区漏了浓度损失,导致控制器以为“氧还够”,实际上氧气分压已经被拽得很低。后来我把模型改成分段近似:中低电流区用线性欧姆项,大电流区额外加一个指数项来模拟浓度极化,整体效果明显更接近文献曲线。

2.3 流体、热动态接口尽量统一成微分方程

动态模型的核心是一组一阶微分方程,每一个都对应一个蓄能环节。阴极侧的状态变量主要是各气体分压,动态来源于气体进出流量和质量守恒:

dp/dt = (R T / V) (W_in - W_out - W_react)

热平衡对应电堆温度状态:

m C_p dT/dt = P_gen - P_cool - P_loss

这里 P_gen 是电堆总产热,P_cool 是冷却液带走热量,P_loss 是向环境散失的热量。为了便于控制器设计,我会把接口变量全部归一化:流量用 g/s,压力用 kPa,功率用 W,温度用 ℃。卡在这个统一的单位体系下,滑模控制器里涉及增益的量纲不会被带偏,很多仿真的“莫名其妙发散”,其实都是单位混了。

3. 过氧比滑模控制:氧饥饿不是闹着玩的

如果只让我保留一个控制目标,我选过氧比。燃料电池动态工况下最怕的就是氧饥饿:负载突增时电流阶跃上去,氧气消耗瞬间变大,空气流量却因为压缩机惯性还在慢慢爬升,氧气分压快速跌落,电池电压会突然塌陷,严重时甚至造成局部反极和催化剂快速衰减。过氧比滑模控制要做的,就是让空气流量始终紧咬住“电流对应需求”,并且偏差能快速回到设定轨迹。

3.1 过氧比的动态表达

实际氧气消耗速率可以按法拉第定律写:

W_O2_react = M_O2 * I_cell * n_cells / (4 F)

其中 n_cells 是单片数,F 是法拉第常数。阴极入口的氧气流量则由空气入口流量乘以氧气质量分数。于是:

λ_O2 = W_O2_ca_in / W_O2_react

这里最麻烦的是 W_O2_ca_in 不能直接从空压机流量读出来,因为进气经过加湿后还有水蒸气,氧气分压和空气分压的比例会变。我做模型时干脆在阴极入口加一个小容积,把入口空气流量先折算成入口氧气摩尔流,再除以反应消耗摩尔流,这样过氧比信号即使在瞬态过程中也不会出现跳变毛刺。

3.2 滑模面和控制律怎么定

对于过氧比环路,滑模面我习惯用带积分项的:

s = e + λ_OER * ∫e dt

这里的 e 是目标过氧比与实际过氧比的差值,λ_OER 是积分系数,目的是消除稳态误差。控制量是压缩机电压或压缩机入口流量。工程上不要把滑模控制理解为纯开关控制,有一个近似等效项会好很多:

u_cv = u_ff(I, T) + K * sat(s / φ)

u_ff 是一个根据电流和温度来查表的前馈电压,本质上是“满足当前消耗氧气流量所需的稳态空压机电压”。有了这个前馈项,滑模切换增益 K 不需要很大,就能处理模型误差和扰动,抖振会小很多。饱和函数里的 φ 是边界层厚度,φ 太小,抖振明显;φ 太大,等于把滑模退化成高增益比例控制,鲁棒性又不够。我通常从 φ=0.05 或 0.1 起步,先看 e 的噪声大小,再逐步调小。

3.3 为什么滑模对负载突变特别管用

电流突然从 100A 跳到 200A 时,理想的控制行为是“压缩机电压立刻大步提前增大,让空气流量抢在氧气消耗真正拉大之前就往上冲”。PID 往往做不到这一步,因为误差还没建立起来。滑模控制配合前馈项后,前馈通道已经按电流直接把压缩机电压顶上去,滑模项只负责修正残余误差。这也是我在实际仿真空机压摆率限制时感受到的最大优势:滑模加前馈后,过氧比最低点从 1.15 拉回到 1.35 附近,电压塌陷幅度明显变小,哪怕压缩机本身响应有 0.3 秒延迟,系统依旧稳定。

4. 温度管理与滑模:冷却液流量不是唯一重点

电堆温度控制如果不做,过氧比控制做得多漂亮都白搭。温度影响膜含水量,膜含水量影响欧姆电阻,欧姆电阻影响输出电压,输出电压又反过来参与能量平衡。滑模控制温度的思路,本质上是在处理一个大惯性、大滞后的热系统。

4.1 温度动态方程和产热计算

dT_st/dt = (P_gen - P_cool - P_loss) / (m_st C_p)

P_gen 不能简单等于电堆功率,需要用“理论发热量”来算。我常用:

P_gen = n_cells * I_cell * (E_th - U_cell)

这里 E_th 是热力学等效电压,近似取 1.25V 左右。当输出电压 U_cell 越低,电堆发热越严重,这也符合物理直觉:同样的负载电流,效率越差,热量越多。P_cool 则是冷却液流量、入口温度与堆入口温度之间建立的换热模型,可以进一步写为:

P_cool = q_cool * C_p_cool * (T_st - T_cool_in)

4.2 滑模温度控制器结构

温度环我没用过直接单环滑模,因为热惯性太大,单环滑模容易产生周期性地“加热-过冷”振荡。我的做法是让滑模层输出一个目标散热功率 P_cool_ref:

s_T = e_T + λ_T ∫e_T dt

u_sw_T = K_T * sat(s_T / φ_T)

P_cool_ref = P_cool_ff + u_sw_T

然后把这个散热功率参考给内环,内环根据流量-换热效率曲线反算冷却液流量参考,再通过一个快速PI去追流量参考。内环因为本质上是泵流量控制,线性度很好,PI足够。外环的滑模只负责对付工况突变和换热系数漂移,两层各干各的,调试起来思路非常清晰。

4.3 温度控制里最容易忽略的补丁

冷却液入口温度不是常数,尤其在车辆冷启动之后,冷却液入口温度会从低温慢慢升到正常值。如果你把 T_cool_in 当作定值,模型在累计运行时间一长之后,温度参考会被持续干扰。所以我在换热模型里加入了冷却液入口温度的动态变化,并把它写成一个慢干扰信号。实测效果是:即使冷却液入口温度波动 5℃,电堆温度依然能稳定在目标值附近 0.3℃以内,如果是恒入口温度的简化模型,光这一条就足够了。

另外,不要在温度环里用太大的切换增益 K_T。温度通道时间常数长达几十秒,系统又带有明显的传输延迟,K_T 过大时饱和函数会在误差方向翻转边缘来回跳,而热惯性又消化不了这种高频指令,结果就是冷却泵转速在 40% 到 90% 之间来回震荡,电堆温度却纹丝不动。遇到这种问题,先降 K_T,再调大边界层 φ_T,比调积分系数管用。

5. 阴极、阳极两侧的分压协调,才是“阴、阳”背后的真正难点

很多初学做 PEMFC 控制的人,把阴极压力控制简单理解为“调节背压阀”,把阳极控制理解为“调氢气阀门开度”,但这种割裂做法在动态仿真中会翻车。阴极压力和空气流量本来就强耦合:背压阀关小,阴极压力升高,但同时空气流量会下降,过氧比跟着变。阳极压力控制也没有那么独立,因为氢气从储罐流进阳极流道,阀门开度相同的情况下,压差还受阴极侧压力波动影响。

5.1 阴极压力控制先理清耦合

我的模型里,阴极出口背压阀的开度同时影响出口流量和阴极压力。背压阀关小,阴极压力上升,有利于提高水蒸气压和膜湿度,但会让氧气分压升高和流量下降带来的效果互相抵消。如果你只做过氧比滑模,不管背压阀,那么在瞬态过程中阴极压力会出现 20kPa 以上的波动,这种波动会直接干扰膜水含量。我最后设计的方案是:背压阀开度由阴极压力环的滑模控制器给出,目标压力先根据负载电流查表得到一个基线值,再把阴极压力误差作为修正项叠加到背压阀控制量上。

阴极压力环的模型增益也比较特殊:背压阀开度越大,阴极压力越低,所以控制方向是反向的。滑模控制器里我用的是负号和背压阀开度匹配,很多人在这一环把符号写反,压力环振荡不止,还误以为是参数没调好。这里算不上什么很难的学问,就是要在第一交叉检查控制量的方向,尤其别把阀开度方向和压力方向搞反。

5.2 阳极氢气分压和尾排阀

阳极侧和阴极侧最大的不同是它存在尾排吹扫周期。阳极流道里除了氢气,还有从渗透或扩散进入的氮气和水蒸气,如果长期不排,氮气会在阳极富集,氢气分压下降,局部会出现燃料饥饿。尾排阀周期性打开会排掉一部分氮气,但同时会瞬间拉低阳极压力。控制目标不是把阳极压力维持在某个恒定值,而是让它在尾排瞬间的跌落不超过安全值,同时保证尾排时的氢气利用率别掉得太快。

我在模型中把阳极出口尾排阀当作一个可离散切换的执行机构:每 8 到 12 秒打开一次,每次开 100ms 左右,具体周期由阳极氮气摩尔分数估计值驱动。滑模环则负责在尾排关闭期间,将阳极压力跟踪到比阴极压力高 0.05~0.15 bar 的设定值,保证膜两侧压差在允许范围内。

5.3 用滑模去协调分压差,而不是分别控两个绝对压力

最好的控制思路是直接控阴极压力与阳极压差。令:

e_pd = p_an - p_ca - p_ref

这里 p_ref 可以是 0.1 bar 左右的小正压差。滑模输出作用于氢气进口比例阀的开度,目的是让阳极压力跟着阴极压力“同步走”。这样即使阴极压力因过氧比控制产生波动,阳极压力也会自动跟踪,膜的机械应力一直被压在较低水平。我在模型里实测,阴极压力瞬态变化 15kPa,压差环配合氢气比例阀滑模控制器后,阴阳极压差波动能控制在 ±5kPa 内,单纯靠两个独立 PI 做压力跟踪时,这个指标一般在 ±12kPa 左右。

6. Simulink 实现细节和调参实录

模型搭建的顺序,我强烈建议“先电压,后流量,再压力,最后温度”。这不是随便排的,因为每一步的仿真稳定性依赖上一步提供的基础变量。先得到输出电压和消耗量,过氧比才能算;过氧比算准了,空气环滑模才有意义;空气环稳定了,阴极压力才不会被瞬态流量冲击;前三个都稳,温度环才能安心调。

6.1 控制周期和解算器选择

对于 PEMFC 这种多时间尺度系统,我一般把电化学子模块用连续建,控制部分用固定步长离散。整体步长定为 1ms,控制器采样步长 10ms。用变步长连续解算器去跑会快一些,但滑模的切换项在变步长下很容易出现额外数值振荡,原因是在切换瞬间步长自动缩短,把抖振更细致地“展现”了出来。固定步长下,抖振看起来更明显,但它正是你需要的反馈信息。

6.2 MATLAB Function 里的简化滑模代码

在 Simulink 里我用 MATLAB Function 模块实现过氧比滑模控制,代码如下:

function u_cv = smc_oer(e, err_sum, ssm, Ts, lambda, K, phi) % e : 过氧比误差 % err_sum : 含积分误差 % ssm : 当前电流/温度下的稳态空压机电压前馈 s = e + lambda * err_sum; % 边界层饱和,避免抖振 u_sw = K * tanh(s / phi); % 最终控制量:前馈 + 滑模补偿 u_cv = ssm + u_sw; end

这个代码块可以直接放到 MATLAB Function 模块里。我把前馈量 ssm 用二维查表模块从外部算好,Simulink 自动连接。注意这里的 lambda 是“每个仿真步长都把积分误差折进滑模面”的比例系数,实际操作中,如果积分项用的是离散累加器,还要在调用 MATLAB Function 前用 reset 逻辑处理 cm,否则温度环和过氧比环在同一个调节周期里会有耦合。

6.3 调参顺序和典型经验

我的调参步骤如下:

  1. 先把滑模切换增益 K、边界层 φ 设成较大值,比如 K 取满量程电压的 40%,φ 取 0.2,确认系统绝对不振荡。
  2. 通过前馈查表把稳态误差压下来,这一步做得好,滑模项就不必长期“出力”。
  3. 逐步减小 φ,每减 50%,观察被控量是否存在高频小抖动,一抖就立即停止减小。
  4. 最后再调 λ 积分系数,把它从小到大加,直到稳态误差接近零,同时系统没有缓慢等幅振荡。
  5. 完成一个回路的调参后,再开下一个回路。先过氧比,再阴极压力,再压差,最后温度。

带电堆模型时,我见过最多的“控制不生效”是因为把所有回路一次性全打开,P 出的结果根本分不清是哪一环在互相影响。如果你能一次只开一个环,现象会干净得多。

7. 仿真常见问题速查表

  • 仿真正交通常来自代数环,多数是因为 Simulink 把“控制量通过压力/流量反馈回入口”形成了无延迟反馈回路。解决方法是尽量把模型拆成连续微分环节,或在反馈通道里放一个足够小的传输延迟。
  • 过氧比环抖振严重时,先增大边界层 φ,再把切换增益 K 降到 20% 满量程。如果还抖,检查前馈查表是否平滑,查表折线处的突变也会被滑模项“放大”。
  • 温度环长时间无法收敛到设定值,先确认 P_gen 计算方法对不对。很多初版模型的产热功率直接用“电堆功率”代替,导致产热量为零或过小,温度自然不会上升。
  • 阴极压力会有周期性振荡但过氧比却稳定,大概率是背压阀控制方向错了,或者是压力环和空气环的时间尺度太接近,发生了共振。可以尝试把压力环带宽调低一点,或者把压力环参考目标增加低通滤波。
  • 阳极压力在尾排阀动作后恢复慢,说明氢气比例阀的滑模增益 K 还不够大,或者尾排模型里氢气吹扫流量的时间常数被设置得不合理。尽量把尾排事件做成离散脉冲,不要让它在连续仿真中形成准开关持续过程。
  • 仿真结果参考值完全对不上文献,优先检查过氧比定义里的氧气摩尔分数,加湿后的空气已经不是干空气,必须先用摩尔分数修正。这一条坑了我至少三个晚上。

8. 一些零碎但重要的体感

我真正把 PEMFC 滑模控制模型跑稳定,是在简化了“目标”之后。最开始总想同时控制过氧比、温度、阴极压力、阳极压差、膜水含量,结果每个环都调不到位。后来我把控制目标收敛到“过氧比优先,温度其次,压差兜底”,其余变量靠合理参考轨迹去自然平衡,系统一下子就乖了。控制对象不是越多越好,而是每个控制量都要有明显的执行机构,还要确保执行机构之间不会打架。

另外,别把滑模控制神话成万灵药。前馈补偿在 PEMFC 这类强非线性系统中占的比重非常大,滑模更像是兜底的“纠偏网”。我在仿真空压机压摆率受限时体会尤其明显:如果没有前馈,纯靠滑模去追快速变化的氧需求,切换增益會被顶得很大,抖振很难看;一旦把前馈查表做好,滑模切换增益只需要原先的百分之三四十,仿真曲线干净得像 PID 一样平滑,但鲁棒性又明显比 PID 强。

做这类模型,最重要的一条建议是:保留一个专门跑“标准工况”的测试脚本。每改一个参数,先跑一遍相同的负载谱,把过氧比、温度、压差的曲线导出来对比。很多时候你觉得新模型差了,其实是因为负载谱和上次不一致,产生了错觉。固定测试序列能帮你快速判断真实的调参效果。这套办法不管你是刚接触 PEMFC,还是在做毕设或项目过半的老手,都能省下大把时间。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进