这一章在干嘛?
与第 18 章同源的逐点比较法,这次的目标是圆弧:每走一步判断动点在圆内还是圆外,向圆心方向「找补」。学完你就能让 X-Y 平台画出一个整圆。
19.1 偏差判别与递推
以第一象限逆圆弧 AE(圆心在原点、半径 R)为例,动点 ,偏差判别式:
原书图 19.2.1.1:第一象限逆圆弧插补示意图
- :动点在圆外,向圆内走 一步;
- :动点在圆内,向圆外走 一步;
- :在圆上,按 处理走 (动点恰在 x 轴上时走 )。
递推化简(免开方、免算 ):
原书图 19.2.2.1:第一象限逆圆弧插补的过程图
与直线插补的关键区别:
直线插补的偏差递推只需要终点坐标;圆弧插补的偏差计算 还依赖动点坐标 ——因为圆上处处曲率不同,得跟着动点走。
19.2 任意象限与终点判别
顺圆 SR1SR4、逆圆 NR1NR4 共 8 种线形,分两组规则:
| 分组 | 线形 | F ≥ 0 进给 | F < 0 进给 |
|---|---|---|---|
| 第一组 | SR1、NR2、SR3、NR4 | 沿 Y 轴(SR1/NR2 走 −Y,SR3/NR4 走 +Y) | 沿 X 轴(SR1/NR4 走 +X,NR2/SR3 走 −X) |
| 第二组 | NR1、SR2、NR3、SR4 | 沿 X 轴(NR1/SR4 走 −X,SR2/NR3 走 +X) | 沿 Y 轴(NR1/SR2 走 +Y,NR3/SR4 走 −Y) |
递推公式形式不变,只是符号与 X/Y 对调:(|Y| 减 1 的场合)或 (|X| 加 1 的场合)。
原书图 19.3.1:任意象限顺逆圆弧的情况
终点判别用总步长法:,每进给一步 n 减 1,减到 0 结束。实际每步位移比头发丝还小,宏观轨迹看起来就是光滑圆弧。
19.3 实验实现:四段圆弧拼一个整圆
/* 终点判别:总步长法 */
g_pol_par.end_pulse--; /* 总步数减一 */
if (g_pol_par.end_pulse == 0) {
g_motor_sta = STATE_STOP; /* 到达终点 */
TIM_CCxChannelCmd(ATIM_TIMX_PWM,
st_motor[g_pol_par.act_axis].pulse_channel, TIM_CCx_DISABLE);
HAL_TIM_Base_Stop_IT(&g_atimx_handle); /* 停止定时器 */
}
/* 偏差递推:F = F + 2*符号*新坐标 + 1 */
g_pol_par.f_e = g_pol_par.f_e + 2 * sign_dir[g_pol_par.act_axis]
* g_pol_par.start_point[g_pol_par.act_axis] + 1;
硬件与直线插补实验完全相同(接口三 = X 轴、接口四 = Y 轴,1.0A、8 细分 1600 脉冲/圈)。setarcdir() 按起点坐标和顺/逆方向确定象限、两轴旋转方向及偏差符号位;arc_incmove() 校验起终点满足同一圆方程( 相等)并计算总步数。
if (key == KEY0_PRES) { /* 按下 KEY0 开始插补 */
arc_incmove(800 * 5, 0, 0, -800 * 5, 2000, CW); /* 第四象限圆弧 */
while (g_motor_sta);
arc_incmove(0, -800 * 5, -800 * 5, 0, 2000, CW); /* 第三象限圆弧 */
/* 依次再走第二、第一象限圆弧,合成一个顺时针整圆 */
}
验证现象:按下 KEY0,笔尖依次走完四个象限圆弧,画出一个顺时针整圆,LCD/串口有对应提示。
1. 第一象限逆圆弧插补中,F>0 和 F<0 时各向什么方向进给?
F>0 动点在圆外,向 −X 进给一步;F<0 动点在圆内,向 +Y 进给一步;F=0 按 F>0 处理走 −X(动点在 x 轴上时走 +Y)。
2. 写出沿 +Y 进给一步后的偏差递推公式,并说明圆弧插补与直线插补在偏差计算上的区别。
。圆弧插补的偏差计算需要上一动点坐标 ,直线插补只需终点坐标。
3. 圆弧插补总步长法终点判别的计数器初值如何确定?
(终点与起点横纵坐标差绝对值之和),每进给一步减 1,减到 0 结束插补。