☰
基于Simulink的龙伯格观测器无传感器转速估计建模与仿真
2026/10/20 18:54:41 网站建设 项目流程

做电机驱动的,很多场合不想装编码器。装一个编码器不仅贵,振动、油污、线缆耦合、安装间隙,哪一样都是售后问题的来源。于是龙伯格观测器(Luenberger Observer)就成了替代方案里最常见的一种——它不需要额外硬件,只靠电压指令和电流反馈,就能把转子转速估计出来。这篇文章我会带你在 Simulink 里完整搭一遍龙伯格观测器的转速估计模型,从电机状态方程推导到增益整定,再到仿真验证和工程坑点,全部按实际项目里的做法来。

这篇文章适合两类人:一类是刚接触无传感器控制、想把原理变成可运行模型的初学者;另一类是被编码器困扰、想评估无传感器方案是否可行的工程师。我会尽量写清楚每个步骤的“为什么”,而不只是丢给你几个模块截图。如果你想快速得到一个能跑、能看曲线的观测器模型,跟着做就能复现;如果你想理解背后的理论,我也会把关键公式和推导逻辑一条条摊开讲。

1. 为什么要把转速做成“估计值”:无传感器控制的真实动机

1.1 编码器并没有那么“理所当然”

先说说为什么非要绕开编码器。很多刚入行的人会问:电机上装个编码器不就行了,干嘛自找麻烦去做观测器?真到了产品阶段,答案就很现实。

首先是成本。一个工业级的增量式编码器,本身几十到几百块,还要配线缆、接头,算上装配工时,整套下来对产品毛利率的影响不是小数。其次是可靠性,电机轴端的编码器在振动大的环境里容易损坏;油污、粉尘也会污染码盘,导致脉冲丢失。我见过现场设备编码器故障,电机直接飞车,最终把减速机都打坏了。再有是线缆问题,编码器线必须走屏蔽、做差分传输,线长了还会有信号衰减和共模干扰,这对整机走线设计是不小的约束。所以只要工况允许,很多厂家都愿意把编码器摘掉,哪怕只是作为降本方案。

1.2 龙伯格观测器在无传感器方案里的定位

无传感器转速估计的方法很多,简单列一下三类的特点:

方法核心思想优点主要短板
反电动势法从端电压和电流推算反电动势,再提取转速实现简单,高速效果好低速时反电动势太小,信号淹没在噪声里
龙伯格观测器/扩展龙伯格观测器把电机模型放进观测器,用电流误差校正状态中速段稳定、动态响应可直接配置依赖电机参数,低速性能有限
滑模观测器/扩展卡尔曼滤波非线性估计或统计最优估计鲁棒性强或对噪声有最优抑制参数复杂、调试难度高、算力需求大

龙伯格观测器之所以常用,是因为它在“实现复杂度”和“估计性能”之间取得了一个比较好的平衡。它不像卡尔曼滤波那样需要协方差矩阵和噪声统计整定,也不像滑模那样存在固有的抖振问题。只要系统可观测、模型参数偏差不大,龙伯格观测器给出的转速估计在中高速段是相当干净和平滑的,动态响应还能按需求配置,这就足够覆盖大多数风机、水泵、压缩机和部分通用变频器的场景。

1.3 可观测性:什么条件下这个方案成立

有人会把观测器想得很玄,其实它的前提不过两句话:模型要准,状态要能通过测量“看”出来。

从控制理论讲,系统的可观测性要求是:给定输入和一段时间内的输出测量,你能唯一地反推出系统内部状态。对表贴式永磁同步电机(SPMSM)来说,我们测量的是 dq 轴电流,而转速通过反电动势耦合进电流动态中,所以理论上转速是可观测的。但这里有个工程前提——电压指令要准确。如果你用逆变器输出的是死区补偿都没做好的电压指令,观测器拿错的输入去推算,结果必然跑偏。所以,做龙伯格观测器之前,先把电流环和电压精度做好,这不是废话,而是能不能收敛的基础。

2. 龙伯格观测器的数学原理:从状态空间到误差收敛

2.1 表贴式永磁电机的 dq 状态方程是怎么搭出来的

