AOI设备的图像采集过程,可以分为硬件的马达驱动丌发,和图像读取的两个部分.因为设备的X向、X向采用了不同的马达驱动方式,X向采用的滚珠丝杠导轨结构的马达,用RS232端口直接驱动;Y向是普通的步进马达,用ADLink8134接口卡进行驱动。这些驱动都有API的函数提供,完成对马达的控制。
对AOI设备的马达控制,也是aoi设备研究中的关键步骤。
工作台的控制马达
从生产效率的角度来讲,一个工作台会放置好几块的PCB板(拼板)或电脑主板等大板。在进行图像采集时,不可能一次采集齐全部要测的PCB板的图像,所以需要移动几次工作台或CCD摄像头,几次才能完成一次的检测过程。
我们这个AOI设备在采集图像中,共有两个马达束驱动,一个是用来移动CCD摄像头的马达,称为x向马达;另一个工作台上,用来移动PCB板的驱动马达,称为Y向马达。
我们设备中使川的这两个马达是不同类型的马达。
x向的ccD移动的驱动马达使用滚珠丝杠导轨的结构,这种马达可以无间隙的轻快运动,很容易获得很高的行走精度。x向马达的驱动,用电脑的RS232端口进行驱动控制,由于滚珠丝杠的移动的螺距可以选择,这样对步进的距离可以直接用单位距离来表示。
工作台上的马达是步进马达,用于控制工作台往Y向的移动。设备对步进马达的驱动,使用电脑内置的ADLink8134的设备卡,马达上的Motion Card联接并控制。由于步进马达是使用输出脉冲进行进动驱动的,所以驱动时需要将移动数折算成脉冲数进行驱动。
马达的驱动程序
我们可以将PCB一次检测的过程,以及马达移动过程,如图一样。图中①、②、 ③、④等为马达停下进行图像采集的点。
因为一共有X、Y方向两个不同的马达进行驱动,且马达的驱动方法完全不同,故分开讨论。
X方向的马达驱动
X方向的马达和CCD摄像头是一体化的在一起的,其驱动软件库,由厂商一起提供,共为两个封装的库文件,提供了一系列函数和参数。其中的一些主要的马达参数代码定义如下:
HANDLE handle;
char mov[OCOUNT];
char res[ICOUNT];
其中,handle为设备句柄,mov[ ]为从电脑到端口的传输的字符串,res[ ]为从端口到电脑传输的字符串。
X方向的马达使用RS232来驱动,则需要初始化RS232端口,这在构造函数中完成。RS232端口的初始化程序如下代码:
CamControl(){
memset(protocol,0,sizeof(protocol));
memset(prot,0,sizeof(prot));
memset(defaultAxisPattern,0,sizeof(defaultAxisPattern));
memset(defaultAxisNo,0,sizeof(defaultAxisNo));
strcpy(protocol,”9600,n,8,1″);
strcpy(prot,”COM1:”);
strcpy(defaultAxisPattern,”01″);
strcpy(defaultAxisNo,”0″);
defaultAxisNumber=0;
handle=NULL;
initpos=100;
}
这样,对RS232的最基本的参数都已经完成了初始化配置。同时,在以后的每一次对RS232端口进行操作时都要事先打开端口,RS232端口的打开函数代码:
openPor(){
COMMTIMEOUTS gTimeoutsDefault={0,0,100,0,100};
//端口的输出时间的实例化,设置端口的读写速度都为100Kb。
handle=::CreateFile(port,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,NULL,NULL);
//打开端口,并设置参数为可读,写,保持开放
DCB dcb;
//dcb设备的实例化
……//其他的DCB的参数的初始化
}
马达驱动完后,RS232端口的关闭函数的代码:
closePort(){
if(handle!=NULL)
CloseHandle(handle);
handle=NULL;
}
电脑对CCD以及马达的驱动,是通过两个字符串操作指令来完成:strcpy()和strcat()。我们通过向端口输出字符串,来达到控制CCD和马达的各项动作。
比如马达和CCD驱动的端口初始化函数代码:
initComm(){
strcpy(mov,”?99ISV”);
strcat(mov,”@@\r\n”);
}
其中字符串”?99ISV”就是专有指令,表示初始化。其它还有一些字符串指令如:”?99PMV”表示移动,”?99TST”表示测试,”?99HOM”表示马达归位等等。而显然字符串”@@\r\n”表示指令结束。这个方法类似MODEM的AT指令,可以向RS232口传输串行的字符串来完成控制工作。
这样,对于马达的驱动位置控制的函数,如代码
moveCameraPoint(const*axisPattern,int point){
……
strcpy(mov,”!99PMV”);//位移指令
attachAxis(mov,axisPattem);//选择坐标系
strcat(mov,”00000800″);//设定为使用普通的速度和电压
int space=4-strlen(buffer);//
for(int i=0;i<space;i++)
strcat(mov,”0″);
strcat(mov,buffer);//移到位置
strcat(mov,”@@\r\n”);
}
这样,移到图位置①,即回到原点的函数表达为:
moveCameraPoint(NULL,1);
移到图位置④,即X方向向前移动一个位置的函数表达为:
moveCameraPoint(NULL,si+1);
余者,以此类推。
Y方向的马达驱动
Y方向的马达在工作台上面,是一般的步进马达(现在大部分aoi设备供应商改用伺服马达)。同样的,也有厂商提供的库函数,可以提供开发。
在使用前,先要初始化,在构造函数中载入配置文件8134.cfg,加载步进马达配置文件的函数代码:
MotionControl(){
char SysDir[255]
::GetSystemDirectory(SysDir,1024);
strcat(SysDir,”\\8134.cfg”);
memset(configName,0,sizeof(configName));
strcat(configName,SysDir);
}
使用的马达的位移函数定义为:
moveConsant(int axisNo,double strVel,double maxVel,double tAcc){
_8134_tv_move(axisNo,strVel,maxVel,tAcc)
}
其中,_8134_tv_move()为厂商提供的API函数。在实际的工作台移动时,这样使用函数为:
moveConsant(0,speed,0.1);
其中,从位置从①到②的方向时,speed=-150000;而从位置④到⑤的方向时,speed=150000。
马达驱动对采集的影响
马达的驱动似乎仅仅是机械方面的问题,其实在高速运转的流水线上,马达的使用对图像以后的采集和处理的影响很大,马达移动带来的惯性会影响到采集的精度。我们要让马达的移动速度和采集图像的清晰度之间达到一种最佳的平衡。
我们的设备在工业化实测中发现,x方向的滚珠丝杠导轨结构的马达的性能要好于Y方向的步进马达。这主要是X向马达的定位精度高,停止时惯性较小,这样在图像采集时,采集的图像的边缘清晰,容易判别。Y向马达在研制初期,出现过马达未完全停止,造成采集的图像边缘不明晰,而无法检测的情况。我们后来通过改用阻尼系数更高的传动皮带材料,来改善了这一故障。但如果全用高精度马达,则会增加设备的制造成本。