XTXB 发表于 2019-2-21 16:32:24

用stc15w和旧光驱移植arduino写字机GRBL之九:步进脉冲Stepper

本帖最后由 XTXB 于 2019-2-21 19:21 编辑

用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
https://www.amobbs.com/thread-5705269-1-1.html

用stc15w4k32s4和旧光驱移植arduino写字机GRBL之九:产生步进脉冲 Stepper

之前的分析都是基于算法,跟硬件没啥联系,现在涉及到引脚输出了,步进模块驱动引脚用如下的方式输出信号:
STEPPING_PORT = (STEPPING_PORT & ~DIRECTION_MASK) | (out_bits & DIRECTION_MASK);
STEPPING_PORT :引脚端口 #define STEPPING_PORT      PORTD
out_bits :步进脉冲引脚
DIRECTION_MASK:步进电机方向引脚,
#define DIRECTION_MASK ((1<<X_DIRECTION_BIT)|(1<<Y_DIRECTION_BIT)|(1<<Z_DIRECTION_BIT))


运动控制无非两点:运动速度,运动轨迹。
在GRBL中,每进入中断一次,XYZ最多输出一步,定时中断的间隔时间,决定了运动的速度。
在定时中断中,运用Bresenham算法 决定XYZ是否输出,从而控制运动轨迹。
Bresenham算法见贴子:https://www.amobbs.com/thread-5701994-1-1.html。
下面主要谈速度的控制方法:
1,步进脉冲的产生用到两个定时器:
步进脉冲周期由定时器1产生,每次进入定时器1中断后开启定时器2,产生很窄的脉宽用以驱动步进模块。
定时器1的周期值由OCR1A 的值决定,这是一个16位数,系统时钟16M,定时范围有限,
好在AVR定时器计数时钟可以5段分频:1,8,64,256,1024,在GRBL中,
用分频扩展定时范围(分频控制TCCR1B),
根据不同的速度,选择不同的分频值,获得需要的脉冲周期,
在函数config_step_timer(uint32_t cycles)()中完成分频及定时的重装。
2,用之前规划器Planner中得到了initial_rate和rate_delta,
计算出当前速度trapezoid_adjusted_rate(step/min)。
通过函数set_step_events_per_minute()—config_step_timer()得到当前的OCR1A = ceiling;
下图是定时器1中断中跟速度有关的代码,主要是围绕当前速度(绿色部分)的一些控制逻辑。
都是些逻辑和加减法,计算量很小,对中断的影响较小。

至此GRBL运动部分的算法算是捋了一遍,估计有些地方,理解还不到位,甚至错误,欢迎指教!

flash3g 发表于 2019-2-21 19:16:51

佩服楼主的恒心,我看的头晕{:lol:}{:lol:}

WHOOK 发表于 2019-2-23 17:18:05

持续坚持做一件事就是成功的前提呀

wkman 发表于 2019-2-23 17:19:12

持续坚持做一件事就是成功的前提呀 {:victory:}{:lol:}

huangqi412 发表于 2019-2-23 22:30:38

佩服楼主的坚持

1785345205 发表于 2019-2-24 00:50:38

说的很精彩,谢谢

yanzhiwei 发表于 2019-2-24 01:21:13

写的很详细

end2000 发表于 2019-2-24 10:37:14

不错,{:handshake:}

su33691 发表于 2019-2-24 12:17:18

关注GRBL一年多了,谢谢楼主的详细说明。

tear604922959 发表于 2019-2-24 16:34:57

NB 写字机器人

liurangzhou 发表于 2019-2-24 16:39:03

我就好奇grbl里的加减速怎么实现的

XTXB 发表于 2019-2-24 16:48:38

每进入定时中断一次,输出一步,定时中断的间隔时间,决定了运动的速度,逐步减少间隔时间就是加速,逐步增加间隔时间就是减速。具体就是在中断中根据计算所得,重装定时器的初值OCR1A 。

XTXB 发表于 2019-2-24 17:12:50

本帖最后由 XTXB 于 2019-2-24 17:21 编辑

su33691 发表于 2019-2-24 12:17
关注GRBL一年多了,谢谢楼主的详细说明。

stc15w定时器分频只有1,12两档,mega328有5挡,移植的话估计在加减速方面会有点压力,看你近段时间在把玩stc8,用stc8会不会轻松点?

su33691 发表于 2019-2-24 17:51:00

XTXB 发表于 2019-2-24 17:12
stc15w定时器分频只有1,12两档,mega328有5挡,移植的话估计在加减速方面会有点压力,看你近段时间在把玩 ...

stc8用24mhz主频,12T的定时器最大为32ms,驱动步进电机有点勉强。
不过用于伺服系统,一点问题都没有。

XTXB 发表于 2019-2-24 18:22:21

本帖最后由 XTXB 于 2019-2-24 18:42 编辑

