图3
设Vs为传感器的信号电压,Vn1、Vn2为外部噪声源在电缆线上的感应噪声信号,Vns为电路噪声。因此,差分放大器输出电压Vo为:
Vo=A(V1-V2)=A(Vs+Vns+(Vn1+Vn2));如果噪声源与信号源频谱不重叠,则经低通滤波电路后:Vf≈AVs。
GAL译码电路
本模块电路中,单片机扩展外围器件较多,有程序存储器AT28C256、CAN控制器SJA1000、并口扩展82C55A和A/D转换AD1674。196单片机在模块中主要工作于8位总线宽度下,由于AD1674采用了12位并行输出模式,因此还需动态改变总线宽度。为了简化电路,以及适应196单片机较高总线速度的要求,译码电路放弃了传统的门电路组合的方法,采用了可多次编程的通用阵列逻辑器件(generic array logic)GAL16V8。这样可以减少元器件数量、降低线路复杂程度,同时降低故障机率及提高硬件设计的灵活性。
GAL16V8引脚分配及逻辑表达式如下:
Input device‘P16V8AS’;
WR,RD,CAN,A12,A13,A14,A15,ADC
pin2,3,4,5,6,7,8,9;
BUSWIDTH,CSCAN,INTCAN,CEROM,CSADC, CS8255,NTADC,EADC
pin19,18,17,16,15,14,13,12;
EQUATIONS
!CEROM=!A15&!A14&A13&!A12#
!A15&!A14&A13&A12
#!A15&A14&!A13&!A12#!A15&
A14&!A13&A12
#!A15&A14&A13&!A12#!A15&
A14&A13&A12
#A15&!A14&!A13&!A12#A15&!
A14&!A13&A12;
!CSCAN=A15&!A14&A13&!A12;
!CS8255=A15&!A14&A13&A12;
!CSADC=A15&A14&!A13&!A12;
BUSWIDTH=A15&A14&!A13&!A12;
!INTCAN=CAN;
!INTADC=ADC;
!CEADC=WR&RD;
由上述逻辑表达式可以看出,外围器件地址基地址由最高4位地址A12~A15决定,AT28C256、SJA1000、82C55A及AD1674对应基地址分别为:2000H,A000H,B000H,C000H。当选通AD1674时,单片机总线宽度控制引脚BUSWIDTH将置为高,动态调整到16位总线宽度,其余时刻,BUSWIDTH为低,单片机保持8位总线宽度。INTCAN和INTADC分别是对SJA1000和AD1674中断请求信号取反。GAL表达式文件用ABEL软件编译形成JED文件,使用通用编程器烧入芯片,且可反复多次烧写,方便调试。
软件编程
控制软件的合理设计是模块实时、有效地完成数据采集及通信任务的关键,主要包括系统初始化、CAN信息处理、数据采集及处理等功能模块。系统开放一个定时中断,定时时间对应上位机发送来的采样周期。CAN报文的接收主要有2种方式:中断和查询方式。为提高系统的实时性,同时也保证接收缓冲器不出现数据溢出现象,模块中采用中断接收方式。CAN报文发送采用查询方式,即当需要发送数据时,将预先组织好的数据帧按字节写入SJA1000的发送缓冲寄存器中。
SJA1000的初始化主要是在SJA1000的复位模式下设置相应寄存器。在初始化CAN内部寄存器时应注意同一网络中各模块的通信速率的设置应一致。下面给出SJA1000工作在BasicCAN模式下的简单的初始化源程序:
INIT-SJA1000:
LDB AL, #01H
STB AL, REG-CR ;复位SJA1000
LDB AL, #0AAH
STB AL, REG-OCR ;设置输出寄存器为普通输出模式
LDB AL, #048H
STB AL, REG-CDR ;使能内部比较器,禁止时钟输出
STB #01H, REG-BTR0 ;设置波特率为
250K(使用16M晶振)
STB #1CH, REG-BTR1
LDB AL, #00H
STB AL, REG-ACR ;设置验收码寄存器
LDB AL, #0FFH
STB AL, REG-AMR ;设置验收屏蔽码寄存器
LDB AL, REG-CR
ANDB AL, #0FEH ;SJA1000退出复位模式
LDB AL, #02H
STB AL, REG-CR ;设置中断寄存器,使能
接收中断
RET
以上程序段可以正确初始化SJA1000,为了提高程序可靠性和容错性,实际应用中应该读出SJA1000寄存器内容并加以比较,从而判断是否正确写入。
结束语
基于以上所述的软、硬件设计实现了CAN协议所包括数据链路层和物理层,由于CAN总线协议没有定义应用层,因此在实际的应用中有必要定义高层通信协议,即相应的命令、参数和数据的格式。国际上比较流行的基于CAN底层协议的高层协议有DeviceNet和CANopen,我们在简单应用中,采用了自定义的简单通信协议,在此不作叙述。设计的智能数据采集模块应用于电液伺服控制系统以来,运行情况良好,由于CAN总线的应用,大大提高了分布式数据采集和控制系统的灵活性、可靠性和实时性,建立了一个有效的现场总线控制系统的实验教学平台。同时该数据采集模块也可以方便地移植到工业上的其它控制系统中,与其它基于CAN总线的智能控制模块组成CAN现场总线控制系统。