技术频道

基于μCOSⅡ的CAN总线车身控制系统

摘要:给出基于μCOSⅡ操作系统的CAN控制器SJA1000智能节点在某品牌商务车车身控制系统中的应用,简述其硬件电路和软件的结构框图,并对设计中的难点及实现过程中应注意的问题进行介绍。
0 引言
  由于车身系统线路复杂,且很多动作都存在相互的关联性,必须对所有关联性作出非常周密的考虑,才能真正实现汽车车身的全部安全控制功能。随着汽车工业的发展和汽车功能的增强,这种情况将更突出,一方面给电路设计人员带来困难,同时又增加成本和给生产、检修带来麻烦,反过来又限制汽车工业的发展。正是在这种情况下,德国Bosch公司为解决现代汽车中众多的控制与检测仪器之间的数据交换而开发了一种通讯协议即现场总线CAN。在国外,尤其在欧洲,CAN网络已被广泛地应用在汽车上如BENZ,BMW,PORSCHE等车,而在国内CAN在汽车上的研究才刚起步。
  μCOSⅡ操作系统平台一方面具有足够的安全性与稳定性,已得到美国联邦航空管理局对用于商用飞机的,符合RTCA DO—178部标准的认证;另一方面它的多任务运行使CPU的利用率达到最高,并使应用程序模块化,不仅使程序开发人员可以将很复杂的应用程序层次化,更易设计和维护,同时很容易实现汽车功能的扩展和移植到其它型号的汽车上。
1、汽车车身系统的介绍
  某品牌商务车车身系统的控制对象有:4个门锁、两个车窗玻璃升降器、行李箱锁、除霜加热器、电动后视镜,前后大灯、小灯、转向灯、危险灯、雾灯、牌照灯、车内阅读灯、车厢顶灯等。在具备遥控功能的情况下,还包括对遥控信号的接收处理和防盗系统的控制。
1.1 节点分配
  车身系统控制单元按位置可分为左门节点,右门节点,车身前节点,车身后节点,仪表节点,主节点。CAN总线拓扑结构如图1所示:

1.2 节点功能
  左/右门节点检测与控制对象有:集控锁的位置检测与控制,电动后视镜上/下、左/右电机的正反向驱动控制,电动车窗玻璃上/下电机的正反向驱动控制,侧方向灯闪烁驱动控制,各自门锁控制开关及玻璃升降开关位置检测,除以上左右门均有的检测与控制对象外,左门上还有右门车窗玻璃点动/自动控制开关、左右电动后视镜上/下、左/右控制开关位置检测。各个控制对象的故障检测和处理。
  前节点对前大灯、前小灯、前雾灯、前转向灯、冷却风扇电机、前雨刮器电机等对象的控制、驱动、故障检测及对少量开关量的检测和处理。
  后节点对后小灯,后雾灯,后转向灯,制动灯,倒车灯,牌照灯,车厢顶各灯以及除霜加热器等对象的控制、驱动、故障检测及少量开关量的检测和处理。
  主节点是整个车身控制系统的中枢,负责和其它各个节点进行数据通讯并作消息处理。各子节点将检测到的各种量(开关量和模拟量)处理后打包成含有各种所需信息的报文(即消息 )发送给主节点 ,主节点根据报文所含的信息作相应处理(包括逻辑关系处理)后再打包成消息发送给子节点执行。CAN总线通讯采用广播模式,即子节点的报文只有主节点接收(点对点模式),主节点的报文所有子节点均接收。主节点除了作为系统的中枢功能外,还和其他节点一样负责对汽车驾驶台前所有开关的状态进行检测,并对驾驶台的所有背光灯(如开关、仪表等)进行PWM调光驱动。
  仪表节点:该节点不参与汽车车身控制但它是人与车交流的界面。仪表指示各传感器产生的脉冲量(发动机转速传感器、车轮转速传感器)和模拟量(油量传感器、水温传感器)所对应的物理量。还有液晶显示日期、大里程和小里程、转速、油量、倒车雷达的测距等,以及语音提示功能。
2、节点电路设计
  在进行硬件电路的设计时,充分考虑了汽车安全、节能、可靠性的要求。根据当前市场、开发工具和课题的实际需要,系统全部节点均以PHILIP P89C668HFA单片机为核心,它含有8K的RAM,足以保证运行μCOSⅡ操作系统。
2.1 硬件通讯可靠性的设计
  选用SJA1000作为CAN控制器,其内部具有64位缓冲器,对总线具有一定的缓存能力。使用CAN控制器接口芯片82C250,它最初为汽车的高速通信应用而设计的,该芯片提供CAN总线的差动发送和接收能力,并具有抗汽车环境下的瞬间干扰,保护总线的能力,可以通过调整CAN总线上通信脉冲的斜率来降低射频干扰。
