4、位置环(外环)详解:位置环的作用、位置环的P/PI控制、位置环的轨迹规划

位置环,说白了就是三环控制里最外面那层。它管的是「你到底要去哪」。速度环管跑多快,电流环管用多大力,而位置环——它决定最终停下来的地方准不准。

我刚开始做伺服驱动那会儿,总觉得位置环不就是个比例系数嘛,调大点响应快,调小点不超调,有什么难的?结果第一次做龙门同步,两个轴的位置环参数没匹配好,电机直接扭成了麻花。嗯,从那以后我再也不敢小看这个外环了。

4.1 位置环到底在干什么?

位置环的输入是位置指令,反馈是编码器实测位置。它俩一减,得到位置误差。位置环的输出,就是速度环的给定值。

你想想看,整个链条是这样的:

  1. 上位机发一个位置指令(比如:走到 1000 个脉冲的位置)
  2. 位置环看到当前在 0,误差 1000
  3. 位置环算出一个速度值(比如 500 rpm)给速度环
  4. 速度环带着电机跑过去
  5. 位置环实时盯着误差,误差变小了,速度给定也降下来
  6. 最终误差为零,电机停稳

所以位置环的本质是一个把位置误差映射成速度指令的映射器。映射得好,定位快又准;映射得不好,要么抖,要么慢,要么过冲。

核心要点:位置环不直接控制力矩,也不直接控制速度。它只负责说「你该跑多快才能到目标」。速度环和电流环是它的执行者。

4.2 位置环的 P 控制

最简单的位置环,就是一个比例系数:

速度给定 = Kp × 位置误差

就这么一行。Kp 越大,同样的误差下速度指令越高,电机跑得越快。但问题也来了——

P 控制有静差。 什么意思?假设你让电机走到 1000 的位置,负载有个恒定的阻力。电机走到 990 的时候,误差是 10,乘以 Kp 产生的速度刚好能抵消阻力。那它就停在那了,永远到不了 1000。这个 10 个脉冲的差距,就是静差。

我在做一个小型桌面机械臂的时候遇到过这个问题。空载时定位精度 0.1mm,一夹持工件就变成 0.5mm。查了半天,就是 P 控制的静差在作怪。负载越大,静差越大。

特性 P 控制
响应速度 快,Kp 越大越快
静差 有,负载越大越明显
超调 Kp 过大时明显
适用场景 负载恒定、精度要求不高的场合

注意:位置环的 Kp 不能无限大。Kp 太大,位置误差稍微一变,速度指令就剧烈跳动。你会听到电机嗡嗡响,甚至震荡。我见过有人把 Kp 调到 200,结果电机像发了疯一样来回抖,编码器线都差点震断。

4.3 位置环的 PI 控制

为了干掉静差,我们引入积分项 I:

速度给定 = Kp × 位置误差 + Ki × ∫(位置误差)dt

积分项会把过去的误差累积起来。只要有静差,积分项就会一直增长,直到输出足够大的速度指令把误差吃掉。

但积分不是万能的。 我个人习惯,在位置环里用 PI 时要非常小心。为什么?

  • 积分饱和: 如果位置误差长时间存在(比如被机械限位卡住了),积分项会累积到非常大的值。等障碍一消除,这个巨大的积分值会瞬间输出一个极高的速度指令——电机「嗖」地冲出去,大概率过冲甚至撞机。
  • 积分抖动: 位置环的更新频率通常比速度环低(1kHz 左右),积分项在低频下容易引起极限环震荡。

我曾经在一个大惯量转台上吃过亏。位置环加了 I 以后,静态精度确实好了,但每次启动都会先反向冲一下——那是积分项在启动前累积的残余值。后来我加了积分限幅和启动清零,才解决。

特性 P 控制 PI 控制
静差 有 无(理论上)
响应速度 快 稍慢(积分需要时间建立)
抗扰动 弱 强
风险 静差 积分饱和、抖动
我推荐用在哪 点对点定位、步进系统 轮廓跟踪、需要零静差的场合

我的经验:如果系统对静态精度要求不高,优先用 P 控制。简单、稳定、好调。非要加 I 的话,一定加上积分限幅(通常限制在最大速度指令的 10%~20%),并且考虑条件积分——误差大时停止积分,误差小时再开启。

4.4 位置环的轨迹规划

