本帖最后由 落叶知秋 于 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源文档文件
GRBL有对应的通信交互协议,但没有项目直接配套的上位机,但有不少人为其开发了对应的上位机,也有开源的
我没有研究过GRBL配套的上位机,只是知道其有对应的通信机制。
撸主重新下载并解压,文件无损坏。重新下载试下吧
非常感谢楼主的回复
pl_block->step_event_count 是完成这个block所需走的步数,就是steps[x], steps[y], steps[z], 的最大值,即是三个轴中的最长轴。如果某个轴是最长轴,意味着这个轴的步进电机每个中断都有脉冲输出。
其他两个轴的输出如何判断的这里没有理解。
谢谢,分析。
下面是Bresenham's line and circle algorithm数学模型
可是看了半天代码分析和这个模型就是关联不起来。
https://www.cs.helsinki.fi/group/goa/mallinnus/lines/bresenh.html
(x, y +ε)的下一个点为(x, y + ε + m),这里ε为累加误差。
可以看出,当ε+m < 0.5时,绘制(x + 1, y)点,否则绘制(x + 1, y + 1)点。
每次绘制后,ε将更新为新值:
ε = ε + m ,如果(ε + m) < 0.5
ε = ε + m – 1, 其他情况
这里判别条件的 (ε + m) < 0.5
即 2*(ε + m) < 1
即 2*(ε + dy / dx) < 1 (由于m = dy / dx)
即 2*(ε* dx + dy) < dx (同乘以dx)
令ξ = ε*dx 可得
ξ = ξ + dy, 如果2*(ξ + dy) < dx
ξ = ξ + dy – dx, 其他情况
可以看到,此时运算已经全变为整数了。以下为算法的伪代码:
ξ ← 0, y ← y1
For x ← x1 to x2 do
Plot Point at (x, y)
If (2(ξ + dy) < dx)
ξ ←ξ + dy
Else
y ← y + 1,ξ ←ξ + dy – dx
End If
End For
其实也没有很难理解,把你提到的公式里面的字母换一下就好结合GRBL的代码理解了
- ξ ← 0, y ← y1
- For x ← x1 to x2 do
- Plot Point at (x, y)
- If (2(ξ + dy) < dx)
- ξ ←ξ + dy
- Else
- y ← y + 1,ξ ←ξ + dy – dx
- End If
- End For
复制代码把上面代码里的ξ看做非主步进轴的计数值,比如X为主步进轴,dx是step_x,dy是step_y,那么event_step = max(step_x,step_y)
然后ξ是cnt_y,cnt_x就不用了,因为每次cnt_x都等于event_step,即X轴每次都输出脉冲
这样把上面的代码翻译一下
-
- For x ← x1 to x2 do //X主步进轴,每次都输出1个脉冲
- Plot Point at (x, y) //打印函数,此处无意义
- If (2(cnt_y + step_y) < event_step)
- cnt_y += step_y
- Else
- y ← y + 1 //输出1个脉冲
- cnt_y += step_y – event_step
- End If
- End For
复制代码是不是跟GRBL的T1的ISR函数代码片段差不多?
一周热门 更多>