su33691 发表于 2019-2-24 17:51
stc8用24mhz主频,12T的定时器最大为32ms,驱动步进电机有点勉强。
不过用于伺服系统,一点问题都没有。 ...

速度快了也有烦恼{:lol:} ,刚刚有个想法,在中断里面弄个计数器,中断几次再执行一次步进脉冲貌似也可以,N档分频,还更灵活。

jaywen 发表于 2019-3-11 15:06:09

XTXB 发表于 2019-2-24 18:22
速度快了也有烦恼 ,刚刚有个想法,在中断里面弄个计数器,中断几次再执行一次步进脉冲貌似也可以 ...

佩服楼主想问下 那个定时器二用来干嘛的呢?

jaywen 发表于 2019-3-11 15:07:08

XTXB 发表于 2019-2-24 18:22
速度快了也有烦恼 ,刚刚有个想法,在中断里面弄个计数器,中断几次再执行一次步进脉冲貌似也可以 ...

还有一个问题是他怎么样通过一个定时器来同时控制三个电机的速度的。定时器周期代表速度 加入三个轴速度不一样 那么定时器怎么办呢

XTXB 发表于 2019-3-11 20:48:13

jaywen 发表于 2019-3-11 15:06
佩服楼主想问下 那个定时器二用来干嘛的呢?


定时器2用来产生窄脉冲,以保证每个T1中断步进电机走一步。

XTXB 发表于 2019-3-11 20:51:41

本帖最后由 XTXB 于 2019-3-11 21:08 编辑

jaywen 发表于 2019-3-11 15:07
还有一个问题是他怎么样通过一个定时器来同时控制三个电机的速度的。定时器周期代表速度 加入三个轴速 ...


三轴联动,一个轴的速度定下来了的话,其他轴的速度也就定下来了,不然运动轨迹就失控了,计算时只需考虑加速度最大的那根轴。
上图反映具体每一步XY轴的运动情况,你走走看就明白了

jaywen 发表于 2019-3-12 09:17:58

XTXB 发表于 2019-3-11 20:48
定时器2用来产生窄脉冲,以保证每个T1中断步进电机走一步。

谢谢楼主的回答辛苦了!!你这图用什么软件画的?看起来很不错

jaywen 发表于 2019-3-12 09:24:47

XTXB 发表于 2019-3-11 20:51
三轴联动,一个轴的速度定下来了的话,其他轴的速度也就定下来了,不然运动轨迹就失控了,计算时只需考 ...

非常感谢!!你这个图我看懂了。。那我可不可以理解为在同一时刻。x,y,z这三个轴同时运行的话没法做到自己设定三个任意速度运行呢?比如考虑两轴联动。x轴可以设定任意速度y可以设定任意速度(在切割场合需要这样)这样是不是gbrl没法实现了。只能是x设定一个速度。y轴速度就确定了。不知道我理解的对不?

XTXB 发表于 2019-3-12 11:48:51

本帖最后由 XTXB 于 2019-3-12 11:57 编辑

jaywen 发表于 2019-3-12 09:24
非常感谢!!你这个图我看懂了。。那我可不可以理解为在同一时刻。x,y,z这三个轴同时运行的话没法做 ...

表格是Excel做的,切割场合估计不可以任意设定XY速度,不然怎么保证切割轨迹?什么叫联动?必定有一个轴受制于另一个轴。你单独改变一下表格中Y轴的运动速度试试,线段斜率马上就变了。其实速度任意设定更简单,但只能用于点对点控制。插补算法可以用于运动轨迹控制,也可以用于点对点控制,而且可以优化运动速度,G代码有个命令专门用于点对点的快速移动,有点高射炮打蚊子的感觉。

zenghl 发表于 2019-11-12 08:22:39

{:handshake:}表示对楼主的敬佩。

yelong98 发表于 2020-10-6 21:46:58

XTXB 发表于 2019-3-11 20:48
定时器2用来产生窄脉冲,以保证每个T1中断步进电机走一步。

楼主太厉害了,我看了一天没头绪就放弃了,楼主威武!请教一个问题,为啥要用第二个定时器?直接在第一个定时器的终端服务里面操作IO高低制造一个脉冲不行么?

落叶知秋 发表于 2020-10-7 12:46:12

yelong98 发表于 2020-10-6 21:46
楼主太厉害了,我看了一天没头绪就放弃了,楼主威武!请教一个问题,为啥要用第二个定时器?直接在第一个 ...

看到回答一下,用一个定时器没问题的,marlin就是这么实现的,使用两个定时器是为了脉冲宽度固定,而不会因计算流程变化

yelong98 发表于 2020-10-7 17:10:13

落叶知秋 发表于 2020-10-7 12:46
看到回答一下,用一个定时器没问题的,marlin就是这么实现的,使用两个定时器是为了脉冲宽度固定,而不会 ...

感谢大佬回复,之前看你写的grbl的代码分析,钻研的够深的,厉害

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

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