GRBL源码简单分析

结构体说明
GRBL里面的速度规划是带运动段前瞻的,所以有规划运动段数据和微小运动段的区分
这里的“规划运动段”对应的数据结构是plan_block_t,前瞻和加减速会使用到,也就是通过解析G代码后出来的直接直线数据或是圆弧插补出来的拟合直线数据
“微小运动段”对应的数据结构是segment_t,加减速的终端数据持有者,也就是plan_block_t数据经过了加减速后的计算数据
plan_block_t的数据还有一个临时的数据缓冲区,st_block_buffer,作用如上所述,其中存储的是脉冲发生ISR里面需要用到的数据
stepper.c里面有个静态变量static st_prep_t prep,这个变量是plan_block_t数据转换为segment_t数据时的一个缓冲,即从plan_block_t里面提取相关数据,然后生成新的segment_t数据

加减速处理
加减速处理在stepper.c的st_prep_buffer()函数里,流程为:
1.segment_t缓冲区有空余位置才会进行加减速数据生成,否则退出函数;有接收到停止运动指令,同样停止生成数据

2.从规划器的plan_block_t队列里面找到当前要进行分解的运动段,此处会分为“系统运动段”和“普通运动段”,就是一般操作和G代码解析的区分

3.判断prep里面的重新计算标志是否有效,有效则重新计算当前的运动段分解
什么时候会需要重新计算呢?一般是调整了速度修调(Ratio)之后,会对未被执行的运动段重新进行计算

4.如果不需要重新计算了,则直接把plan_block_t里面对应的Bresenham算法需要用到的脉冲输出阈值和总步数,记录到st_block_buffer里面

5.此时开始根据plan_block_t里面的数据和系统当前状态来确定加减速的状态,这里有好几个条件分支,其中牵扯到前瞻计算的初始速度和终止速度,以及系统的速度修调率。
  5.1如果检测到系统有进给保持(HOLD)状态指令,则直接进入全减速状态(RAMP_DECEL)
  5.2如果速度修调被降低了,则判断当前运动段的距离够不够减速到对应的终止速度,不够则进入全减速状态(RAMP_DECEL),如果是足够的,则进入半减速状态(RAMP_DECEL_OVERRIDE),如果是进入了规划的减速段,则也进入全减速状态(RAMP_DECEL)
  5.3如果是速度修调被升高了,或是一开始进入加速运动,则要进入加速状态(RAMP_ACCEL)
  5.4如果是加速到了目标速度,则应该进入匀速状态(RAMP_CRUISE)
  5.5其中,在加速状态的时候,可以计算出要进行梯形加减速还是三角形加减速

6.在确定了当前运动段的加减速状态后,则根据该状态进行segment_t微小运动段的分解计算,分解计算是依靠一个固定的时基DT_SEGMENT来进行的
注意,该固定时基只在计算segment_t数据时使用,跟脉冲发生的时间没有直接关系

7.分解微小运动段的方法是:根据加减速状态和pl_block的速率,算出在DT_SEGMENT单元时间内的进给量(即应输出的脉冲量)
  7.1半减速处理(RAMP_DECEL_OVERRIDE):首先计算减速到目标速度的时间,然后算出减速状态下的进给,再把加减速状态设置为匀速状态(RAMP_CRUISE),剩下的时间会在循环条件里再次进入匀速状态计算进给
  7.2全加速处理(RAMP_ACCEL):计算全加速下,是否会到达运动段的加速段目标位置,如果还可以加速,则继续处于全加速状态,否则看加减速是梯形条件还是三角形条件,如果是梯形则进入匀速状态(RAMP_CRUISE),如果是三角形则进入全减速状态(RAMP_DECEL)
  7.3匀速处理(RAMP_CRUISE):计算匀速段是否结束了,是则进入全减速状态(RAMP_DECEL),否则保持该状态;另外,如果匀速状态在DT_SEGMENT时间内就结束了,同样地,把剩余时间在全减速状态再计算一次进给量
  7.4全减速处理(RAMP_DECEL):如果剩余的距离还可以继续减速,则保持该状态,然后计算出该次的进给量;如果剩余的距离可以在该次减速中完成,则要算出完成减速的时间量和进给量,然后退出该运动段pl_block的加减速
  7.5另外,加减速处理中有“最小步”的输出要求,如果在1个DT_SEGMENT内,没有达到“最小步”的要求,则继续累加1个DT_SEGMENT的时间,知道满足“最小步”输出要求,才退出步骤7

