☰
PMSM控制新方案:终端滑模速度环+MPC电流环仿真实现
2026/10/17 4:19:34 网站建设 项目流程

简介:本资源是一份面向电机控制方向研究生、自动化专业高年级本科生及工业控制工程师的MATLAB仿真研究资料,聚焦永磁同步电机(PMSM)在复杂扰动下的高性能控制问题,融合非线性终端滑模控制(TSMC)的强鲁棒性与模型预测控制(MPC)的多步优化能力,解决传统PI控制动态响应慢、抗干扰弱等实际工程痛点。压缩包共7个文件(98KB),含3个核心MATLAB函数(如get_Is_g.m、switch_state.m)实现TSMC切换律与状态观测,1个Simulink主模型文件(TSMC_MPC_PMSM.slx)构建完整PMSM矢量控制系统,1个.mat数据文件用于参数初始化,另含autosave备份与Git配置文件,结构紧凑、即开即用。已有177人学习下载,读者可直接复现TSMC-MPC复合控制器设计全过程,深入理解滑模面构造、预测时域设置、在线优化求解及抖振抑制策略,并通过仿真波形对比验证其在转速突变、负载扰动等工况下的快速收敛性与稳态精度。 做电机控制的工程师看到 TSMC、MPC、PMSM 这三个缩写凑在一起,第一反应大概率是:又一个把高级算法往永磁同步电机上叠的课题。说实话,刚接到这个仿真任务时我也是这么想的,但真正把终端滑模和模型预测控制搭到一起跑起来之后,我发现这个组合并不是为了发论文硬凑,而是确实踩中了 PMSM 控制的几个核心痛点。这篇就围绕我基于 MATLAB/Simulink 搭建的 TSMC-MPC-PMSM 联合仿真平台,把非线性终端滑模控制在速度环、模型预测控制在电流环的完整实现思路、建模细节和调试过程都摊开讲清楚,顺便把我在仿真里踩过的那些坑也一并列出来。

1. 为什么 PMSM 控制需要 TSMC 和 MPC 搭伙干活

永磁同步电机本身是一个典型的非线性、强耦合、多变量系统,运行过程中还会遇到负载突变、参数摄动、外部扰动这些麻烦事。传统的 PI 控制策略在工程上确实用得最广,稳定可靠、参数整定也简单,但它有两个天生短板:一是对电机参数的依赖性强,电感、磁链一旦因为温升或饱和发生变化,PI 参数就不匹配了;二是抗扰动能力说到底是靠积分项在兜底,遇到大幅负载突变时转速跌落明显,恢复时间也比较长。

滑模控制(Sliding Mode Control, SMC)就是冲着这两个短板来的。它的核心思想是设计一个滑模面,然后用不连续的控制量把系统状态强行“压”到滑模面上,之后系统沿着滑模面滑动。这个过程对参数摄动和外部扰动天然不敏感,因为系统的动态行为由滑模面方程决定,而不是由被控对象参数决定。这也是滑模控制这几十年来在电力电子和电机驱动里一直有人研究的原因。

但传统的线性滑模面有个问题:状态到达滑模面之后,是渐进收敛到平衡点的,也就是说误差趋近于零的速度是指数级的,理论上要无限长时间才能真正收敛。终端滑模(Terminal Sliding Mode, TSM)在滑模面里引入非线性项——一般是误差的分数次幂——使得系统状态在滑模面上能够在有限时间内收敛到零,收敛速度和稳态精度都明显优于传统滑模。当然它也带来了奇异性问题,这个后面细说,解决办法也成熟了。

再说 MPC。模型预测控制(Model Predictive Control)的优势在于它天然具备多步预测能力和约束处理能力。放在 PMSM 的电流环里,MPC 直接根据电机的离散化数学模型预测每个电压矢量作用下下一时刻的电流值,然后通过价值函数选出一个最优的电压矢量去作用逆变器。它替代了传统 FOC 里 PI 电流调节器加 SVPWM 调制那一整套,动态响应快,电流波形质量也高,而且实现思路直白,不需要调 PI 参数。

