基于ADμC812的CAN总线智能节点的设计
摘要:介绍了一种用单片机ADμC812、CAN总线控制器SJA1000和CAN总线驱动器POA82C250组成的CAN总线智能节点的设计方案,给出了该节点的硬件结构和软件设计方法,同时介绍了CAN总线的主要特点。
关键词:CAN总线;ADμC812;数据采集卡
1 引言
CAN(Controller Area Network)总线协议最初是以研发和生产汽车电子产品著称的德国BOSCH公司开发的,它是一种支持分布式实时控制系统的串行通信局域网。目前,CAN总线以其高性能、高可靠性、实时性等优点,而被广泛应用于控制系统中的检测和执行机构之间的数据通信中。CAN总线具有以下一些技术特性:
●多主方式工作,采用非破坏性的基于优先权的总线仲裁技术;
●借助接收滤波可实现多地址的帧传送;
●数据采用短帧结构,抗干扰性强,数据帧的信息CRC校验及其它错误检测措施完善;
●发送期间丢失仲裁或由于出错而遭破获的帧可以自动重发;
●严重错误时可自动关闭总线功能,以使总线其它操作不受影响。
CAN总线符合ISO11898标准,最大传输速率为1MB/s时传输距离最大为40m;传输速率为5kB/s时的最大传输距离为10km。CAN总线的传输介质可为双绞线、同轴电缆等。由于CAN总线是一种很有发展前景的现场总线,因此得到了国际上很多大公司的支持,加之基于CAN总线的硬件接口简单,编程方便,系统容易集成。因此它特别适用于系统分布比较分散、实时性要求高、现场环境干扰大的场合。
2 系统结构
由于CAN总线采用多主方式工作,所以它具有与DCS控制系统不一样的拓扑结构。其控制系统的构成由计算机和智能节点组成,图1所示是其系统结构。该系统最大的特点就是所有的节点(包括上位PC机)都能以平等的地位挂接在总线上。一个CAN总线节点通常至少包括三个部分,即负责节点任务控制的单片机、CAN总线控制器以及CAN总线收发器。本文给出的就是一个可完成数据采集功能的CAN节点的设计方法。
3 CAN节点的硬件设计
本CAN节点的电路原理简图如图2所示。该电路的三个核心器件是单片机ADμC8121、独立的CAN总线控制器SJA1000和CAN总线驱动器PCA82C250。其中SJA10002和PCA82C250两者的组合应用已经在很多CAN总线节点的设计中用到,而本设计的特点就在于,它是根据要完成数据采集功能这一具体要求来选用微控制器ADμC812。图2中的串行接口芯片MAX232作为ADμC812与PC机的串口连接,它的使用是由该单片机的调试特点决定的。
ADμC812是高度集成、高精度12位数据采集系统,该产品在其内核中集成了带有片内可重编程非易失性闪速/电擦除程序存储器的高性能8位(与8051兼容)MCU和多通道(8个输入通道)12位ADC。
由于ADμC812只需要通过其串口模块和计算机的串口进行连接,而不需要额外的仿真器,因而可利用ADI公司的QUICKSTART软件来实现程序的在线下载、在线调试和在线仿真,从而极大地提高了工作效率。这也是本设计使用MAX232的原因。
该系统在工作时,首先将从前面传感器送来的工业标准信号(4~20mA或1~5V)通过调理电路变为0~2.5V的模拟电压信号输入至ADμC812的P0.0~P0.7 (AD0~AD7)引脚(根据实际情况确定所需AD端口的数量),然后通过程序控制,再将A/D转换所得的数字信息通过SJA1000和PCA82C250送到CAN总线上的相关节点。
SJA1000作为微控制器的片外扩展芯片,其片选引脚CS应接在微控制器的P2.0上,以用于决定CAN控制器各寄存器的地址。SJA1000通过CAN总线驱动器PCA82C250连接在物理总线上。PCA82C250器件可提供对总线的差动发送能力和对CAN控制器的差动接受能力,它同时完全和“ISO11898”标准兼容。为进一步提高系统的抗干扰能力,一般在CAN总线控制器SJA1000和CAN总线驱动器PCA82C250之间加接6N137光电隔离芯片,只不过在图2中没有表示出来。由于通信信号传输到导线的端点时会发生反射,而且反射信号会干扰正常信号的传输,因此,总线两端应接有终端电阻R1、R2,以消除反射信号,其阻值应当与传输电缆的特性阻抗大致相当。
4 CAN节点的软件设计
本节点的软件编程主要包括A/D转换(ADC)、CAN控制器的初始化、CAN总线数据的发送和接收等几个部分。主程序的流程图如图3所示。
下面分别对这几个主要部分的程序设计做一介绍。
4.1 A/D转换部分
笔者在本设计中采用的是单步A/D转换模式,并将A/D转换结果存入指定的数据存储区。具体步骤如下:
(1)通过设置ADC控制寄存器(ADCCON1和ADCCON2)的值来确定A/D转换的工作状态和采样通道号;
(2)使能ADC中断,置位SCONV位以启动单步A/D转换;
(3)等待响应ADC中断,并进入中断服务程序;
(4)把采样所得的数据从ADCDATAL和ADC-DATAH两个特殊寄存器中取出,并存入预设的片内数据存储器中,然后退出中断服务程序;
(5)判断所需通道是否采样完毕,如果未完成,则设置采样通道号并返回步骤(2),若完成则退出A/D转换子程序。
通过该程序可随时根据实际需要更改采样通道数,并将采样结果直接存入指定数据存储区,以为今后向CAN总线发送所得数据提供便利。
4.2 SJA1000的初始化
CAN的通信协议主要是由CAN控制器完成的,因此,要想实现CAN节点的数据传送,对CAN控制器的初始化是十分关键的。这个步骤直接决定着该CAN网络系统各节点所共同遵守的协议。对SJA1000进行初始化实际上就是通过单片机向其片内的各个寄存器写入控制字的过程,其寄存器包括以下几个:
REG CONTROL—内部控制寄存器地址;
REG COMMAND—内部命令寄存器地址;
REG STATUS —内部状态寄存器地址;
REG INTERRUPT—内部中断寄存器地址;
REG ACR—内部验收代码寄存器地址;
REG AMR—内部验收屏蔽寄存器地址;
REG BTR0—总线定时寄存器0;
REG BTR1—总线定时寄存器1;
REG OCR—输出控制寄存器。
其中:BTR0、BTR1寄存器的内容可用于决定系统通信的波特率和CAN协议物理层中的同步跳转宽度,因此,对于一个系统中的所有节点,这两个寄存器的内容必须相同(包括上位机),否则将无法进行通信;OCR寄存器的内容用于决定CAN控制器的输出方式;而写入ACR、AMR寄存器的内容则要根据实际的网络系统和报文标志符来决定。本设计中,笔者采用的是BasicCAN模式。
完成初始化后,CAN控制器就能正常运行了,但是要实现具体的数据收发任务,还必须编制特定的收、发程序。
4.3 CAN总线数据的发送和接收
(1)发送部分的程序设计
用CAN总线发送数据的流程图如图4所示。实际上,在程序运行过程中,常常会在发送某一帧数据时发现上一帧的数据还没有完全发送完毕(可以通过查询状态寄存器REG STATUS的第4位BIT TCS的显、隐状态可了解上次数据的发送情况)。因此,笔者采用的处理方法是:通过指令启动本次发送之后,就不停地查询状态寄存器,以判断本次发送是否完成,直到确定完成为止。这样可以为下次发送提供便利,同时也有利于程序的顺利执行,从而避免出现错误。
(2)接收部分的程序设计
图5所示是该系统接收部分的软件流程图。
实际上,在对响应速度要求不太高的场合,以查询方式来设计接收子程序是最简单、最可靠的方式。如果总线上有数据发往本节点,则通过查询状态寄存器的第1位BIT_RBS的位状态,便可得知接收缓冲区(RXFIFO)中的可用信息,然后通过软件将RXFIFO中的数据逐个“移入”到指定的片内存储空间即可。对于这样一个主要以数据采集功能为主的CAN节点,这些数据多半是由CAN网络中的“控制中心”发来的控制信号,设计时把它们留给ADμC812进一步处理就可以了。
还应注意的是:在接收查询过程中,要“观察”是否有总线关闭、总线出错、接收缓冲器超载等状态,如果有的话,必须要进行相应的“错误”处理,否则也不能正常进行数据接收,还有一个问题是关于远程帧的处理。限于篇幅,本文不作介绍。
5 结束语
实践证明:本文所介绍的CAN总线智能节点能够很好地实现对工业标准模拟输出信号的采集以及与CAN总线上其它节点的通信。由于该节点是基于单片机ADμC812开发的,因此它的体积小巧且扩展灵活。笔者相信,基于该单片机的各种总线节点一定会得到广泛的应用。
评论