3、运动控制核心算法:点位运动、插补与速度规划
各位工程师朋友,这一章咱们来啃运动控制的“硬骨头”——核心算法。说实话,我刚入行那会儿,觉得算法就是数学公式堆砌,离实际应用很远。后来被项目“教育”了几次才明白:不懂算法,选型就是瞎蒙,调试就是撞大运。
这一章我会把点位运动、直线圆弧插补、速度规划,还有电子齿轮凸轮这几个核心概念,用我自己的理解讲清楚。你想想看,电机转起来容易,但要让它精准地走到指定位置、走出特定轨迹、走得又快又稳,靠的就是这些算法。
核心观点:运动控制算法决定了设备的“精度上限”和“效率天花板”。选型时,算法支持能力比硬件参数更关键。
3.1 点位运动(PTP)原理
点位运动,英文叫 Point to Point,简称 PTP。说白了就是:电机从A点走到B点,中间路径不关心,只关心起点和终点准不准。
我遇到过不少刚入行的工程师,觉得PTP太简单,不就是发个脉冲嘛。其实不然。PTP的核心在于“怎么走”——是直接全速冲过去?还是先加速再匀速最后减速?这直接决定了设备会不会抖动、会不会过冲。
PTP有两种基本模式:
- 绝对定位:以原点为参考,告诉电机“走到坐标1000的位置”。每次指令都是相对于原点。
- 相对定位:以当前位置为参考,告诉电机“再往前走500个脉冲”。每次指令都是相对于当前位置。
我的习惯:做多工位设备时,我一般用绝对定位。因为一旦原点丢失,所有位置都乱套。相对定位适合单步调试或手动微调场景。
3.2 直线插补与圆弧插补
插补,这个词听起来高大上,其实意思就是“在已知点之间,用算法算出中间点”。你想想看,控制器不可能每纳秒都给你发指令,它只能隔一段时间发一个位置点。中间那些点怎么补?这就是插补算法干的事。
3.2.1 直线插补
直线插补,就是让两个或三个轴联动,走出一条直线。比如XY平台要从(0,0)走到(100,50),两个轴必须按比例同步运动——X轴走2个单位,Y轴走1个单位。
常用的算法是DDA(数字微分分析器)和逐点比较法。我个人更倾向于DDA,因为它实现简单,而且容易扩展到多轴。
// 直线插补核心逻辑(伪代码)
void LineInterpolate(int x1, int y1, int x2, int y2) {
int dx = x2 - x1;
int dy = y2 - y1;
int steps = max(abs(dx), abs(dy));
float x_inc = dx / (float)steps;
float y_inc = dy / (float)steps;
float x = x1, y = y1;
for(int i = 0; i <= steps; i++) {
OutputPosition(round(x), round(y));
x += x_inc;
y += y_inc;
}
}
3.2.2 圆弧插补
圆弧插补比直线复杂一些。它需要指定圆心、半径、起始角和终止角。算法上常用的是时间分割法——把圆弧分成很多小段,每段用直线逼近。
我记得有一次做激光切割项目,客户要求切一个直径200mm的圆,误差不能超过0.02mm。当时用的控制卡插补周期是1ms,算下来每段弧长只有0.1mm左右,精度完全够。但如果插补周期是4ms的老卡,那就得掂量掂量了。
| 插补类型 | 轴数 | 典型应用 | 精度影响因素 |
|---|---|---|---|
| 直线插补 | 2~4轴 | 点胶、焊接、搬运 | 插补周期、脉冲当量 |
| 圆弧插补 | 2轴 | 切割、打磨、轮廓加工 | 插补周期、半径大小 |
| 螺旋插补 | 3轴 | 螺纹加工、3D打印 | 线性轴与旋转轴同步 |
避坑指南:我曾经选过一款低端控制卡,标称支持圆弧插补,但实际跑起来在象限切换点有明显停顿。后来才发现它的插补算法没做速度前瞻处理。所以选型时一定要问清楚:插补周期是多少?有没有速度前瞻?
3.3 速度规划:梯形曲线与S型曲线
速度规划,说白了就是决定电机怎么加速、怎么减速。你想想,如果电机一启动就是全速,那冲击力得多大?机械结构受得了吗?
3.3.1 梯形速度曲线
梯形曲线是最简单的:匀加速→匀速→匀减速。三段式,像梯形一样。优点是计算量小,实现简单。缺点是加加速度(Jerk)在拐点处突变,会有冲击。
梯形曲线的参数就三个:最大速度、加速度、减速度。我一般用在要求不高的场合,比如简单的传送带、物料搬运。
3.3.2 S型速度曲线
S型曲线比梯形多了一个“加加速度”控制。它把加速段又分成了“加加速→匀加速→减加速”三段,减速段同理。整个速度曲线呈S形,平滑无突变。
什么时候用S型?高速高精度场合,比如数控机床、芯片封装。我做过一个芯片贴装项目,要求每分钟贴装30000颗,运动冲击稍大就会导致芯片偏移。那时候必须上S型曲线,而且还得调Jerk参数。
| 特性 | 梯形曲线 | S型曲线 |
|---|---|---|
| 计算复杂度 | 低 | 中高 |
| 运动平滑性 | 一般 | 优秀 |
| 启停冲击 | 有 | 无 |
| 适用场景 | 低速、短距离 | 高速、高精度 |
| 控制卡要求 | 低 | 较高 |
选型建议:如果控制卡只支持梯形曲线,那做高速高精度项目基本没戏。至少得支持S型曲线,最好还能自定义Jerk参数。我见过一些高端卡,支持7段S型甚至更复杂的多项式规划。
3.4 电子齿轮与电子凸轮
这两个概念,很多人容易搞混。我简单说一下:电子齿轮是“比例跟随”,电子凸轮是“函数跟随”。
3.4.1 电子齿轮
电子齿轮,就是让从轴跟随主轴,按固定比例运动。比如主轴转一圈,从轴转两圈。这个比例就是电子齿轮比。
实际应用中,电子齿轮比可以是分数。比如主轴转3圈,从轴转2圈,比例就是3:2。控制卡内部通过脉冲计数和分频来实现。
我做过一个印刷机项目,需要主辊和压辊保持严格同步。当时用的就是电子齿轮,比例设成1:1.2。调试时发现一个问题:齿轮比不是整数时,长时间运行会有累积误差。后来加了定期回零才解决。
3.4.2 电子凸轮
电子凸轮比电子齿轮灵活得多。它不是固定比例,而是定义了一个“主轴位置→从轴位置”的映射表。主轴走到某个角度,从轴就走到对应的位置。这个映射关系可以任意定义,比如正弦、摆线、自定义曲线。
电子凸轮的核心是凸轮表。一张表里存了主轴位置和对应的从轴位置。控制卡在运行时查表插值,实现复杂的同步运动。
// 电子凸轮表示例(主轴角度 → 从轴位置)
// 主轴角度(°) 从轴位置(mm)
// 0 0
// 60 10
// 120 25
// 180 30
// 240 25
// 300 10
// 360 0
我的经验:电子凸轮表的分辨率很关键。表越密,运动越平滑,但占用内存也越大。一般1024点/周期够用,高精度场合用4096点。选型时注意控制卡的凸轮表容量上限。
电子凸轮的应用场景很多:包装机械的横封切刀、纺织机械的综框运动、飞剪定长切割……说白了,凡是需要主轴和从轴之间有复杂函数关系的,都可以用电子凸轮。
曾经踩过的坑:有一次做飞剪项目,电子凸轮表在高速运行时出现抖动。排查了很久,发现是控制卡的插补周期太长(4ms),导致查表插值跟不上主轴速度。后来换了1ms周期的卡,问题解决。所以选型时,电子凸轮的最小执行周期一定要问清楚。