所以 TSMC-MPC 这个组合的逻辑就很清晰了:速度环用终端滑模控制,保证转速在负载突变和参数摄动下能快速、无超调地跟踪给定,并且有很强的鲁棒性;电流环用模型预测控制,用最快的动态响应跟踪速度环给出的电流指令,同时天然具备逆变器开关管导通状态的约束处理能力。一个管外环的快速性和鲁棒性,一个管内环的动态响应和约束,各干各最擅长的事。

这里要特别说明一下,我用的结构是速度外环 + 电流内环的传统级联架构,速度环输出是 q 轴电流给定值,d 轴电流给定值按照表贴式电机的惯例直接给 0。TSMC 负责速度环,MPC 负责电流环。如果你看到某些文献里把 MPC 也叫作“TSMC-MPC”的一部分,那多半是速度环用 TSMC 生成电流给定、电流环用 MPC 跟踪,跟我的做法是一致的。

2. 永磁同步电机的数学模型与仿真建模细节

不管用什么控制算法,第一步永远是先把被控对象的数学模型搞扎实。PMSM 在三相静止坐标系下的方程很复杂,因为定子绕组之间互相耦合,而且转子位置角在不断变化。所以工程上都用 Clark 变换和 Park 变换把三相物理量投影到跟转子同步旋转的 d-q 坐标系下,把时变系数变成常数系数,方程一下子清爽很多。

在 d-q 坐标系下,表贴式三相永磁同步电机的电压方程是:

ud = Rs·id + Ld·(did/dt) - ωe·Lq·iq uq = Rs·iq + Lq·(diq/dt) + ωe·(Ld·id + ψf)

磁链方程:

ψd = Ld·id + ψf ψq = Lq·iq

电磁转矩方程:

Te = 1.5·pn·(ψd·iq - ψq·id) = 1.5·pn·(ψf·iq + (Ld - Lq)·id·iq)

对于表贴式 PMSM,Ld = Lq,所以转矩方程简化为:

Te = 1.5·pn·ψf·iq

机械运动方程:

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

其中 ωe = pn·ωm 是电角速度,pn 是极对数,ωm 是机械角速度,J 是转动惯量,B 是阻尼系数,TL 是负载转矩。

这些方程看着不复杂,但是它们之间是耦合的:q 轴电压方程里有 ωe·Ld·id 项,d 轴电压方程里有 ωe·Lq·iq 项,这就是所谓的交叉耦合。转速越高,耦合项的影响越大。PI 控制器的本质是把耦合当扰动硬扛,而滑模控制的鲁棒性恰恰体现在对这类耦合项的抑制上。

搭建仿真模型时我采用的是分模块结构:

  • 电机本体模块:根据 d-q 轴电压输入和负载转矩,解算出 d-q 轴电流和转速输出。用 MATLAB Function 或者 Simulink 基础模块都行,建议用 MATLAB Function 直接写微分方程,逻辑清楚而且方便改参数。
  • 坐标变换模块:包含 Clark 变换(abc → αβ)和 Park 变换(αβ → dq),以及它们的逆变换。仿真里我用的是双闭环结构,坐标变换是把三相电流变换到 d-q 坐标系给控制器用,同时把控制器输出的电压从 d-q 坐标变换回三相给逆变器模块。这里要注意 Park 变换里的角度是电角度,别拿机械角去算,不然波形全乱。
  • 逆变器模块:仿真里我用理想逆变器模型,直流母线电压 Vdc 恒定,根据开关状态生成三相端电压。这里做 MPC 时必须注意,逆变器输出的电压矢量一共有 8 个状态,其中 6 个有效矢量和 2 个零矢量,后面做模型预测的时候遍历的就是这 8 个状态。

建模时有一个容易被忽视的细节:仿真步长。MPC 的预测周期决定了控制器的执行频率,如果仿真步长比控制周期大,数值本身就是错的;如果仿真步长比控制周期小太多,计算量又白白浪费。我仿真里电机和逆变器的电气方程用定步长 ode3 求解,步长 1e-6 秒,MPC 的控制周期是 1e-4 秒,也就是 10 kHz,TSMC 速度环的周期也是 1e-4 秒。这样设置的好处是 PWM 频率和预测频率能够对得上,仿真结果更接近真实电机驱动器的行为。

