作为一名电力电子工程师,我最近在车载充电机(OBC)项目中遇到了一个棘手的问题:如何在电网电压波动和负载突变的情况下,依然保持稳定的输出性能?传统的PI控制在实验室环境下表现尚可,但一到实际工况就暴露出抗干扰能力不足的缺陷。经过反复尝试,我发现自抗扰控制(ADRC)技术能够很好地解决这个问题。
本文将分享我在Simulink平台上实现ADRC控制OBC前级的完整过程。不同于教科书式的理论讲解,我会从一个工程师的实操角度,详细展示从算法设计到参数整定的每一个关键步骤。这个方案在我们实际项目中已经验证,在电网电压跌落15%时,THD可以控制在3%以内,动态响应时间小于5ms。
传统PI控制最大的问题在于它高度依赖精确的系统模型。但在实际工程中,电感值会随温度变化,电容会老化,这些参数漂移都会导致控制性能下降。ADRC的核心思想很巧妙 - 它不纠结于精确建模,而是把所有的模型不确定性和外部干扰都当作"总扰动"来处理。
想象一下开车时的场景:PI控制就像是一个必须知道路面坡度、风阻系数才能控制油门的司机;而ADRC则像一个经验丰富的老司机,他能感知到所有影响车速的因素(上坡、逆风等),并自动调整油门来保持匀速。
TD的作用是给参考信号"安排过渡过程"。举个例子,当电流指令突然从5A跳到10A时,直接跟踪会导致超调。TD会生成一个平滑的过渡曲线,就像老司机不会猛踩油门,而是渐进加速。
在Simulink中,我用MATLAB Function实现了TD:
matlab复制function [v1, v2] = td(ref, r0, h0, Ts)
persistent v1_prev v2_prev;
if isempty(v1_prev), v1_prev=ref; v2_prev=0; end
e = ref - v1_prev;
v1_new = v1_prev + v2_prev*Ts;
v2_new = v2_prev + r0*h0*tanh(e/h0); % 非线性函数实现平滑过渡
v1_prev = v1_new; v2_prev = v2_new;
v1 = v1_new; v2 = v2_new;
end
关键参数r0控制跟踪速度,h0是滤波因子。经过实测,r0=1000,h0=0.01时效果最佳。
ESO是ADRC的核心,它把总扰动扩张为一个新的状态变量进行观测。这就好比不仅观测汽车的速度,还把路况、风阻等影响因素也作为状态来估计。
我的ESO实现如下:
matlab复制function [z1, z2, z3] = eso(iL, d, uo, L, beta1, beta2, beta3, Ts)
persistent z1_prev z2_prev z3_prev;
if isempty(z1_prev), z1_prev=iL; z2_prev=0; z3_prev=0; end
e = z1_prev - iL;
z1_new = z1_prev + Ts*(z2_prev - beta1*e);
z2_new = z2_prev + Ts*(z3_prev - beta2*e + (-uo/L)*d);
z3_new = z3_prev + Ts*(-beta3*e); % 扰动估计
z1_prev=z1_new; z2_prev=z2_new; z3_prev=z3_new;
z1=z1_new; z2=z2_new; z3=z3_new;
end
这里β1-β3是观测器增益,按照"βi=10i"的经验法则设置。实际调试中发现β3对THD影响最大,从5000调整到10000后,THD从3.5%降到了2.8%。
NLSEF采用非线性函数处理误差,比线性PID更灵活。我使用了三次方函数来增强大误差时的调节力度:
matlab复制function d = nlsef(v1, v2, z1, z2, k1, k2)
e1 = v1 - z1; e2 = v2 - z2;
u0 = k1*e1^3 + k2*e2^3; % 非线性反馈
d = u0;
end
k1和k2需要平衡响应速度和稳定性。经过反复测试,k1=0.5,k2=0.1时能在快速性和稳定性间取得最佳平衡。
在Simulink中搭建Boost PFC电路:
特别注意要设置元件的寄生参数:
这些寄生参数对仿真结果的真实性影响很大,不能忽略。
电网扰动包括:
实现方法:
matlab复制基波 = 220*sqrt(2)*sin(2*pi*50*t);
谐波 = 44*sqrt(2)*sin(2*pi*250*t);
电压跌落 = 187*sqrt(2)*sin(2*pi*50*(t-2)).*(t>=2);
电网电压 = 基波 + 谐波 + 电压跌落;
将ADRC的三个组件封装成子系统:
PWM发生器使用100kHz三角载波,与占空比比较生成驱动信号。
ADRC参数整定是工程实现的关键。我的经验是:
先调TD参数:
再调ESO增益:
最后调NLSEF:
记录一组优化后的参数:
| 参数 | 初始值 | 优化值 | 效果改善 |
|---|---|---|---|
| β3 | 5000 | 10000 | THD↓0.7% |
| r0 | 500 | 1000 | 响应↑2ms |
| k1 | 0.3 | 0.5 | 误差↓0.2% |
设置2秒时电压从220V跌至187V(-15%),对比PI和ADRC的表现:
| 指标 | PI控制 | ADRC | 改善幅度 |
|---|---|---|---|
| 电流跟踪误差 | 12% | <1% | 91.7% |
| THD | 15% | 2.8% | 81.3% |
| 恢复时间 | 15ms | 4ms | 73.3% |
ADRC的波形明显更平滑,几乎没有出现震荡。
在3秒时负载从1kW突增至3kW:
| 指标 | PI控制 | ADRC | 改善幅度 |
|---|---|---|---|
| 电压波动 | 18V | 5V | 72.2% |
| 恢复时间 | 12ms | 3ms | 75% |
ADRC能在单周期内完成扰动补偿,表现出极强的鲁棒性。
| 指标 | PI控制 | ADRC | 标准要求 |
|---|---|---|---|
| THD | 12% | 2.5% | <5% |
| 功率因数 | 0.94 | 0.998 | >0.99 |
| 效率 | 95.2% | 96.8% | - |
ADRC不仅动态性能优越,稳态指标也全面超越PI控制。
DSP选择:
电流采样:
PWM驱动:
上电步骤:
参数调整:
安全保护:
在实际工程中,我遇到过以下几个典型问题:
问题:启动时电流冲击大
原因:TD参数r0过大
解决:降低r0,添加启动斜坡
问题:高频开关噪声影响采样
原因:PCB布局不合理
解决:优化地平面,增加RC滤波
问题:重载时THD升高
原因:ESO估计延时
解决:在ESO中加入延时补偿项
这些经验教训都是经过多次失败后总结出来的,希望能帮助读者少走弯路。
完成基础模型后,还可以进一步优化:
参数自整定:
多模块并联:
代码生成:
这个ADRC控制方案不仅适用于OBC,也可以推广到光伏逆变器、UPS等其他电力电子装置中。