加载中,请稍候...
LChid0
浏览历史

 

 

 

 

 

基于CAN总线的数据采集系统

基于CAN总线的数据采集系统

前言

(一)背景

随着汽车工业的发展,20 世纪 80 年代中期,率先由 Bosch 公司研发出新一代的汽车总线即控制器局域网(Controller Area Network,简称:CAN 总线或 CAN-bus),CAN 总线具有布线简单、典型的总线型结构、可最大限度的节约布线与维护成本、稳定可靠、实时、抗干扰能力强、传输距离远等特点,这些都决定了 CAN 总线必定是一种成功的总线。一经推出不仅在汽车行业得到广泛的推广与应用,在诸如航天、电力、石化、冶金、纺织、造纸等领域也得到广泛应用。在自动化仪表、工业生产现场、数控机床等系统中也越来越多的使用了 CAN 总线,CAN 总线在未来的发展中依然充满活力,有着巨大的发展空间。

由于 CAN 总线本身只定义 ISO/OSI 模型中的第一层(物理层)和第二层(数据链路层),通常情况下 CAN 总线网络都是独立的网络,所以没有网络层。在实际使用中,用户还需要自己定义应用层的协议,因此在 CAN 总线的发展过程中出现了各种版本的 CAN 应用层协议,现阶段最流行的 CAN 应用层协议主要有 CANopenDeviceNet J1939 等协议。而本设计采用的协议时CANopen

(二)概述

控制器局部网(CANCONTROLLER AREA NETWORK)是BOSCH公司为现代汽车应用领先推出的一种多主机局部网,由于其高性能、高可靠性、实时性等优点现已广泛应用于工业自动化、多种控制设备、交通工具、医疗仪器以及建筑、环境控制等众多部门。控制器局部网将在我国迅速普及推广。

随着计算机硬件、软件技术及集成电路技术的迅速发展,工业控制系统已成为计算机技术应用领域中最具活力的一个分支,并取得了巨大进步。由于对系统可靠性和灵活性的高要求,工业控制系统的发展主要表现为:控制面向多元化,系统面向分散化,即负载分散、功能分散、危险分散和地域分散。

分散式工业控制系统就是为适应这种需要而发展起来的。这类系统是以微型机为核心,将 5C技术--COMPUTER(计算机技术)、CONTROL(自动控制技术)、COMMUNICATION(通信技术)、CRT(显示技术)和 CHANGE(转换技术)紧密结合的产物。它在适应范围、可扩展性、可维护性以及抗故障能力等方面,较之分散型仪表控制系统和集中型计算机控制系统都具有明显的优越性。

典型的分散式控制系统由现场设备、接口与计算设备以及通信设备组成。现场总线(FIELDBUS)能同时满足过程控制和制造业自动化的需要,因而现场总线已成为工业数据总线领域中最为活跃的一个领域。现场总线的研究与应用已成为工业数据总线领域的热点。尽管目前对现场总线的研究尚未能提出一个完善的标准,但现场总线的高性能价格比将吸引众多工业控制系统采用。同时,正由于现场总线的标准尚未统一,也使得现场总线的应用得以不拘一格地发挥,并将为现场总线的完善提供更加丰富的依据。控制器局部网 CANCONTROLLER AERANETWORK)正是在这种背景下应运而生的。

由于CAN为愈来愈多不同领域采用和推广,导致要求各种应用领域通信报文的标准化。为此,1991 9 PHILIPS SEMICONDUCTORS制订并发布了 CAN技术规范(VERSION 2.0)。该技术规范包括AB两部分。2.0A给出了曾在CAN技术规范版本1.2中定义的CAN报文格式,能提供11位地址;而2.0B给出了标准的和扩展的两种报文格式,提供29位地址。此后,199311ISO正式颁布了道路交通运载工具--数字信息交换--高速通信控制器局部网(CAN)国际标准(ISO11898),为控制器局部网标准化、规范化推广铺平了道路。   

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

一、       总体方案设计

(一)方案论证