电机参数我用的是下面这组典型表贴式 PMSM 参数:

参数符号数值单位
定子电阻Rs2.875Ω
d 轴电感Ld8.5mH
q 轴电感Lq8.5mH
永磁磁链ψf0.175Wb
极对数pn4-
转动惯量J0.001kg·m²
阻尼系数B0N·m·s

这里阻尼系数我直接给 0,因为实际仿真中机械阻尼影响很小,而且这样做反而能更纯粹地考察控制器自身的抗扰动能力。很多论文里会保留一个小的 B 值,取 0 会让速度环的调节任务更重,如果 TA 的参数设计不合理,转速响应就很容易出问题,这恰好是检验 TSMC 鲁棒性的一个好方式。

3. 终端滑模面的选取与速度环控制器完整推导

速度环是这台电机的“大脑”,它负责把转速误差转成 q 轴电流指令给电流环。要设计终端滑模控制器,第一步是定义转速误差:

e = ωm_ref - ωm

其中 ωm_ref 是给定机械角速度。对误差求导,结合运动方程:

de/dt = dωm_ref/dt - dωm/dt = dωm_ref/dt - (1/J)·(Te - TL)

代入 Te = 1.5·pn·ψf·iq,得到:

de/dt = dωm_ref/dt - (1.5·pn·ψf/J)·iq + TL/J

接下来是滑模面的设计。传统线性滑模面长这样:

s = c·e + de/dt, c > 0

系统在滑模面上时 s = 0,即 de/dt = -c·e,这是一个一阶线性微分方程,解出来是 e(t) = e(0)·e^(-ct),误差按照指数形式渐进衰减。理论上 t 趋向无穷大时误差才变成 0,实际应用里只能说是“足够小”,但永远不是真正的 0。

终端滑模面把非线性项放进来,改成这样:

s = de/dt + β·e^(q/p), β > 0, p > q > 0, p、q 为奇数

这里 q/p 是一个介于 0 和 1 之间的分数。注意 e 是标量误差,所以 e^(q/p) 必须保证在 e < 0 时也有定义,这要求 p、q 都是奇数。系统进入滑动模态后 s = 0,那么:

de/dt = -β·e^(q/p)

这是一个可分离变量的微分方程,积分一下就能求出从 e(0) 收敛到 0 的时间:

t_s = |e(0)|^(1-q/p) / (β·(1-q/p))

关键就在这个式子:收敛时间是有限值,而且由 β、q/p 和初始误差 e(0) 决定。通过增大 β 或者把 q/p 调得更接近 1,可以把收敛时间压得更短。这是终端滑模“有限时间收敛”的含义——状态一旦落到滑模面上,误差在有限时间内精确归零。

不过终端滑模面直接用在控制器推导里时会碰到一个棘手问题:奇异性。因为 s 的表达式中含有 e^(q/p),而对 s 求导时会得到 e^(q/p - 1)·(d²e/dt²) 这一项,q/p - 1 < 0,所以当 e = 0 时,这一项趋于无穷大,导致控制量发散。工程里没人敢用这种控制器去跑实物,因为一旦误差过零,电流指令会直接打到限幅。

解决奇异性问题有两条常用的路:一是改用非奇异终端滑模(Nonsingular Terminal Sliding Mode, NTSM),把滑模面写成:

s = e + β·(de/dt)^(p/q)

这样求导后不会出现负指数项,从根本上规避奇异性;二是保持终端滑模面不变,但在控制律里把奇异项单独处理掉。为了降低推导和实现的复杂度,我在速度环里用了一个更简洁的方式:终端滑模面加上指数趋近律,控制律分成等效控制项和切换控制项两部分,切换控制项里用饱和函数 sat(s/Φ) 替代符号函数 sign(s),这个边界层设计既能消除抖振,也避免在 s 接近 0 时控制量的剧烈抖动。