要用龙伯格观测器,第一步是把电机写成状态空间形式。这里以表贴式永磁同步电机为例,因为它在 dq 轴电感相等(Ld=Lq=Ls)时推导最简洁,工程上也最常见。

电机在同步旋转坐标系下的电压方程为:

ud = Rs·id + Ls·d(id)/dt − ωe·Ls·iq
uq = Rs·iq + Ls·d(iq)/dt + ωe·Ls·id + ωe·ψf

把两个方程整理成状态导数的形式:

d(id)/dt = −(Rs/Ls)·id + ωe·iq + ud/Ls
d(iq)/dt = −(Rs/Ls)·iq − ωe·id − (ψf/Ls)·ωe + uq/Ls

机械运动方程也要进来。电磁转矩 Te = 1.5·p·ψf·iq,机械方程为:

J·d(ωm)/dt = Te − TL − B·ωm

把机械角速度换成电角速度(ωe = p·ωm),就得到:

d(ωe)/dt = (1.5·p²·ψf/J)·iq − (B/J)·ωe − (p/J)·TL

现在把状态向量取为 x = [id, iq, ωe]ᵀ,输入取 u = [ud, uq]ᵀ,可测量输出为 y = [id, iq]ᵀ。这就是一个三阶系统,转速 ωe 是我们需要估计的关键状态。

注意看这几个方程里,id、iq 和 ωe 之间是有乘积关系的,属于非线性系统。传统龙伯格观测器严格说是针对线性系统的,所以在电机上用的是“扩展龙伯格观测器”,把非线性模型直接塞进观测器结构里,再在每个工作点对误差动态做线性化来保证收敛。这一点后面展开说。

2.2 观测器的标准结构与误差收敛逻辑

龙伯格观测器的标准形式,一句话就能概括:用输入驱动模型,用输出误差修正模型状态。它的结构与电机本身完全平行,区别在于它是跑在控制器里的“影子模型”。

状态方程层的观测器写作:

d(x̂)/dt = f(x̂, u) + L·(y − ŷ)

其中 x̂ 是估计状态,ŷ = C·x̂ 是估计输出,L 是观测器增益矩阵,维度是 3×2。f 对应上面推导的非线性电机方程,把 x̂ 代进去即可。

观测器的误差定义成 e = x − x̂,忽略负载转矩扰动后,误差动态可以写成:

d(e)/dt ≈ (A − L·C)·e

其中 A 是电机模型在当前工作点线性化后的状态矩阵。只要 (A − L·C) 的特征值都在复平面左半平面,估计误差就会指数收敛到零,收敛速度由特征值的实部绝对值决定。换句话说,你只要把 L 设计好,就能决定“影子模型”追真实电机的快慢。

2.3 为什么叫“扩展”:非线性项的处理手法

电机方程里存在 ωe·id、ωe·iq 这样的乘积项,这是问题的核心。严格线性化处理只能在一个工作点附近成立;而工程上更常见的做法是“伪线性化”:在观测器内部,用当前估计的 ω̂e 实时更新这些乘积项,使得模型始终跟踪当前工作点。这也正是为什么观测器要在每个控制周期内重新计算模型矩阵或直接使用带乘积项的方程。

这个处理方法在数学上可以理解为:把非线性函数 f(x̂, u) 直接放进观测器中,然后假设误差小,对误差动态做局部线性化。只要误差没有发散得太远,局部线性化就足够指导增益设计了。我们实际仿真中会发现,只要参数不离谱,扩展龙伯格观测器在额定转速的 10%~100% 范围内都能稳定工作,这就是伪线性化在工程上的有效性证明。

3. Simulink 建模分步实录:从电机模型到观测器子系统

3.1 第一步:先把“真实电机”搭出来

观测器仿真第一步,是搭一个作为被控对象的电机模型。虽然 Simulink 里有电机库可以直接拖 PMSM 模块,但我建议你第一版还是用基础模块搭一个,这样你能清楚地知道每个环节在算什么,后续改参数也更可控。

