汽车ECU 标定系统CCP 软件的实现
关键字:CCP 协议 CAN 总线 标定系统
摘要:CCP 协议是一种CAN 总线标定匹配协议。本文简单介绍该协议的基本原理,以及一种基于该协议的汽车ECU 标定系统的实现方法。最后,结合MC9S12DP256 芯片以及μC/OS-II操作系统,详细讨论了此标定系统的CCP 软件实现方法。
1 前言
标定是指根据整车的各种性能要求(如动力性、经济性、排放及辅助功能等),来调整、优化和确定整车上各ECU(包括发动机和各子系统 ECU)的运行及控制参数的控制算法。通过标定系统,能够很方便的读取 ECU 中的标定变量数据到标定平台,并可以对这些数据进行编辑修改,编辑后的数据又可以写入 ECU,从而达到修改 ECU 中标定参数的目的。功能完善且灵活方便的标定软件对整个汽车ECU 控制系统的开发起到事半功倍的效果。目前,一般的标定系统都是采用基于串行口的点对点的通信方式,这种通信方式具有很大的局限性,而且通信协议都不一样。在这个ECU 系统中,将采用 CAN 总线的通信方式和CCP(CAN Calibration Protocol)协议。
2 CCP 协议简介
1996 年6 月,欧洲ASAP 项目组发布了现行的2.0 版,它采用CAN 2.0B(11 位或29位ID)进行MCS(measurement and calibration system)与ECU 之间的通信[1]。该协议具有通用性强,适用范围广的特点,无论对8 位低速带CAN 的控制器,还是32 位高速带CAN 的控制器,均可满足工作要求。基于CCP 协议的ECU 标定采用主-从通信方式,主设备通过CAN 总线与多个从设备相连,其中主设备是测量标定系统MCS(Measurement CalibrationSystem),从设备是需要标定的ECU。根据CCP 协议,主设备首先与其中一个从设备建立逻辑链接, 建立逻辑连接后,主、从机之间所有的数据传递均由主机控制,从机执行主机命令后返回包含命令响应值或错误代码等信息的报文。
3 标定系统的实现
3.1 上位机部分
友好的人机页面对于标定工作的顺利进行是起决定性作用的,此标定系统的设计克服了以往大多数标定系统只能通过键盘对标定数据进行修改的局限性[2],在标定系统中除了表格编辑方式外,还将引入图形编辑方式。将标定变量数据转换成图形,将使标定员对于标定变量数据比如说修正曲线和 MAP 图有一个更直观了解,并且可以通过鼠标拖动对图形进行编辑修改,从而达到编辑修改标定变量数据的目的,这样大大方便了对于修正曲线和 MAP图类型标定变量的编辑。
在这里我们是采用 Visual C++完成标定页面的设计以及与下位机的通信。该标定系统除了具有对 ECU 的标定功能外,还引入了实时监测功能,从而可以很快得到标定操作的返回信息。如图所示,监测界面主要完成各种监测量数据的实时接收和显示功能。测量得到的数据以数字和图形两种方式显示出来,数据可以存储。历史数据可以从文件中读出来,进行离线分析。标定界面则是完成标定变量数据的显示、编辑修改以及上传下载功能。根据变量的不同类型,变量数据分别以参量、二维、三维的形式表示。
图 1 标定系统实现图
3.2 底层ECU 部分
而底层 ECU 部分,标定系统在这里采用的是Freescale 公司的MC9S12DP256,这是一款16 位CPU 及0.25 微米、高速、高性能5.0V FLASH 存储器技术的中档芯片。它具有25MHz的主频、256K 字节的FLASH 存储器、16 通道的8 位A/D 转换器以及多达5 个的高速CAN 控制器。其较高的性能价格比使其非常适合用于一些中高档汽车电子系列相关产品。同时其较简单的背景开发模式(BDM)使得开发成本进一步降低,也使得现场开发与系统升级变得更加方便。
需要标定的变量称为标定参数,标定定义也就是修改驻扎在ECU 内存中的变量的内容。根据标定参数所在不同地址空间( RAM、FLASH 或EEPROM) , 这里也就有了不同的标定方法。RAM EEPROM 标定的速度较块,但RAM 和EEPROM 空间有限,所需的标定参数的数目也就受到了限制,而FLASH 空间较大,但标定的速度相对较慢。这里考虑选择芯片的实际情况,选择了FLASH 标定的方法。当标定参数需要存放在FLASH 中时, 在ECU 上电初始化后, 程序首先将标定参数的初始值复制到RAM 中, 在标定软件中该段用来存放标定参数的RAM 称为Calibration RAM。标定过程中, 标定软件修改Calibration RAM 中的参数值。标定全部结束后, 再将该段RAM 中的内容复制回FLASH 中。
4 软件设计
标定系统的软件设计主要分为二个部分:CAN Driver 和CCP Driver,而这二个部分都是基于μC/OS-II 这种实时操作系统上运行。由于ECU 这里采用飞思卡尔的MC9S12DP256,因此可以直接应用芯片CAN 模块提供的接口,发送CAN 数据。CCP Driver 是标定系统的核心部分,它主要是通过调用CAN Driver 实现与上位机标定软件的通信,从而进行对ECU的在线标定。
4.1 CAN Driver
在这里我们采用的是μC/OS-II 这种实时操作系统,但在标定过程中,我们处理的数据量很大,通信速度也很快,CAN 接收到一条消息就产生一次中断,中断服务子程序,每次中断都要引起一次任务调度。CPU 大量的时间花在任务切换上,若CPU 还需处理其他事件,则可能出现接收缓冲寄存器接收溢出的错误,造成数据丢失。因此,在这里采用一种基于环形缓冲区的方式来实现CAN Driver。整个CAN Driver 由中断处理程序和底层驱动模块组成。中断处理程序在每次CAN 控制器完成收发时,唤醒驱动程序,进行下一步工作,设备相关程序通过对CAN 控制器寄存器的读写,完成对CAN 端口的配置和状态检测等工作,同时为设备无关软件和用户程序提供接口。而底层驱动模块则主要任务是结合收发消息缓冲区,为应用程序提供了接收和发送消息的接口函数。
(本文转自电子工程世界:http://www.eeworld.com.cn/qcdz/2010/0717/article_2293_1.html)
(1)中断处理程序
中断级程序的程序流程图如图 2 所示。首先根据不同的中断类别进入不同的中断级程序。若为接收完成中断,则清除中断源,将接收到的消息放入接收缓冲区;将该消息存入接收缓冲区存入指针所指向的地址,将该指针向下移动,接收缓冲区计数器加1,并发出信号量通知应用程序有新的消息已经接收到,若有任务正在等待CAN 上的新消息,则该任务进入就绪状态等待OS 的调度。
图2 中断级程序的程序流程图
若为发送完成中断,则将发送缓冲区的待发送消息读出;将有待发送消息且优先级最高的一个中读取最旧的消息,发送缓冲区计数器减1,发出信号量通知应用程序有一个消息被发出,并汇报当前发送缓冲区的状态;还应判断是否为最后一个待发送的消息,若不是,则清除中断源并将消息发送到总线上,若是最后一个,则禁止发送完成中断后发送该消息,将这个发送完成中断保留到应用程序下一次发送消息的时候允许并产生。
(2)底层驱动模块
底层驱动模块主要是为应用程序提供了接收和发送消息的接口函数。当接收消息时[4],如图3 实线所示,应用程序在信号量处等待;收到一个消息后,ISR从串行端口读入消息,将其存入环状缓冲区。然后ISR 发出信号量,通知在等待串口数据的任务已收到一个消息。等待任务收到信号量后,进入就绪状态,准备被OS 调度器激活。当内核调度该任务运行时,该任务从环状缓冲区中取出消息,完成接收消息的过程。
图3 缓冲区接收发送消息
发送消息的方法如图3 虚线所示。当发送环状缓冲区已满时,信号量作为指示,暂停发送任务。为发送消息,任务等待信号量。如果环状缓冲区未满,则任务继续向环状缓冲区存储欲发送的消息。如果存储的消息是缓冲区的第一个字节,则发送中断允许,中断程序准备启动。CAN 发送ISR 从环行缓冲区中取出最旧的消息,同时发送信号量,通知发送任务,表明环状缓冲区有空间接收另外的消息。接着ISR 将消息从CAN 端口发送到总线上。
4.2 CCP Driver
基于实时操作系统的CCP Driver,标定系统在这里是通过Command 处理机和DAQ 处理机两部分来实现的。
Command 处理机由一个系统任务来完成[5]。该任务在OS 初始化后就启动运行,识别CAN 网络上的CCP 主设备发送给该从设备的会话命令。根据命令做相应动作,并回送命令应答,完成会话。DAQ 处理机由1~n 个系统任务来完成。本项目支持对不同时间要求的监视参数设定不同的DAQ 周期,不同时间要求的监视参数填入不同的DAQ_List,每个DAQ_List 由一个任务完成周期发送。
Command 处理机在收到主设备要求启动某DAQ_List 命令时, 调用OS 函数OSTaskCreate()启动相应的任务,该任务每完成一次发送就调用OS 函数OSTimeDlyHMSM( )挂起一定的时间,这个时间就是主设备对这个DAQ_List 要求的发送周期。在收到主设备要求停止某DAQ_List 命令时,调用OS 函数OSTaskDel( )函数删除该任务。
(1)Command 处理机
Command 处理机主要是获取并解读主设备的CCP 命令,并执行该命令;命令执行完成后,向主设备发送应答;若执行时出错,应答中向主设备报错;若主设备命令要求对DAQ进行操作,则将该操作传达给DAQ 处理机,由DAQ 处理机完成DAQ 操作。
Command 处理机由一个RTOS 任务来完成,其示意性代码如下,GetMsg 函数为CAN 驱动程序的接收消息函数,调用此函数则等待获取CAN 端口接收到的消息帧。一旦接收到新的消息帧则函数返回,用户可通过&msg_command 获取该消息帧的内容。
void task (void * data) {
for( ; ; ) {
GetMsg(&msg_command); //等待并获取一个CCP 命令
CCP_Command (&msg_command); //将命令送给CCP 命令处理函数
}
}
(2)DAQ 处理机
DAQ 处理机的任务是根据主设备的需要,定时向CAN 总线上发送DAQ 数据。它由启动从设备的DAQ 发送、停止从设备的DAQ 发送、执行DAQ 循环发送的任务3 个部分构成。
启动或停止从设备的 DAQ 发送,由Command 处理机调用函数Start_DAQ (DAQ List
number ,)和Stop_DAQ (DAQ List number)来完成,该函数启动或停止相应的DAQ 发送任务,
其示意性代码如下:
Start_DAQ(INT8U DAQ_List_num) { //启动第n 个DAQ_List
DAQ_List[n].Started = 1;
DAQ_List[n].Prepared = 1;
OSTaskCreate (第n 个DAQ_List 的任务); //调用系统函数,创建DAQ 发送任务,
并使任务进入调度
}}
Stop_DAQ(INT8U DAQ_List_num) { //停止第n 个DAQ_List
DAQ_List[n].Started = 0;
DAQ_List[n].Prepared = 0;
OSTaskDel (第n 个DAQ_List 的任务); //调用系统函数,删除DAQ 发送任务
}
执行DAQ 循环发送的任务,需要按照ODT 设置把DAQ 数据发送到CAN 总线上,同时需要按照DAQ 周期要求循环执行,该任务示意性代码如下:
void DAQ_task ( ) {
for( ; ; ) {
CCP.Upload(0); //根据ODT 设置把DAQ 数据发送到CAN 总线上
OSTimeDlyHMSM(Period); //调用RTOS 函数,等待一个周期的时间
}
}
5 结束语
经过多次反复不断的实际调试,此 CCP 软件程序在系统上运行稳定可靠,实现了基于MC9S12DP256 上的FLASH 区的标定。
这种采用环形缓冲区以及结合实时操作系统的 CCP 软件程序设计,有效的避免在ECU标定过程中数据的丢失,并可以对多个ECU 同时进行在线标定,具有很强的实用价值。
免责声明/版权申明 Passiontech
所有文章为网上搜集或私下交流学习之用,任何涉及商业盈利目的均不得使用,否则产生的一切后果由您自己承担!
本站仅仅提供一个观摩学习的环境,将不对任何资源负法律责任。所有资源请在下载后24小时内删除。
若无意中侵犯到您的版权利益,请来信联系我们,我们会在收到信息三天内给予处理!