文献标识码:A
文章编号: 0258-7998(2013)07-0021-04
目前,CAN总线系统已经成熟应用在惯性姿态测量系统中,具有很好的实时性和抗干扰能力[1]。虽然CAN协议本身具有较强的检错纠错能力,但在一些特殊应用场合,比如高空长航的工作状态,或受恶劣天气等环境的干扰,以及传输介质损坏等都会严重影响CAN的可靠通信。在要求高可靠性的应用系统中,解决这一问题的有效途径是进行CAN总线冗余设计[2-3]。本文针对浮空器惯性姿态测量系统,基于两片LPC11C24微控制器,设计实现了CAN总线冗余系统。
1 冗余系统设计
典型的CAN总线通信电路主要由微控制器、CAN总线控制器和CAN总线驱动器以及总线4部分组成[4]。基于CAN总线的冗余方法主要从3个环节进行不同程度的冗余:有总线驱动器冗余、总线控制器冗余和全系统冗余3种。3种冗余方法各有优缺点,其中全系统冗余方法可靠度最高[5]。全系统冗余方法由双路CAN通信电路组成,需要的主要器件数为无冗余系统的2倍。传统的惯性姿态测量系统由导航计算机作为微控制器,CAN总线节点设计需要CAN总线控制器、CAN总线驱动器以及相关电平转换芯片。导航计算机属于嵌入式产品,固定在载体的机械结构上,几何形状和质量都一般力求小型化。冗余设计器件数的增多不但会增加系统的成本和容量的开销,而且使系统的构成较复杂,也可能会引来新的错误。
本文选用LPC11C24微控制器来设计CAN总线冗余系统,其基本架构如图1所示。LPC11C24是恩智浦(NXP)公司近年推出的一款Cortex-M0微控制器,内嵌易用型片上CAN驱动,集成了高速CAN物理层收发器TJF1051,在低成本LQFP48封装中实现了完整的CAN功能。LPC11C24的成本低、集成度高,是兼容CAN 2.0B的LPC11C00系列控制器的新成员之一,可为恶劣环境下的应用带来最佳性能[6]。基于LPC11C24的CAN总线冗余设计能充分利用该款芯片的优势,减少导航计算机的电气互连,节省50%以上的电路,从而提高了整个系统的可靠性。
2 系统硬件设计
本文惯性姿态测量系统导航计算机采用DSP+FPGA架构,DSP主要实现导航姿态的实时解算和系统控制,FPGA集成系统所有的接口功能,包括CAN通信接口。CAN总线冗余系统是基于两路LPC11C24最小系统来实现的,两片LPC微控制器以主-从模式工作。其在导航计算机中的基本设计原理如图2所示。
DSP输出的主要是导航姿态信息,接收的信息主要是IMU数据、外部传感器(GPS、磁强计等)数据以及相关指令信息。CAN通信模块搭建在FPGA上,通过FPGA与DSP进行数据交互,数据信息在FPGA内部寄存器中缓冲。这样的设计减少了DSP对外开销,保证了导航姿态的实时解算以及与人机交互低速数据的匹配。FPGA与LPC微控制器的主要连接如下:
(1)数据线D0~D7:8根数据线,用于完成FPGA与LPC的数据交互。
(2)地址线A0~A4:5根地址线,最大数据交互的字节数不应超过32,若超过,则需增加地址线。
(3)信号控制线:读控制信号CAN_RE、写控制信号CAN_RE、数据发送准备完成信号CAN_RDY以及复位信号CAN_RST。
两LPC微控制器共用数据线D0~D7和数据发送准备完成信号线CAN_RDY,数据线和地址线通过GPIO口实现。数据发送准备完成后,同时触发两LPC微控制器INT,INT通过定时器捕获外部事件中断来实现。复位信号由FPGA产生一个低电平实现,读写控制信号在FPGA与CAN通信数据交互过程中分别有效。
实现CAN通信功能还需搭建LPC微控制器最小系统。LPC最小系统主要包括供电电源、外部时钟和调试接口。LPC微控制器所需电压3.3 V由导航计算机电源模块提供。本文采用12 MHz外部时钟给系统提供基准时钟。由于LPC1100系列Cortex-M0不再支持JTAG调试模式,所以调试接口采用SWD串行调试模式。两总线输出之间连接EMI滤波器,滤除总线上的高频干扰。此外,两LPC之间有两交互信号,分别为EN0和EN1,EN0是发出故障切换信号,EN1是接受处理信号,或称之使能CAN通信信号。工作过程中,使能一个CAN的同时禁用一个CAN。
3 系统软件设计
CAN总线冗余系统采用两条完全独立的CAN总线,实现系统的物理层和数据链路层全面冗余。
系统上电复位后,初始化两路 CAN 总线;一路CAN总线中断开启,处于正常运行状态,另一路CAN总线中断关闭,处于备用状态;系统采用兼容两种触发方式的报文分配方式,将传输报文分为周期传送报文(时间触发)与非周期传送报文(事件触发),其中导航姿态信息为20 ms周期报文,控制报文为非周期报文。惯性姿态测量系统平时不输出任何报文,当控制报文控制其启动后才按照总线调度策略进行输出,完成导航测姿功能。CAN总线冗余系统设计主要实现两部分功能:一为单路通信程序设计,二为双路总线切换设计。冗余系统的工作流程如图3所示。
3.1 单路CAN通信程序设计
CAN节点通信过程主要包括系统初始化、CAN报文接收、CAN报文发送和CAN中断处理等。其中系统初始化主要包括系统配置初始化、管脚初始化、定时器初始化以及CAN模块初始化等。LPC11C24微控制器中包含了C_CAN片上驱动,片上驱动程序存放在引导ROM中,并通过定义好的API向用户应用程序提供CAN初始化和通信特性[7]。下列几个常用的函数包含在API中,其调用实现如下:
(1)CAN控制器的初始化是在基于寄存器的阵列值上实现的,这些值通过指针来进行传递。CAN初始化调用范例如下:
void CAN_init()
{
ROM **rom =(ROM **)0x1fff1ff8;
uint32_t CanApiClkInitTable[2] = {
0x00000000UL, //晶振时钟分频数
0x00007EC3UL };//位定时寄存器配置7EC3:24;
//CAN通信速率为500 kb/s
(*rom)->pCANAPI->init_can(&CanApiCanInitTable
[0]);
}
(2)CAN发送函数允许设置报文对象,并可在总线上触发CAN报文的传送;报文编号随着每一次通信而增加,而且可用于监控引入的信息。当超过255时,信息代码会归零。这使得网络中的任意节点可以通过报文编号来测定报文的进程和正确的顺序,以进行检查。发送函数如下:
void CAN_send( )
{
msg_obj.msgobj = 2;//报文对象
msg_obj.mode_id= 0x001UL;//报文对象编号
msg_obj.mask = 0x0UL;//不屏蔽任何ID
msg_obj.dlc = 1;//数据长度
msg_obj.data[0] = 0x00;
(*rom)->pCAND->can_transmit(&msg_obj);
}
(3)CAN接收函数在调用之前,必须在结构体中设置要被读取的报文对象的编号,这样指向报文对象结构的指针会被传递到接收函数中。其实现如下:
void CAN_receive( )
{
msg_obj.msgobj = 1;
(*rom)->pCAND->can_receive(&msg_obj);
}
(4)用户应用程序必须为CAN中断提供中断处理程序才能处理CAN事件,调用回调函数,并根据CAN总线上接收到的数据和检查到的状态采取相关的操作。CAN中断处理程序调用如下:
(*rom)->pCAND->isr();
(5)CAN API支持各种事件的回调函数,包括报文发送、报文接收和错误处理等。回调函数通过API函数来发布,CAN中断处理程序会按照中断级别来调用CAN回调函数。注册回调表如下:
const CAN_CALLBACKS callbacks =
{
CAN_rx,
CAN_tx,
CAN_error,
};
3.2 双路CAN总线切换设计
双CAN总线冗余采用热备方式运行。一个CAN控制器作为系统上电后默认的CAN,另一个为系统的备用CAN。系统正常工作时,投入运行的CAN称为主CAN,另一路称为从CAN。当主CAN发生故障时,从CAN总线投入运行。系统运行时,要求两路CAN控制器处于热备状态,经初始化后都随时准备接收信息,但是在一个时间点上,系统中有且仅有一路CAN通道在工作,另一路处于监听状态(正常工作时)或故障状态(发生故障时)。实现CAN总线系统的全面冗余,主要解决总线故障的自动检测和总线的切换问题。
CAN2.0协议中规定节点处于错误激活态、忽略错误态、脱离总线态3种状态之一[8]。总线正常工作时处于错误激活状态,利用CAN总线控制器的故障界定机制可以判断总线错误。硬件初始化后错误计数器为0,控制器检测到错误后将发送/接收错误计数器的值递增。当发送或者接收错误计数值大于127时,总线状态为忽略错误态,可能的原因是CANH、CANL断开;当总线发送或者接收错误计数值大于255时,总线状态为脱离总线态,可能的原因是CANH与CANL短路,或者CANH与地短路,或者CANL与电源短路。在错误状态发生时,需立即执行总线切换操作。
系统运行时,如两路CAN(CAN0和CAN1)都运行良好,则选取CAN0作为默认主CAN,CAN1处于关闭状态,等待CAN0发出的使能信号,从CAN则随时备用。当主CAN发生错误状态时,读取错误状态寄存器,同时触发CAN1使能引脚,CAN1给出响应并禁用CAN0,响应完毕后,开启CAN1,两CAN主从模式切换。CAN0处于故障状态,等待修复,若修复完毕,即可作为从CAN备用,在下一次出现故障时由CAN1给出使能信号启动;若没有及时修复,则系统处于无冗余状态,若再次出现故障,则禁止系统运行。
4 测试与验证
要验证本文设计的CAN总线冗余系统的有效性,需搭建测试平台进行实验。实验软件环境包括TKScope嵌入式智能仿真开发平台、ZLGCANTset监测软件以及串口调试助手等。硬件环境包括AK100仿真器、USBCAN模块以及基于导航计算机的双LPC组成的CAN冗余电路等。实验过程主要是对单路CAN通信功能和双路冗余功能进行测试。
(1)单路CAN通信功能测试。单路CAN通信的功能测试主要包括CAN的收发,以及I/O口的中断、数据交互等。为了便于调试,隔离开导航计算机中DSP模块,采用上位机串口进行模拟。首先由上位机串口模拟发送导航姿态信息,周期为20 ms,FPGA收取数据至内部缓存器,然后由LPC读取并发送至CAN总线上。同样,CAN模块可以接收总线上的报文信息,产生中断读取并转发至上位机串口显示。测试过程中, CANTest监测软件收发和串口调试助手发收数据一致,表明CAN通信正常。
(2)双CAN冗余功能测试。冗余功能测试是在完成了单路通信测试而且双路CAN通信都能独立正常工作的基础上进行的。实验过程中,需增加一个USBCAN模块。首先,系统上电正常工作时,只有CAN0处于运行状态,而且其基本通信功能正常,CAN1总线处于关闭状态;手动断开CAN0总线,CAN1总线启动,CAN0总线关闭;接好CAN0总线,手动断开CAN1总线,CAN1总线关闭,CAN0总线恢复。图4给出了在CAN模块发送数据过程中,CAN0总线发生故障时,数据切换到CAN1总线上的情况。实验测试过程中,主CAN出现故障,能及时切换到从CAN运行,有较强的容错性。
采用双LPC设计实现的CAN总线冗余系统节约了导航计算机的成本和空间的开销,而且开发过程中充分利用了LPC控制器片上CAN驱动模块中的API函数,缩短了开发周期。CAN总线冗余系统的设计增强了系统对环境的应对能力,有效提高了浮空器惯性姿态测量系统可靠性。
参考文献
[1] 宋凝芳,任磊,林恒,等.光纤陀螺捷联航姿系统CAN总线设计[J].中国惯性技术学报,2008,16(1):16-19.
[2] 杜倩倩.双冗余CAN总线模块研制[D].哈尔滨:哈尔滨工业大学,2011.
[3] 禹春来,许化龙,刘根旺,等.CAN总线冗余方法研究[J].测控技术,2003,22(10):28-30.
[4] 莫传孟.CAN总新冗余通信在机车控制系统中的应用研究[D].成都:西南交通大学,2003.
[5] 汤宜涌,王传德.CAN总线冗余系统的研究及可靠性分析[J].中原工学院学报,21(5):73-75.
[6] LPC11Cx2/Cx4 Product data sheet(Rev.2-3)[M].广州周立功单片机公司,2010.
[7] LPC11C1x系列微控制器用户手册(Rev.00.13)[M].广州周立功单片机公司,2010.
[8] 汪孟寅,高明煜.基于STM32F105微控制器的双CAN冗余设计[J].杭州电子科技大学学报,2011,31(2):9-12.