5iMX宗旨:分享遥控模型兴趣爱好

5iMX.com 我爱模型 玩家论坛 ——专业遥控模型和无人机玩家论坛(玩模型就上我爱模型,创始于2003年)
查看: 8870|回复: 61
打印 上一主题 下一主题

单片机 实现6轴联动控制 ,最高输出频率200K 可能吗

[复制链接]
跳转到指定楼层
楼主
发表于 2012-4-6 00:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
:em04:
论坛为什么只能上传 195k的图片呀

[ 本帖最后由 scottmaxwell 于 2012-4-6 00:51 编辑 ]

无标题1.jpg (89.25 KB, 下载次数: 41)

无标题1.jpg

欢迎继续阅读楼主其他信息

沙发
发表于 2012-4-6 01:00 | 只看该作者
不懂。帮顶。
3
发表于 2012-4-6 02:18 | 只看该作者
如果只是控制,也就是IO输出高低电平,可以做到。
但是如果一边计算一边输出,这个没办法,特别是涉及到除法运算。
4
发表于 2012-4-6 08:47 | 只看该作者
这个完全看单片机性能和程序设计了,还有控制需求。预加载刀路的话可以考虑先运算后输出。
5
发表于 2012-4-6 08:53 | 只看该作者
不做复杂运算估计没什么问题。貌似现在51单片机可以上三四十M的晶振。
为什么不用ARM呢,价格也便宜,量又足。
6
 楼主| 发表于 2012-4-6 11:02 | 只看该作者
原帖由 hxq123 于 2012-4-6 08:53 发表
不做复杂运算估计没什么问题。貌似现在51单片机可以上三四十M的晶振。
为什么不用ARM呢,价格也便宜,量又足。

需要做插补运算的,每走一步都需要计算下一步各轴的输出.ARM   IO口的操作效率不高,51单片机,就是上三四百M的晶振,也计算不过来,还必须要借助单片机的硬件外设模块完成,
现在使用的是 pic32    80M 主频   1.56 DMIPS/MHZ,带有DMA模块(这个很重要),最重要的是他的io口有单时钟周期操作能力,这个是ARM7远远做不到的,必须要有快速中断处理功能,就是要有影子寄存器

[ 本帖最后由 scottmaxwell 于 2012-4-6 11:21 编辑 ]
7
 楼主| 发表于 2012-4-6 11:04 | 只看该作者
原帖由 kissjack 于 2012-4-6 02:18 发表
如果只是控制,也就是IO输出高低电平,可以做到。
但是如果一边计算一边输出,这个没办法,特别是涉及到除法运算。

就是一边计算   一边输出,需要避免除法运算的, 除法可以转换成定点乘法运算.
当然同时还要给下面几条G代码进行预处理

[ 本帖最后由 scottmaxwell 于 2012-4-6 11:08 编辑 ]
8
发表于 2012-4-6 11:04 | 只看该作者
这个听大牛解说了
9
发表于 2012-4-6 11:18 | 只看该作者
我试过了51 不行  单轴都做不好
10
 楼主| 发表于 2012-4-6 12:34 | 只看该作者
如果可以的话  6轴联动插补,最高200KHZ输出, io输出输入全部光电隔离, USB接口    0 -10v 模拟量输出,电子手轮接口,原点,限位  都可以做进去.
上位自己写,或支持mach3,估计下来硬件成本不超过 150元
11
发表于 2012-4-6 14:10 | 只看该作者
细分不要搞太高,或许可以.
12
 楼主| 发表于 2012-4-6 15:27 | 只看该作者
原帖由 hzs_1002 于 2012-4-6 14:10 发表
细分不要搞太高,或许可以.

1.8度的步进电机   16细分   丝杆导程为4mm的    200KHZ的输出  f值最高可以到 15000
13
发表于 2012-4-6 18:56 | 只看该作者
f值15000好象没什么实际意义吧?惯性这么大,机器会抖得很,影响加工质量,除非很轻的负载,贴片机之类的,不过这种场合可以用同步带,这就不需要这么高的f值了。我觉得LZ有能力,不如研究一下用低成本的8位AVR单片机实现最高f2000就够了,M8最便宜的才几块一片,用一片M8做脉冲输出,用另一片M168和PC通讯、G代码预处理、开关量控制和模拟量采集,M168和M8之间用IIC通讯,这样成本极低

运行在20MHz主频的M8,在f2000的情况下,每个脉冲上升沿和下降沿之间的时间,M8的中断程序可以执行大约375条指令,实际上6轴的中断输出程序不到100条指令

ATmega8-16AU 3.75元/片
ATmega168-20AU 7.5元/片

[ 本帖最后由 3dbuild 于 2012-4-6 18:59 编辑 ]
14
 楼主| 发表于 2012-4-6 19:14 | 只看该作者
原帖由 3dbuild 于 2012-4-6 18:56 发表
f值15000好象没什么实际意义吧?惯性这么大,机器会抖得很,影响加工质量,除非很轻的负载,贴片机之类的,不过这种场合可以用同步带,这就不需要这么高的f值了。我觉得LZ有能力,不如研究一下用低成本的8位AVR单片机 ...

