1. 项目概述
作为一名电力电子工程师,我最近在车载充电机(OBC)前级控制中遇到了一个棘手问题:传统PID控制在面对电网电压波动和负载突变时,动态响应和抗扰能力明显不足。经过多次尝试,最终选择了自抗扰控制(ADRC)方案,并决定用Simulink进行系统级仿真验证。这篇文章将完整记录从ADRC原理理解到Simulink实现的全过程,特别分享在OBC前级应用中的参数整定技巧和工程化处理经验。
ADRC作为新型控制算法,其核心思想是通过扩张状态观测器(ESO)实时估计并补偿系统内外扰动。相比传统PID,它能实现"总扰动抑制",特别适合OBC这种强非线性、多扰动场景。而Simulink的模块化建模方式,让我们可以快速验证算法效果,避免直接硬件实现的风险。
2. ADRC核心原理与OBC适配性分析
2.1 ADRC三部分解构
ADRC由三部分组成:跟踪微分器(TD)、扩张状态观测器(ESO)和非线性状态误差反馈(NLSEF)。在OBC前级PFC电路中:
-
TD:安排过渡过程,解决快速性与超调矛盾。例如从220V电网电压到400V母线电压的跟踪,传统阶跃响应会导致过大冲击电流,而TD可生成理想过渡轨迹。
-
ESO:将模型不确定性和外部扰动统一视为"总扰动"。对于OBC而言,这包括:
- 电网谐波(特别是充电桩接入时的3/5/7次谐波)
- 负载阶跃(电动汽车充电时的CC-CV模式切换)
- 元器件参数漂移(如Boost电感随温度变化)
-
NLSEF:通过非线性组合提高控制精度。实测发现,在轻载时采用更激进的非线性函数可改善THD指标。
2.2 OBC前级的特殊挑战
典型OBC前级是Boost PFC电路,其状态方程可表示为:
code复制diL/dt = (vin - (1-d)*vout)/L
dvout/dt = ((1-d)*iL - iout)/C
其中d为占空比。ADRC的优势在于无需精确知道L、C参数,通过ESO实时估计d项中的耦合关系。这在批量生产时特别有价值——即使电感量有±10%偏差,控制器仍能稳定工作。
3. Simulink建模实战
3.1 基础模块搭建
在Simulink中建立ADRC控制器,关键步骤包括:
- ESO实现:
matlab复制function [z1,z2,z3] = eso(u,y,h,b0)
persistent z1_prev z2_prev z3_prev
if isempty(z1_prev)
z1_prev = 0; z2_prev = 0; z3_prev = 0;
end
e = z1_prev - y;
fe = fal(e,0.5,h);
fe1 = fal(e,0.25,h);
z1 = z1_prev + h*(z2_prev - beta01*e);
z2 = z2_prev + h*(z3_prev - beta02*fe + b0*u);
z3 = z3_prev - h*beta03*fe1;
z1_prev = z1;
z2_prev = z2;
z3_prev = z3;
end
注意:h为采样周期,beta01~03为观测器增益,需要根据控制对象动态调整
- 非线性函数设计:
matlab复制function f = fal(e,alpha,delta)
if abs(e) > delta
f = abs(e)^alpha * sign(e);
else
f = e / (delta^(1-alpha));
end
end
这个非线性函数是ADRC性能的关键,alpha通常取0.5~1之间,delta根据误差范围设定。
3.2 参数整定经验
通过多次仿真验证,总结出OBC前级的ADRC参数整定规律:
-
TD参数:
- 速度因子r:决定跟踪速度,建议从50开始调试
- 滤波因子h0:与开关频率相关,通常取1/10采样周期
-
ESO参数:
- 观测器带宽wo:按wo≈3~5wc选取(wc为期望闭环带宽)
- 三阶ESO的增益组合:β1=3wo, β2=3wo², β3=wo³
-
NLSEF参数:
- 非线性区间delta:取额定值的5%~10%
- 误差增益kp:先按线性PID整定,再叠加非线性
实测某3.3kW OBC的优化参数:
| 参数 | TD(r) | TD(h0) | ESO(β1) | ESO(β2) | ESO(β3) | NLSEF(kp) |
|---|---|---|---|---|---|---|
| 数值 | 80 | 1e-4 | 300 | 3e4 | 1e6 | 0.5 |
4. 工程应用中的特殊处理
4.1 数字实现问题
当把Simulink模型移植到DSP(如TI C2000)时需注意:
-
离散化方法:
- 优先采用Tustin变换(双线性变换)
- 避免前向欧拉法导致的数值不稳定
-
计算顺序优化:
c复制// 错误顺序:会导致代数环
void adrc_loop() {
eso_output = eso_update(u, y);
u = nlf_calc(eso_output);
}
// 正确顺序:
void adrc_loop() {
prev_u = u;
eso_output = eso_update(prev_u, y);
u = nlf_calc(eso_output);
}
4.2 抗饱和策略
OBC启动时的软启动需特别处理:
- 在TD中增加输出限幅:
matlab复制v1 = v1 + h*v2;
v2 = v2 + h*fhan(v1-v, v2, r, h0);
v1 = sat(v1, 0, Vout_max*1.1); // 10%余量
- ESO初始化策略:
c复制void eso_init(float y0) {
z1 = y0;
z2 = 0;
z3 = 0;
}
5. 实测效果对比
在300V-400V/3.3kW的OBC平台上对比:
| 指标 | 传统PID | ADRC | 改善幅度 |
|---|---|---|---|
| 启动超调 | 8% | <1% | 87.5% |
| THD(满载) | 5.2% | 3.8% | 27% |
| 动态响应时间 | 20ms | 8ms | 60% |
| 抗电网跌落能力 | ±15% | ±25% | 66% |
特别在负载阶跃测试中,当电流从10%突加至100%时,ADRC控制的输出电压跌落仅1.2%,恢复时间5ms,远优于PID的3.5%和15ms。
6. 常见问题排查
6.1 观测器发散
症状:ESO输出z3持续增大直至溢出
解决方法:
- 检查离散化方法是否正确
- 降低β3增益(通常先除以10)
- 增加软件限幅:
c复制z3 = limit(z3, -Z3_MAX, Z3_MAX);
6.2 高频振荡
症状:开关管驱动波形出现MHz级抖动
排查步骤:
- 确认采样是否与PWM同步
- 检查TD速度因子r是否过大
- 在PWM输出增加RC滤波(如1kΩ+100pF)
6.3 稳态误差
症状:输出电压存在0.5%~1%的固定偏差
处理方案:
- 在NLSEF中增加积分项(改进为IADRC)
- 重新校准电压采样网络
- 检查MOSFET导通电阻是否过大
经过半年实际运行验证,这套ADRC方案在-30℃~85℃环境温度下均能稳定工作,批量生产的一致性问题也得到显著改善。对于想尝试ADRC的工程师,建议先从Simulink离线仿真开始,逐步过渡到硬件在环(HIL)测试,最后再实机验证。