当前位置:网站首页> 体育头条 > 体育app源码(Grbl源码解析移植-运动控制)

体育app源码(Grbl源码解析移植-运动控制)

更新时间:2022-10-02 09:59:31

上一篇我们分享了G代码解析器,G代码解析后获得了运动的基本信息:曲线类型(直线,圆),坐标位置信息,速度等,然后用这些参数调用mc_line()和mc_arc()函数画直线或圆弧。


这两个函数是在motion_control.c中实现的,目的是给grbl的运动控制具体实现提供上层接口,最重要的函数是mc_line(),mc_arc()函数通过直线插补模拟圆弧,然后调用mc_line(),把当前线段的信息存入block_buffer队列中,用前瞻算法修正队列中前后线段的速度和加速度。装入队列后,在主循环中通过protocol_auto_cycle_start消费block_buffer的数据。


void mc_line(float target, float feed_rate, uint8_t invert_feed_rate)


{


//如果限位使能,就检查target值是否超出了轴能到达的最远位置,如果超出了就告警限位错误,并复位系统


if (bit_istrue(settings.flags,BITFLAG_SOFT_LIMIT_ENABLE)) { limits_soft_check(target); }



do {


//这个函数的功能很多,有很多地方都会调用它,这里调用的目的是判断有没有系统异常发生,比如系统告警或复位,如果有异常,这个函数里处理异常的代码就会执行,没有就继续运行


protocol_execute_runtime(); // Check for any run-time commands


if (sys.abort) { return; } // Bail, if system abort.


//检查block_buffer是否满,如果满就执行尝试打开线段插补执行使能开关。如果系统配置里开启了auto-cycle功能,就可以自动开始执行线段插补,block_buffer里的线段会被系统执行插补操作而空出一些空间,这样队列就不满了,也就退出下面的do-while循环继续执行代码


if ( plan_check_full_buffer() ) {

protocol_auto_cycle_start();

} // Auto-cycle start when buffer is full.

else { break; }


} while (1);


//把当前线段的的信息添加到block_buffer队列里,这个函数里包含了前瞻算法的处理过程

plan_buffer_line(target, feed_rate, invert_feed_rate);

。。。

}