伺服系统基本架构:位置环、速度环、电流环三环结构解析

做伺服驱动的人都知道,伺服系统最核心的就是三个闭环:位置环、速度环、电流环。这三个环像俄罗斯套娃一样,一层套一层。我刚开始接触伺服时,总觉得这结构太复杂,后来才明白——正是这种嵌套结构,才让伺服系统有了高精度的跟随能力。

说白了,三环结构就是一套「目标分解」机制。位置环负责最终精度,速度环负责平稳性,电流环负责响应速度。你想想看,如果只有一个环,既要管位置又要管电流,那控制器根本忙不过来。

2.1 三环结构总览

先看一张整体框架图,把三环的关系理清楚。

伺服系统三环控制结构图 位置环控制器 P / PI 控制 速度环控制器 PI 控制 电流环控制器 PI 控制 电机 + 负载 被控对象 位置传感器 编码器 / 光栅尺 速度计算 位置微分 / 测速机 电流采样 霍尔 / 采样电阻 速度指令 电流指令 PWM 驱动 机械位置 位置反馈 速度反馈 电流反馈 目标位置 💡 关键特点 • 内环响应速度 > 外环 • 电流环带宽最高 • 位置环带宽最低 • 逐级限幅保护

从图上你能看到,位置环在最外层,速度环在中间,电流环在最里面。每个环都有自己的控制器和反馈通道。我习惯把这种结构叫做「洋葱模型」——剥开一层还有一层。

2.2 电流环:最内层,最快

电流环是三个环中响应最快的。它的任务很简单:让电机绕组中的实际电流,快速跟上指令电流。

为什么电流环要放在最里面?因为电流直接决定电磁转矩。你想想看,如果电流响应慢了,速度环和位置环再怎么调都没用。我在调试高速冲床时遇到过这种情况——电流环带宽不够,电机一加速就丢步,后来把电流环采样频率从 8kHz 提到 16kHz,问题才解决。

电流环关键参数:

  • 带宽:通常 500Hz ~ 2kHz,取决于开关频率和电机电感
  • 采样频率:一般与 PWM 开关频率相同,8kHz ~ 20kHz
  • 控制器:PI 控制为主,很少用纯 P
  • 反馈:霍尔电流传感器或采样电阻

电流环的数学模型其实不复杂。以永磁同步电机为例,d-q 轴电压方程是:

Vd = Rs * Id + Ld * dId/dt - ω * Lq * Iq
Vq = Rs * Iq + Lq * dIq/dt + ω * (Ld * Id + ψf)

实际工程中,我们通常做 id=0 控制,这样转矩只和 iq 成正比,控制起来简单很多。我建议初学者先从 id=0 入手,等把电流环调稳了,再考虑 MTPA 等高级策略。

💡 我的经验:电流环 PI 参数整定时,先把积分项设成 0,只调比例增益。让电流响应不振荡了,再加积分消除静差。这样一步步来,不容易出问题。

2.3 速度环:中间层,承上启下

速度环接收位置环给出的速度指令,输出电流指令给电流环。它的核心任务是让电机转速平稳,不受负载扰动影响。

速度环的带宽通常比电流环低 5~10 倍。为什么?因为速度反馈来自位置微分,本身就有噪声。带宽设太高,反而会把噪声放大。我记得有次调试印刷机,速度环带宽设到 200Hz,结果电机嗡嗡响,后来降到 80Hz 就安静了。

参数 典型范围 说明
速度环带宽 20 Hz ~ 200 Hz 取决于机械刚性和负载惯量
速度环采样周期 0.5 ms ~ 2 ms 通常比电流环慢 5~10 倍
控制器类型 PI 纯 P 会有静差
反馈方式 编码器微分 / 测速机 微分会放大噪声

速度环整定时,我有个习惯:先让电机空载跑,调好 PI 参数;然后加上 50% 负载,看速度跌落和恢复时间。如果恢复太慢,加大 Ki;如果超调太大,减小 Kp。说白了,就是反复试,直到找到平衡点。

⚠️ 注意:速度环的输出(电流指令)一定要做限幅。否则一旦位置环给出过大的速度指令,电流环可能饱和,导致电机失控。我曾经见过一台设备因为没限幅,加速时电流直接冲到驱动器保护值,整条产线停了半小时。

2.4 位置环:最外层,精度担当

位置环是最终用户能感知到的环。它的输入是目标位置,输出是速度指令。位置环的精度直接决定了伺服系统的跟随误差。

位置环的带宽最低,通常只有 5 Hz ~ 50 Hz。为什么这么低?因为位置反馈来自编码器,而编码器分辨率有限。带宽设高了,位置反馈的量化噪声会被放大,导致电机抖动。

位置环控制器有两种常见选择:

  • 纯 P 控制:简单,但有静差。适合点位运动,不适合轮廓跟踪。
  • P + 前馈控制:加入速度前馈和加速度前馈,能大幅减小跟随误差。我强烈推荐这种方式。

前馈控制的原理其实不复杂。你想想看,如果我知道目标轨迹的速度和加速度,那我可以提前给速度环一个补偿信号,而不是等位置误差出来了再调整。这样做的好处是——跟随误差能减小 80% 以上。

// 位置环 + 前馈控制伪代码
void PositionLoop(void)
{
    // 位置误差计算
    pos_error = target_pos - actual_pos;
    
    // P 控制
    speed_cmd_p = Kpp * pos_error;
    
    // 速度前馈
    speed_cmd_ff = Kff_v * target_velocity;
    
    // 加速度前馈
    speed_cmd_aff = Kff_a * target_acceleration;
    
    // 合成速度指令
    speed_cmd = speed_cmd_p + speed_cmd_ff + speed_cmd_aff;
    
    // 限幅
    if(speed_cmd > MAX_SPEED) speed_cmd = MAX_SPEED;
    if(speed_cmd < -MAX_SPEED) speed_cmd = -MAX_SPEED;
}

关键结论:位置环的跟随误差主要来自三个方面:

  1. 比例增益不足:Kpp 太小,误差收敛慢
  2. 前馈缺失:没有速度/加速度前馈,动态误差大
  3. 速度环响应慢:位置环输出速度指令,但速度环跟不上

2.5 三环之间的配合关系

三个环不是独立工作的,它们之间有严格的配合关系。我总结了几条「铁律」:

原则 说明 后果
带宽逐级递减 电流环 > 速度环 > 位置环 内环响应快,外环才能稳定
输出限幅 每环输出都要限幅 防止饱和,保护下级
采样同步 电流环采样最快,速度环次之,位置环最慢 避免数据混叠
积分分离 外环饱和时,内环积分应停止 防止积分饱和

我曾经在调试一台五轴机械手时,发现 Z 轴在下降时总是过冲。查了半天,原来是位置环输出限幅设得太高,速度环收到过大的速度指令,导致电流环饱和。把限幅降到合理值后,问题就解决了。嗯,这种问题其实很常见,但排查起来确实费时间。

2.6 实际调试中的常见问题

最后分享几个我在项目中踩过的坑:

🔧 调试顺序:先调电流环,再调速度环,最后调位置环。这个顺序不能乱。我见过有人先调位置环,结果电机抖得像筛子,还以为是位置环参数问题,其实是电流环根本没调好。

⚠️ 编码器噪声:位置反馈的噪声会通过微分放大到速度环。如果电机在静止时有微小抖动,先检查编码器信号质量,别急着调参数。我曾经换了一根屏蔽电缆,抖动就消失了。