具体推导过程是这样的。对终端滑模面求导:

ds/dt = d²e/dt² + β·(q/p)·e^(q/p - 1)·(de/dt)

把运动方程求二阶导数代入并整理,得到等效控制:

uq_eq = (2·J/(3·pn·ψf))·(d²ωm_ref/dt² - β·(q/p)·e^(q/p-1)·(de/dt))

切换控制项采用:

uq_sw = (2·J/(3·pn·ψf))·(k·sat(s/Φ))

k > 0 是切换增益,Φ 是边界层厚度。最终 q 轴电流给定:

iq_ref = uq_eq + uq_sw

稳定性证明用李雅普诺夫函数 V = 0.5·s²,求导得到:

dV/dt = s·(ds/dt) = -k·|s| ≤ 0

只要 k > 0,系统就是渐近稳定的,而且由于终端滑模面的特性,实际上是有限时间稳定。这里 k 的选取要覆盖扰动上界,如果负载转矩 TL 的突变幅度很大,k 必须给到足够大才能保证到达条件成立,但 k 太大又会加重抖振。我的经验是先在空载情况下调到一个合适的 k,保证启动过程不抖,然后加 10 N·m 阶跃负载测试,如果转速跌落能够忍受就不要再加大 k 了。

4. MPC 电流内环的集成方式与价值函数设计

电流环是这台电机的“肌肉”,执行速度环给出的电流指令。模型预测控制在这个环节替换了传统的 PI + SVPWM 方案,它的思路完全不依赖调制,而是直接遍历逆变器所有可能的开关状态,用预测模型算出每一种状态下下一时刻的电流,再通过价值函数优选出最合适的开关状态在下一个周期去执行。

MPC 的设计从预测模型开始。要对电流方程做离散化处理,采用一阶前向欧拉法:

di/dt ≈ (i(k+1) - i(k)) / Ts

代入 d-q 轴电压方程并整理,得到电流预测公式:

id(k+1) = id(k) + (Ts/Ld)·(ud(k) - Rs·id(k) + ωe·Lq·iq(k)) iq(k+1) = iq(k) + (Ts/Lq)·(uq(k) - Rs·iq(k) - ωe·(Ld·id(k) + ψf))

其中 Ts 是 MPC 的控制周期。公式里 id(k)、iq(k)、ωe 是当前时刻的采样值,ud(k)、uq(k) 是逆变器输出的候选电压矢量在 d-q 坐标系下的投影,一共 8 组候选值。

这里要注意一个关键点:逆变器的 8 个电压矢量是在 α-β 静止坐标系里定义的,而预测公式是在 d-q 旋转坐标系里运作的,所以每个控制周期都要把 8 个 α-β 电压矢量用当前的电角度变换到 d-q 坐标系。表格列一下这 8 个矢量的 α-β 分量(Vdc 为直流母线电压):

开关状态矢量编号UαUβ类型
000V000零矢量
001V1-Vdc/3-Vdc/√3有效矢量
010V2-Vdc/3-Vdc/√3有效矢量
011V3-2Vdc/30有效矢量
100V42Vdc/30有效矢量
101V5Vdc/3-Vdc/√3有效矢量
110V6Vdc/3-Vdc/√3有效矢量
111V700零矢量

不对,我重新算一下 Uα、Uβ。两电平逆变器有 6 个有效矢量,分别相差 60 度电角度,幅值都是 2Vdc/3。零矢量是两个(000 和 111),幅值为 0。坐标位置以 a 相轴为 α 轴,电压矢量 V1(100) 在 α 轴上,幅值 2Vdc/3。V2(110) 在 60 度位置,V3(010) 在 120 度,V4(011) 在 180 度,V5(001) 在 240 度,V6(101) 在 300 度。所以:

开关状态矢量编号UαUβ
000V000
100V12Vdc/30
110V2Vdc/3Vdc/√3
010V3-Vdc/3Vdc/√3
011V4-2Vdc/30
001V5-Vdc/3-Vdc/√3
101V6Vdc/3-Vdc/√3
111V700