方案一:单片机AT89C51属标准型,芯片价格低廉,引脚与80C51完全兼容。片上外围资源丰富,片内具有41d3 Flash ROM程序存贮空间,这不仅给程序修改带来极大方便,而且避免了外部ROM扩展,降低了节点成本和线路复杂性,提高了电路可靠性。另外AT89C51具有在片程序和ROM两级保密系统,可防止程序被非法剽窃。

SJA1000PHILIP公司推出的功能很强的CAN 控制器,其内部结构见图2。片内含信息缓冲、位流处 理、位定时逻辑、接收滤波、错误管理逻辑等电路,并配置有丰富的功能寄存器。可完成数据成帧、总线填充、错误检测、总线仲裁及错误界定处理等CAiN规范。

方案二:采用Luminary公司基于 ARM® CortexTM-M3 的控制器LM3S5749

Luminary Micro StellarisTM系列的微控制器是首款基于 ARM® CortexTM-M3 的控制器,它将高性能的 32 位计算引入到对价格敏感的嵌入式微控制器应用中。这些堪称先锋的器件拥有与 8 位和 16 位器件相同的价格,却能为用户提供 32 位器件的性能,而且,所有器件都是小型封装形式提供。Luminary Micro 提供一套完整的解决方案以便快速进入市场,包括用户开发板、白皮书和应用手册,以及强大的支持、销售和分销商网络。所以,我们这里就采用M3来实现CAN总线的数据采集。

(二)系统框图如图1

 

1 系统框图

 

二、       硬件电路的设计

外围电路包括:电源电路、温度采集、时钟电路、存储电路、报警电路、模拟控制电路、按键电路、显示电路以及串口等电路。下面将依次对各个模块进行说明。

(一)电源电路

电源变压器是将交流电网220V的电压变为所需要的电压值。交流电经过二极管整流之后,方向单一了,但是电流强度大小还是处在不断地变化之中。这种脉动直流一般是不能直接用来给集成电路供电的,而要通过整流电路将交流电变成脉动的直流电压。由于此脉动的直流电压还含有较大的纹波,必须通过滤波电路加以滤除,从而得到平滑的直流电压。滤波的任务,就是把整流器输出电压中的波动成分尽可能地减小,改造成接近稳恒的直流电。但这样的电压还随电网电压波动,一般有%左右的波动,负载和温度的变化而变化,因而在整流、滤波电路之后,还需要接稳压电路。稳压电路的作用是当电网电压波动,负载和温度变化时,维持输出直流电压稳定。220V交流电通过9V变压器变为9V的交流电,9V交流电通过四个二极管的全桥整流后变为9V直流电,然后经过电解电容(470μF)进行一级滤波,以去除直流电里面的杂波,防止干扰。9V直流电出来后再经过三端稳压器LM7805稳压成为稳定的5V电源,其中7805Vin脚是输入脚,接9V直流电源正极,GND是接地脚,接9V直流电源负极,Vout为输出脚,它和接地脚的电压就是+5V了。5V电源出来再经过电解电容的二级滤波,使5V电源更加稳定可靠。同时在5V稳压电源加上一个10K的电阻和一个红色发光二极管,当上电后,红色发光二极管点亮,表示电源工作正常。此时一个稳定输出5V的电源已经设计好,对于本设计它完全能够满足单片机及集成块所需电源的要求。电源原理图如图2所示:

2 电源原理图

 

(二)复位电路

所示为复位电路原理图,复位是单片机的初始化操作,其主要功能是把PC初始化为0000H,使单片机从0000H单元开始执行程序,并使其它功能单元处于一个确定的初始状态。本复位电路采用的是按键复位,它是通过复位端经电阻与VCC电源接通而实现的,它兼具上电复位功能。因本系统的晶振的频率为12MHz,所以,复位信号持续时间应当超过2μS才能完成复位操作。

3 复位电路

 

(三)CAN总线通讯电路

4 CAN总线通讯接口

 

(四)按键电路

5.4所示为键盘原理图,本系统采用的是独立式键盘结构,每个按键单独占用一根I/O口线,每个按键的工作不会影响其它I/O口线的状态。它软件是采用查询式结构,首先逐位查询每根I/O口线的输入状态,如某一根I/O口线输入为低电平,则可确认该I/O口线所对应的按键已按下,然后,再转向该键的功能处理程序。

 