8.要注意的是,步骤5是segment_t根据pl_block_t的状态初始化自己数据的流程,里面有步骤7计算时需要用到的初始数据
步骤7是计算一个完整segment_t数据的流程,里面有输出脉冲的条件数据,比如在多长的时间内输出多少个脉冲
然后就是初始化T1定时器计数,并且触发ISR,在ISR中计算脉冲输出条件

9.另外,1个pl_block_t可以分解成很多个segment_t,如果segment_t的缓冲满了,pl_block_t还没有结束,则暂停生成segment_t,等缓冲区空闲了再计算,否则会一直生成segment_t;
相反,也有可能1个pl_block_t就对应1个segment_t,且segment_t可能会在DT_SEGMENT内就完成了pl_block_t的目标距离,时间是以实际计算的为准

10.脉冲输出的时基,即T1定时器的溢出中断计数,是根据segment_t的需要输出脉冲数和segment_t使用的时间(不一定是DT_SEGMENT)来直接计算的。在单个segment_t的脉冲输出期间,T1的溢出中断时间间隔一致,但一般不同的segment_t会有不同的T1时间间隔

pl_block->step_event_count 是完成这个block所需走的步数,就是steps[x], steps[y], steps[z], 的最大值,即是三个轴中的最长轴。如果某个轴是最长轴,意味着这个轴的步进电机每个中断都有脉冲输出。

其他轴按照DDA算法输出

所谓的DDA算法如下

假设从P0点(0,0,0)插补到P1点(2,4,8),坐标分别对应X,Y,Z,则最长轴是Z,每个周期应该Z步数增加1个单位,总共需要8个周期
再假设event_step = 8,step_x = 2,step_y = 4,step_z = 8,cnt_x = cnt_y = cnt_z = 0;
要Z每个周期都输出脉冲,则有:
cnt_x += step_x;
if (cnt_x >= event_step) {输出X脉冲,cnt_x -= event_step} //这里会在第4和第8个周期分别输出脉冲
cnt_y += step_y;
if (cnt_y >= event_step) {输出Y脉冲,cnt_y -= event_step} //这里会在第2/4/6/8个周期分别输出脉冲
cnt_z += step_z;
if (cnt_z >= event_step) {输出Z脉冲,cnt_z -= event_step} //每个周期都输出脉冲
你按照每个周期来算一下就知道,X/Y/Z会按照插值法来输出脉冲了,这个就是DDA的一个例子

假设需要从点(0,0,0)到点(31,21,5),从(0,0,0)到(31,21,5)最终的执行结果是X轴步进电机移动31步、Y轴步进电机移动21步、Z轴步进电机移动了5步。
那么代码执行的详细情况如下

current_block->steps[X_AXIS] = 31;

current_block->steps[Y_AXIS] = 21;

current_block->steps[Z_AXIS] = 5;

current_block->step_event_count = 31;

//st.counter_x = st.counter_y = st.counter_z = (st.exec_block->step_event_count >> 1);
counter_x = (current_block->step_event_count>>1) = 15;

counter_y = counter_z = counter_e = counter_x;



第一步

Counter_x = counter_x + current_block->steps[X_AXIS] = 15 + 31 = 46;

因为条件counter_x > current_block->step_event_count为true, 所以X电机向前走一步

counter_x = counter_x - current_block->step_event_count = 46 - 31; = 15;

counter_y = counter_y + current_block->steps[Y_AXIS] = 15 + 21 = 36;

因为条件counter_y > current_block->step_event_count为true,所以Y电机向前走一步

counter_y = counter_y - current_block->step_event_count = 36 - 31 = 5;

counter_z = counter_z + current_block->steps[Z_AXIS] = 15 + 5 = 20;

因为条件counter_z > current_block->step_event_count为false,所以Z电机不动



第二步

Counter_x = counter_x + current_block->steps[X_AXIS] = 15 + 31 = 46;

因为条件counter_x > current_block->step_event_count为true, 所以X电机向前走一步

counter_x = counter_x - current_block->step_event_count = 46 - 31 = 15;

counter_y = counter_y + current_block->steps[Y_AXIS] = 5 + 21 = 26;

因为条件counter_y > current_block->step_event_count为false,所以Y电机不动

counter_z = counter_z + current_block->steps[Z_AXIS] = 20 + 5 = 25;