这套矢量坐标在后面的预测迭代里要用,建议直接在初始化脚本里写成一个常数矩阵,避免每次仿真循环里重复计算。

价值函数的设计是整个 MPC 的核心。我用的价值函数是:

J = |id_ref - id(k+1)| + |iq_ref - iq(k+1)|

id_ref 在表贴式电机里为 0,iq_ref 是速度环 TSMC 的输出。每一控制周期里,把 8 个矢量分别代入预测公式算出一组 id(k+1)、iq(k+1),然后代入价值函数取最小值对应的矢量,作为下一个周期的逆变器开关状态。

这里有个工程细节我需要特别说一下:延时补偿。真实数字控制器里,电流采样、预测计算、PWM 输出是在一个控制周期内完成的,但实际输出要等到下一个周期才会生效,所以存在一拍延时。仿真里如果不做延时补偿,MPC 的性能在小采样周期下可能看不太出来,但如果把采样周期放大到 1e-4 秒量级,延时造成的预测失配就会很明显,表现为电流纹波增大和轻微振荡。我采用的是两步预测方案:第一步先消除一拍延时,即在当前时刻根据测量值预测 t+1 时刻的电流;第二步再遍历电压矢量预测 t+2 时刻的电流,用 t+2 时刻的值来选最优矢量。

关于权重系数的设计:如果 d 轴和 q 轴的价值权重都是 1,那么 d 轴电流误差和 q 轴电流误差是同等对待的。但实际运行中 q 轴电流是速度环的输出来源,一般情况下我们更希望 q 轴电流跟踪得准一点,所以可以在价值函数里给 q 轴误差加权重:

J = λd·|id_ref - id(k+1)| + λq·|iq_ref - iq(k+1)|

我调试下来的经验是 λd 取 1、λq 取 1.2 到 1.5 左右,效果就比等权重要好。不过这个没有定式,如果你的应用场景对 d 轴电流限制更敏感,比如弱磁工况,那就反过来调整。仿真里多试几组,看电流波形的高频尖峰和跟踪误差哪一个更值得优化。

MPC 跟 TSMC 的衔接还有几个细节要处理。TSMC 速度环输出的 iq_ref 可能会有高频分量,因为滑模控制的切换动作会通过误差项传到电流指令里来。我建议在速度环和电流环之间加一个一阶低通滤波器,截止频率设为 MPC 控制频率的 1/5 到 1/4,比如 MPC 是 10 kHz,滤波器截止频率就设在 2 kHz 左右。别小看这个滤波器,很多仿真结果图上的电流毛刺就是从这里漏过去的。但是注意滤波器不能加太重,否则会把 TSMC 快速响应的优势消磨掉,转速阶跃时会明显看到 iq_ref 的上升沿变缓。

5. MATLAB/Simulink 仿真架构搭建与参数整定实战

仿真平台的搭建是整个研究里最花时间但最值得投入的部分。我用的 MATLAB 版本是 R2022a,Simulink 模型结构分五个部分:TSMC 速度环控制器、MPC 电流控制器、逆变器模型、PMSM 电机模型、测量与坐标变换模块。下面逐个说清楚实现细节。

顶层模型里我用了两个 MATLAB Function 模块:一个写 TSMC,一个写 MPC。这样做有几个好处:一是代码逻辑一目了然,改参数不用翻几层子系统;二是 MATLAB Function 里可以直接写矩阵运算,MPC 遍历 8 个电压矢量的逻辑用 for 循环写起来非常自然;三是后续你觉得仿真速度不够,可以把 MATLAB Function 直接换成 C MEX S-Function,函数主体基本不用改。

TSMC 的 MATLAB Function 输入是 ωm_ref、ωm 和 dωm/dt(速度微分项可以在模型里用一阶差分求,或者直接在函数里对 ωm 求导,我推荐前者,避免纯微分放大噪声),输出是 iq_ref。函数内部关键代码框架:

function iq_ref = fcn(wm_ref, wm, dwm, FLAG) persistent s_prev if isempty(s_prev) s_prev = 0; end p = 5; q = 3; beta = 800; k = 200; Phi = 0.01; Pn = 4; Fai = 0.175; J = 0.001; Rs = 2.875; B = 0; e = wm_ref - wm; de = dwm_ref - dwm; % dwm_ref 由外部给定,阶跃时近似为 0 s = de + beta * e^(q/p); % 终端滑模面 % 等效控制 + 切换控制(饱和函数) de_ddot = 0; % 阶跃参考时代二阶导数为 0 u_eq = (2*J/(3*Pn*Fai)) * (de_ddot - beta * (q/p) * e^(q/p-1) * de); u_sw = (2*J/(3*Pn*Fai)) * k * sat(s/Phi); iq_ref = u_eq + u_sw; s_prev = s; end function y = sat(x) if abs(x) <= 1 y = x; else y = sign(x); end end

注意 MATLAB Function 里用函数 sat 时,要把它定义成子函数放在同一个文件里,Simulink 是支持这种写法的。另外 e^(q/p) 里 e 如果是复数域,MATLAB 会返回复数结果,所以必须保证 p、q 都是奇数,同时加一个 abs 在 e < 0 时能取实值才稳妥。

MPC 的 MATLAB Function 输入是 id_ref、iq_ref、id、iq、we、theta(电角度),输出是逆变器的开关信号(1 到 8 的索引值,或者三相开关状态)。函数内部核心代码框架:

function [Sa, Sb, Sc] = fcn(id_ref, iq_ref, id, iq, we, theta) Ts = 1e-4; Rs = 2.875; Ld = 8.5e-3; Lq = 8.5e-3; Fai = 0.175; Vdc = 311; % 直流母线电压 % 8 个电压矢量 alpha-beta 分量 V_ab = [0, 0; 2/3*Vdc, 0; 1/3*Vdc, 1/3*sqrt(3)*Vdc; -1/3*Vdc, 1/3*sqrt(3)*Vdc; -2/3*Vdc, 0; -1/3*Vdc, -1/3*sqrt(3)*Vdc; 1/3*Vdc, -1/3*sqrt(3)*Vdc; 0, 0]; % 延时补偿:先用当前采样值预测 t+1 时刻电流 id1 = id + Ts/Ld*(0 - Rs*id + we*Lq*iq); % ud=0 是近似,实际可用上一周期最优矢量 iq1 = iq + Ts/Lq*(0 - Rs*iq - we*(Ld*id + Fai)); J_min = inf; idx_min = 1; for k = 1:8 % alpha-beta 转 dq ud = V_ab(k,1)*cos(theta) + V_ab(k,2)*sin(theta); uq = -V_ab(k,1)*sin(theta) + V_ab(k,2)*cos(theta); % 预测 t+2 时刻电流 id2 = id1 + Ts/Ld*(ud - Rs*id1 + we*Lq*iq1); iq2 = iq1 + Ts/Lq*(uq - Rs*iq1 - we*(Ld*id1 + Fai)); % 价值函数 J = abs(id_ref - id2) + 1.3*abs(iq_ref - iq2); if J < J_min J_min = J; idx_min = k; end end % 根据索引输出三相开关状态 switch idx_min case 1, Sa=0; Sb=0; Sc=0; case 2, Sa=1; Sb=0; Sc=0; case 3, Sa=1; Sb=1; Sc=0; case 4, Sa=0; Sb=1; Sc=0; case 5, Sa=0; Sb=1; Sc=1; case 6, Sa=0; Sb=0; Sc=1; case 7, Sa=1; Sb=0; Sc=1; case 8, Sa=1; Sb=1; Sc=1; end end

这里我特意把电流预测里的 ud 当前项简化处理了,实际项目里如果你要更精确,可以把上一周期选中的电压矢量传进函数来更新 id1、iq1 的预测,效果会更好。仿真模型里这样简化之后,调试起来方便,后面再逐步精细化也可以。

逆变器模型里,根据 Sa、Sb、Sc 三个开关状态,三相端电压对中性点的电压可以直接写成 V_a = (2/3·Vdc·Sa - 1/3·Vdc·Sb - 1/3·Vdc·Sc),V_b、V_c 循环移位。我建议直接用 Simulink 的 MATLAB Function 一次性算出三相电压,比搭一堆 Sum 和 Gain 模块清爽得多。