键盘是人与微机打交道的主要设备,按键的读取容易引起误动作。可采用软件去抖动的方法处理,软件的触点在闭合和断开的时候会产生抖动,这时触点的逻辑电平是不稳定的,如不采取妥善处理的话,将引起按键命令错误或重复执行,在这里采用软件延时的方法来避开抖动,延时时间20ms。按下某键时,对应的功能键解释程序得到执行,如操作者没有释放按键,则对应的功能会反复执行,好象连续执行,在这里我们采用软件延时250ms,当按键没释放则执行下一条对应程序。利用连击功能,能实现快速调时操作。

单片及应用系统中,键盘扫描只是CPU的工作内容之一。CPU忙于各项任务时,如何兼顾键盘的输入,取决于键盘的工作方式。考虑仪表系统中CPU任务的份量,来确定键盘的工作方式。键盘的工作方式选取的原则是:既要保证能及时响应按键的操作,又不过多的占用CPU的工作时间。键盘的工作方式有:查询方式(编程扫描,定时扫描方式)、中断扫描方式。矩阵式键盘适用于按键数量较多的场合,由行线和列线组成,按键位于行列的交叉点上节省I/O口。按键电路如图16

5 按键电路

 

(五)JTAG下载电路

    JTAG是英文“Joint Test Action Group(联合测试行为组织)的词头字母的简写,该组织成立于1985 年,是由几家主要的电子制造商发起制订的PCB IC 测试标准。JTAG 建议于1990 年被IEEE 批准为IEEE1149.1-1990 测试访问端口和边界扫描结构标准。该标准规定了进行边界扫描所需要的硬件和软件。自从1990 年批准后,IEEE 分别于1993 年和1995 年对该标准作了补充,形成了现在使用的IEEE1149.1a-1993 IEEE1149.1b-1994JTAG 主要应用于:电路的边界扫描测试和可编程芯片的在线系统编程。

6 JTAG电路

 

(六)LM3S6965介绍

如图18所示为LM3S6965芯片的引脚图

 

7 AT89S52引脚图

Luminary Micro公司 Stellaris®所提供一系列的微控制器是首款基于ARM® Cortex-M3的控制器,它们为对成本尤其敏感的嵌入式微控制器应用方案带来了高性能的32位运算能力。 这些具备领先技术的芯片使用户能够以传统的8位和16位器件的价位来享受32位的性能,而且所有型号都是以小占位面积的封装形式提供。该 Stellaris® 系列芯片能够提供高效的性能、广泛的集成功能以及按照要求定位的选择,适用于各种关注成本并明确要求具有的过程控制以及连接能力的应用方案。该Stellaris® LM3S1000 系列使用更大的片上存储器、增强型电源管理和扩展I/O以及控制功能来扩展Stellaris®

家族。 该Stellaris®LM3S2000 系列是针对控制器局域网(CAN)应用方案而设计的一组芯片,它在Stellaris系列芯片的基础上扩展了Bosch CAN网络技术——短距离工业网络里的黄金标准。该Stellaris® LM3S2000系列芯片还标志着先进的Cortex-M3内核和CAN能力的首次结合运用。 该Stellaris® LM3S6000 系列芯片结合了10/100以太网媒体访问控制(MAC)以及物理层(PHY),标志着ARM Cortex-M3 MCU已经具备集成连接能力,还是唯一集成了10/100以太网MACPHY物理层的ARM架构MCU。 该Stellaris® LM3S8000 系列结合了 Bosch 控制器局域网技术和 10/100 以太网媒体访问控制(MAC)以及物理 (PHY) 层。该LM3S5749微控制器是针对工业应用方案而设计的,包括远程监控、电子贩售机、测试和测量设备、网络设备和交换机、工厂自动化、HVAC和建筑控制、游戏设备、运动控制、医疗器械、以及火警安防。至于那些对功耗有特别要求的应用方案,LM3S5749微控制器还具有一个电池备用的休眠模块,从而有效的使LM3S5749芯片在未被激活的时候进入低功耗状态。一个上电/掉电序列发生器、连续的

