第四章:单轴运动控制:轴参数配置、点位运动、JOG运动、相对运动与绝对运动
各位同学,欢迎来到第四章。这一章我们正式进入单轴运动控制的核心。说实话,单轴控制是所有运动控制的基础,你把它搞明白了,后面多轴联动、插补什么的,上手会快很多。我当年刚入行时,就是靠啃透单轴控制,才慢慢摸到门道的。
4.1 轴参数配置——先把“腿”装好
运动控制的第一步,不是写代码,而是配参数。你想想看,一个电机连上驱动器,你不告诉它“你是谁、你要去哪”,它怎么动?
轴参数配置,说白了就是给运动控制器“介绍”你的电机和机械系统。我个人习惯,每次拿到新设备,第一件事就是打开轴参数表,一项一项过。
4.1.1 必须配置的核心参数
| 参数名称 | 说明 | 典型值/范围 |
|---|---|---|
| 脉冲当量 | 每个脉冲对应的物理位移量 | 0.001 mm/pulse |
| 最大速度 | 轴允许的最高运行速度 | 100 mm/s |
| 加速度/减速度 | 速度变化的快慢 | 500 mm/s² |
| 软限位 | 软件限制的运动范围 | -100 ~ +100 mm |
| 回零方向 | 回原点时的运动方向 | 正向/负向 |
嗯,这里要注意:脉冲当量这个参数,很多新手会算错。我记得有一次在项目现场,一个同事怎么调轴都走不准,最后发现是脉冲当量少算了一个小数点。所以我的建议是:配完参数后,先手动发1000个脉冲,用千分表量一下实际位移,验证一下。
4.1.2 参数配置的代码示例
以某主流IPC运动控制器为例,配置一个轴通常是这样写的:
// 轴参数配置示例
AXIS_PARAM axisParam;
// 设置脉冲当量:1个脉冲 = 0.001mm
axisParam.pulseEquiv = 0.001;
// 设置运动范围:-100mm 到 +100mm
axisParam.softLimitNeg = -100.0;
axisParam.softLimitPos = 100.0;
// 设置速度参数
axisParam.maxVel = 100.0; // 最大速度 100 mm/s
axisParam.acc = 500.0; // 加速度 500 mm/s²
axisParam.dec = 500.0; // 减速度 500 mm/s²
// 设置回零参数
axisParam.homeDir = HOME_DIR_POSITIVE; // 正向回零
// 应用参数到轴0
SetAxisParam(0, &axisParam);
这段代码看起来简单,但每个参数背后都有讲究。比如加速度,设得太大会导致机械振动,设得太小又影响效率。我一般会先按理论值设,然后现场微调。
4.2 点位运动——让轴“点到点”地跑
点位运动,也叫PTP(Point to Point)运动。它的特点是不关心中间路径,只关心起点和终点。说白了,就是“你从A到B,中间怎么走我不管,到了就行”。
这种运动方式在贴片机、点胶机、搬运设备上很常见。你想想看,一个吸嘴从取料位到放料位,中间路径不重要,只要准确到达就行。
4.2.1 点位运动的实现
// 绝对点位运动:移动到 50mm 位置
MoveToPosition(0, 50.0, 50.0); // 轴0,目标位置50mm,速度50mm/s
// 等待运动完成
while(GetAxisState(0) != AXIS_STATE_IDLE) {
Sleep(10); // 每10ms检查一次
}
这段代码里,MoveToPosition 是绝对运动指令。我习惯在每次点位运动后加一个等待循环,确保运动完成再执行下一步。不然的话,你下一个指令发出去,轴还在半路上,那就乱套了。
4.3 JOG运动——手轮模式,想走就走
JOG运动,也叫点动或寸动。它和点位运动最大的区别是:JOG没有目标位置,你按着它就走,松开就停。有点像游戏里的摇杆,推一下动一下。
JOG运动在调试阶段特别有用。我记得有一次调试一个视觉定位系统,需要手动把工件送到相机下面。用JOG模式,一边看图像一边微调位置,非常方便。
4.3.1 JOG运动的实现
// 启动正向JOG,速度30mm/s
StartJog(0, JOG_DIR_POSITIVE, 30.0);
// 运行一段时间后停止
Sleep(2000); // 持续2秒
StopJog(0);
这里有个细节:JOG运动的速度一般不会设到最大。为什么?因为JOG通常是人工操作,速度太快容易撞。我一般把JOG速度限制在最大速度的30%~50%。
4.4 相对运动与绝对运动——两种“坐标系”思维
这一节是很多新手容易搞混的地方。绝对运动和相对运动,说白了就是“你在哪”和“你要走多远”的区别。
- 绝对运动: 指定一个绝对位置,轴移动到那个位置。比如“去100mm处”。
- 相对运动: 指定一个位移量,轴从当前位置移动那么多距离。比如“再往前走50mm”。
你想想看,如果你在坐标原点,绝对运动到100mm和相对运动100mm,结果是一样的。但如果你已经在50mm处,绝对运动到100mm只走50mm,而相对运动100mm会走到150mm。这就是区别。
4.4.1 代码对比
// 绝对运动:移动到 100mm 位置
MoveToPosition(0, 100.0, 50.0);
// 相对运动:从当前位置再走 50mm
MoveRelative(0, 50.0, 50.0);
我个人的习惯是:能用绝对运动就用绝对运动。为什么?因为绝对运动有明确的目标位置,程序可读性强,也容易排查问题。相对运动适合用在“增量式”的场景,比如每次进给相同的距离。
4.4.2 实际项目中的选择
| 场景 | 推荐方式 | 原因 |
|---|---|---|
| 固定工位间的搬运 | 绝对运动 | 位置明确,不受当前位置影响 |
| 步进式进给 | 相对运动 | 每次走固定步长,简单高效 |
| 回零后定位 | 绝对运动 | 回零后位置已知,绝对运动更可靠 |
| 手动微调 | 相对运动 | 每次微调固定距离,操作直观 |
嗯,这里要提醒一下:绝对运动前,一定要确保轴已经回零。否则你发的绝对位置,控制器不知道参考点在哪,结果就是乱跑。我曾经见过一个案例,操作员没回零就发绝对运动指令,轴直接往反方向冲,差点出事。
4.5 综合示例:一个完整的单轴控制流程
最后,我们来看一个完整的例子。假设我们要控制一个轴完成:回零 → 移动到100mm → JOG微调 → 再相对移动50mm。
// 1. 配置轴参数
AXIS_PARAM param;
param.pulseEquiv = 0.001;
param.maxVel = 100.0;
param.acc = 500.0;
param.dec = 500.0;
param.softLimitNeg = -200.0;
param.softLimitPos = 200.0;
SetAxisParam(0, ¶m);
// 2. 回零
HomeAxis(0);
while(GetAxisState(0) != AXIS_STATE_IDLE) {
Sleep(10);
}
// 3. 绝对运动到100mm
MoveToPosition(0, 100.0, 50.0);
WaitForMotionDone(0, 5000); // 等待完成,超时5秒
// 4. JOG微调(正向走10mm)
StartJog(0, JOG_DIR_POSITIVE, 20.0);
Sleep(500); // 持续0.5秒
StopJog(0);
// 5. 相对运动再走50mm
MoveRelative(0, 50.0, 50.0);
WaitForMotionDone(0, 5000);
printf("运动完成!当前位置:%.3f mm\n", GetAxisPos(0));
这个流程,基本覆盖了单轴控制的常见操作。你把这个跑通了,单轴控制就算入门了。
- 轴参数配置是基础,脉冲当量和软限位一定要验证
- 点位运动适合“点到点”的场景,记得加等待和超时
- JOG运动用于调试和手动操作,速度要保守
- 绝对运动有明确目标,相对运动是增量位移,根据场景选择
- 绝对运动前必须回零,这是铁律
好了,这一章就到这里。下一章我们会讲多轴协同控制,到时候你会发现,单轴控制的基础打好了,多轴其实也没那么难。有什么问题,欢迎在课程群里交流。