被控对象模型就按 2.1 节的三条状态方程搭:

  • 输入:ud、uq,外加负载转矩 TL;
  • 状态:id、iq、ωe(电角速度),机械转速可以由 ωm = ωe/p 换算;
  • 输出:三相电流或者直接输出 dq 轴电流。

我习惯把 dq 轴电压、电流都放在同一个坐标系里做,这样观测器直接吃 id、iq 就行,省去 Clarke 和 Park 变换的麻烦。如果你要更贴近实际,可以在外部加一个三相逆变器模型,再通过 abc→dq 变换得到测量电流,但第一版仿真没必要把复杂度拉满。先用理想电压驱动的模型,把观测器本身跑通,再去加逆变器细节。

选一下电机参数,方便后面复现:

参数符号数值
定子电阻Rs0.5 Ω
定子电感Ls5 mH
永磁磁链ψf0.1 Wb
极对数p4
转动惯量J5e-4 kg·m²
阻尼系数B1e-4 N·m·s

这些参数不需要多真实,关键是量级合理,能把观测器的动态特性体现出来。

3.2 第二步:搭建观测器子系统的核心积分方程

观测器子系统在 Simulink 里可以有两种做法:一是用 Integrator 模块逐条搭建三条状态方程,适合想看清每个积分环节的人;二是把整个观测器封装成一个 MATLAB Function 模块,代码风格更紧凑,适合后续移植到嵌入式里。我两个都用过,更推荐第二种,因为调增益、换初始化条件都方便,且代码和 C 语言版本几乎可以一一对应。

观测器的内部逻辑写在 MATLAB Function 里,核心伪代码如下:

function xhat = observer_step(xhat_prev, ud, uq, id_meas, iq_meas, dt) % 状态定义: xhat(1)=id_hat, xhat(2)=iq_hat, xhat(3)=we_hat Rs = 0.5; Ls = 5e-3; psi = 0.1; p = 4; J = 5e-4; B = 1e-4; idh = xhat_prev(1); iqh = xhat_prev(2); weh = xhat_prev(3); % 扩展龙伯格观测器的状态导数 did_dt = -(Rs/Ls)*idh + weh*iqh + ud/Ls + L(1,1)*(id_meas-idh) + L(1,2)*(iq_meas-iqh); diq_dt = -(Rs/Ls)*iqh - weh*idh - (psi/Ls)*weh + uq/Ls + L(2,1)*(id_meas-idh) + L(2,2)*(iq_meas-iqh); dwe_dt = (1.5*p^2*psi/J)*iqh - (B/J)*weh + L(3,1)*(id_meas-idh) + L(3,2)*(iq_meas-iqh); % 欧拉积分 xhat = xhat_prev + dt * [did_dt; diq_dt; dwe_dt]; end

这里 L 是 3×2 的观测器增益矩阵,由外部参数传入。关键之处在于:观测器内部完全不知道负载转矩 TL,它只按电机方程“预测”转速;而负载产生的转速跌落,最终是通过电流误差 (id−id̂)、(iq−iq̂) 被逐步修正回来的。这就是为什么观测器对负载扰动有自愈能力。

3.3 第三步:两种增益实现方式的选型

增益矩阵 L 有三种落地方案。第一种是把 L 计算成常数矩阵,在一个代表性工况点线性化得到 A、B、C,然后离线用极点配置算出 L 固定不变。这种最简单,只要工况变化范围不大,实际效果完全够用。

第二种是让 L 随转速在线更新——在每个采样周期根据 ω̂e 重新线性化矩阵,再用同一个极点位置重新算一次 L。这种“增益调度”比常数 L 在宽速度范围内表现更均匀,代价是每个周期要多做一次矩阵计算。在性能充裕的处理器上这不是问题,但在低成本 MCU 上就要三思。

第三种是在 MATLAB Function 里直接调用 place 函数算 L,我做过测试,确实方便,但要注意代码生成时是否能完整支持这个函数。如果你以后要把观测器部署到嵌入式平台,我建议把 L 的数值预先离线算好,以常数表或者查表的形式放在工程里。在线算增益是调试期的便利,不是最终产品的必要功能。

3.4 仿真配置里的那些小细节

仿真配置有几个地方需要专门注意。

