XTXB 发表于 2019-1-8 13:14:36

用stc15w和旧光驱移植arduino写字机GRBL之八:前瞻算法2

本帖最后由 XTXB 于 2019-1-8 14:15 编辑

stc15w4k32s4和旧光驱移植arduino写字机GRBL连载:
用stc15w4k32s4和旧光驱移植arduino写字机GRBL之一:机架搭建
https://www.amobbs.com/thread-5701202-1-1.html

用stc15w4k32s4和旧光驱移植arduino写字机GRBL之二:PCB制作
https://www.amobbs.com/thread-5701573-1-1.html

用stc15w4k32s4和旧光驱移植arduino写字机GRBL之三:Bresenham算法
https://www.amobbs.com/thread-5701994-1-1.html

用stc15w4k32s4和旧光驱移植arduino写字机GRBL之四:FIFO算法
https://www.amobbs.com/thread-5702730-1-1.html

用stc15w4k32s4和旧光驱移植arduino写字机GRBL之五:G_Code
https://www.amobbs.com/thread-5702784-1-1.html

用stc15w4k32s4和旧光驱移植arduino写字机GRBL之六:运动控制motion_control
https://www.amobbs.com/thread-5703165-1-1.html

用stc15w4k32s4和旧光驱移植arduino写字机GRBL之七:前瞻算法1
https://www.amobbs.com/thread-5703989-1-1.html

用stc15w4k32s4和旧光驱移植arduino写字机GRBL之八:前瞻算法2
前瞻算法得到的小线段运动数据要具体到每个小线段的起始速度,结束速度,中间速度节点时的步数,加速度等:
uint32_t initial_rate;            // The step rate at start of block 开始速度,步/分
uint32_t final_rate;                // The step rate at end of block结束速度,步/分
int32_t rate_delta;               // The steps/minute to add or subtract when changing speed (must be positive)
                                //在改变速度时需要要增加或减去的速度,步/分钟
uint32_t accelerate_until;          // The index of the step event on which to stop acceleration
                                        //加速段的步数
uint32_t decelerate_after;          // The index of the step event on which to start decelerating
                                        //减速段的步数=停止加速+平台期步数
uint32_t nominal_rate;// The nominal step rate for this block in step_events/minute
                                //步/分,这个块的正常速度
前瞻算法用到的物理学知识:V2²-V1²=2as,a:加速度;s:从V1到V2运动距离。

之前有探讨过,根据经验知道E的速度对D的速度有影响,GRBL中利用函数planner_reverse_pass( )向后推计算:
在向后推算中,在void planner_reverse_pass() 函数中,调用void planner_reverse_pass_kernel( ),
以确认当前点的进入速度current->entry_speed。
方法是逐点检查减速线段,反向计算,假设从下一点开始加速,计算到当前点时的速度max_allowable_speed,跟当前点的进入速度比较,取最小值为当前点的进入速度。

同样,根据经验知道F的速度对G的速度有影响,GRBL中利用函数planner_forward_pass( )向前推算:
在向前推算中,在void planner_forward pass() 函数中,调用void planner_forward pass_kernel( ),
以确认当前点的进入速度current->entry_speed。
方法是:逐点检查从上一点开始加速,计算到当前点的速度max_allowable_speed,跟当前点的进入速度比较,取最小值为当前点的进入速度。

由于上面算法已经将各个交点的速度落实下来了,接下来GRBL中利用函数planner_recalculate_trapezoids( )落实线段中途的速度节点的位置。

如图④所,假设线段的长度为s,刚好只有加速和减速过程,类似G-H,到M点时刚好达到系统设定的最大速度Vm,随即减速。
已知线段的长度为s,初速度为Vp,线段的加速度为a,线段的末速度为Vq,求加速距离S1。
设减速距离为S2,由加速度计算公式:Vm²-Vp²=2as1 , Vm²-Vq²=2as2 ,s1+s2=s。得s1=(2as-Vp²+Vq²)/4a
在GRBL0.8中:
intersection_distance=(2*acceleration*distance-initial_rate*initial_rate+final_rate*final_rate)/(4*acceleration)
加速阶段距离: accelerate_steps= estimate_acceleration_distance( )=(Vm²-Vp²)/2a
减速阶段距离:decelerate_steps = -(Vm²-Vq²)/2a
平台阶段距离:plateau_steps = block->step_event_count-accelerate_steps-decelerate_steps;
如果plateau_steps < 0,说明只有加减速。
如果plateau_steps = 0,说明可以加速到最大速度。
如果plateau_steps >0,说明有完整的加速,减速,平台期。
加速段的距离:accelerate_steps =min(accelerate_distance,block->step_event_count);
block->accelerate_until = accelerate_steps
block->decelerate_after = accelerate_steps+plateau_steps;