因为条件counter_z > current_block->step_event_count为false,所以Z电机不动

  • 7
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: GRBL是一种用于控制CNC机器的开源软件,具有高度的可定制和可扩展性。其中,加减速控制是GRBL的重要功能之一,可以实现更加精准的加工效果。 GRBL的加减速控制源码主要包括以下几个方面: 1. 加速度计算:GRBL会根据用户设定的加速度和当前速度,计算出加速度值,从而控制CNC机器在运动过程中的加速度变化。 2. 速度规划:GRBL利用速度规划算法,根据切削路径、机床性能、刀具质量等因素,实现加减速控制,使CNC机器在运行过程中保持更加稳定和平滑的状态。 3. 斜坡速度控制:此功能可以在加速时快速增加速度,而在减速时则减缓速度,从而保证机器加减速过程更加平稳,减少对刀具、工件和机器的损伤。 4. 角加速计算:对于圆弧或曲线运动,GRBL会根据设定的角度加速度计算出每一步的速度和加速度,从而实现精确的圆弧加减速控制。 总的来说,GRBL的加减速控制源码是一项复杂而关键的工作,需要考虑到多个因素的复杂交互,以实现高效、稳定和精确的加工效果。同时,该源码也为CNC机器的开发和改进提供了重要的参考和指导。 ### 回答2: GRBL是一款广泛应用的开源G代码解释器,它可以将输入的G代码转换为机器人控制信号,从而完成加工、打印等各种应用。其中,加减速控制是GRBL非常重要而又复杂的一部分。 GRBL的加减速控制源码主要包括加速段、匀速段和减速段三个部分。其中,加速段指的是机器人在起始速度到达目标速度的过程,它的速度由固定增量逐渐变快;匀速段指的是机器人以最大速度前进的过程,它的速度维持不变;减速段指的是机器人在目标点前面一段距离开始减速的过程,它的速度由固定减量逐渐变慢。 GRBL的加减速控制源码以S曲线为基础,即通过计算一系列采样点,将机器人的加速、匀速和减速三个阶段的速度变化模拟成连续的S曲线。这样可以使机器人在加减速过程中更加平稳,减少机器人震动和抖动的问题。 具体地,GRBL的加减速控制源码主要包括以下几个部分: 1. 加速、匀速和减速的速度计算部分,负责根据预设的最大速度和加速度,计算机器人在加减速阶段速度的变化情况。 2. S曲线生成部分,即根据速度计算出的一系列采样点,生成平滑的S曲线函数,并将采样点按照时间顺序发送给机器人。 3. 采样控制部分,即控制机器人在每个采样点上停留的时间,保证机器人可以按照S曲线函数的速度精确移动。 4. 暂停恢复控制部分,负责在机器人加工过程中暂停和恢复运动,保证加工过程的可靠性和稳定性。 5. 位置更新部分,即根据机器人的当前位置和速度计算出下一个采样点的位置和速度,同时更新机器人的位置状态。 总的来说,GRBL的加减速控制源码相对复杂,在实际应用中需要综合考虑各种因素,如机器人的类型、工作环境、加工材料等,进行适当的调整和优化。但是,只要理解了其原理和基本思路,并进行一定的实践尝试,就可以用GRBL实现各种精密加工、打印、雕刻等应用。 ### 回答3: GRBL是通过控制电机的运动来控制机器的一种开源的G代码解释器,它支持的G代码指令允许用户控制机器人的移动、加工速度、加减速等参数。在GRBL中,加速度和减速度是关键参数,直接影响机器人的加减速和停止精度,因此要分析GRBL的加减速源码。 关于GRBL中加减速的源码分析,我们需要从加速度和减速度这两个方面入手。GRBL中的加减速是通过控制电机的加速度来实现的。在基本的电机控制回路中,加速度是一个常量值,但GRBL使用了一种叫做“S曲线加速度”(S-Curve Acceleration)的算法,这种算法可以使电机的加速度曲线更加光滑,从而提高了加速度的精度。 在GRBL的加减速源码中,S曲线加速度算法具体实现如下:首先,计算出目标速度和当前速度之间的差值,然后根据这个差值和当前速度的大小来计算电机的加速度,从而获得电机的目标速度。为了让加速度不会出现跳跃或者震动,GRBL还引入了一个加速度系统,它可以缓慢增加加速度,直到达到最终的目标速度。 此外,在GRBL的减速源码中,也采用了类似的方法。在机器人需要停止或者改变方向的时候,GRBL会计算出目标速度和当前速度之间的差值,并根据这个差值来计算出电机的减速度。在电机减速的时候,GRBL会不断降低加速度,直到电机完全停止。 总的来说,GRBL的加减速源码所采用的S曲线加速度算法和加速度系统可以有效提高加减速的精度和光滑度,从而使GRBL更加适用于高精度的机器人控制应用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

newzhpfree

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值