7.PMAC下位机-回零程序的编写

在运动控制中,运动轴的回零是一个共性的问题:对于半闭环的编码器+电机+模组或全闭环的直线电机+光栅尺来说,它们之所以能够知道自己当前处于一个什么样的位置就是靠编码器和光栅尺来记录当前的位置,问题在于一般我们使用的都是相对式的编码器或光栅尺,换言之,我们必须告诉编码器和光栅尺以什么位置作为零点开始计算当前的坐标指定当前的零点的过程就是回零的过程。相对式的编码器或光栅尺一旦掉电,就必须重新回零,这也是大多数数控机床上电要回零的原因。


如下图,为了指定当前运动系统的零点,我们使用一个零位传感器来标记,对于编码器+电机+模组,零位传感器就是一个处在零位的限位传感器,对于直线电机+光栅尺可以不用设置特殊的硬件,直接捕获光栅尺的零位信号就行,当然你也可以不用零位信号,而统一使用限位传感器来指定零位。同时每个运动系统一般都是有正负限位的,一方面是作为安全用途,一旦模组运动超出正负限位范围自动停掉电机防止造成危害,另一方面,也可作为触发使用,下面会讲到。

技术分享


1.信号的触发

为了形象的说明问题,考虑模组和传感器的如下相对运动,这里传感器既可以是限位传感器也可以是零位点触发,基本原理是一样的。这里为了说明问题,将传感器拉长了,实际上传感器的接触长度很短。

技术分享

可以看到,当前模组和传感器相对运动的时候,还没接触的时候信号为低电平,一旦模组开始进入传感器范围,这时候电平跳变为高电平,存在一个上升沿,捕获这个上升沿就是模组刚刚进入传感器范围的时刻。模组继续运动,一旦模组完全离开传感器范围,这时候电平跳变为低电平,存在一个下降沿,捕获这个下降沿就是模组刚刚完全离开传感器范围的时刻。

因为最开始的时候没有回零,这时候模组是不知道自己当前到底处于什么位置的,但是在高低电平跳变的时候会发送中断,我们可以捕获这两个中断从而判断当前模组是否运动到指定的位置,从而将当前指定位置标记为零点。


2.回零策略

上面其实已经叙述了最基本的思想:利用信号触发的上下沿来通知PMAC是否已经运动到指定位置,从而将当前模组在的位置标记为相对零点
但是,我们需要面临的一个问题是,模组的最开始位置是不定的。同样用之前的图,最开始时候模组可能处于零位的正向也可能处于负向,甚至可能直接就在正负限位或零点上。这时候该怎么编写一个回零程序,在最开始不知道模组的位置的时候让模组正确的运动到零点呢?
技术分享
毫无疑问,模组处于正向的时候必须向负向移动才能到零点触发,模组在负向的时候必须向正向移动才能到零点触发,但是它们的方向是完全相反的,这让我们编写运动程序很为难。为了解决这个问题,我们采用如下策略:
  • 1.不管当前模组处于什么位置,都先向负向运动直到触发负限位
  • 2.从负限位触发点开始向正向移动,PMAC是通过指定一个偏移值来完成的,所谓偏移值就是到达触发点后再偏移多少距离,这个偏移要求必须让模组移动到零位的正向
  • 2.然后,模组负向运动直到准确停在零点触发点,当前标记为零点

好了,现在基本策略定下来了。现在说说偏移值的问题。当我们运动到指定限位导致电平出现上下沿信号的时候,这时候PMAC接到中断,但是此时还在运动,不会准确的停在指定点上。对于这种问题,PMAC提供的解决方案是,既然不能准确的停止那就不让它准确的停在指定的触发点上,而是指定一个偏移值,当第一次上下沿触发的时候会记录当前的位置,这个当前的位置是可以准确记录的,这样运动到偏移一个指定值时是可以完成的,当然这个值是不能太小的,否则也停不准。那么要精确的停止在某一点怎么做呢,很简单,借鉴这种方法,既然你要跑过,那就让你先跑过,再反向回走偏移的值就行,这就是很多机床看回零时先过零点再反向走回来的原因,看运动平台在那不知所谓的来回捣鼓,其实干的就是这事儿。PMAC中指定偏移值为0,仔细观察PMAC会自己帮我们完成走过再回来的流程,这个需要了解一下以便于我们清楚整个回零轨迹为什么这样跑动和为什么使用偏移值。

下面结合示意图看回零过程
技术分享
可以看到:
  • 1.负向运动到负限位直到触发,这里分为两种情况:
A.不在负限位的时候,直接负向移动直到上升沿触发
B.在负限位的时候,正向移动直到下降沿触发
注意一个使用上升沿,一个使用下降沿,是为了保证两种情况触发时模组位置是一样的,看示意图就懂了
  • 2.按照步骤1指定的移动偏移值移动到零位的正向去,只要指定了偏移值,PMAC会自动完成这个偏移过程
  • 3.从偏移后的位置负向移动,按照之前讲的先走过一点再反向走回从而精确停在零位,这个偏移可能很小,人眼不易观察出来。

3.PMAC回零代码

一个单独的轴的典型回零程序如下:
;程序功能:实现6轴回零运动。
;**********************************************************************

CLOSE ;确认所有缓冲区被关闭
&1

;~~~~~~~~~~~~~~~~~~~~~~~~~  以下部分为运动程序  ~~~~~~~~~~~~~~~~~~~~~~~
OPEN PROG 20
CLEAR

;6轴回零

If (M622 = 1)        	;负限位有信号
I623=50           		;回零速度(Counts / msec),方向为正
I626=81920*16       	;回零偏置,单位1/16 Count
I7123=2             	;使用负限位为触发信号
I7122=10            	;捕捉触发信号的下降沿
Home 6            		;回零
Dwell 20
Else 					;负限位无信号
I623=-50             	;回零速度(Counts / msec),方向为负
I624=$120000        	;禁能限位
I626=81920*16      		;回零偏置,单位1/16 Count
I7123=2             	;使用负限位为触发信号
I7122=6             	;捕捉触发信号的上升沿
Home 6             		;回零
Dwell 20
EndIf

I623=-50               	;回零速度(Counts / msec),方向为负
I624=$100000            ;使能限位
I626=0              	;回零偏置,单位1/16 Count
I7123=0               	;使用原位信号为触发信号
I7122=7               	;捕捉触发信号的上升沿及Z向的下降沿信号
Home 6               	;回零
Dwell 50

CLOSE

代码中需要说明如下:
  • 1.使用负限位做标记的时候,必须禁能限位,否则一旦模组运动到限位传感器处会自动停止当前电机
  • 2.这里在回原位(零位)的时候,捕捉模式设为7,既支持编码器的上升沿也支持光栅尺的零位信号
  • 3.在前两步时,速度可以较快,最后一步准确回零的时候速度要慢

这里的回零代码笔者在各个项目中使用过,稳定可靠,具体的参数含义请自行查阅手册。

原创,转载请注明来自http://blog.csdn.net/wenzhou1219

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。