GRBL源码简单分析[源码+图片+xmind文档]

2019-12-09 13:38发布

本帖最后由 落叶知秋 于 2018-5-10 12:05 编辑

声明

  好久没发技术贴,刚好前一阵子才把文档写完,就发到论坛上来,希望对坛友有用。
  去年就开始在GitHub下载了源码开始看,但断断续续的看了将近一年才模模糊糊的看完!
  也一边看一边做文档记录,用的XMind做记录,由于免费版,导不出来Word或者PDF,
  只能导图片了,将就一下。

说明

  文档内容是看代码过程中的理解,肯定有理解不透彻的地方,如果有坛友能指出,提前感谢。
  由于软件限制和懒,文档内容以图片形式展示
  附件提供楼主看代码的GitHub版本的源代码和网络上找的stm32移植版本的源代码,没有实际上机录验证过,此处仅讨论代码

简介
  GRBL是基于Avr单片机的一个应用于3D打印机上的运动控制项目,由于楼主不会Avr,就不发在Avr版块,但不影响阅读源码
  注意:个人认为GRBL是个简易型的数控系统,但仅此而已,其中有可以学习借鉴的地方,运动控制方面的。
  GRBL里面有G代码解析、运动前瞻,T型加减速、直线插补、两轴圆弧插补等功能。

文档内容

grbl 1.1f.png (10.2 KB, 下载次数: 5) 下载附件 总目录 2018-5-10 11:50 上传

1.文件目录.png (165.32 KB, 下载次数: 3) 下载附件 1.文件目录 2018-5-10 11:50 上传

2.模块分类.png (56.71 KB, 下载次数: 0) 下载附件 2.模块分类 2018-5-10 11:50 上传

3.数据流.png (55.34 KB, 下载次数: 1) 下载附件 3.数据流 2018-5-10 11:50 上传

4.综合说明.png (1.71 MB, 下载次数: 2) 下载附件 4.综合说明 2018-5-10 11:50 上传

附件

grbl-1.1f.20170801.zip (296.07 KB, 下载次数: 329) 2018-5-10 11:51 上传 点击文件名下载附件
GitHub源码

stm32f407移植GRBL.rar (12.51 MB, 下载次数: 805) 2018-5-10 11:51 上传 点击文件名下载附件
stm32移植

grbl 1.1f XMind文档.rar (30.42 KB, 下载次数: 391) 2018-5-10 12:05 上传 点击文件名下载附件

编辑原因:添加了XMind源文档文件
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
99条回答
xd785
1楼-- · 2019-12-19 06:56
之前看过一段时间,只是用于应用,没去理解底层那么深,楼主很用心。顶~~~
落叶知秋
2楼-- · 2019-12-19 07:10
 精彩回答 2  元偷偷看……
Chunfy
3楼-- · 2019-12-19 07:16
做的好,做的好,做的好,做的好,
王涛
4楼-- · 2019-12-19 11:20
本帖最后由 王涛 于 2018-5-19 12:29 编辑
落叶知秋 发表于 2018-5-14 17:24
不行。。。字数补丁


20160829171246173.png (61.31 KB, 下载次数: 0)

下载附件

2018-5-19 11:23 上传

20160829171303377.png (139.99 KB, 下载次数: 0)

下载附件

2018-5-19 11:23 上传



楼主你好这是一个关于marlin源码bresenham算法光栅化的画直线算法的分析。这个算法的误差E只和dx和dy有关系。

grbl1.1源代码中
        //Initialize Bresenham line and distance counters
        st.counter_x = st.counter_y = st.counter_z = (st.exec_block->step_event_count >> 1);
       我们这里假定X轴是最长轴恒为真,也就是么个每个中断都有脉冲输出,
       那么Y轴的判断就是根据
       ξ‘’+dy-0.5step_event_count >0

       这里 ξ‘’=0.5dX//  ξ‘’   就是st.counter_y  等于st.counter_x = st.counter_y = st.counter_z = (st.exec_block->step_event_count >> 1);

      st.counter_y=0.5st.exec_block->step_event_count//(st.exec_block->step_event_count >> 1);
      
      st.counter_y += st.steps[Y_AXIS];
      
     if (st.counter_y > st.exec_block->step_event_count) {
    st.step_outbits |= (1<<Y_STEP_BIT);
    st.counter_y -= st.exec_block->step_event_count;
    if (st.exec_block->direction_bits & (1<<Y_DIRECTION_BIT)) { sys_position[Y_AXIS]--; }
    else { sys_position[Y_AXIS]++; }
  }
      
这里的判断条件为啥是  if (st.counter_y > st.exec_block->step_event_count)而不是  if (st.counter_y > 0.5st.exec_block->step_event_count) ?????

但是下面的逻辑又是对的
请教上面的问题
假设需要从点(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电机不动






第三步

同理

……
落叶知秋
5楼-- · 2019-12-19 15:14
王涛 发表于 2018-5-19 12:01
楼主你好这是一个关于marlin源码bresenham算法光栅化的画直线算法的分析。这个算法的误差E只和dx和dy有 ...

之前已经回复过你了,避免负数运算,且不可能是有浮点运算的。。。为了避免浮点,放大了两倍;为了避免负数运算,初始值做了1/2的偏置
王涛
6楼-- · 2019-12-19 21:04
落叶知秋 发表于 2018-5-19 16:26
之前已经回复过你了,避免负数运算,且不可能是有浮点运算的。。。为了避免浮点,放大了两倍;为了避免负 ...

楼主你好,我太笨了,还是不能理解,楼主好人做到底能否结合源代码给我分析一下,先谢谢了。

一周热门 更多>