当前位置:文档之家› CAN总线应用

CAN总线应用

设计(论文)题目:基于CAN总线的楼宇温度检测系统前言基于单片机实现传统温度检测技术的特点,提出了基于CAN总线的楼宇温度检测系统方案。

该系统方案的硬件平台主要包括温度检测模块和主控平台,并详细介绍了其硬件实现、软件设计思想及流程。

实验表明:该系统可实现对楼宇温度的实时检测,并由数码管显示检测结果,对异常情况进行处理,从而实现对楼宇房间温度的有效检测。

在传统的检测技术中,温度检测基本采用单片机系统为主,且大多数都针对工业需要,日常生活中的应用并不多;而通信多基于落后的485总线,不能进行远距离的实时数据传输,更不能与因特网相连,可靠性也不高。

因此,本文提出一种基于CAN总线的温度测控技术,该技术适合远距离控制与传输,具有非常高的可靠性。

控制器局域网(Controller Area Network,CAN)是国际上应用最广泛的现场总线之一。

CAN总线最早出现在20世纪80年代末的汽车工业中,由德国BOSCH公司最先提出,其主要特性为低成本,且总线利用率高。

CAN采用串行通信方式工作,所提供的最高数据传输速率为1Mbit/s,最大通信距离为10km。

CAN还具有可靠的错误处理和检错机制,极强的错误检测能力,发送信息遭到破坏后可自动重发;可在高噪声的干扰环境中只用,能够检测出产生的任何错误,当数据的传输距离达到10km时,CAN仍能提供5kbit/s的数据传输速率。

正是基于CAN总线的上述优点,目前CAN总线在众多领域被广泛应用,其应用范围不再局限于原先的汽车行业,而向过程工业、机械工业、纺织工业、数控机床、医疗器械及传感器等领域发展,CAN总线已经形成国际标准,并已被公认为是几种最有前途的现场总线之一。

考虑到CAN总线的高可靠性和远距离传输优点,结合目前温度检测技术的技术瓶颈,即距离短和实时性差的特点,本系统CAN总线应用于传统的温度检测中,也是一种新的尝试。

1 基于CAN 总线楼宇温度检测系统的实现本设计的总体方案如图1所示,有主控平台、报警系统、键盘控制、数码管显示、温度检测模块即电源接口电路等部分组成。

主控平台的主要功能是连接和控制各个接口,并根据操作命令完成相应数据的处理、传输。

本方案系统结构如图图1总体方案总线图2 系统结构1.1 温度检测节点的硬件设计温度检测模块是本方案的核心模块,该模块的技术关键在于温度检测节点的传感器图3 温度检测模块的检测模块图3 中DS18B20为数字温度传感器,主要用于组网温度测量,它是I-Wire 总线通信协议数字式温度传感器,测温范围为-55~+125℃,分辨率0.5℃。

SJA1000控制器是PHILIPS公司生产的符合CAN2.0B协议的协议转换器。

TJA1050是CAN协议控制器的物理总线之间的接口,对总线提供差动发送能力,对CAN控制器提供差动接受能力,使用TJA1050可以增大通信距离、提高系统的瞬间抗干扰能力、保护总线及降低射频干扰。

光耦则是高速光电隔离器件,使用已经非常普遍。

1.2 主控平台设计系统中的主控平台主要完成人机对话和系统管理功能,如各温度检测点的温度上下限设定,对由温度检测模块采集的温度进行数据库管理,实现温度的实时图4中的键盘驱动,数码管显示及报警部分均有成熟的电路可用选用,核心PC机可以采用单片机——A T89S51。

2 软件设计2.1 主控台软件设计主控台软件分为初始化和主调度。

初始化部分仅在上电启动或复位时运行;主调度主要包括CAN信息帧处理、键盘按键处理、显示处理和警报、数据和时间处理、中断控制等部分。

软件框图如图5所示。

图5 主控机软件框图主调度始终不停地在多个子任务之间巡查和调用。

主调度负责管理多个子任务的运行,巡查各个子任务,当外部事件触发主调度的相关子任务时,则此子任务被激活,进行子任务处理,否则主调度跳过这一子任务。

任何系统在使用之前都要对系统进行初始化,此系统的初始化包括CAN总线接口的初始化、时钟芯片的初始化等。

键盘扫描电路及按键处理程序则用来实现键盘的输入按键的识别及相关处理。

CAN信息帧处理模块主要实现基于CAN总线的控制台和个控制节点间的通讯协议。

显示处理和报警模块则实现将数据和时间处理模块的结果进行数码管显示,并控制报警系统。

2.2 节点软件设计此系统包含多个节点,分布在各自需要的位置,每个节点都是通过CAN总线接受主控台控制,处理后得到该节点所控制的每个房间温度极限值。

同时,每个节点配有各自的温度传感器DS18B20,节点系统能够读取该节点的温度值,与该房间的温度极限值进行比较,如果超过极限值则通过控制模块控制发出相应信号。

