搜索
bottom↓
回复: 26

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

[复制链接]

出0入0汤圆

发表于 2019-2-21 16:32:24 | 显示全部楼层 |阅读模式
本帖最后由 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_raterate_delta
计算出当前速度trapezoid_adjusted_rate(step/min)
通过函数set_step_events_per_minute()—config_step_timer()得到当前的OCR1A = ceiling;
下图是定时器1中断中跟速度有关的代码,主要是围绕当前速度(绿色部分)的一些控制逻辑。
都是些逻辑和加减法,计算量很小,对中断的影响较小。

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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2019-2-21 19:16:51 | 显示全部楼层
佩服楼主的恒心,我看的头晕

出5入85汤圆

发表于 2019-2-23 17:18:05 | 显示全部楼层
持续坚持做一件事就是成功的前提呀

出0入0汤圆

发表于 2019-2-23 17:19:12 | 显示全部楼层
持续坚持做一件事就是成功的前提呀

出0入0汤圆

发表于 2019-2-23 22:30:38 | 显示全部楼层
佩服楼主的坚持

出180入0汤圆

发表于 2019-2-24 00:50:38 | 显示全部楼层
说的很精彩,谢谢

出0入0汤圆

发表于 2019-2-24 01:21:13 | 显示全部楼层
写的很详细

出0入0汤圆

发表于 2019-2-24 10:37:14 | 显示全部楼层
不错,

出0入0汤圆

发表于 2019-2-24 12:17:18 | 显示全部楼层
关注GRBL一年多了,谢谢楼主的详细说明。

出0入0汤圆

发表于 2019-2-24 16:34:57 | 显示全部楼层
NB 写字机器人

出0入0汤圆

发表于 2019-2-24 16:39:03 | 显示全部楼层
我就好奇grbl里的加减速怎么实现的

出0入0汤圆

 楼主| 发表于 2019-2-24 16:48:38 | 显示全部楼层
每进入定时中断一次,输出一步,定时中断的间隔时间,决定了运动的速度,逐步减少间隔时间就是加速,逐步增加间隔时间就是减速。具体就是在中断中根据计算所得,重装定时器的初值OCR1A 。

出0入0汤圆

 楼主| 发表于 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会不会轻松点?

出0入0汤圆

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

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

出0入0汤圆

 楼主| 发表于 2019-2-24 18:22:21 | 显示全部楼层
本帖最后由 XTXB 于 2019-2-24 18:42 编辑
su33691 发表于 2019-2-24 17:51
stc8用24mhz主频,12T的定时器最大为32ms,驱动步进电机有点勉强。
不过用于伺服系统,一点问题都没有。 ...


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

出0入10汤圆

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

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

出0入10汤圆

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

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

出0入0汤圆

 楼主| 发表于 2019-3-11 20:48:13 | 显示全部楼层
jaywen 发表于 2019-3-11 15:06
佩服楼主  想问下 那个定时器二用来干嘛的呢?


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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2019-3-11 20:51:41 | 显示全部楼层
本帖最后由 XTXB 于 2019-3-11 21:08 编辑
jaywen 发表于 2019-3-11 15:07
还有一个问题是  他怎么样通过一个定时器来同时控制三个电机的速度的。定时器周期代表速度 加入三个轴速 ...



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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入10汤圆

发表于 2019-3-12 09:17:58 | 显示全部楼层
XTXB 发表于 2019-3-11 20:48
定时器2用来产生窄脉冲,以保证每个T1中断步进电机走一步。

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

出0入10汤圆

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

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

出0入0汤圆

 楼主| 发表于 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代码有个命令专门用于点对点的快速移动,有点高射炮打蚊子的感觉。

出0入0汤圆

发表于 2019-11-12 08:22:39 | 显示全部楼层
表示对楼主的敬佩。

出0入135汤圆

发表于 2020-10-6 21:46:58 | 显示全部楼层
XTXB 发表于 2019-3-11 20:48
定时器2用来产生窄脉冲,以保证每个T1中断步进电机走一步。

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

出40入42汤圆

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

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

出0入135汤圆

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

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

出16370入6733汤圆

发表于 2023-10-25 17:13:52 来自手机 | 显示全部楼层
帖子移动通知:
原分论坛:8051/STC32【已下线】
目标分论坛:51单片机
移动时间:0小时之后
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-6-9 14:46

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表