时间计数器(RTC)、一对匹配寄存器、一个到系统总线的APB接口以及专用的非易失性存储器、休眠模块等功能组件使LM3S5749微控制器极其适合用在电池的应用中。

除此之外,该LM3S5749微控制器的优势还在于能够方便的运用多种ARM的开发工具和片上系统(SoC)的底层IP应用方案,以及广大的用户群体。 另外,该微控制器使用了兼容ARMThumb®指令集的Thumb2指令集来减少存储容量的需求,并以此达到降低成本的目的。最后,LM3S5749微控制器与Stellaris®系列的所有成员是代码兼容的,这为用户提供了灵活性,能够适应各种精确的需求。

三、       软件设计

(一)概述

CANopen 协议是在 20 世纪 90 年代末,由 CiA 组织(CAN-in-Automation)在 CALCAN Application Layer)的基础上发展而来,一经推出便在欧洲得到了广泛的认可与应用。经过对 CANopen 协议规范文本的多次修改,使得 CANopen 协议的稳定性、实时性、抗干扰性都得到了进一步的提高。并且 CIA 在各个行业不断推出设备子协议,使 CANopen 协议在各个行业得到更快的发展与推广。目前 CANopen 协议已经在运动控制、车辆工业、电机驱动、工程机械、船舶海运等行业得到广泛的应用。

(二)CANopen协议简介

8  CANopen 设备结构

 

8 所示为 CANopen 设备结构,CANopen 协议通常分为用户应用层、对象字典、以及通讯三个部分。其中最为核心的是对象字典,这部分将在本文以下章节中介绍。CANopen通讯是 CANopen 关键部分,其定义了 CANopen 协议通信规则以及与 CAN 控制器驱动之间对应关系,这部分是CANopen 协议核心思想。

(三)软件流程

9 软件流程

 

 

 

 

 

 

四、       总结

在硬件电路制作阶段,我到图书馆、网上查阅各种资料,在电脑上使用PROTEL99SE进行以及相关的绘图软件,使自己在理论分析设计和动手操作能力等各方面得到了极大提高。我通过对设计任务书的具体要求分析思考,再加上以前在学校进行的各种相关实践和实习积累的经验,首次完成了硬件电路板的制作,虽然在初次制板时,其中在钻孔时,看着别人钻好简单,自己一试,也不是一件容易的事,不仅看得你眼花缭乱,还一不小心,钻头就断了,钻孔那天我组就弄断了好几个。后来随着动作越来越熟练,速度也越来越快。尽管板面没买得好看,但那也是我们的成果,还有因不细心、不熟习制作流程,还有打印的时候由于油墨的质量不行且不够浓,导致第一块电路板有很多的断线而报废,但总结了经验后又重新做了一块板子,总算成功,但是还有很多地方要改进才行,以后做板子的时候要特别注意。硬件电路板制好后,在利用ASM51软件编写程序调试时,遇到了不少困难,这使我学会了耐心分析问题,并进一步锻炼自己去攻破难题的能力。

这次课程设计整体来说是成功的,但我也发现了自己许多错漏和不足之处。譬如,最简单的程序没写好就想着写更复杂的程序,做事还是缺乏耐性和细心,当有时遇到问题时,总觉得无从下手,对于课本上的知识不能很好的组织起来。在编写各功能程序时,特别是后来增添的比较复杂的程序,

目前,外面企业公司编写程序大部分用C语言,而少用我们现在所学的汇编语言,所以我在以后的时间还是会自学C语言编程。再之现在电子领域、不同的行业极为广泛,对于我们学电子专业的人来说,学好课本上的知识仅仅是基础,要掌握一门技术必须还得更深层的学习,并且亲自动手去做,这样才能达到事半功倍的效果。

在最后,再次感谢王维博老师。

 

 

 

 

 

 

 

 

 

 

参考文献

[1] 余永权. 单片机原理及应用. 北京:电子工业出版社, 1997                                              

[2] 邦田. 电子电路实用抗干扰技术. 北京:人民邮电出版社,1994                                                      

[3] 曲喜贵. 电子元件材料手册. 北京:电子工业出版社,1989

[4] 黄贤武,郑筱霞 传感器实际应用电路设计. 成都:电子科技大学出版社,1997