此信号通过CAN总线将节点位置和相应温度值送往主控制台。

节点软件框图如图6所示。

2.3 CAN接收与发送数据程序发送数据程序把数据存储区中待发送的数据取出,组成数据帧,然后将数据帧发送到CAN控制器的发送缓冲区。

在接收到发送模块发送请求后,发送程序启动发送命令。

数据从CAN控制器发送到总线是由CAN控制器自动完成的。

数据从CAN总线到CAN控制器的接收缓冲区也是由CAN控制器自动完成的。

接收程序只需从接收缓冲区读取数据,并将其存储在数据存储区。

接收和发送数据的中断程序流程如图7、图8所示。

图7 接收数据流程图 图8发送数据流程图3 设计原理本系统主要由三部分组成,分布在现场的节点,即温度检测模块;主控台,是所有节点的控制核心;还有就是连接主控台和各个节点通讯的CAN 总线。

温度检测模块是系统构成的基础与关键,它直接与温度采集机构相连接,实现对温度的检测与控制,如温度超限报警等。

虽然该模块是系统的一个组成部分,但它也可以独立工作,即在系统其它部分停止工作的情况下,自动温度测控模块仍可以独立控制执行机构来实现基本的温度测控功能,提高了系统工作的可靠性。

同时由于系统对主控台的依赖并不是绝对的,因此就降低了各个节点独立工作的风险。

这样就算是由于年久失修使总线失去通讯功能时,温度检测模块仍可根据以前的设定对相应事件做出反应。

系统工作时,首先主控台将各个温度检测点的温度设定值及极限温度设定值通过CAN 总线发送给相应的温度检测模块,各个节点的温度检测模块将接收到的各个设定值保存,这样在不更新设置的情况下,温度检测模块可以脱离主控台而独立工作。

各个节点的温度测控模块与主控台之间通过CAN 现场总线通讯。

与其它网络不同,在CAN 总线的通信协议中,没有节点地址的概念,也没有任何与节点地址相关的信息存在,它支持的是基于数据的工作方式。

即,CAN 总线面向的是数据而不是节点;因此加入或撤销节点设备都不会影响网络的工作,这样的结构十分适用于控制系统要求快速、可靠、简明的特点。

同时,CAN 总线的直接通讯距离最远可以达到10Km ,通过CAN 总线中的中继器可以使通讯的距离进一步延长。

本系统使用的温度采集模块是数字温度传感器DS18B20,它的温度测量范围为-55~+125℃,精度为0.5℃,测量的温度值用9~12位数字表示,最大转换时间为750ms,温度超标报警的上、下限值,DS18B20的转换分辨率均可由用户设定,并能长期保存。

改变了传统温度测量的方法,能在现场采集温度数据,并直接将温度物理量变换为数字信号并以总线方式传送到主控台进行数据处理。

可应用于各种领域、各种环境的自动化测试和控制系统,使用方便灵活,测试精度高,优于任何传统的温度数字化、自动化测控设备。

本系统使用的显示器是数码管。

本系统在设计时主要考虑的是使用CAN总线进行主控制台和各个节点之间通讯控制。

因此在设计时使用的报警器只是用简单的蜂鸣器替代,而在现实应用中则应选择合适的报警器。

不同的报警器有不同的报警方式,因人使用的区别而异。

如果要将此系统应用到实际之中,只需用合适的报警器替代本系统中的蜂鸣器。

实现原理相同,只需稍加改变。

显示部分使用的则是人们日常使用的数码管,它的功耗极低,抗干扰能力强,因而在低功耗的单片机系统中能够得到广泛的应用。

数码管的显示方法是动态扫描方式,通过分时轮流控制各个数码管的的COM端,就使各个数码管轮流受控显示,这就是动态驱动。

在轮流显示过程中,每位数码管的点亮时间为1~2ms,由于人的视觉暂留现象及发光二极管的余辉效应,尽管实际上各位数码管并非同时点亮,但只要扫描的速度足够快,给人的印象就是一组稳定的显示数据,不会有闪烁感,动态显示的效果和静态显示是一样的,能够节省大量的I/O端口。

4 结束语楼宇温度检测系统不仅具有基本的温度测控功能,而且通过CAN总线将分布在各处的节点连接起来,可以在主控台上进行集中监控以及查询和统计等数据的管理,具有结构灵活、集中控制和管理于一体等优点,克服了人工方式控制精度差,劳动强度大,且集中综合管理更加困难等缺点,降低了各种损耗,管理手段实现了现代化。

在本设计方案中硬件电路主要由微处理器、CAN控制器、温度芯片DS18B20、显示数码管、按键键盘、复位电路、蜂鸣器等几部分组成。

单片机AT89S51是硬件电路的核心,承担CAN控制器的初始化、数据收发控制等任务;CAN总线控制器用于同主控台进行远程通讯,能够独立完成CAN总线上数据的接收和发送工作;DS18B20芯片用于检测和发送温度数据。