第一步是初始条件。真实电机启动前,id、iq、ωe 都是 0;但观测器启动时不可能知道所有初值,尤其在故意验证收敛能力时,我会把观测器的初始转速设成与实际值差 1000 rpm 以上,看看它能不能拽回来。这个测试非常关键,因为它直接反映误差动态的收敛性能。

第二步是求解器选择。第一遍跑通用变步长 ode45 没问题,采样精度高,收敛曲线也很平滑。但做无传感器控制的人最终要面对的是离散化问题,所以建议在模型跑通后,尽快切到固定步长离散求解器,步长取和实际控制周期一致(比如 100 μs),用离散积分器重新实现一遍。这一步能提前发现不少离散化带来的问题,后面第 6 章会展开聊。

第三步是数据记录。我习惯用 Data Inspector 或者简单的 Scope 模块同时观测真实转速、估计转速、转速误差三个信号。速度误差信号是最有用的,因为它能很直观地告诉你观测器的收敛速度、稳态误差和动态跟踪能力。

4. 观测器增益整定:极点配置与工程折中

4.1 用 place 函数一次算出增益矩阵

增益整定的正统思路是极点配置。前面已经得到系统矩阵 A 和输出矩阵 C,在给定工作点下,观测器误差动态的闭环矩阵是 A − L·C,我们希望它的特征值落在设计好的位置。

在实际项目中,我是在 MATLAB 里按这样算的:

% 状态矩阵 (表贴式电机在工作点 id=0, iq=0, we=0 附近近似) Rs = 0.5; Ls = 5e-3; psi = 0.1; p = 4; J = 5e-4; B = 1e-4; A = [-Rs/Ls, 0, 0; 0, -Rs/Ls, -psi/Ls; 0, 1.5*p^2*psi/J, -B/J]; C = [1 0 0; 0 1 0]; % 测量的是 id 和 iq % 观测器极点: 比电机电气极点更快一些 obs_bandwidth = 1000; % rad/s poles = [-obs_bandwidth, -obs_bandwidth*1.2, -obs_bandwidth*0.8]; L = place(A', C', poles)';

place 函数的要求是系统必须满足可观测性。这里要注意一个问题:如果工作点的选择让某些状态在动态上退耦,可能 A 矩阵会退化。比如你在 id=0、iq=0、ωe=0 处线性化,id 动态里没有 ωe 的耦合项,id̂ 就只靠 id 的测量误差来校正,这没问题,因为 id 本身就是测量量。关键是 ω̂e 要能通过 iq 的误差来修正——它里面有 iq 的耦合,所以整体可观测性是有保证的。

4.2 观测器带宽选多少:一个容易被忽视的折中

极点位置的绝对值,决定观测器收敛速度。不同工程书本里的建议值不一样,我的实践经验是:观测器带宽取电流环带宽的 2~5 倍,至少要比转速环带宽高一个数量级,这样观测器才不会拖慢转速环的动态。

比如电机电气极点大致在 Rs/Ls = 100 rad/s 附近,机械极点更低,只有几 rad/s 量级。如果你把观测器极点放在 1000 rad/s 左右,那转速估计的收敛速度就远快于机械动态,转速环看到的“假转速”才能跟上真实转速的变化。

这里有一个很容易犯的错:为了追求极快的收敛,把观测器极点放得很远,比如放到 5000 rad/s。效果看起来是误差秒收敛,但代价是观测器对电流测量噪声极度敏感。因为增益 L 越大,噪声通过 (id−id̂) 和 (iq−iq̂) 灌进状态方程的幅度也越大,最终转速估计上会出现明显的高频毛刺。收敛速度和噪声抑制是跷跷板,整定的核心就是在这两个指标间找平衡。我的经验是从 5 倍电气极点开始试,看转速估计波形是否干净,不行再调。

4.3 参数失配是绕不开的坎

观测器模型用的是铭牌参数,真实电机参数会随温度、磁路饱和、负载变化而漂移。最典型的是 Rs 和 ψf。