2.2 硬件节能的设计
  在汽车中电路设计首先要考虑各器件的耗电量。驱动芯片选用MOTOROLA系列的汽车专用芯片,它除能够满足汽车上各个设备的需要并具有对短路,断路,过流,过热等故障进行检测、诊断和保护的功能外,而且其芯片静态电流很小,如MC33288静态电流小于10μA。另一方面要充分考虑控制电路板的电源消耗,除了主节点运行外,其余各节点在汽车停放时,通过主节点控制各节点的DC-DC的使能端切断控制电源,在汽车启动时,再通过主节点控制各节点的DC-DC的使能端使其正常运行。
2.3 CAN电源的设计
  汽车车身比较大,CAN电源和通讯的线路都比较长,为防止车身震动和电源电压波动,影响CAN通讯,车身前节点和车身后节点上各通过DC-DC芯片把12V直流电源整流成5V,并联作为CAN电源使用。其节点的硬件设计很相似,图2是前节点的硬件结构图。
2.4 开关量检测电路设计
  汽车所有开关量,通过I2C总线用8574芯片扩展的I/O口进行检测,同时把一个节点上的所有8574芯片的INT引脚和P89C668的INT1(中断1)线相连, CAN总线的中断是利用CPU的INT0(即外部中断0)。


3、系统软件设计
  整个系统的软件可分为编译软件、上位机的软件和系统节点软件三个部分。
3.1 编译软件
  主要是把用汉字书写的汽车上各个器件的逻辑关系(规则式),(例如: [<变光开关:近光]&[<灯光开关:大灯]==[>前照灯:远光] &[Delay:5s]&[>前照灯:灭]),根据具体的CAN协议和μCOSⅡ嵌入式操作系统所定义消息的要求编译成单片机能认识的代码,从而保证了程序的兼容性和有利于汽车功能的扩展,同时也可以移植到其它型号的汽车上。
3.2 上位机的软件
  主要是通过USBCAN适配卡对CAN总线传递的报文进行监听,这样对整个CAN上的设备和装置可以起到较好的监控作用,以便能方便地进行系统调试。
3.3 系统节点软件软件
  主程序基于μCOSⅡ嵌入式操作系统实现多任务实时控制。各节点采集,检测各自的数字量,模拟量,脉冲量,以CAN协议的格式形成报文(即消息)发送到总线上,同时根据需要对多个设备对象进行就地实时控制和监视。通信软件是系统节点软件的关键部分,采用CAN2.0B通讯协议。通信软件有3部分组成:主程序,初始化程序,发送程序和接收程序(即中断0处理程序)。以下是基于μCOSⅡ嵌入式操作系统的简单框架和部分程序。

3.3.1 主函数
  OSInit()和OSStart()是μCOSⅡ操作系统提供的源代码,OSMboxCreate() 和OSTaskCreate()是μCOSⅡ操作系统分别用来产生邮箱和任务的函数[4]。
void main(void)
{
INTInit (); // 开通CPU的中断;
CanInit(); //SJA1000的初始化;
OSInit(); //μCOSⅡ操作系统的初始化;
Timer0Init (); //定时器0的初始化;
MBoxPro=OSMboxCreate((void *)0); //创建存放从CAN上接收到的数据(消息)的邮箱;
MBoxSend=OSMboxCreate((void *)0); //创建存放所要发送数据(消息)的邮箱;
OSTaskCreate(TaskCanSend, (void *)0, &TaskCanSendSTK[0],7);
//创建发送CAN数据的任务;
OSTaskCreate(TaskMsgPro,(void*)0,&TaskProSTK[0],20);//创建处理消息的任务;
OSStart(); //启动μCOSⅡ操作系统;
}
3.3.2 初始化程序
  初始化程序通过将CAN控制器的寄存器写入控制字,确定CAN的工作方式。用P2.7作为选通信号与SJA1000的CS引脚相连,SJA1000的片内寄存器和P89C668单片机寄存器是重叠编址的,因此SJA1000寄存器寻址时要定义成片外RAM寻址。
