CAN总线智能节点的软件设计主要包括三个部分:CAN节点初始化、报文发送和报文接收。CAN节点的通讯实质上就是对CAN控制器内部各寄存器进行读写,由于这些寄存器或发送、接收缓冲器均有确定的地址,CPU可通过外设访问指令对它们进行读写操作。系统上电复位后,CPU对SJA1000的各个控制寄存器写入相应控制字信息,以完成CAN控制器的初始化。本例中,系统软件采用结构化程序设计方法,程序具有较好的模块性和可移植性,对于不同的检测系统和应用环境,可以方便地进行程序重组。编程语言采用单片机C语言Keil C51,它具有较高的效率,可读性好,能够有效减轻系统软件编程的工作量。
CAN总线通讯的成功与否重点是SJA1000的初始化设置,初始化程序通过将CAN控制器的寄存器写入控制字,确定CAN的工作方式。用P89C668的P2.7作为片选信号与SJA1000的CS引脚相连,SJA1000的片内寄存器和P89C668单片机寄存器是重叠编址的,因此SJA1000寄存器寻址时要定义成片外RAM寻址。下面给出了CAN节点的初始化程序:
Init_Can (void)
{ MODE = 0x09; file://进入复位模式,对SJA1000进行初始化;
CDR = 0x88; file://选择PelICan;
CMR = 0x0C; file://清除数据溢出和释放接收缓冲器;
IER = 0x03; file://开放接收中断和发送中断;
ACR0 = 0x66;
ACR1 = 0x66;
ACR2 = 0x66;
ACR3 = 0x66; file://根据具体的协议定义设置验收码寄存器;
AMR0 = 0xFF;
AMR1 = 0xFF;
AMR2 = 0xFF;
AMR3 = 0xFF; file://根据具体的协议定义设置验收屏蔽寄存器;
BTR0 = 0x41;
BTR1 = 0x1B; file://12MHz晶振下,设置波特率为200kbps;
OCR = 0XAA;
EWLR =0x60;
RBSA = 0x00; file://RX缓存器起始地址寄存器设置为0;
TXERR= 0x00; file://发送错误接收器设置为0;
ECC =0x00; ?
MODE= 0x08; file://单向滤波方式,进入正常模式,初始化完毕;
由于视觉传感器测控系统要进行视觉检测多为在线检测,实时性要求较强,这里各传感器节点采用中断接收方式接收上位机的控制命令,节点初始化后,当一帧信息经过出错检测确认为正确信息后装入接收缓冲器,SJA1000的INT脚会产生中断信号,该信号连接到单片机P89C668的外边中断0引脚,在外部中断0中断处理程序中判别该信息的标志符如果是本节点地址,便读出接收缓冲器的数据并保存在RAM中,中断接收程序框图如下:
系统中发送报文采用查询方式,传感器节点在收到主控机的数据请求命令后发送数据,发送模块首先进行状态查询,判定总线是否空闲,如空闲,则将目的节点地址写入发送标志符寄存器,数据写入发送缓冲器,完成一帧CAN信息发送。
CAN信息格式分为信息和数据两部分,头两个字节是信息部分,其前11位为标志符,标志符的前八位用作接收判断,应包含本信息包的目的节点地址,然后是一位RTR位(0为数据帧,1为远程帧,本例使用数据帧),最后是四位的DLC。其余八个字节为是数据部分,存有实际要发送的数据。本例中只用到前两个数据,第一个表示传感器地址,第二个字节表示选择传感器里的两路摄像机中的哪一路采集图像。
CAN节点之间通讯成功的另一个关键是波特率的设置,不仅CAN总线上的各下位机节点要设置相同的波特率,总线与上位PC机相连的USBCAN接口卡也要有相同的波特率,这样才能保证通讯畅通。由于USBCAN接口卡内的CAN控制器SJA1000用的是16M晶振,而各传感器节点内的SJA1000与P89C668使用12M晶振,因此对于不同的通讯速率一定要计算出两种晶振都相一致的BTR0、 BTR1来设置总线波特率。
6 结束语
本文主要着重于多视觉传感器控制系统的设计研究,目前系统软硬件已初步调试完成,并能做到各个视觉传感器的快速切换传输视频图像,且切换是图像抖动较小,效果较好。本系统的精度主要由硬件决定,选用高精度、高分辨力的CCD摄像机和激光器,激光器投射出的线结构光越细光强分布越均匀,则测量精度越高。