4、位置环(外环)详解:位置环的作用、位置环的P/PI控制、位置环的轨迹规划
位置环,说白了就是三环控制里最外面那层。它管的是「你到底要去哪」。速度环管跑多快,电流环管用多大力,而位置环——它决定最终停下来的地方准不准。
我刚开始做伺服驱动那会儿,总觉得位置环不就是个比例系数嘛,调大点响应快,调小点不超调,有什么难的?结果第一次做龙门同步,两个轴的位置环参数没匹配好,电机直接扭成了麻花。嗯,从那以后我再也不敢小看这个外环了。
4.1 位置环到底在干什么?
位置环的输入是位置指令,反馈是编码器实测位置。它俩一减,得到位置误差。位置环的输出,就是速度环的给定值。
你想想看,整个链条是这样的:
- 上位机发一个位置指令(比如:走到 1000 个脉冲的位置)
- 位置环看到当前在 0,误差 1000
- 位置环算出一个速度值(比如 500 rpm)给速度环
- 速度环带着电机跑过去
- 位置环实时盯着误差,误差变小了,速度给定也降下来
- 最终误差为零,电机停稳
所以位置环的本质是一个把位置误差映射成速度指令的映射器。映射得好,定位快又准;映射得不好,要么抖,要么慢,要么过冲。
核心要点:位置环不直接控制力矩,也不直接控制速度。它只负责说「你该跑多快才能到目标」。速度环和电流环是它的执行者。
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 位置环的知识体系
下面这张图把位置环的核心逻辑串起来了:
这张图把位置环拆成了三个维度:作用、控制方式、轨迹规划。底部是它们共同指向的关键问题。你调试的时候,可以对照这张图,看看自己卡在了哪个环节。
4.6 调参的一点个人心得
最后分享一个我常用的调试顺序:
- 先不加轨迹规划,直接给阶跃指令,调 P 到临界稳定(刚出现轻微震荡),然后退 30%~50%。
- 如果需要加 I,从 Ki = Kp / 100 开始试,同时设积分限幅为最大速度的 15%。
- 加上梯形规划,加速度从机械能承受的 50% 开始往上加。
- 如果定位时间不够,先加加速度,别急着加 Kp。Kp 加过头,系统会抖。
- 如果抖了,先降 Kp,再检查机械连接是否松动。很多时候不是参数问题,是螺丝松了。
嗯,位置环就讲这么多。它不复杂,但细节很多。你只要记住一句话:位置环是速度环的指挥官,指挥官不能瞎指挥,也不能反应太慢。