11921|2

1148

帖子

0

TA的资源

纯净的硅(高级)

楼主
 

基于CAN总线的分布式控制网络设计 [复制链接]

一、引言

    目前,工业机器人的控制系统一般分集中式控制和分布式控制。集中式控制系统过分依赖主控计算机,一旦主控计算机出现故障,整个控制系统将会瘫痪,系统可靠性低;分布式控制系统在适用范围、可扩展性、控制速度、系统模块化、可维护性、抗单点故障等方面具有明显优势,是极佳的选择。

    CAN总线最初被设计作为汽车环境中的微控制器通信,形成汽车电子控制网络。因其卓越的性能、极高的可靠性、独特灵活的设计和低廉的价格,现已广泛应用于工业现场控制、机器人、医疗仪器、环境监控等众多领域。

    与以往RS- 485等工业控制总线相比,CAN总线具有如下优点:

    (一)实时性高

    多主站工作方式,优先级高的节点先传输数据,较高的数据传输率(1 Mb/s);

    (二)检错和纠错机制强

    发送信息损坏自动重发,采用独特的非破坏总线仲裁技术,具卜有CRC及其他校验;

    (三)连接简单,可扩展性强

    通信协议与开放系统互连(OSI)模型一致,应用层协议可由用户自己定义。

    本文设计了基于CAN总线的分布式控制网络,开发了相应的软硬件,并成功应用于863攻关项目“自治水下机器人”的控制系统。 

二、CAN总线控制网络总体结构

    网络拓扑、传输控制、通信方式和传输介质是局部网络的4大要素。分布式控制系统使用得较多的网络拓扑结构有星型、环形和总线型3种。

    星型结构(中央控制型结构)中所有通信都经由中央控制节点。该结构组成简单、造价低廉,类似集中式控制;缺点是中央控制节点有故障时,整个系统就会瘫痪。

    环型结构中相邻控制节点顺序链接,形成环路结构,信息一般仅以一个方向在环上从源节点传送到目的节点。发生故障时可支持双向传输,但环路一般封闭,不利于节点的扩充。

    总线型结构的所有节点都共享一个公共的物理通道(即总线)。具有延迟小、速度快、易扩展、单个节点故障影响小的优点。本系统即采用总线型拓扑结构,其控制网络框图如图1所示。




    系统采用单片机作为控制单元完成机器人控制系统中的各种控制任务(如传感器控制、电机驱动器控制和通信模块控制等)。各功能单元直接挂接在CAN总线上,成为控制网络中的一个节点,从而构成多主机结构,即每个节点均为一个主机,通过CAN通信协议协同完成控制任务。 

 在图1中,将CAN总线的分布式控制网络应用于水下机器人中。总线上各节点完成不同的任务和功能,它们大部分时间并行工作,必要时通过CAN总线与其他节点进行通信。2 CAN总线控制器设计

    CAN总线上各节点采用Philips公司生产的单片机P87 C591,除完成节点自身的控制功能外,还实现了CAN通信接口。

    P87 C591兼容80C51指令集,并成功地集成了Philips公司的SJA1000 CAN控制器,该嵌人式CAN控制器具有以下特点:

    1.完全符合CAN 2.0规范,控制CAN帧的接收和发送;

    2.CAN接口包含5个实现CPU与CAN控制器连接的特殊功能寄存器;

    3.CAN控制器的发送缓冲区能够保存一个完整的CAN信息帧(扩展或标准帧),通过CPU启动发送,信息就从发送缓冲区传输到CAN内核模块;

    4.当接收一个信息时,CAN内核模块将串行数据流转换成并行数据传输到验收滤波器,通过该可编程滤波器,P87 C591确几认接收需要的信息。

    图2为以P87 C591为核心的CAN总线接口电路。P1.0、P1.1分别对应CAN的收(RxDC)和发(TxDC)线。




    CAN总线收发器选用Philips公司的PCA82C250,以差分方式发送。引脚8与地之间的电阻为斜率电阻,其取值决定了系统处于高速方式、斜率控制方式或待机方式。本系统中PCA82C250工作于斜率方式,通过Rs对地连接的电阻对总线进行斜率控制,以控制射频干扰。使用双绞线作为传输介质。

    通过高速光耦6N137将P87 C591与CAN总线收发器进行光电隔离,以增强CAN总线节点的抗干扰能力。

    总线末端加124Ω的终端匹配电阻,以减少信号反射干扰。 

 三、CAN应用层协议

    CAN协议是建立在国际标准化组织的OR模型基础上的,其模型结构只有3层,即底层物理层、数据链路层和应用层。在CAN 2. 0规范中,只对物理层和数据链路层作了规定,用户需要根据自己的需求制定应用层协议。本文以机器人控制系统为应用对象设计其应用层通信协议。




    在机器人控制系统中,CAN总线上传输的信息一般可分为以下3类:

    1.传感器数据信息。由数据采集节点发送到总控制节点和执行控制节点,包含机器人正常运动所需要的传感器信息,传输数据量最大。

    2.运动控制命令。由控制节点发送到执行控制节点。依据机器人时间常数和要求的响应速度,在不同的机器人中,运动控制命令的发送频率差异较大。

    3.紧急命令。由总控制节点发送至执行控制节点。例如出现紧急情况需要停机、切断电源等。此类命令不定时发送,需较高的优先权。

    本系统中,在CAN 2.0标准帧格式的基础上,根据机器人控制系统的需求特点,制定了一个多帧传输的应用层协议。协议中,将11位信息标识符按图3进行分配。 