CanInit(void)
{ MODE = 0x09; //进入复位模式,对SJA1000进行初始化;
CDR =0x88; //选择PeliCan;
CMR = 0x0C; //清除数据溢出和释放接收缓冲器;
IER = 0x03; //开放接收中断和发送中断;
ACR0 = 0x66; //根据具体的协议定义;
ACR1 = 0x66; //根据具体的协议定义;
ACR2 = 0x66; //根据具体的协议定义;
ACR3 =0x66; //根据具体的协议定义;
AMR0 = 0x00; //根据具体的协议定义;
AMR1 = 0x00; //根据具体的协议定义;
AMR2 = 0x00; //根据具体的协议定义;
AMR3 = 0x07; //低三位SJA1000是保留位,设置为无关;
BTR0 = 0x02; //12MHz晶振下,设置波特率为100kbps;
BTR1 =0x2F;
OCR=0XAA;
EWLR =0x60;
RBSA = 0x00; //RX缓存器起始地址寄存器设置为0;
TXERR= 0x00;
ECC =0x00; 
MODE= 0x08; //单向滤波方式,进入正常模式;
}
3.3.3 发送任务程序
  要发送的报文的数据为两个字节。
void TaskCansend(void *scddata) reentrant
{ INT8U err;
unsigned char xdata *ptbuf;//SJA1000的寄存器定义成片外RAM;
unsigned char i,status;
StrYz *MesNeedSend; //邮箱接收报文的格式,为结构体;
scddata=scddata;
for(;;){
//不断等待发送邮箱MboxCanSend是否有要发送的报文,若有报文则执行发送任务。
MesNeedSend=(StrYz *)OSMboxPend(MBoxSend,0,&err);
ptbuf=0x7f10;
status=SR;
if ((status&0x10)==0x10) return ;
if ((status&0x08)==0x0) return ;
if ((status&0x04)==0x0) return ;
for(i=0;i<=4;i++)
{
*ptbuf=SjaTran[i]; //发送1个字节的报文帧信息和4字节的报文ID码;
ptbuf++;
}
*ptbuf=Val ; //发送的消息即报文:第一个字节;
ptbuf++;
*ptbuf= ID; //发送的消息即报文:第二个字节;
CMR=0x01;
return ; } }
3.3.4 接收中断服务子程序
  SJA1000报文的接收有两种方式:中断接收方式和查询接收方式。鉴于对汽车通讯的实时性要求很强,因此采用中断接收方式.当SJA1000接收缓存器满时,其内部接收中断标志位置位,并使得CPU的外部中断INT0为高电平,产生中断。因中断比μCOSⅡ操作系统的其它任务优先级高,则μCOSⅡ操作系统立即响应并进行保护现场和任务调度,进入下面的CAN中断接收程序,当执行完后,恢复现场,进行任务切换。鉴于每次发送一个帧数据(含有消息),为了防止一个开关动作而发送几个消息(非连续发送),根据SJA1000的机理,每接收一次释放一次,如果当前的消息没有及时地发送到要处理消息的邮箱MsgPro,从而造成当前的消息被后来的消息覆盖,因此在CPU开辟一段RAM空间作为缓存区即StrYz StrCanRE[10],来保存要处理的消息,这也是实现可靠通讯的需要。
StrYz StrCanRE[10];
INT8U IStrCanRE=0;
void TaskCanRec(void) reentrant
{ unsigned char status;
unsigned char xdata * prbuf; //定义指向SJA1000寄存器的指针;
status=SR; //读状态并去SJA1000的中断标志位;
status=status&0xC3;
if(status!=0)
{ if((status&0x80)==0x80) { MODE=0x00;return;}
if((status&0x2)==0x02) {CMR=0x0C;return; }
if((status&0x01)==0x01 )
{ if((*prbuf & 0x40)==0x40) CMR=0x04; //是否远程祯;
else { ptbuf=0x7f15; //接收后两个字节的数据(消息);
StrCanRE[IStrCanRE].Val=*ptbuf; //接收第一个字节数据;
ptbuf++;
StrCanRE[IStrCanRE].ID=*ptbuf; //接收第二个字节数据;
CMR=0x04;
//把从CAN总线上接收到的消息发送到要处理消息的邮箱MsgPro;
OSQPost(MBoxPro,(void * )&StrCanRE[IStrCanRE]);
IStrCanRE++;
if( IStrCanRE >= 10 ) IStrCanRE = 0;
}} }
return;
}
4、结束语
  总之,就像汽车电子技术在20世纪70年代引入集成电路、80年代引入微处理器一样,90年代直到21世纪初总线技术在汽车电子技术中将是一个重要的里程碑。目前国内还没有自主产权的CAN总线技术在汽车工业中应用,但是许多高校和科研单位都在加紧这方面的研究和开发。本文在这一领域做了有益的探索和大胆的尝试,实践证明,CAN技术是成功的。它必将以其低成本,高可靠性及灵活的通讯方式推动我国汽车工业的发展。


文章版权归西部工控xbgk所有,未经许可不得转载。