PMSM 电机模型的搭建是直接用 MATLAB Function 写状态方程。把 d-q 轴电流和机械角速度作为状态变量,微分方程写进去,然后积分器输出。这部分的输入是 ud、uq、TL、以及电角度(用于给电流环反馈),输出是 id、iq、ωm、θe、Te。

参数整定方面,我总结了一套比较有效的顺序:

  1. 先把 MPC 电流环单独调试。给 id_ref=0、iq_ref 一个固定值比如 5 A,观察电流跟踪效果。如果电流纹波太大,检查采样周期和控制周期是否匹配,Vdc 是否足够;如果电流有直流偏差,去调价值函数里 λq 的权重。
  2. 再调 TSMC 速度环的空载启动。给一个转速阶跃比如 1000 rpm,观察转速上升曲线。如果超调太大,说明 k 太大或者 β 太大,先降 k;如果启动太慢,说明 β 太小,增大 β 到转速能在 0.1 秒内到达给定值。
  3. 最后做负载突变测试。空载稳定后,在某个时刻阶跃加入负载转矩,观察转速跌落幅度和恢复时间。如果转速跌落超过 20% 且恢复时间超过 0.2 秒,增大切换增益 k;如果出现抖振,加宽边界层厚度 Φ 或者降低 k。

下面是我一组经过多次调试后效果不错的参数,可以直接作为初始参数跑:

参数符号数值
终端滑模参数β800
分数幂q/p3/5
切换增益k200
边界层厚度Φ0.01
低通滤波截止频率fc2 kHz
MPC 控制周期Ts_mpc1e-4 s
仿真步长Ts_sim1e-6 s
直流母线电压Vdc311 V
d 轴电流权重λd1
q 轴电流权重λq1.3

6. 仿真结果分析与实测踩坑记录

调试过程中最有价值的不是最后那一张漂亮的曲线图,而是前面一堆失败的尝试。我把几个典型的仿真现象和对应的处理过程写下来,这些比最终结果更有参考价值。

第一个坑是终端滑模控制器在误差过零时控制量突变。最开始我直接用 e^(q/p) 原样写进 MATLAB Function,结果仿真在 0.3 秒左右直接报复数错误,后来排查发现是因为 e 是负值、q/p 是 3/5,MATLAB 会尝试求功率的复数根。这个问题的解决方法是把 e^(q/p) 改写成 sign(e)·|e|^(q/p),保证任何情况下返回实数,同时在滑模面计算里也加上绝对值保护。

第二个坑是转速启动时出现了一次数值发散。查了模型之后发现是速度环输出的 iq_ref 在启动瞬间非常大——TSMC 的等效控制里面有一个 e^(q/p-1) 项,当 e 接近 0 时这个项的绝对值是极大的,再加上切换项的叠加,iq_ref 直接冲到限幅上限。这个现象的本质就是终端滑模在误差接近 0 时的固有高增益放大。我的处理办法是把 e^(q/p-1) 加上一个很小的偏移 ε 再取绝对值,比如记作 (|e| + 0.001)^(q/p-1),这样既能保持终端滑模特性,又不会让控制量在误差过零时炸掉。

第三个坑是负载突变后转速恢复出现抖振。第一次加上 15 N·m 阶跃负载,转速恢复是可以的,但速度曲线上叠加了一个频率很高的正弦纹波,而且 q 轴电流波形上有明显的高频开关噪声。我一开始怀疑是 MPC 的预测误差,后来发现是 TSMC 的切换增益 k 取值偏大,在负载突变后状态点在滑模面附近来回穿越,边界层里的饱和函数在 Φ=0.01 的情况下还是太窄。把 Φ 从 0.01 加到 0.05,k 从 250 降到 180,抖振明显被压下来,转速恢复时间只增加了大概 0.03 秒,这在工程上完全可以接受。