位置环不能只靠反馈硬顶。你想想看,如果上位机直接丢一个阶跃指令「从 0 瞬间到 1000」,位置环看到误差 1000,会瞬间输出一个巨大的速度指令。结果就是电机急加速、急减速,机械冲击大,还可能过冲。

轨迹规划就是给位置指令「抹平滑」。 它不是让电机一步到位,而是规划出一条平滑的路径,让位置环沿着路径走。

4.4.1 梯形速度规划

最经典的规划方式。分三段:匀加速、匀速、匀减速。

// 伪代码示例:梯形规划
// 输入:目标位置 target_pos, 当前位置 current_pos
// 参数:最大速度 v_max, 加速度 acc, 减速度 dec

total_dist = target_pos - current_pos;
acc_dist = v_max * v_max / (2 * acc);      // 加速段距离
dec_dist = v_max * v_max / (2 * dec);      // 减速段距离

if (acc_dist + dec_dist < total_dist) {
    // 能达到最大速度:有匀速段
    v_cruise = v_max;
} else {
    // 达不到最大速度:三角形规划
    v_cruise = sqrt(2 * acc * dec * total_dist / (acc + dec));
}

// 然后根据当前时间计算每个时刻的位置指令

梯形规划简单、计算量小。但缺点是加速度在拐点处突变——从加速到匀速的瞬间,加速度从 +acc 跳变到 0。这会产生冲击力,业内叫「 jerk 」(加加速度)。

4.4.2 S 形速度规划

为了消除 jerk,S 形规划对加速度也做了平滑。它把加速度本身也分成加加速、匀加速、减加速三个阶段。

说白了,梯形规划控制速度,S 形规划控制加速度的变化率。

我做过一个晶圆搬运的项目,晶圆片薄得像纸片,稍微一抖就碎。梯形规划根本不敢用,加减速切换时的冲击直接震碎晶圆。换成 S 形规划以后,加速度连续变化,冲击几乎为零。

规划方式 加速度连续性 计算量 冲击 适用场景
梯形 不连续(有跳变) 低 大 普通定位、大负载不敏感
S 形 连续 中 小 精密设备、易碎品搬运
多项式/样条 高阶连续 高 极小 高速高精轮廓加工

4.4.3 位置环与轨迹规划的配合

这里有个很多人忽略的点:轨迹规划的输出是位置指令,位置环跟踪这个指令。 两者是串联关系,不是替代关系。

轨迹规划决定了「理想路径」,位置环负责「消除实际跟踪误差」。规划得再好,位置环参数不对,照样跟丢。反过来,位置环调得再完美,规划是阶跃的,机械冲击也躲不掉。

避坑:我见过有人把轨迹规划的加速度设得特别大,觉得反正位置环能跟上。结果电机是跟上了,机械结构受不了——联轴器扭裂了。轨迹规划的加速度上限,应该由机械系统的承受能力决定,而不是电机的响应能力。

4.5 位置环的知识体系

下面这张图把位置环的核心逻辑串起来了:

位置环知识体系结构图 位置环知识体系 位置环(外环) 核心作用 位置误差 → 速度指令 控制方式 P 控制 PI 控制 轨迹规划 梯形 S 形 关键问题与避坑 静差(P 控制) 积分饱和(PI 控制) 机械冲击(规划不当) 位置环调参核心:响应快 + 不超调 + 无静差 + 低冲击 四者不可兼得,根据工况取舍

这张图把位置环拆成了三个维度:作用、控制方式、轨迹规划。底部是它们共同指向的关键问题。你调试的时候,可以对照这张图,看看自己卡在了哪个环节。

4.6 调参的一点个人心得

最后分享一个我常用的调试顺序:

  1. 先不加轨迹规划,直接给阶跃指令,调 P 到临界稳定(刚出现轻微震荡),然后退 30%~50%。
  2. 如果需要加 I,从 Ki = Kp / 100 开始试,同时设积分限幅为最大速度的 15%。
  3. 加上梯形规划,加速度从机械能承受的 50% 开始往上加。
  4. 如果定位时间不够,先加加速度,别急着加 Kp。Kp 加过头,系统会抖。
  5. 如果抖了,先降 Kp,再检查机械连接是否松动。很多时候不是参数问题,是螺丝松了。

嗯,位置环就讲这么多。它不复杂,但细节很多。你只要记住一句话:位置环是速度环的指挥官,指挥官不能瞎指挥,也不能反应太慢。