F15000对于使用1MM 800脉冲(1.8度  16细分  丝杆导程 4mm),但是对于我现在使用的 伺服驱动意义很大  
3600线的伺服 四倍频后  丝杆导程 4mm  每移动 1mm  需要3600个脉冲    这是的f值就是 3300.
以前我就是玩AVR的,但是AVR 8位单片机基本无戏,运算能力相差百倍,还缺少 DMA 这种不需要CPU干预传输数据的模块
M8的中断也不是快速中断  缺少影子寄存器,中断的时候需要保护现场,也需要许多的指令周期   况且8位单片机 计算32位数据时根本就力不从心,做插补时候  8位数据是远远不够的,还有我不知到 你如何使用8位单片机  6轴插补运算只有 100条指令,我现在的32位单片机需要300多条指令
ATmega8-16AU 3.75元/片
ATmega168-20AU 7.5元/片

这个价格是谁报给你的

[ 本帖最后由 scottmaxwell 于 2012-4-6 19:30 编辑 ]
15
发表于 2012-4-6 19:43 | 只看该作者
你用伺服驱动就没办法了,是要这么高的输出频率
用我的方案,不需要M8来计算32位数据,由M168来做计算准备,把一长串脉冲拆分成最多255个脉冲,M8只负责输出脉冲,程序变得很简单,对于M168来说,处理时间比单CPU方案多了255倍,相当于M168运行在5G
价格是前段时间在淘宝上买的,可能是散新件,测试过运行正常,没有问题,唯一不确定的是里面的EEPROM不知道是不是给写过,写过多少次?不过我的程序不用EEPROM,所以没有问题

我觉得如果可以在有限的硬件里实现高级的功能,才能体现一个技术水平,当然用更高级的CPU会省事一些

[ 本帖最后由 3dbuild 于 2012-4-6 19:46 编辑 ]
16
 楼主| 发表于 2012-4-6 19:47 | 只看该作者
原帖由 3dbuild 于 2012-4-6 19:43 发表
你用伺服驱动就没办法了,是要这么高的输出频率
用我的方案,不需要M8来计算32位数据,由M168来做计算准备,把一长串脉冲拆分成最多255个脉冲,M8只负责输出脉冲,程序变得很简单,对于M168来说,处理时间比单CPU方 ...


插补需要实时计算的,每走一步需要计算下一步,保证最小误差1步以内,况且AVR 168 也没有 USB接口. PIC32的USB通许也可以 不需要 CPU干预,可以直接拷贝到预先设定好的内存缓存取.

[ 本帖最后由 scottmaxwell 于 2012-4-6 19:51 编辑 ]
17
发表于 2012-4-6 19:50 | 只看该作者
如果你用伺服的目的,只是要它的高速度和高可靠定位精度,而它的每圈脉冲数成为问题的话,可以考虑用我的方案,外加倍频芯片,成本也很低的
18
 楼主| 发表于 2012-4-6 19:56 | 只看该作者
原帖由 3dbuild 于 2012-4-6 19:50 发表
如果你用伺服的目的,只是要它的高速度和高可靠定位精度,而它的每圈脉冲数成为问题的话,可以考虑用我的方案,外加倍频芯片,成本也很低的

不是每圈脉冲数   比如  G1 X100 Y200 Z300 A400 B500 C600  做 插补  
每个轴 每走1MM 需要800个 脉冲 ,如何实现  
X走第一步时  X输出一个脉冲      X走第2步是   X 输出一个脉冲  Y也输出一个脉冲   
X走第2步  X 输出一个脉冲  Z输出一个脉冲  ......

[ 本帖最后由 scottmaxwell 于 2012-4-6 19:59 编辑 ]
19
发表于 2012-4-6 19:56 | 只看该作者
原帖由 scottmaxwell 于 2012-4-6 19:47 发表


插补需要实时计算的,每走一步需要计算下一步,保证最小误差1步以内

这个可以做到,对于6轴输出的其中一段来说,准备好6轴的每脉冲数据,每次定时器中断时进行各轴位置累加,判断各个输出端是否要输出,结果用位&操作保存在一个寄存器临时变量,最后一次性在同一个端口寄存器输出,每步都不会有误差

每个轴 每走1MM 需要800个 脉冲 ,如何实现
把800个脉冲用M168分成4段,每段200个脉冲,预先处理数据传给M8,在中断服务程序里输出脉冲,输出脉冲的同时,M8的主循环用IIC接收下一段200个或者其他个数的输出脉冲命令

[ 本帖最后由 3dbuild 于 2012-4-6 19:58 编辑 ]
20
 楼主| 发表于 2012-4-6 20:04 | 只看该作者
原帖由 3dbuild 于 2012-4-6 19:56 发表

这个可以做到,对于6轴输出的其中一段来说,准备好6轴的每脉冲数据,每次定时器中断时进行各轴位置累加,判断各个输出端是否要输出,结果用位&操作保存在一个寄存器临时变量,最后一次性在同一个端口寄存器输出,每 ...

X轴总共要走 800*100   
分别需要判断6轴   判断  累加  我不知到你有没有看程序编译好的汇编代码,他到底产生了多少条指令
置位后  你还需要在1us -10 us 后让他边为低电平  才是一个脉冲 ,这个对于AVR 就是使用一个定时器  但是定时器中断 需要写中断程序   中断程序 需要保护现场 恢复现场    拉到低电平 也需要几条指令 因为 AVR io口没有置位和清零寄存器,否则你就会影响其他位 所以要先读取8个io口的状态 ,这些都需要CPU 开销的
还有我不知道你这个方法实现过了 ,还是只是停留在理论之上

[ 本帖最后由 scottmaxwell 于 2012-4-6 20:15 编辑 ]
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

关闭

【站内推荐】上一条 /1 下一条

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