按照对信息优先权的影响(由大到小),本协议将CAN标识符依次划分为信息功能标识、多帧标识和目的地址。信息功能标识为ID28 --ID26,可将信息分为8种类型。在机器人的各节点通信时,可为运动控制命令、传感器数据、紧急命令等信息赋予不同的信息功能标识,从而使它们具有不同的优先权。

    标识符ID25用来区别单帧传输和多帧传输;标识符ID24 - ID21定义为信息目的地址。这样,可以按优先权由高到低,从低向高为节点分配地址,以保证总线竞争中优先权高的节点能更先占有总线。标识符分配中,一般保留一个地址作为广播地址,另外不使用地址15,以避免标识符前7位全为隐性位(逻辑1)。因此,协议可满足不多于14 Byte的需求。

    标识符ID20-ID18为帧类型,可以表示8种帧类型,目前并没有用完,只定义了多帧传输中的结束帧、多帧传输中的非结束帧和广播帧3种帧类型。

    CAN2. 0标准帧的数据域仅包含8 Byte,为了实现多帧传输,除使用ID25作为多帧标识外,同时使用数据域第一字节的低半字节存放多帧传输序列标识,4位序列标识可以为16个CAN帧编号。因数据域第一字节被占用,所以一个CAN帧最多携带7 Byte有效数据,向上层软件提供长度不超过112 Byte的透明数据流传输。在进行多帧传输时,多帧标识应置为0,以获得比单帧数据传输更高的优先权,从而减少多帧数据传输被其他数据帧打断的机会。

    最后,协议将CAN帧源地址放在数据域的第一字节的高半字节。
四、CAN通信软件设计

    结合CAN总线协议的模型结构,根据软件分层思想,将CAN通信软件分为CAN总线初始化模块、报文接收模块、报文发送模块和错误处理模块。将各种基本的CAN通信功能模块设计成接口函数,以便应用时直接调用。CAN总线软件结构模型如图4所示。




    CAN总线初始化包括操作模式的设置、验收滤波器的设置、总线定时的设置及中断的设置等。验收滤波器的设置决定了本节点所接收的信息的格式;定时器用来设置CAN总线上数据传输的波特率。

    报文的接收可以采用查询方式或者中断方式,本系统采取中断方式。中断函数中首先将接收到的CAN帧放人缓冲区,根据各种标识、源地址和序列标识,将CAN帧中的数据重新组合,最后将数据插入队列,其他程序只需操作队列即可。例如,可以在程序主循环中读取队列,并根据其中的命令或数据执行相应的操作或运算。

    CAN总线本身提供了较完善的总线仲裁、错误检测和故障界定等功能,所以发送程序的设计比较简单。将发送报文写人发送缓冲器,并置位“发送请求”即可。错误处理模块中,通过在CAN中断服务函数中读取中断寄存器(IR),判断CAN总线是否有错误发生。各节点对通信错误的处理各异,就一般节点,可通过重新初始化CAN控制器来恢复CAN通信。

    将本文所述的CAN总线控制网络应用于自主开发的小型自治水下机器人中,已先后两次完成湖试。图5和图6分别为无缆自治航行试验中的使命航迹图和实际航迹图。