第四个坑是 MPC 在电流环的动态响应中出现一个周期的高频脉冲。这个问题的根源在采样时刻和开关状态的同步上:当 MPC 的价值函数选出某一个电压矢量时,逆变器输出端的电气量会改变,但电流采样如果没有避开开关动作瞬间,采样值会包含振铃分量,导致预测不准。解决办法有两个,一是在模型里把采样时间设置在 PWM 开关周期的中间位置,二是在 MPC 的电流预测里加一拍延时补偿。我两个方法都试了,延 时补偿的效果更稳定。

调试过程中我最推荐的测试场景组合是这三组:

第一组,空载阶跃启动。给定转速从 0 到 1000 rpm,观察转速上升时间、超调量、稳态误差。用我上面那组参数,实测上升时间约 0.08 秒,几乎没有超调,稳态转速误差在 ±1 rpm 以内。q 轴电流在启动瞬间有一个约 30 A 的峰值,随后很快回落到零附近,这说明 TSMC 的动态响应是够快的。

第二组,负载突变测试。空载稳定 0.5 秒后阶跃加载 10 N·m,转速跌落约 25 rpm,恢复时间约 0.15 秒。这个结果在工程上是比较理想的了——传统 PI 控制在这个电机参数下,同样负载阶跃,转速跌落通常会超过 50 rpm,恢复时间 0.3 秒以上。

第三组,参数摄动鲁棒性测试。我把电机的电感值人为调大 30%,把磁链调小 20%,模拟实际运行中的参数变化,TSMC-MPC 的调速性能几乎没有明显劣化,转速响应曲线跟原始参数相比只有很小的差异。这是滑模控制鲁棒性的直接体现。

对比试验我也做了:把速度环换成经典 PI 控制器,电流环仍然用 MPC,在同样的参数摄动和负载突变条件下做对比。PI 速度环在参数没有摄动时表现其实不错,转速稳定性也可以,但一旦参数摄动,速度环的恢复时间明显变慢,负载突变时转速跌落幅度更大。这个对比说明终端滑模的速度环确实给系统带来了更强的抗参数变化能力。

还有一个值得说的点:模型预测控制本身就有一个优势是不需要调 SVPWM 的调制参数,因为它直接把开关状态选出来,省掉了调制环节。但代价是在固定开关频率下,电流纹波会比 SVPWM 略大,因为每一步选择的矢量是离散的,不像 SVPWM 那样通过占空比去连续合成电压。仿真里我把 MPC 的电流波形和传统 PI+SVPWM 的电流波形做了对比,同样 10 kHz 开关频率下,MPC 的电流纹波大约大 15% 左右,但动态响应速度提升了大概 30%。这就是一个典型的工程权衡,看你的应用更看重电流质量还是响应速度。

调试的时候我还整理了一个踩坑检查清单,现在每次搭建新的电机控制仿真都会过一遍:

  • 坐标变换角度是电角度还是机械角度,极对数有没有乘进去
  • MPC 的价值函数里 id_ref 是否为 0,iq_ref 有没有被低通滤波器延迟
  • 逆变器的零矢量是否被正确包含在 8 个候选矢量里
  • 终端滑模的幂次项是否加了实部保护
  • 采样周期、控制周期、仿真步长三者是否满足数值稳定性要求
  • 负载转矩加载时刻是否避开了速度阶跃的调节过程

这套 TSMC-MPC-PMSM 仿真平台跑稳定之后,我有一个很直观的感受:终端滑模和模型预测控制并不是互相替代的关系,它们各自解决控制链路里不同位置的问题——滑模管住外环的鲁棒性和快速收敛,模型预测管住内环的动态性和约束处理。这个架构比单独用其中任何一个的性能都要均衡。如果你也想搭一套类似的控制仿真,建议从我这组参数出发,先跑通空载阶跃,再加负载测试,最后做参数摄动对比,一步步来,不要一上来就追求复杂的改进算法,把基础架构和参数整定手法跑熟了,后面再往非奇异终端滑模、自适应增益、多步预测这些方向扩展,都会顺手很多。

本文还有配套的精品资源,点击获取

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

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

立即咨询