定子电阻 Rs 会随温度明显变化,铜绕组的电阻温度系数大约 0.4%/℃,温升 50℃ 就可能让 Rs 增大 20% 以上。Rs 不准,对高速段估计影响不大,因为高速时反电动势占主导;但在低速段,电阻压降在方程里比重升高,失配就会直接反映为转速估计偏差。永磁磁链 ψf 则随温度升高而下降,温度升高 50℃,钕铁硼磁体磁链可能掉 5%~10%,这会让观测器的反电动势项偏小,导致估计转速偏低。

我做过一个测试:把观测器里的 Rs 手动改到实际值的 1.5 倍,在额定转速下估计误差只有 1% 左右,但在 10% 额定转速下误差直接到了 8% 以上。所以,如果你的产品要覆盖很宽的速度范围,只靠固定参数的观测器是不够的。工程上常用对策是加参数在线辨识,或者结合高频注入来做低速段补偿。这些是更深的坑,这篇先不展开,但你要有这个意识:参数失配决定了你是“参数敏感”的观测器方案能做到多低的速度。

5. 仿真结果怎么看:验证估计性能的六个关键指标

5.1 阶跃转速指令下的收敛过程

搭建完模型后,第一个实验我会给一个从 0 到额定转速的阶跃指令(比如1000 rpm)。在这个实验里,最值得关注的不是转速环的跟踪,而是观测器的收敛过程。

正常结果是这样的:启动瞬间,由于观测器初始状态和实际不一致,转速误差会有一个明显的尖峰,峰值甚至能达到几十上百 rpm。随后误差在几十毫秒内按指数衰减到接近零。衰减的时间常数和极点配置直接相关,如果你把极点放在 1000 rad/s 处,理论上 5 ms 内误差就能衰减到忽略不计的水平;实际仿真里因为非线性项和离散化的影响,会稍微慢一点,但数量级应该对得上。

如果误差衰减得很慢,说明增益取小了;如果误差曲线振荡,高频分量明显,说明增益取大了。这两个现象要会看。

现象可能原因调整方向
误差收敛很慢观测器极点离虚轴太近增大极点绝对值、调高带宽
稳态误差明显模型参数偏差较大检查 Rs、ψf 是否与实际一致
误差周期性波动转速越高波动越大检查 dq 变换相位是否正确
收敛后仍有高频抖动增益过大放大噪声降低带宽或加输出滤波

5.2 负载突加时的动态跟踪能力

第二个实验是让电机带载运行,在中途突然加载。真实电机的转速会因为负载转矩而跌落一小段,然后被转速环拉回去。观测器由于不知道 TL,它在突加载瞬间会“以为”转速没有变化,只在电流误差变大的压力下才逐步把估计值拉回来。所以你会看到,估计转速会比真实转速有几十毫秒的滞后,然后追上。这个滞后时间由观测器带宽决定,可接受范围一般在 10~50 ms。

如果系统里有转速环,观测器的这种短期滞后通常不致命,因为转速环带宽本来就不高;但如果你的应用里需要很高的动态性能,比如伺服启动扭矩控制,只靠龙伯格观测器的速度估计去闭环就会有点吃力。这一点做方案评估时要提前心里有数。

5.3 从零速启动:龙伯格观测器最尴尬的地方

第三个实验,也是最有意义的一个:零速启动。前面说过,低速时电机反电动势几乎为零,电流方程里能“观察”转速的通道几乎关闭,可观测性在这个区域变得很差。默认的龙伯格观测器在零速、低速下基本是睁眼瞎,误差不会发散,但也没有收敛的驱动力。

所以如果你要做的产品必须覆盖零速到低速,比如电梯、起重、低速重载设备,单纯用龙伯格观测器是不够的。常见的补充方案是高频信号注入法,在低速段注入一个高频电压信号,通过电流响应解调转子位置,跟龙伯格观测器做“切换或融合”。这也是为什么无传感器控制里,最终落到产品上的方案往往是一个复杂体系,而不是单一观测器。

6. 工程化落地中的常见坑与我的经验

6.1 离散化带来的延迟与稳定性问题