此帖出自汽车电子论坛

最新回复

新手第一次看到应有程序,谢谢  详情 回复 发表于 2009-6-12 17:40
点赞 关注

回复
举报

2

帖子

0

TA的资源

一粒金砂(初级)

沙发
 

调试好的can(汇编及C语言)程序

调试好的can(汇编及C语言)程序,与大家分享! //************************************程序功能*************************************************** //节点1向CAN节点2发送数据,数据的头两个字节分别是:节点1的ID和要求节点2回复的数据长度 //节点2收到节点1的信息后,立即按照节点1的要求回复数据 //************************************************************************************************ #include #include //SJA存储器定义头文件 #include //SJA子程序文件 #include //显示头文件 #include //字符串函数 //***************************头文件***************************************************// void Init_Cpu(void); //初始化单片机 void Sja_1000_Init(void); //初始化SIA //************************************************************************************ bit s; //配置sja标志 bit flag_send; //发送命令标志 unsigned char data a[5]={0x05,0x05,0x05,0x05,0x05}; //显示"5" unsigned char b[5]={0x12,0x12,0x12,0x12,0x12}; //显示"p" unsigned char c[5]={0x01,0x01,0x01,0x01,0x01}; //显示"1" unsigned char data send_data[10],rcv_data[10]; //发送和接收数组 unsigned char bdata flag_init; //保存中断寄存器值 unsigned int count_k; //延时记数用 sbit rcv_flag=flag_init^0; //接收中断标志 sbit err_flag=flag_init^2; //错误中断标志 //***********************************************************************************// void main(void) { s=0; //配置sja1000出现错误时,重新初始化 do{ Sja_1000_Init(); }while(s!=0); Init_Cpu(); //initialize mcu flag_init=0x00; //保存中断寄存器值清零 while(1) { if(rcv_flag) //if there is receive interrupt { rcv_flag=0; //接收标志位清零 BCAN_DATA_RECEIVE(rcv_data); //接收数据 BCAN_CMD_PRG(RRB_CMD); //释放接收缓冲区 flag_send=1; //发送命令置位 } if(flag_send) { flag_send=0; //发送位清零 send_data[0]=rcv_data[2]; //接收到的"发送方ID10~ID3" send_data[1]=rcv_data[3]; //接收到的"发送方ID2~ID0"和要求的数据长度 send_data[2]=0x88; send_data[3]=0x89; BCAN_DATA_WRITE(send_data); //发送数据 BCAN_CMD_PRG(TR_CMD); //置位发送请求位 for(count_k=0;count_k<200;count_k++) display(a); //延时显示"5" } if (err_flag) //错误中断 { for(count_k=0;count_k<280;count_k++) display(c); //错误显示"1" err_flag=0; //错误标志位清零 Sja_1000_Init(); //初始化SJA } display(b); //显示"p" } } void ex0_int(void) interrupt 0 using 1 //外部中断0 { SJA_BCANAdr=REG_INTERRUPT; //指针指向中断寄存器 flag_init=*SJA_BCANAdr; //保持中断寄存器值 } void Init_Cpu(void) //单片机初始化,开放外部中断0 { PX0=1; EX0=1; EA=1; } void Sja_1000_Init(void) { s=BCAN_CREATE_COMMUNATION(); //SJA自测 s=BCAN_ENTER_RETMODEL(); //进入复位 s=BCAN_SET_BANDRATE(0x04); //设置波特率100K/S s=BCAN_SET_OBJECT(0xaa,0x00); //设置地址ID:550 s=BCAN_SET_OUTCLK(0xaa,0x48); //设置输出方式,禁止COLOCKOUT输出 s=BCAN_QUIT_RETMODEL(); //退出复位模式 SJA_BCANAdr=REG_CONTROL; //地址指针指向控制寄存器 *SJA_BCANAdr|=0x1e; //开放错误\接收\发送中断 } 本人同时提供can实验开发板给初学者 1 CAN控制器为SJA1000,驱动器为TJA1050,电源隔离; 2 提供详尽的源程序,可根据用户需求编写程序 联系我: QQ: 531706356
此帖出自汽车电子论坛
 
 

回复

4

帖子

0

TA的资源

一粒金砂(中级)

板凳
 
新手第一次看到应有程序,谢谢
此帖出自汽车电子论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表