1、绪论:为什么需要状态观测器?电机控制中的状态观测器概述

1.1 一个让我头疼的真实问题

做电机控制这些年,我踩过最大的坑是什么?

不是PID调参,也不是FOC算法本身。

而是——你明明需要某个状态量,但传感器装不了,或者装得起但信号烂得没法用

我记得2017年做的一个伺服项目。客户要求零速带载,力矩波动小于3%。我用了电流环+速度环双闭环,按理说够了。但实际跑起来,低速时速度反馈抖得像筛糠。为什么?编码器分辨率不够,低速下脉冲间隔太长,算出来的速度全是噪声。

换高分辨率编码器?成本翻三倍,客户直接摇头。

后来怎么解决的?状态观测器。我用电流和位置信息,通过一个简单的龙伯格观测器,把速度“算”了出来。结果呢?低速抖动从±15rpm降到了±2rpm。客户满意了,我也记住了:有些状态,不是非得用传感器去测

1.2 什么是状态观测器?说白了就是“软测量”

你想想看,电机控制里我们最关心什么?

  • 电流(能测,用电流传感器)
  • 转速(能测,用编码器或霍尔)
  • 转子位置(能测,用编码器或旋变)
  • 磁链(能测吗?不能!)
  • 负载转矩(能测吗?不能!)
  • 反电动势(能测吗?不能!)

你看,有些关键状态,要么测不了,要么测不准,要么测得起但成本受不了。

状态观测器就是干这个的——利用你能测到的信号(比如电流、电压),结合电机的数学模型,把那些测不到的状态“推算”出来

嗯,这里要注意:它不是瞎猜。它是有理论依据的。核心思想是——

用模型预测 + 用实测修正 = 状态估计

说白了,就是让一个“虚拟传感器”在代码里跑起来。

1.3 为什么电机控制离不开状态观测器?

我个人的习惯是,做任何算法之前先问三个问题:

  1. 这个状态我能不能直接测?
  2. 如果能测,成本多少?精度够不够?
  3. 如果不能测,有没有办法算出来?

在电机控制里,状态观测器几乎无处不在。我给你列几个最常见的场景:

应用场景 需要估计的状态 为什么不用传感器
无传感器FOC 转子位置、转速 去掉编码器,降成本、提高可靠性
磁链观测 定子磁链、转子磁链 磁链无法直接测量
负载转矩前馈 负载转矩 转矩传感器太贵、安装困难
低速/零速控制 精确转速 编码器低速信号质量差
参数辨识 电阻、电感、磁链常数 在线测量不现实

你看,从最简单的速度估计,到复杂的无传感器矢量控制,状态观测器都是核心中的核心

1.4 几种主流的状态观测器,我帮你捋一捋

做电机控制这些年,我接触过的观测器不下十种。但真正工程上常用的,其实就这几类:

1.4.1 龙伯格观测器(Luenberger Observer)

这是最经典、最基础的一种。结构简单,计算量小。适合线性系统。我在早期的伺服项目里就用它做速度估计。效果不错,但有个前提——电机模型要准。模型一偏,估计值就跟着偏。

1.4.2 滑模观测器(Sliding Mode Observer)

这个我特别喜欢。它对模型误差和参数变化不敏感,鲁棒性好。我曾经在一个车载项目里用滑模观测器做无传感器FOC,电机参数从冷机到热机变了30%,估计的位置误差才2度电角度。不过它有个毛病——抖振。信号里会带高频毛刺,需要加滤波器处理。

1.4.3 卡尔曼滤波器(Kalman Filter)

如果你追求最优估计,卡尔曼滤波器是首选。它考虑了噪声统计特性,能在随机干扰下给出最小方差估计。但代价是——计算量大。我在一个需要极高精度的位置伺服项目里用过扩展卡尔曼滤波(EKF),效果确实好,但MCU的算力差点没扛住。

1.4.4 模型参考自适应系统(MRAS)

这个思路很有意思:让一个参考模型和一个可调模型同时跑,用两者的误差去修正可调模型的参数。常用于转速估计和参数辨识。我建议初学者从MRAS入手,因为它物理意义清晰,调试起来直观。

我的建议: 如果你是刚接触状态观测器,先从龙伯格观测器入手。把原理搞透,再去看滑模和卡尔曼。别一上来就啃EKF,容易劝退。

1.5 一个简单的例子:用龙伯格观测器估计转速

光说不练假把式。我给你看一个最简化的例子。

假设我们有一个直流电机(或者交流电机的某一轴),它的机械方程是:

J * dω/dt = Te - Tl - B * ω

其中:

  • ω:转速(我们要估计的状态)
  • Te:电磁转矩(可以算出来)
  • Tl:负载转矩(未知,当作扰动)
  • J:转动惯量
  • B:阻尼系数

我们能测什么?位置θ(通过编码器)。

龙伯格观测器的思路是:

// 预测步骤(基于模型)
ω_hat_pred = ω_hat + (Te - Tl_hat - B*ω_hat) / J * Ts

// 修正步骤(用实测位置误差修正)
error = θ_measured - θ_hat
ω_hat = ω_hat_pred + K1 * error
θ_hat = θ_hat + (ω_hat_pred + K2 * error) * Ts

你看,核心就两步:先按模型预测,再用实测误差修正。K1和K2是观测器增益,决定了修正的力度。

我曾经在一个项目里把K1调得太大,结果观测器输出跟着编码器噪声一起抖。后来把增益降下来,再加了个一阶低通,才稳定下来。嗯,这就是经验——观测器不是越“猛”越好,要跟传感器噪声做权衡

1.6 避坑指南:我踩过的几个坑

我曾经犯过的错误:

  • 模型参数不准就硬上观测器 —— 有一次我直接用铭牌参数做磁链观测,结果估计的磁链跟实际差了40%。后来老老实实做了离线参数辨识,才把误差降到5%以内。
  • 忽略离散化误差 —— 连续域设计的观测器增益,直接搬到离散域里用,结果系统振荡。后来我学会了用双线性变换(Tustin)做离散化,问题解决。
  • 观测器带宽跟控制带宽打架 —— 观测器响应太快,会把噪声引入控制环;响应太慢,又跟不上动态。我现在的经验是:观测器带宽设为电流环带宽的2~3倍,速度环带宽的5~10倍

1.7 这门课你会学到什么?

好,说了这么多,你应该对状态观测器有个基本认识了。这门课我会带你:

  1. 从零推导每种观测器的数学原理,不跳步
  2. 手撕代码,把公式变成能在MCU上跑的C代码
  3. 实战调试,告诉你增益怎么调、遇到振荡怎么办
  4. 对比选型,什么场景用龙伯格,什么场景用滑模,什么场景必须上卡尔曼

我个人的习惯是,每讲完一个观测器,都会给你一个完整的仿真模型和代码框架。你拿回去就能跑,跑起来就能调。

下一章,我们先从最基础的龙伯格观测器开始,把它的原理掰开揉碎了讲清楚。准备好了吗?

我们第二章见。