给数控铣DIY刚性攻丝功能:修订间差异
无编辑摘要 标签:visualeditor |
标签:visualeditor |
||
第71行: | 第71行: | ||
==Outcome== | ==Outcome== | ||
让主轴以1500转每分钟的速度正转,在LinuxCNC的虚拟示波器中看到各个信号的波形是这样的: | |||
[[文件:LinuxCNC虚拟示波器中查看主轴编码器波形.png|无|缩略图|主轴转速为1500转每分钟时的编码器信号]] | |||
攻M6×1螺纹的效果就是题图的动画啦,这是用实验室的高速摄像机以725帧每秒的帧率拍摄的。想看完整的攻丝过程慢动作可以移步优酷网。 |
2018年4月12日 (四) 23:13的版本
Intro
我们都在金工实习时学过攻丝(Tapping),就是用一个带有螺纹形切削刃的工具在工件上切出螺纹来。做内螺纹的工具叫丝锥,做外螺纹的叫板牙。
与手工工作相比,数控机床在批量制造零件时具有较高的效率和一致性。数控铣床刚性攻丝(Rigid Tapping)的过程有三步:主轴正转将丝锥旋入预先钻好的孔,到达预定深度后主轴停止,最后反转将丝锥退出工件。
值得注意的是,丝锥在工件内时,包括中间的减速和反转,Z轴的平动和主轴的转动要同步:主轴转一圈,Z轴运动一个螺距,不然丝锥分分钟断给你看。这就需要一个传感器不停地给数控系统报告主轴的转动角度,一般我们会用光电编码器或者磁编码器。正因为多了这么个传感器,数控机床厂就有理由把刚性攻丝当作一个高附加值的Feature,能够刚性攻丝的数控铣要贵很多。实验室的小破数控铣就没有这个功能,经过一番调研,我决定DIY一个光电编码器。
可能有同学想问,主轴的转速不是预先设定好的吗?按照转速移动Z轴不就行了?嘿嘿,我想说,有个东西叫累计误差(或者积分误差、累积误差,随你怎么叫),而且中间的加减速过程不好解决。
Planning
关于光电编码器
正交光电旋转编码器(Optical Quadrature Rotary Encoder)由三个红外对射光电传感器和一个码盘组成。码盘圆周上有等分的空缺,光电传感器会因为空缺打通了光路而发出信号。
我们把三个光电传感器分别叫做A、B和Z。A和B的光路放置在等分空缺经过的圆周上,相位差为90°或-90°(“正交”即为此意)。Z的光路放置在码盘一周唯一的空缺会经过的圆周上,给每一圈旋转确定起始位置。这样,主轴旋转时A、B、Z的输出信号应该长这样儿:
这样,我们不仅可以根据信号脉冲的个数推断主轴的角位移,还可以根据AB相的相位差推测主轴的旋转方向。
调研后我决定使用欧姆龙的EE-SX-677-WR/EE-SX-676-WR传感器,并且把码盘安装在主轴上方,也就是这里:
因为这篇文章是事后诸葛亮,图里可以看见大螺母上已经被我做了两个M4的螺纹孔,用于安装码盘。
测量尺寸
从上图可以看出安装编码器的位置比较狭小,要用游标卡尺测出各个需要的尺寸非常困难,所以这里我们使用试错法:画一个模板,用天空工场的激光切割机做出来,与实物比对后调整尺寸:
试了几次后,终于做出了正确的模板。模板装上以后长这样儿:
于是我们的设计有了一个草图做参照。用自顶向下设计方法的语言来讲,这个草图就是设计的骨架(Skeleton)
Making
机械部分
完成后的CAD模型如下:
找了一块尺寸合适的不锈钢板,把它做成了编码器底座。这块不锈钢板是天空工场2018年女生节礼物iPhone X里的配重。(什么?工场女生节送iPhone X?iPhone包装盒里有配重?)
码盘是用3mm厚亚克力板经激光切割而成。
经过一些比较,最终选用了一圈9个脉冲(9 Pulses per Revolution)的码盘,这样AB相传感器的相位差最接近±90°,并且脉冲频率不至于过高。
机械部分全部安装好是这个样子的:
电气部分
欧姆龙EE-SX677-WR的原理图如下:
可以看出把Load替换成几个kΩ的上拉电阻就可以将OUT线接到电脑并口的引脚上了(当然,电源也是要接的)。随手拿洞洞板做了个电路,装进机床的控制柜:
数控系统
小破铣床的数控系统是用LinuxCNC自制的。LinuxCNC本质上就是一个实时版的Simulink或Labview,但模块之间的连接不是图形化的表示,而是用一种叫Hardware Abstraction Layer的语言描述。在LinuxCNC的配置文件中加入以下HAL代码:<syntaxhighlight lang="bash">
- 添加一个encoder实时模块,并把这个实例命名为spindle-encoder
loadrt encoder names=spindle-encoder
- 按照文档指示将所有encoder实例的这两个函数添加到对应的实时线程中
addf encoder.update-counters base-thread #base-thread是一个执行周期为25μs的线程 addf encoder.capture-position servo-thread #servo-thread是一个执行周期为1ms的线程
- 设置spindle-encoder实例的一些参数
setp spindle-encoder.position-scale 36 #因为x4-mode是1(true),码盘一周9个周期,所以这里是9×4=36 setp spindle-encoder.x4-mode 1
- 将该连的信号连上
net spindle-a parport.0.pin-15-in => spindle-encoder.phase-B #并口15脚输入到spindle-encoder的B相 net spindle-b parport.0.pin-13-in => spindle-encoder.phase-A #并口13脚输入到spindle-encoder的A相 net spindle-z parport.0.pin-12-in-not => spindle-encoder.phase-Z #并口12脚取反后输入到spindle-encoder的Z相
- motion是LinuxCNC中执行G代码、协调机床运动的模块,按照文档连接信号使motion知道主轴的位置和转速
net spindle-index-enable spindle-encoder.index-enable motion.spindle-index-enable net spindle-revs spindle-encoder.position => motion.spindle-revs net spindle-true-speed spindle-encoder.velocity => motion.spindle-speed-in </syntaxhighlight>
Outcome
让主轴以1500转每分钟的速度正转,在LinuxCNC的虚拟示波器中看到各个信号的波形是这样的:
攻M6×1螺纹的效果就是题图的动画啦,这是用实验室的高速摄像机以725帧每秒的帧率拍摄的。想看完整的攻丝过程慢动作可以移步优酷网。