温度测控模块是系统构成的基础与关键,它直接与温度采集机构相连,实现对温度的检测与控制,如温度超限报警等。

基于CAN总线的智能测温系统具有测量范围广、精度高、环境适应能力强等特点。

该系统通过CAN总线控制器和主控台连接,可以方便地构成分布式测控系统。

此外,该智能测温系统可以应用于其它远距离分布式控制场合,而且该智能测温系统在电力、油田、楼宇、冶金等工业自动化领域也具有广泛的应用前景。

在此,需要说明的是本系统测得的温度误差是DS18B20芯片的测量误差及单片机的处理误差,而系统传输过程中不会增加新的误差,但有时也有可能由于CAN总线协议编写不对,会引起丢失数据现象的情况存在。

本系统基本可以实现对楼宇房间温度的有效检测,达到城市用电高峰时的电能耗主动控制检测。

5.1 主控台原理图5.2 节点原理图6.1 主控台程序#include <reg52.h> #include <intrins.h>#include <can_showdef.h>void CAN_init( void ); // 初始化CAN 总线芯片void CAN_TXD( void );//CAN 发送子函数 void Rxd_deal(void);//接收处理函数 void Txd_deal(void);//发送处理函数 void Delay(uchar delay_time);//延时子函数void fasong();//显示子函数void jieshou();//接收显示子函数 void shezhi();//设置子函数 void bojing(); sbit key1 = P3^0; sbit key2 = P3^1; sbit key3 = P3^3; sbit bao = P3^4; sbit key4 = P3^5; sbit p2 = P2; sbit p22 = P2^2; sbit p24 = P2^4; sbit key5 = P2^6;sbit key6 = P2^7;uchar shi=3,ge=0,shezhishi; //CAN_init();/********延时1MS 函数***/ void delay(uchar x) { uchar i,j;for(i=0;i<x;i++) for(j=0;j<120;j++); }void main(void) {//CPU 初始化 SJA_RST = 0;delay(10);SJA_RST = 1;//CAN 总线复位管脚 SJA_CS = 0;//CAN 总线片选有效 EX1 = 1;//外部中断1使能;CAN 总线接收中断IT1 = 0;//低电平触发IT0 = 1;//脉冲方式触发,外部中断0负边沿触发EX0 = 1;//打开外部中断0EA = 1; //打开总中断SJA_CS = 1;//CAN 总线片选无效,保证数据线上的变化不会影响SJA1000 //CPU 初始化CAN_init( ); //SJA1000初始化,对 SJA1000寄存器的读写是采用外部寄存器寻址方式,所以不需要程序单独控制片选有效无效 _nop_(); _nop_(); while(1) {_nop_();_nop_();////////显示/////////////// if(key5==0) {if( TXD_flag == 1 )Txd_deal();//发送处理程序while(!key5);//按下5键,将设置好的数据发送 fasong(); }if(key6==0) {if( RXD_flag )Rxd_deal();//接收处理程序while(!key6);//按下6键,接收到来的数据jieshou(); }bojing(); }}//***********接收处理函数************ void Rxd_deal(void) {EA = 0;//关闭CPU 中断RXD_flag = 0;Rxd_data = RX_buffer[5];EA = 1;}//*************发送处理函数********* void Txd_deal(void){_nop_();TXD_flag = 0;TX_buffer[5] = Txd_data;// CAN_TXD();_nop_();_nop_();}///中断处理程序//////////////void CAN_RXD( void ) interrupt 2{//接收数据函数,在中断服务程序中调用 uchar data Judge;EA = 0;//关CPU中断IE0 = 0;Judge = IR;if( Judge & 0x01){//IR.0 = 1 接收中断RX_buffer[0] = RBSR;RX_buffer[1] = RBSR1;RX_buffer[2] = RBSR2;RX_buffer[3] = RBSR3;RX_buffer[4] = RBSR4;RX_buffer[5] = RBSR5;RX_buffer[6] = RBSR6;RX_buffer[7] = RBSR7;RX_buffer[8] = RBSR8;RX_buffer[9] = RBSR9;RX_buffer[10] = RBSR10;RX_buffer[11] = RBSR11;RX_buffer[12] = RBSR12;RXD_flag = 1;//置有接收标志CMR = 0X04;Judge = ALC;//释放仲裁随时捕捉寄存器Judge = ECC;//释放错误代码捕捉寄存器}IER = 0x01;// .0=1--接收中断使能; EA = 1;//打开CPU中断}//--------按键中断发送处理---/////////////////////SJA1000 的初始化///////void CAN_init( void ){uchar bdata Judge;uchar ACRR[4];uchar AMRR[4];ACRR[0] = 0x11;ACRR[1] = 0x22;ACRR[2] = 0x33;ACRR[3] = 0x44;//接收代码寄存器,节点1AMRR[0] = 0xff;AMRR[1] = 0Xff;AMRR[2] = 0xff;AMRR[3] = 0xff;//接收屏蔽寄存器。

相关主题