flash3g 发表于 2019-1-8 13:24:56

{:lol:}感谢分享,分析得很好

su33691 发表于 2019-1-8 15:37:41

谢谢楼主!
最近在当小白鼠,提前感受STC8H的强大。假期打算将GRBL移植到STC8H上跑。1.2K的RAM虽然小点,裁剪一下还是可以的。

flash3g 发表于 2019-1-8 20:56:38


里面有一句 float inverse_millimeters = 1.0/block->millimeters;// Inverse millimeters to remove multiple divides       

哥们能帮忙解读一下吗,先谢谢了

XTXB 发表于 2019-1-9 11:17:13

flash3g 发表于 2019-1-8 20:56
里面有一句 float inverse_millimeters = 1.0/block->millimeters;// Inverse millimeters to remove mu ...


个人理解就是为了做个除法,做一次除法,后面都用乘法,比较节省资源。

XTXB 发表于 2019-1-9 11:20:47

su33691 发表于 2019-1-8 15:37
谢谢楼主!
最近在当小白鼠,提前感受STC8H的强大。假期打算将GRBL移植到STC8H上跑。1.2K的RAM虽然小点,裁 ...

咱的好奇心也很重,一起折腾吧{:lol:}

flash3g 发表于 2019-1-9 11:58:15

XTXB 发表于 2019-1-9 11:17
个人理解就是为了做个除法,做一次除法,后面都用乘法,比较节省资源。 ...

哦!昨晚看了几个钟越看越模糊,你这么一说我就明白了,非常感谢你!

PCBBOY1991 发表于 2019-1-9 11:59:28

用这个东西可以用来做雕刻机啊?

XTXB 发表于 2019-1-9 12:38:20

PCBBOY1991 发表于 2019-1-9 11:59
用这个东西可以用来做雕刻机啊?

原理上可以做离线雕刻机,不过在线雕刻已经很成熟,操作更灵活,做离线雕刻意义不大。

PCBBOY1991 发表于 2019-1-9 12:47:59

XTXB 发表于 2019-1-9 12:38
原理上可以做离线雕刻机,不过在线雕刻已经很成熟,操作更灵活,做离线雕刻意义不大。 ...

嗯,谢谢哈。

whatcanitbe 发表于 2019-1-9 13:47:15

楼主你是人才,向你学习。

kms2hh 发表于 2019-1-9 21:31:26

厉害,楼主的精神和资料都值得学习{:handshake:}{:handshake:}{:handshake:}

iidm 发表于 2019-1-16 19:45:09

膜拜,如果楼主想做大点的话,我可以送几个丝杆电机。{:handshake:}{:handshake:}

wkman 发表于 2019-1-16 20:40:53

su33691 发表于 2019-1-8 15:37
谢谢楼主!
最近在当小白鼠,提前感受STC8H的强大。假期打算将GRBL移植到STC8H上跑。1.2K的RAM虽然小点,裁 ...

stc8a8k不是有 8k ram嘛{:shocked:}

XTXB 发表于 2019-1-17 21:51:06

iidm 发表于 2019-1-16 19:45
膜拜,如果楼主想做大点的话,我可以送几个丝杆电机。 ...

多谢了!就是个爱好,不想整太大动静{:lol:} ,暂时就这个迷你的玩玩。

iidm 发表于 2019-1-18 00:14:37

XTXB 发表于 2019-1-17 21:51
多谢了!就是个爱好,不想整太大动静 ,暂时就这个迷你的玩玩。

支持一下!

jaywen 发表于 2019-3-12 13:37:33

XTXB 发表于 2019-1-9 11:17
个人理解就是为了做个除法,做一次除法,后面都用乘法,比较节省资源。 ...

你这个写了注释的代码可以分享一下吗???{:lol:}想学习下

XTXB 发表于 2019-3-12 17:56:48

jaywen 发表于 2019-3-12 13:37
你这个写了注释的代码可以分享一下吗???    想学习下

GRBL只啃了一部分,不够完善,当时做的个笔记而已,后来发现有些错误,怕误导坛友,看英文的还更准确些,以后全部啃完了再发出来。

jaywen 发表于 2019-3-13 09:23:00

XTXB 发表于 2019-3-12 17:56
GRBL只啃了一部分,不够完善,当时做的个笔记而已,后来发现有些错误,怕误导坛友,看英文的还更准确些, ...

好的。。。期待{:lol:}

armok. 发表于 2023-10-25 17:13:14

帖子移动通知:
原分论坛:8051/STC32【已下线】
目标分论坛:51单片机
移动时间:0小时之后
页: [1]
查看完整版本: 用stc15w和旧光驱移植arduino写字机GRBL之八:前瞻算法2