1. 项目概述
作为一名电力电子工程师,我最近在车载充电机(OBC)项目中遇到了一个棘手的问题:如何在电网波动和负载突变的情况下,依然保持高功率因数和低谐波失真。经过多次尝试,我发现传统的PI控制已经难以满足日益严苛的性能要求。于是,我开始研究自抗扰控制(ADRC)这一由中国学者韩京清提出的创新控制方法。
ADRC的核心思想非常巧妙——它将系统内部的不确定性和外部扰动统一视为"总扰动",通过扩张状态观测器(ESO)实时估计并补偿这些扰动。这种方法最大的优势在于不依赖精确的数学模型,具有极强的鲁棒性。在Simulink中实现ADRC后,我惊喜地发现电流THD从原来的4.7%降到了2.3%,负载突变的恢复时间也从6ms缩短到了不足0.9ms。
2. 系统建模与ADRC原理
2.1 Boost PFC电路动态方程
让我们从Boost PFC电路的基本方程开始。在单相整流器中,网侧电流的动态方程可以表示为:
L(di_g/dt) = v_g(t) - d(t)V_dc
其中:
- i_g是网侧电流(我们的控制对象)
- v_g = V_m sin(ωt)是电网电压(已知扰动)
- d∈[0,1]是占空比(控制输入)
- V_dc是母线电压(慢变扰动)
这个方程看似简单,但实际上隐藏着诸多挑战。电网电压是正弦波,开关动作是离散的,再加上电感饱和、电容老化等参数时变问题,使得传统PI控制很难达到理想效果。
2.2 总扰动概念的精妙之处
ADRC的巧妙之处在于它重新组织了系统方程:
di_g/dt = (v_g/L) + (-d V_dc/L) + f(t)
这里f(t)就是所谓的"总扰动",它包含了:
- 电感参数误差(L变化)
- 母线电压波动(V_dc变化)
- 开关非线性
- 测量噪声等
关键在于,ADRC不关心这些扰动具体来自哪里,而是将它们统一视为一个整体进行估计和补偿。这种"黑箱"处理方式大大简化了控制器的设计。
2.3 ADRC的三重奏:TD、ESO和NLSEF
完整的ADRC控制器由三个核心组件构成:
-
跟踪微分器(TD):负责生成平滑的指令信号,避免参考输入的突变对系统造成冲击。在Simulink中,我使用二阶TD来实现这个功能,它能够很好地安排过渡过程。
-
扩张状态观测器(ESO):这是ADRC的灵魂所在。它将总扰动f(t)作为一个额外的状态进行估计。我采用的是三阶ESO,可以同时估计电流i_g、其导数以及总扰动。
-
非线性状态误差反馈(NLSEF):这部分负责根据跟踪误差生成控制量。我使用了非线性函数fal来实现,它能够在不同误差范围内提供不同的增益,兼顾快速性和平稳性。
最终的控制律非常简洁:
u = u0 - ẑ2
其中u0来自NLSEF,ẑ2是ESO估计的总扰动。这种前馈补偿的方式使得系统对扰动的响应速度大大提高。
3. Simulink建模实战
3.1 主电路搭建
在Simulink中搭建OBC前级主电路时,我选择了Simscape Electrical库,因为它提供了更真实的物理建模能力。具体包括:
- 交流电压源(230Vrms,50Hz)
- Boost电感(1.2mH,含0.1Ω等效电阻)
- MOSFET和快恢复二极管组成的开关管
- 输出电容(680μF)
- 用可变电阻模拟电池负载变化(200Ω↔100Ω)
特别要注意的是,为了准确模拟实际工况,我在电感模型中加入了饱和特性,并在MOSFET中设置了适当的导通电阻和开关时间。
3.2 ADRC核心模块实现
3.2.1 跟踪微分器(TD)实现
在Simulink中,我使用MATLAB Function模块实现了二阶TD:
matlab复制function [v1, v2] = fcn(r, x1, x2, r0, h)
fh = fal(r - x1, 0.5, r0) - x2;
v1 = x1 + h * x2;
v2 = x2 + h * fh;
end
这里的r0是速度因子,决定了指令跟踪的快慢。经过多次调试,我发现将其设置为电流环带宽的平方左右效果最佳。
3.2.2 扩张状态观测器(ESO)设计
ESO的实现相对复杂一些,我采用了三阶结构:
matlab复制function [z1, z2, z3] = fcn(i_g, u, z1, z2, z3, b0, L, vg, Ts)
e = i_g - z1;
fe = fal(e, 0.25, 0.01);
dz1 = z2 + 3*fe/Ts;
dz2 = z3 + 3*fe/(Ts^2);
dz3 = -fe/(Ts^3) + b0*u - vg/L;
z1 = z1 + Ts*dz1;
z2 = z2 + Ts*dz2;
z3 = z3 + Ts*dz3;
end
这里有个重要技巧:将已知项vg/L显式地加入ESO,可以显著提高估计精度。这是因为ESO只需要估计未知部分,减轻了它的负担。
3.2.3 非线性函数fal的实现
非线性函数fal是ADRC性能的关键:
matlab复制function y = fal(e, alpha, delta)
if abs(e) <= delta
y = e / (delta^(1-alpha));
else
y = sign(e) * abs(e)^alpha;
end
end
这个函数在误差较小时提供高增益,保证精度;在误差较大时降低增益,避免超调。经过反复试验,我发现对于电流环,alpha=0.5,delta=0.1的组合效果很好。
3.3 电压外环设计
电压环我仍然采用PI控制,因为它对直流量的调节已经足够好。PI的输出是电流幅值指令I_amp,与电网电压瞬时值相乘得到电流指令:
i_g* = I_amp · v_g
这种设计巧妙地实现了单位功率因数,而且不需要复杂的锁相环(PLL),大大简化了系统结构。
4. 仿真结果与分析
4.1 测试场景设计
为了全面评估ADRC的性能,我设计了严格的测试场景:
- 0-0.1s:稳态运行(3.3kW)
- 0.1s:负载突变(模拟电池充电模式切换)
- 0.15s:电网电压跌落20%
同时设置了传统PI控制作为对比。
4.2 性能指标对比
| 指标 | PI控制 | ADRC |
|---|---|---|
| 输入电流THD | 4.7% | 2.3% |
| 母线电压跌落(负载突变) | 32V | 11V |
| 恢复时间 | 6ms | <0.9ms |
| 功率因数 | 0.989 | 0.996 |
从数据可以看出,ADRC在所有关键指标上都显著优于PI控制。特别是在负载突变时,ADRC的恢复时间还不到PI控制的1/6。
4.3 波形分析
观察仿真波形,有几个亮点值得注意:
- 电网电流完美跟随电压波形,几乎看不出相位差
- ESO估计的总扰动ẑ2能够快速跟踪实际扰动变化
- 占空比d非常平滑,没有出现高频抖振
最令人印象深刻的是,当我故意将电感值增加30%时,PI控制的电流波形出现了明显畸变,而ADRC几乎不受影响,这充分证明了其强大的鲁棒性。
5. 工程实现要点
5.1 参数整定经验
经过多次实践,我总结出以下参数整定经验:
- ESO带宽ω_o应该是电流环带宽的5-10倍
- TD的速度因子r0≈ω_c^2,其中ω_c是指令带宽
- 非线性函数fal的参数:
- 对于ESO:alpha=0.25,delta=0.01
- 对于NLSEF:alpha=0.5,delta=0.1
5.2 离散化处理
在实际数字控制中,离散化方法的选择很重要。我推荐使用Tustin(双线性变换)方法,因为它能保持稳定性。采样频率至少要达到开关频率的10倍以上。
5.3 计算效率优化
如果MCU资源有限,可以考虑线性ADRC(LESO+PD):
- 用线性ESO替代非线性ESO
- 用PD控制替代NLSEF
虽然性能略有下降,但计算量大幅减少。
6. 扩展应用与进阶建议
ADRC的应用远不止于OBC前级,我在其他项目中也取得了成功:
- 三相OBC:在dq坐标系下分别设计ADRC,实现解耦控制
- LLC谐振变换器:用于抑制频率漂移
- 数字实现:在C2000或STM32上部署,采样率≥20kHz
对于想要深入研究的同行,我建议:
- 尝试加入电感饱和模型,测试ADRC的适应能力
- 使用Simulink的FFT模块实时监测THD
- 通过代码生成功能导出到TI C2000 LaunchPad进行硬件验证
在实际项目中,我发现ADRC对参数变化确实具有很强的鲁棒性。有一次客户临时更改了电感规格,传统PI控制需要重新整定参数,而ADRC几乎不需要调整就能正常工作,这大大缩短了开发周期。