在做位置伺服或机械臂关节控制的时候,很多工程师应该都有过这种体会:系统想跑得快,超调就压不住;超调压下去了,响应又变得拖沓。尤其是在负载惯量变化、摩擦非线性、负载力矩突变这些真实工况叠加进来之后,固定增益的 PID 三环结构很难同时满足“快速性”和“无超调”这两项要求。
本文围绕“扰动观测器 + 非奇异终端滑模”的组合控制方案展开。全文会先说明为什么要抛弃纯 PID 思路,再逐步推导非奇异终端滑模面和扰动观测器的数学形式,接着给出一套完整的 MATLAB 仿真验证流程,最后落到 STM32 数字实现和实际调试中常见的坑点上。无论你是刚接触滑模控制的学生,还是正在做电机驱动器、关节模组开发的工程师,都可以按这套流程复现并迁移到自己的项目中。
1. 问题背景与系统建模
1.1 传统三环 PID 在高速高精应用中的局限
电机伺服控制最常见的结构是三环控制:电流环、速度环、位置环。电流环负责力矩响应,速度环负责转速调节,位置环负责最终的角度或直线位置跟踪。环与环之间是级联关系,外环输出作为内环参考。
这种结构的优点是工程实现简单、参数含义直观,但缺陷也很明显:
- 误差驱动的响应滞后。PID 本质上是用当前误差和误差变化率去推算控制量,当扰动进入系统后,要先产生误差才能被控制器感知并补偿。
- 快速性与超调矛盾。要提高响应速度就需要放大比例增益,但增益过大很容易导致位置超调,机械系统一旦出现位置超调,在精密对位、关节插补等场景中往往是不允许的。
- 鲁棒性有限。负载转动惯量变化、摩擦力矩突变等工况下,固定 PID 参数很难始终维持同样的动态性能。
这些局限促使工程师在 PID 之外寻求更高级的控制策略。滑模控制(Sliding Mode Control, SMC)就是其中一个重要方向。
1.2 滑模控制的基本思想
滑模控制的思路可以这样理解:设计一个滑模面 s,使系统状态一旦到达这个面,就会沿着面“滑向”原点。滑模面只取决于系统状态,不依赖精确的模型参数,所以对外部扰动和参数摄动具有天然的不变性。
传统滑模面通常取线性形式:
s = e2 + c * e1其中 e1 是位置误差,e2 是速度误差,c 是正常数。在这个滑模面上,系统误差以指数形式渐近收敛到零,理论上收敛时间趋向无穷。虽然工程上可以接受,但在要求“极速收敛”的场合仍然不够理想。
另一个问题是抖振。滑模控制中的切换项为了保证鲁棒性,通常会使用符号函数 sign(s),这个高频切换作用在未建模动态上会激发高频振荡。切换增益越大,抖振越明显。
1.3 为什么终端滑模和扰动观测器要一起用
终端滑模(Terminal Sliding Mode, TSM)把滑模面改为非线性形式,使误差在滑模面上能在有限时间内收敛到零。相比线性滑模,收敛速度更快,精度更高。
但传统终端滑模存在一个严重问题:控制律分母中含有速度误差的负数次幂项,当速度误差接近零时,控制量可能趋于无穷大,这就是“奇异”现象。非奇异终端滑模(Nonsingular Terminal Sliding Mode, NTSM)通过重新构造滑模面,在保留有限时间收敛特性的同时,从数学上规避了奇异问题。
不过即使使用 NTSM,切换增益仍然要大于扰动的上界才能保证鲁棒性。真实电机系统中的负载扰动往往幅值不小,如果单纯依靠增大切换增益去对抗扰动,抖振问题会被放大。为了在不大幅提高切换增益的前提下抵消扰动影响,引入扰动观测器(Disturbance Observer, DOB)是更合理的选择。
扰动观测器先把负载扰动、参数摄动等综合干扰估计出来,再以前馈形式补偿到控制律中。这样 NTSM 中的切换增益只需要大于“扰动估计误差”而不是“原始扰动上界”,抖振会明显下降,也就是标题中所说的零超调和极速收敛的实现基础。
1.4 电机系统建模
为了保证推导过程清晰,这里以永磁同步电机(PMSM)或带霍尔/编码器的 BLDC 电机为对象,建立速度环和位置环可用的简化机电模型。
电流环响应速度远快于机械环节时,可以忽略电流环动态,把电机模型简化为一阶惯性加积分环节:
J * dω/dt = Kt * iq_ref - B * ω - TL dθ/dt = ω其中:
- J 为转动惯量,单位 kg·m²;
- B 为粘滞摩擦系数,单位 N·m·s/rad;
- Kt 为力矩系数,单位 N·m/A;
- iq_ref 为 q 轴电流参考值,单位 A;
- TL 为负载转矩,单位 N·m;
- θ 为转子位置,单位 rad;
- ω 为转子角速度,单位 rad/s。
令 x1 = θ,x2 = ω,把扰动集中项写为 d(t) = -(B * ω + TL) / J,系统可以写成二阶状态方程形式:
dx1/dt = x2 dx2/dt = a * u + d(t)其中 a = Kt / J,u = iq_ref。
这样建模的好处是:控制量 u 直接对应电流指令,在工程实现时只需要在控制器输出后做一次电流限幅,再交给 FOC(磁场定向控制)执行即可。
2. 非奇异终端滑模控制器设计
2.1 非奇异终端滑模面
定义位置跟踪误差:
e1 = x1 - x1d e2 = x2 - x2d其中 x1d 是期望位置,x2d 是期望速度。
非奇异终端滑模面取为:
s = e1 + β * sign(e2) * |e2|^γ这里的 β > 0,γ 满足 0 < γ < 1,并且通常取 γ = p / q,p 和 q 均为正奇数。之所以要求为奇数比值,是为了保证当 e2 为负数时,幂次项仍然保持实数且可微,从而在数值实现时避免复数运算。
当系统状态进入滑模面 s = 0 后,有:
e1 = -β * sign(e2) * |e2|^γ在该约束下,位置误差 e1 的收敛动态为:
de1/dt = -β^(-1/γ) * sign(e1) * |e1|^(1/γ)求解这个一阶非线性微分方程可以得到,误差从 e1(0) 收敛到零的时间 T 是有限值:
T = β^(1/γ) / (1 - 1/γ) * |e1(0)|^(1 - 1/γ)这就是终端滑模“有限时间收敛”的来源。对比线性滑模“渐近收敛”的特性,终端滑模的收敛速度在接近目标时会显著快于线性滑模。
2.2 控制律推导
对滑模面 s 求导,可得:
ds/dt = de1/dt + β * γ * |e2|^(γ-1) * de2/dt将 de1/dt = e2,de2/dt = a * u + d 代入,并令 ds/dt = 0,可以得到等效控制项。为了保证系统状态即使偏离滑模面也能被拉回,还需要加入切换控制项。
最终控制律形式为:
u = -a^(-1) * [ d_hat + β^(-1) * γ^(-1) * sign(e2) * |e2|^(2-γ) + k_s * sign(s) ]其中:
- 第一项 d_hat 是扰动观测器给出的扰动估计值;
- 第二项是实现滑模面上有限时间收敛所需的等效控制项;
- 第三项中的 k_s 是切换增益,用于克服扰动估计误差和未建模动态。
注意观察第二项中的指数是 2 - γ。因为 γ 在 0 到 1 之间,所以 2 - γ 大于 1,当 e2 趋向于零时,这一项趋向于零而不是无穷大。这正是非奇异终端滑模能够避免传统终端滑模奇异问题的关键。
2.3 稳定性分析
取李雅普诺夫函数:
V = 0.5 * s²对其求导可得:
dV/dt = s * ds/dt = s * [ e2 + β * γ * |e2|^(γ-1) * (a * u + d) ]把控制律代入后,整理可得:
dV/dt = β * γ * |e2|^(γ-1) * [ s * (d - d_hat) - k_s * |s| ]由于 β * γ * |e2|^(γ-1) 为正,只要切换增益满足:
k_s > |d - d_hat|即切换增益大于扰动估计误差上界,则有 dV/dt < 0,系统满足滑模到达条件。也就是说,系统状态能在有限时间内到达滑模面,并沿滑模面有限时间收敛到目标。
这里能清楚看到扰动观测器的作用:如果没有 DOB,切换增益 k_s 必须大于原始扰动 d 的上界;加入 DOB 后,k_s 只需要大于扰动估计误差的上界。扰动估计误差通常远小于扰动本身,所以抖振可以显著降低。
3. 非线性扰动观测器设计
3.1 扰动观测器的基本思路
电机系统中的负载力矩 TL 往往难以直接测量,摩擦和参数摄动更难获得准确值。观测器的核心思想是利用系统状态输出和控制量,反向估算出“等效扰动”。
非线性扰动观测器的设计中,通常不直接估计扰动本身,而是构造一个辅助变量,通过辅助变量与系统状态的组合来间接得到扰动估计值。
3.2 观测器数学形式
设计辅助变量 z,使得:
dz/dt = -l * z - l² * x2 - l * (a * u + f) d_hat = z + l * x2其中 l 为观测器增益,是一个正数。如果考虑之前简化的模型,f 中可以包含已知的粘滞摩擦项。
对 d_hat 求导可得:
dd_hat/dt = dz/dt + l * dx2/dt = -l * z - l² * x2 - l * (a * u + f) + l * (a * u + f + d) = -l * (z + l * x2) + l * d = -l * d_hat + l * d定义观测误差为 d_tilde = d - d_hat,则观测误差动态为:
dd_tilde/dt = dd/dt - dd_hat/dt = dd/dt - l * d_tilde当扰动变化缓慢时,dd/dt 近似为零,此时:
d_tilde(t) = d_tilde(0) * e^(-l * t)观测误差会按指数速度收敛到零,收敛速度由增益 l 决定。在扰动快速变化的场景下,l 越大,观测器跟踪能力越强;但同时 l 过大也会放大测量噪声。工程上通常通过仿真对比选定 l 的数量级。
3.3 观测器增益选择原则
观测器增益 l 的选取要和切换增益 k_s 配合考虑。一个实用经验是:
- 先让扰动观测器工作,在仿真中给系统加入阶跃负载和正弦负载,观察 d_hat 能否快速跟踪;
- 再逐步增大 l,直到扰动估计曲线已经贴住真实扰动曲线;
- 如果继续增大 l 后控制量出现高频毛刺,说明观测器已经开始放大噪声,这时可以回退 l,并通过提高 k_s 的方式保证鲁棒性。
4. DOB + NTSM 复合控制器整体方案
4.1 复合控制律
把前面的设计组合起来,DOB + NTSM 复合控制器的完整控制律为:
u = -a^(-1) * [ d_hat + sat(β^(-1) * γ^(-1)1 * sign(e2) * |e2|^(2-γ), U_max) + k_s * sat(s / φ) ]这里额外加入了两个工程化处理:
- 饱和函数 sat() 替代符号函数 sign(),在滑模面边界层内部做线性过渡,目的是抑制抖振;
- 对等效控制项做限幅,防止速度误差在接近零时数值跳动导致控制量异常。
4.2 各环节作用
整个控制系统的信号流如下:
- 位置编码器或旋变读取当前角度 x1;
- 微分或测速观测器得到速度 x2;
- 与期望位置 x1d、期望速度 x2d 比较得到误差 e1、e2;
- 计算 NTSM 滑模面 s;
- 扰动观测器根据历史控制量和状态估计 d_hat;
- 按复合控制律计算控制量 u;
- 控制量经电流限幅后作为 iq_ref 送入 FOC 或直接驱动电路。
4.3 零超调与极速收敛的机理
“零超调”并不是说控制器自动消除了所有超调,而是通过以下三个机制实现的:
- 有限时间收敛:NTSM 滑模面使误差在接近目标时具有非线性加速特性,误差收敛后期速度快,不需要像 PID 那样通过放大比例增益来加速,因此不容易出现超调。
- 扰动前馈补偿:DOB 将负载力矩、参数摄动等干扰补偿掉,系统等效为无扰动的标称对象,避免了扰动引起的动态偏差和恢复过程的超调。
- 切换增益按边界层处理:switch 项在边界层内连续过渡,不产生大幅控制量的来回切换,避免位置越过目标后因控制量反向过度而产生超调。
需要强调的是,零超调是有前提的:NTSM 参数 β、γ 需要与期望动态匹配,DOB 带宽要覆盖实际扰动的频率范围,切换增益 k_s 也要略大于扰动估计误差。参数设计不合理时,同样会出现超调或振荡。
5. MATLAB 仿真验证
5.1 仿真模型与参数
下面用一个完整的位置伺服仿真来验证前面的设计。仿真对象采用简化的永磁同步电机机械模型,FOC 电流环动态视为理想环节。
仿真参数如下:
| 参数 | 数值 | 含义 |
|---|---|---|
| J | 0.01 kg·m² | 转动惯量 |
| B | 0.001 N·m·s/rad | 粘滞摩擦系数 |
| Kt | 1.0 N·m/A | 力矩系数 |
| β | 20 | NTSM 滑模面参数 |
| γ | 3/5 | NTSM 幂次 |
| φ | 0.01 | 边界层厚度 |
| k_s | 5 | 切换增益 |
| l_dob | 100 | 扰动观测器增益 |
| TL | 1.5sin(8πt) + 0.3 | 负载转矩扰动 |
控制目标:给定位置参考从 0° 阶跃到 60°,要求位置响应快、超调尽量小,同时存在持续正弦负载扰动。
5.2 辅助函数代码
为了避免 MATLAB 里的负底数小数次幂产生复数结果,需要定义一个保持符号的实数幂函数。
function y = pow_sign(x, p) % 保持底数符号的实数幂运算 y = sign(x) .* abs(x).^p; end再定义一个饱和函数,用于边界层处理:
function y = sat(x) % 饱和函数,限幅到 [-1, 1] y = max(-1, min(1, x)); end5.3 DOB + NTSM 控制器主脚本
%% DOB+NTSM 位置控制仿真主脚本 clear; clc; close all; % ------- 模型参数 ------- J = 0.01; % 转动惯量 kg*m^2 B = 0.001; % 粘滞摩擦系数 N*m*s/rad Kt = 1.0; % 力矩系数 N*m/A a = Kt / J; % 控制增益 % ------- NTSM 参数 ------- beta = 20; gama = 3/5; phi = 0.01; k_s = 5.0; % ------- DOB 参数 ------- l_dob = 100; % ------- 扰动定义 ------- % 真实扰动中包含正弦负载和常值负载 dist_func = @(t) (1.5 * sin(8 * pi * t) + 0.3) / J; % ------- 仿真时间 ------- dt = 1e-4; T = 1.0; t = 0 : dt : T; n = length(t); % ------- 状态初始化 ------- x1 = 0; % 位置 rad x2 = 0; % 速度 rad/s d_hat = 0; % 扰动估计 z = 0; % DOB 辅助变量 % ------- 参考轨迹 ------- ref_pos = 60 * pi / 180 * ones(size(t)); % 60°阶跃 ref_vel = zeros(size(t)); ref_acc = zeros(size(t)); % ------- 数据记录 ------- x1_log = zeros(1, n); x2_log = zeros(1, n); u_log = zeros(1, n); d_log = zeros(1, n); dh_log = zeros(1, n); s_log = zeros(1, n); % ------- 主循环 ------- for i = 1 : n % 记录数据 x1_log(i) = x1; x2_log(i) = x2; d_log(i) = dist_func(t(i)); dh_log(i) = d_hat; e1 = x1 - ref_pos(i); e2 = x2 - ref_vel(i); % 滑模面 s = e1 + beta * pow_sign(e2, gama); s_log(i) = s; % 等效控制项:注意 2-gama 大于 1 u_eq = ref_acc(i) - pow_sign(e2, 2 - gama) / (beta * gama); % 切换控制项 u_sw = -k_s * sat(s / phi); % 复合控制律 u = (u_eq + u_sw + d_hat) / a; % 限幅 u = max(-20, min(20, u)); u_log(i) = u; % 真实扰动 d = dist_func(t(i)); % 系统状态更新(欧拉法) dx2 = a * u + d; dx1 = x2; x1 = x1 + dx1 * dt; x2 = x2 + dx2 * dt; % DOB 更新 % dz/dt = -l*z - l^2*x2 - l*(a*u) % 注意这里的模型 f = 0,粘滞摩擦并入扰动 dz = -l_dob * z - l_dob^2 * x2 - l_dob * (a * u); z = z + dz * dt; d_hat = z + l_dob * x2; end % ------- 绘图 ------- figure; subplot(3,1,1); plot(t, x1_log * 180 / pi, 'LineWidth', 1.5); hold on; plot(t, ref_pos * 180 / pi, 'r--', 'LineWidth', 1); ylabel('位置/°'); legend('实际位置', '参考位置'); grid on; subplot(3,1,2); plot(t, d_log, 'LineWidth', 1.2); hold on; plot(t, dh_log, 'r--', 'LineWidth', 1.2); ylabel('扰动'); legend('真实扰动', 'DOB估计'); grid on; subplot(3,1,3); plot(t, u_log, 'LineWidth', 1.2); ylabel('控制量/A'); xlabel('时间/s'); grid on;这个脚本运行后可以直观看到位置响应、DOB 对扰动的估计情况以及控制量变化。需要提醒的是,如果直接采用阶跃参考位置,位置环在初始时刻会存在速度误差和位置误差同时较大的情况,NTSM 能够处理这种大误差状态,但控制量初始阶段可能会较大。实际项目中更推荐使用梯形速度规划或 S 型速度规划来减少初始冲击。
5.4 对比实验设计
为了验证 DOB + NTSM 的性能优势,可以设计三组对比:
- 传统 PID 位置环 + 速度环;
- 普通线性滑模控制(传统 SMC);
- DOB + NTSM 复合控制。
| 控制方案 | 调节时间(误差<1%) | 位置超调 | 稳态位置误差 |
|---|---|---|---|
| PID 三环 | 约 0.42 s | 约 8% | ±0.08° |
| 线性 SMC | 约 0.30 s | 约 5% | ±0.03° |
| DOB + NTSM | 约 0.12 s | 0.2% 以内 | ±0.01° |
这里的数据是仿真趋势示意,实际数值会随参数变化。但结论方向是明确的:DOB + NTSM 在调节时间和超调两个指标上都能兼顾,而不是像 PID 那样需要二选一。
5.5 边界层内抖振处理
如果直接把切换项写成-k_s * sign(s),控制量会出现高频切换,仿真步长稍大时结果就会“毛茸茸”的。使用饱和函数sat(s / φ)之后,状态在滑模面附近时切换量随 s 线性变化,等效为一种“准滑模”,抖振明显减弱。
边界层厚度 φ 的选择也影响性能:
- φ 过大,边界层太宽,相当于把滑模控制器变成了带死区的比例控制器,跟踪误差会变大;
- φ 过小,边界层太窄,抖振抑制效果不明显。
一般先取 φ = 0.01 左右,观察实际位置稳态噪声水平再调整。
6. 参数调节方法与工程坑点
6.1 NTSM 参数 β 和 γ 的调节顺序
β 和 γ 决定滑模面上的误差收敛速度,但二者作用不同:
- β 影响到达滑模面之后误差收敛的“整体速度”,β 越大,收敛越快;
- γ 影响误差接近零时的非线性特征,γ 越接近 1,收敛特性越接近线性滑模;γ 越接近 0,接近零时收敛越快,但对噪声和数值误差的敏感度也越高。
工程上建议先固定 γ = 3/5,然后从小到大调整 β。把 β 增大到出现轻微控制量振荡或速度噪声放大时,再回退 20% 左右。之后如果还想继续提升快速性,可以把 γ 微调到 1/3 或 5/7,并用仿真对比收敛时间。
6.2 负底数幂次运算的数值问题
这是新手最容易踩的坑。在 MATLAB 中直接写(-0.2)^(3/5)会得到复数,因为 MATLAB 默认按照复数幂规则计算。在 C 语言中,powf(-0.2f, 0.6f)在部分编译环境下同样可能返回 NaN。
正确做法是始终使用带符号的幂函数:
function y = pow_sign(x, p) y = sign(x) .* abs(x).^p; endC 语言版本:
float pow_sign(float x, float p) { return (x >= 0.0f) ? powf(x, p) : -powf(-x, p); }无论是仿真还是嵌入式实现,凡是滑模面和控制律里出现的幂次运算,都要统一使用这类函数,否则系统会在误差过零时出现控制量跳变甚至发散。
6.3 切换增益 k_s 的选择
理论上 k_s 只需要略大于扰动估计误差上界。但在工程实现中,由于模型简化、测量噪声、离散化误差等因素,扰动估计误差的实际上界很难精确获得。
实用整定步骤:
- 先让 k_s = 0,系统大概率在扰动下出现稳态误差或发散;
- 逐步增大 k_s,直到系统在最大负载扰动下仍然能保持在滑模面附近;
- 再增加 20% 的裕量,然后观察控制量噪声水平;
- 如果抖振明显,回退 k_s,同时提高 DOB 增益 l_dob。
6.4 与 PID 参数整定的根本区别
PID 调参是在“增益换动态”的框架里取舍,而 NTSM + DOB 的核心是先通过扰动观测器把不确定性压到很小,再通过滑模面对残余不确定性做鲁棒控制。所以调参时要记住:不要一上来就猛拉 k_s,优先把 DOB 带宽调好,k_s 只需要“兜底”。
7. STM32 数字实现要点
7.1 离散化与控制周期分配
从仿真到 STM32 控制器,需要考虑离散化问题。NTSM 和 DOB 都是微分方程形式的控制器,工程上最常用的一阶欧拉离散格式实现。
控制周期分配一般如下:
- 电流环:10 kHz 到 20 kHz,与 PWM 频率同步;
- 速度环:1 kHz 到 2 kHz;
- 位置环:1 kHz 左右,可以在速度环中断里一并完成,也可以独立周期执行;
- DOB:与速度环或位置环同周期执行。
如果采用位置环直接输出 q 轴电流的“位置电流一体化”设计,可以把 NTSM 放在位置环中运行。控制律中的 u 按前面的模型推导是“期望加速度”量纲,要转换为电流指令,需要乘以转动惯量并除以力矩系数:
iq_ref = J * u / Kt然后再进入电流限幅和 FOC 执行。
7.2 STM32 核心代码示例
下面是一段位置环 NTSM + DOB 的核心代码片段,适用于在速度环中断或位置环定时器中周期调用。
// 文件路径:ntsm.c #include "ntsm.h" #include <math.h> typedef struct { float J; // 转动惯量 kg*m^2 float Kt; // 力矩系数 N*m/A float beta; // NTSM 参数 float gama; // NTSM 幂次 float phi; // 边界层 float k_s; // 切换增益 float l_dob; // DOB 增益 float dt; // 控制周期 s float z; // DOB 辅助变量 float d_hat; // 扰动估计 } NTSM_Handle; float pow_sign(float x, float p) { return (x >= 0.0f) ? powf(x, p) : -powf(-x, p); } float sat(float x) { if (x > 1.0f) return 1.0f; if (x < -1.0f) return -1.0f; return x; } float ntsm_dob_step(NTSM_Handle *h, float ref_pos, float ref_vel, float ref_acc, float pos, float vel) { float e1 = ref_pos - pos; float e2 = ref_vel - vel; // 滑模面 float s = e1 + h->beta * pow_sign(e2, h->gama); // 等效控制项 float u_eq = ref_acc - pow_sign(e2, 2.0f - h->gama) / (h->beta * h->gama); // 切换控制项 float u_sw = -h->k_s * sat(s / h->phi); // 复合控制律,输出加速度量纲 float u = u_eq + u_sw + h->d_hat; // 模型 a = Kt / J float a = h->Kt / h->J; float iq_ref = h->J * u / h->Kt; // 转换为电流指令 // DOB 更新 float dz = -h->l_dob * h->z - h->l_dob * h->l_dob * vel - h->l_dob * (a * u); h->z += dz * h->dt; h->d_hat = h->z + h->l_dob * vel; return iq_ref; }使用时,在定时器中断里按照固定周期调用:
// 文件路径:control_isr.c static NTSM_Handle ntsm = { .J = 0.01f, .Kt = 1.0f, .beta = 20.0f, .gama = 0.6f, .phi = 0.01f, .k_s = 5.0f, .l_dob = 100.0f, .dt = 0.001f, }; void TIM_ISR(void) { // 读取编码器位置 float pos = encoder_get_position_rad(); // 使用观测速度或测速速度 float vel = speed_observer_get_velocity(); // 参考轨迹生成 float ref_pos = trajectory_get_position(); float ref_vel = trajectory_get_velocity(); float ref_acc = trajectory_get_acceleration(); // 计算电流指令 float iq_ref = ntsm_dob_step(&ntsm, ref_pos, ref_vel, ref_acc, pos, vel); // 电流限幅 float iq_sat = clamp(iq_ref, -10.0f, 10.0f); // 送入 FOC 电流环 foc_set_iq_reference(iq_sat); }7.3 速度获取与滤波
NTSM 需要速度误差,速度信号通常由编码器位置差分得到。直接差分在低速时噪声很大,如果把这个噪声送入 NTSM 的幂次项,控制量会出现高频毛刺。
工程上常用的做法:
- 位置信号先做一阶低通滤波,再做差分求速度;
- 或者直接使用锁定环/状态观测器来估计速度和加速度;
- DOB 内部状态对噪声比较敏感,所以编码器分辨率要足够,否则 DOB 增益 l_dob 不能取太大。
7.4 与 FOC 电流环的衔接
这里的电流指令 iq_ref 是 q 轴电流参考值,PMSM/BLDC 电机在 FOC 控制下电流环带宽通常远高于机械环带宽。所以电流环动态可以忽略,NTSM 输出作为 FOC 输入是合理的。
如果使用的是 STM32G4 系列,其片内集成了高性能 ADC、运放和高级定时器,非常适合做 FOC 电流环;STM32F407 也可以配合外部采样电阻和运放实现 FOC。NTSM 位置环只需要在主循环或定时器中断里调用,不占用太多 CPU 资源。
7.5 多电机协同场景中的位置扩展
当系统需要多个关节电机协同运动时,比如机械臂多关节 CSP(Cyclic Synchronous Position)模式,通常由主站通过 CAN/CANFD 总线下发规划好的位置曲线,每个关节的伺服控制器在内部运行位置环控制算法。此时 NTSM + DOB 可以作为单关节的底层控制器,负责快速、无超调地跟踪主站下发的期望位置。
CAN 总线的实时性取决于波特率和报文周期。典型 1 Mbps CAN 总线带 6 到 8 个关节时,位置指令周期通常可以做到 1 ms 到 2 ms。NTSM 控制周期保持 1 kHz,正好可以与 CAN 周期对齐。
8. 常见问题与排查思路
| 问题现象 | 常见原因 | 解决思路 |
|---|---|---|
| 系统高频抖振明显 | k_s 过大,或边界层 φ 过小 | 用饱和函数替代 sign,适当增大 φ,同时增大 DOB 增益 |
| 控制量出现尖峰 | 直接使用负底数幂次运算,产生复数或 NaN | 改用 sign(abs) 形式的实数幂函数 |
| 大负载突变下有超调 | DOB 带宽不够,扰动估计滞后 | 提高 l_dob,同时把 k_s 提高到扰动估计误差上界之上 |
| 位置收敛慢 | β 过小,或 γ 过于接近 1 | 先增大 β,再微调 γ,优先用仿真观察收敛时间 |
| 稳定时存在小幅往复 | 边界层 φ 过大,等效为比例控制精度不足 | 减小 φ,或采用边界层内结合积分补偿的方案 |
| DOB 估计噪声大 | 速度测量噪声被观测器放大,l_dob 过大 | 提高速度估计滤波强度,或降低 l_dob |
除了表格中的问题,还有一个容易被忽略但很关键的排查点:控制周期必须保持严格固定。NTSM 和 DOB 都是时间离散系统,如果控制周期抖动,等效于参数随时变化,系统很容易出现之前的仿真中没有的问题。
另一个常见问题是初始化。DOB 的辅助变量 z 必须初始化为零,并且在系统启动或控制模式切换时重新初始化,否则由于 z 中残留的旧状态,扰动估计值会出现一个较大的阶跃。
9. 总结与进阶方向
本文从工程痛点出发,围绕“扰动观测器 + 非奇异终端滑模”这套组合方案,梳理了一条完整的技术链路:为什么要用 NTSM、如何设计滑模面和控制律、扰动观测器如何补偿负载扰动、复合控制器如何实现零超调目标和有限时间收敛,以及如何从 MATLAB 仿真迁移到 STM32 数字实现。
核心结论可以归纳为三点:
- 非奇异终端滑模解决的是“收敛速度和奇异问题”,它比线性滑模收敛更快,又能规避传统终端滑模在速度误差过零时的控制量奇异;
- 扰动观测器解决的是“抖振与鲁棒性矛盾”,它把大幅扰动人前馈补偿掉,让滑模切换增益只承担小误差兜底功能;
- 两者的结合是工程化落地的关键,仿真验证、参数分步整定、离散化实现三个环节缺一不可。
如果继续深入,可以进一步研究超螺旋滑模(Super-Twisting)、高阶滑模、自抗扰控制中的扩张状态观测器与 DOB 的对比,以及模型预测控制与滑模控制的混合策略。对于多电机协同场景,还可以在关节控制器之上设计轨迹规划层,配合 CAN/CANFD 总线实现高精度联动。
最后给一个实际调试的建议:不要一开始就在真实电机上尝试“极限参数”。先在仿真里把 DOB 跟踪效果和 NTSM 收敛曲线调到位,再在硬件上用远小于仿真值的 k_s 起步,逐步逼近仿真状态。这样不仅能保护机械系统和驱动器,也能让你在每一步都能看清控制器内部状态的变化规律。