连续域仿真跑得很漂亮的观测器,换成离散实现后可能突然不稳定或者收敛变差,这个坑很多人是到了台架上才撞到。根本原因是:离散化引入了一步或半拍的延迟,相当于给你的系统误差环多加了一个滞后环节,相位裕度下降,系统就更倾向于振荡。

我做过对比,用纯欧拉法离散,采样周期从 20 μs 提高到 200 μs,观测器的有效稳定带宽几乎要折半。所以我的建议是:

  • 控制周期尽量小,观测器和电流环用同一个采样周期;
  • 如果控制周期已经定死(比如 100 μs),观测器增益要在离散域重新验证,必要时重新用离散极点配置来计算 L;
  • 对噪声敏感的应用,可以采用二阶离散器(比如 Tustin 变换)来替代纯欧拉,虽然计算量上去了,但相位特性更好。

具体到 Simulink,你在固定步长离散模式下,把观测器的积分器换成 Discretetime Integrator,步长设置成和控制周期一致,观察估计转速是否仍然收敛,就能快速确认离散化影响是否可接受。

6.2 电流采样噪声:观测器里最容易放大的一环

电流采样噪声、量化噪声、PWM 开关噪声,是所有无传感器方案的头号敌人。观测器的本质是“用电流误差驱动模型修正”,噪声会直接打进状态导数里,然后被积分。

我在实际项目中发现,转速估计波形上的毛刺大部分不是来自模型不对,而是来自电流信号太脏。所以硬件的电流放大电路、采样时序、PWM 同步采样这些基础功夫要先做好。软件上,我在观测器外面会加一个截止频率为几百 Hz 的一阶低通滤波,专门用于滤掉转速估计的高频毛刺。但要注意,低通滤波会引入附加相位滞后,如果滤波器太“深”,转速环的动态会被拖慢。折中下来,我会优先保证电流采样的硬件质量,让观测器本身尽量少依赖软件滤波。

6.3 高速区:反电动势饱和与平台电压限制

转速高了以后,反电动势会接近母线电压,这是另一个极限。因为观测器从 iq 方程里通过反电动势项 ψf/Ls·ω̂e 来感知转速,一旦进入弱磁区,d 轴电流不再是零,电压方程的形式变了,而且电流控制器对电压精度的影响更明显。这时候固定参数的扩展龙伯格观测器精度会下降。

我见过不少团队在高速区改用更复杂的模型或者加入弱磁区的补偿项,甚至切换到其他估计方法。对于大多数风机水泵类应用,工作点相对固定,不深挖弱磁区,龙伯格观测器是够用的;但对于宽调速范围或者深弱磁的应用,你要把它当成“系统方案的一部分”来设计,而不是一个独立模块。

6.4 最后落地前,别忘了做参数敏感性扫描

不管仿真做得多漂亮,最后给产品定型前,一定要做一轮参数敏感性扫描。把观测器里的 Rs、ψf、Ls、J 分别在原值基础上 ±20%、±50% 拉偏,然后看不同转速下的估计误差。这个测试能帮你明确两个边界:一是这个方案能保证精度的速度下限;二是哪些参数最影响性能,后续产品是否需要重点选型或者加辨识。

我实际跑过一轮扫描,结论是:J 对稳态精度几乎没影响,但对收敛过程的超调量有影响;Rs 主要影响低速精度;ψf 在各速度段都有影响,是最需要保证准确性的参数。如果你所在项目的电机磁链一致性不好,每台电机之间差 3%~5%,观测器参数就要留足裕量。这个经验帮我省下了后面大量的台架调试时间,也推荐你按这个思路做一次类似的仿真分析。

我做这类仿真最深的体会是:龙伯格观测器从来不是“搭完模型就能用”,它是模型精度、采样质量、离散化程度、速度范围四个约束下的工程设计题。每次把观测器极点从 500 rad/s 调到 2000 rad/s,我都会先在仿真里看一眼噪声放大情况,再决定下一步动作。只要把第 4 节的极点配置思想、第 6 节的噪声和离散化意识提前放进项目里,你搭出来的观测器就少走很多弯路。这篇是基于 Simulink 的完整搭建过程,后面如果你遇到低速启动或者参数辨识的难题,我们再接着聊。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询