3、负载扰动观测器设计:龙伯格观测器原理、扰动转矩估算、前馈补偿策略

好,咱们进入第三章。前两章我们把速度环震荡的根因挖了一遍,也聊了传统 PI 的局限。这一章要聊的,是我个人觉得 FOC 实战里最有「工程师味道」的一个环节——负载扰动观测器。

说白了,就是让电机自己「感觉」到外界在推它、拽它,然后提前把对抗的力气使出来。而不是等转速掉下去了,PI 再慢悠悠地去追。你想想看,这就像你开车,前面有个坡,老司机提前加油,新手到了坡底才踩油门——哪个稳?

3.1 为什么要用观测器?

先问个问题:负载扰动能不能直接测?

能,但代价高。装个扭矩传感器,贵、占地方、信号还容易受干扰。在量产产品里,这玩意儿基本不现实。那怎么办?用数学模型「算」出来。

我在做伺服驱动器项目时,遇到过一台设备,空载跑得挺顺,一加上负载就「嘎嘎」响。后来发现,不是 PI 参数不行,而是负载突变时,速度环根本来不及反应。加了观测器之后,同样的 PI 参数,稳得像换了台电机。

核心思想: 利用电机已有的状态(电流、转速、电压),通过一个动态模型,实时估算出外部扰动转矩。然后把这个估算值前馈到电流环,抵消扰动影响。

3.2 龙伯格观测器原理

龙伯格观测器,名字听着唬人,其实原理不复杂。它就是一个状态重构器。

电机系统可以写成状态方程:

dx/dt = A·x + B·u
y = C·x

其中 x 是状态(比如转速、电流),u 是输入(比如 q 轴电压),y 是输出(比如实测转速)。

但我们不知道扰动转矩,它不在状态里。怎么办?把扰动转矩也当成一个状态,扩展开来。

龙伯格观测器的结构是这样的:

dẋ/dt = A·ẋ + B·u + L·(y - ŷ)
ŷ = C·ẋ

这里的 L 就是观测器增益矩阵。它的作用,是让估算状态 ẋ 快速收敛到真实状态 x。L 越大,收敛越快,但噪声也越容易被放大。嗯,这里要注意,L 不是越大越好。

我的经验: 观测器增益 L 的整定,我习惯先按系统带宽的 3~5 倍来设初值。然后看实际波形,如果估算值抖动厉害,就降一点;如果响应太慢,就升一点。没有万能公式,得调。

3.3 扰动转矩估算模型

对于永磁同步电机(PMSM),机械运动方程是:

J·dω/dt = Te - TL - B·ω

其中:

  • J:转动惯量
  • ω:机械角速度
  • Te:电磁转矩(已知,从 iq 算出来)
  • TL:负载转矩(未知,我们要估的)
  • B:阻尼系数

把 TL 当作一个缓慢变化的状态(dTL/dt ≈ 0),扩展后的状态方程就是:

d/dt [ω; TL] = [ -B/J  -1/J; 0  0 ] · [ω; TL] + [ 1/J; 0 ] · Te
y = [1 0] · [ω; TL]

然后套用龙伯格观测器公式,就能实时估算出 TL。

避坑指南: 我曾经在这个模型上栽过跟头——忽略了阻尼系数 B。结果空载时估算值飘得厉害。后来加了 B 的辨识,才稳定下来。记住,模型越准,观测器越稳。

3.4 前馈补偿策略

估算出扰动转矩 TL_hat 之后,怎么用?

直接把它换算成 q 轴电流补偿值:

iq_ff = TL_hat / Kt

其中 Kt 是转矩常数。然后把这个补偿值加到速度环 PI 的输出上:

iq_ref = iq_pi + iq_ff

这样一来,当负载突变时,观测器几乎瞬间就能估算出变化,前馈通道直接给电流环一个「预判」信号。速度环 PI 只需要处理残余的微小误差就行。

我做过对比测试:纯 PI 控制,突加 50% 负载,转速掉 200 rpm,恢复时间 150 ms。加上观测器前馈后,转速只掉 30 rpm,恢复时间不到 20 ms。效果立竿见影。

3.5 本章知识体系

下面这张图,把整个负载扰动观测器的设计流程串起来了:

负载扰动观测器设计流程 负载扰动观测器设计流程 电机数学模型 状态扩展(含TL) 龙伯格观测器 估算TL_hat iq_ff = TL_hat/Kt iq_ref = iq_pi + iq_ff 效果:转速跌落减小 80%+,恢复时间缩短 85%+ 速度环 PI 只需处理残余误差,压力大幅降低 💡 关键参数: • 观测器增益 L:决定收敛速度与噪声抑制的平衡 • 模型精度:J、B 的准确性直接影响估算质量

3.6 代码实现要点

最后,给一段观测器核心代码的伪代码框架,方便你移植到自己的项目里:

// 龙伯格观测器 - 离散化实现
// 采样周期 Ts

// 状态:x[0] = 转速, x[1] = 扰动转矩
// 输入:u = Te (电磁转矩)
// 输出:y = 实测转速

void observer_update(float omega_meas, float Te)
{
    // 预测步
    float omega_pred = x[0] + Ts * ((-B/J)*x[0] - (1.0/J)*x[1] + (1.0/J)*Te);
    float TL_pred     = x[1];  // 假设扰动缓慢变化
    
    // 误差计算
    float error = omega_meas - omega_pred;
    
    // 修正步(L1, L2 为观测器增益)
    x[0] = omega_pred + L1 * error;
    x[1] = TL_pred     + L2 * error;
    
    // 输出估算扰动
    TL_hat = x[1];
}

我的建议: 实际工程中,L1 和 L2 的比值很关键。我一般让 L1 大一些(保证转速跟踪快),L2 小一些(避免扰动估算抖动)。具体数值,建议在仿真里先扫一遍,再上硬件微调。