[5] 刘君华. 智能传感器系统. 西安:西安电子科技大学出版社,1999

[6] 余永权. Flash 单片机原理及应用. 北京:电子工业出版社,1997

[7] 邦田. 电子电路实用抗干扰技术. 北京:人民邮电出版社,1994

[8] 吉鹏.马云峰. 微机原理与接口技术. 北京:高等教育出版社,2001

[9] 振国. DS1820 及高精度温度测量的实现. 电子技术应用,2000

[10] 一线数字温度传感器资料. 武汉:武汉力源电子有限公司,1996

[11] 贤武,郑霞. 传感器实际应用电路设计. 成都:电子科技大学出版社,1997

[12] 伟正. 单线数字温度传感器的原理与应用. 电子技术应用,2000

[13] 周月霞,孙传友. DS18B20 硬件连接及软件编程. 传感器世界,2001

[14] 单线数字温度传感器资料武汉:武汉力源电子有限公司,1996

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

附录1:电路原理图

附录2:部分源码

#include "config.h"

 

/*********************************************************************************************************

  声明全局变量

*********************************************************************************************************/

extern tCANFrameBuff  *pReceFrameBuff;                               /*  指向帧接收缓冲区的指针      */

extern tCANFrameBuff  *pSendFrameBuff;                                  /*  指向帧发送缓冲区的指针      */

extern tCANNodeInfo   *pCAN_Node_Info;                                  /*  指向CAN节点数据信息的指针   */

 

/*********************************************************************************************************

  This structure holds the static defitions used to configure the CAN

  controller bit clock in the proper state given a requested setting.

*********************************************************************************************************/

tCANBitClkParms CANBitClkSettings[] =

{  

   

    /*

     *  OSC = 8MHz

     */

    #if 0

        {5, 2, 2, 1},                                                   /*  CANBAUD_1M                  */

        {5, 2, 2, 2},                                                   /*  CANBAUD_500K                */

        {5, 2, 2, 4},                                                   /*  CANBAUD_250K                */

        {9, 6, 4, 4},                                                   /*  CANBAUD_125K                */

        {5, 2, 2, 10},                                                   /*  CANBAUD_100k                */

        {5, 2, 2, 20},                                                   /*  CANBAUD_50k                 */

        {9, 6, 4, 20},                                                   /*  CANBAUD_25k                 */

        {5, 2, 2, 50},                                                   /*  CANBAUD_20k                 */

        {5, 2, 2, 100},                                                 /*  CANBAUD_10k                 */

        {9, 6, 2, 100},                                                 /*  CANBAUD_5k                  */

        {9, 6, 2, 200},                                                 /*  CANBAUD_2k5                 */

    #endif

   

    /*

     *  OSC = 6MHz

     */

    {6, 1, 2, 1},                                                       /*  CANBAUD_1M                  */

    {11, 4, 2, 1},                                                      /*  CANBAUD_500K                */

    {11, 4, 2, 2},                                                      /*  CANBAUD_250K                */

    {11, 4, 2, 4},                                                      /*  CANBAUD_125K                */

    {11, 4, 2, 5},                                                      /*  CANBAUD_100k                */

    {11, 4, 2, 10},                                                     /*  CANBAUD_50k                 */

    {11, 4, 2, 20},                                                       /*  CANBAUD_25k                 */

    {11, 4, 2, 25},                                                       /*  CANBAUD_20k                 */

    {11, 4, 2, 50},                                                       /*  CANBAUD_10k                 */

    {11, 4, 2, 100},                                                    /*  CANBAUD_5k                  */

    {11, 4, 2, 200},                                                    /*  CANBAUD_2k5                 */

};

 

/*********************************************************************************************************

** Function name:           CreateCAN

** Descriptions:            创建一个节点信息结构体

** input parameters:        *pCAN           指向节点结构的空指针

**                          ulChannelNr     节点通道号

**                          ulBaud          节点通信波特率

**                         ulRxMsgObj      节点接收数据MO

**                         ulTxMsgObj      节点发送数据MO

**                         *pReceBuff      节点接收数据缓冲区

**       &n