燃料电池控制系统

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

基于HCS12的实时嵌入式燃料电池控制系统

白日光3,1,萧蕴诗1,孙泽昌3,2

(1.同济大学控制工程与科学系,上海 200092;2.同济大学汽车学院,上海 200092;

3.同济大学摩托罗拉汽车电子联合实验室,上海 20092)

摘要:燃料电池控制器是燃料电池中非常关键的部分,对于燃料电池稳定而安全的工作有积极的作用。针对燃料电池控制中要求较高的实时性与可靠性,利用摩托罗拉16位单片机MC9S12DP256b把实时嵌入式系统UC/OS-II成功移植到控制中。本文结合HCS12单片机和Codewarrior编译器的特点详细介绍了内核的优化实现,并利用实例说明了嵌入式操作系统带来的优点。

关键词:UC/OS-II;燃料电池控制器(FCC);MC9S12DP256b;移植;内核

Real Time Kernel Fuel Cell Control System Based on HCS12

Bai Riguang3,1,Xiao Yunshi1,Sun Zechang3,2

(1. Department of Control Engineering & Science, Tongji University, Shanghai, 200092, China;

2. Automobile College, Tongji University, Shanghai, 200092,China;

3. Tongji University Motorola Automobile Electronic Laboratory, Shanghai, 200092, China)

Abstract: The Fuel Cell Controller (FCC) is an important part of Fuel Cell. It affects steady and safe running of Fuel Cell. Considering real time and reliability qualities of FCC, we port real time embedded operation system UC/OS-II to the controller using HCS12. With the characteristic of HCS12 single chip and Codewarrior, the paper introduces the implementation of the kernel in details, and shows the advantage of the embedded operation system by an example.

Key words: UC/OS-II; fuel cell controller (FCC); MC9S12DP256b; port; kernel

0 引言

随着汽车工业的发展,人类对传统能源(如原油)的需求日益扩大,从而带来空气污染和资源枯竭两大问题,燃料电池作为一种新型的绿色能源开始受到人类的关注。结合由同济大学承担的国家863电动汽车重大专项——燃料电池轿车项目,需要开发适用于质子交换膜燃料电池稳定而安全工作的燃料电池控制器。考虑到燃料电池控制器硬件资源的需求,研究中利用了摩托罗拉公司的16位单片机MC9S12DP256b。为了进一步满足控制中高可靠性与实时性的要求,把内核公开的UC/OS-II实时嵌入式操作系统移植到此单片机中,从而使开发具有更好的扩展性。本文首次把实时嵌入式操作系统应用到燃料电池控制中,取得了良好的效果。

基金项目:国家863电动汽车重大专项(2003AA501)作者简介:白日光(1980—),男,硕士生,主要从事燃料电池控制器,过程控制与计算机控制方向研究。

萧蕴诗(1946—),男,教授,博士生导师,主要研究方向为智能控制理论与系统。

孙泽昌(1953—),男,教授,博士生导师,主要研究方向为汽车电子。1 系统平台介绍

1.1 硬件MC9S12DP256b]1[

MC9S12DP256b是摩托罗拉16位单片机HCS12家族中的一员,它的处理单元采用了16位的STAR12 CPU。此单片机内嵌了很多资源,包括256K FLASH,4K EEPROM,12K RAM,8通道定时器以及多种通信接口。此单片机可通过单线BDM进行程序的编译,下载和在线调试。

1.2 软件平台Codewarrior

Codewarrior是Metrowerks公司开发的一个编程环境。这里使用的Codewarrior4.2是专门针对HCS12系列单片机开发的,他可以用来进行程序编辑,编译,连接和在线调试等多项功能,并支持多种语言功能,可在C中嵌入汇编程序。

1.3 嵌入式操作系统UC/OS-II内核]2[

UC/OS-II(Micro Control Operation System Two)是一种源代码公开的嵌入式操作系统, 程序绝大部分是用C语言写的, 带有少量的汇编程序, 并且有详细的说明和示例, 可移植、易调试, 稳定性与可靠性高, 功能也比较完善。在改进后的2.51版]3[中包括了任务管理,时间管理,任务间通信(消息,邮箱,信号量和标志)和内存管理等多项功能。

UC/OS-II的内核是占先式的,具有最高优先级的任务一旦准备就绪, 就能立刻得到CPU的控制权, 可以剥夺低优先级任务的CPU使用权, 处理系统最紧急的事务。

1.4 移植条件

一般来说,能移植UC/OS-II的CPU及其编译器必须满足以下条件:①用户的编译器能产生可重入性代码;②用C语言就可以打开和关闭中断;③CPU能产生定时中断,而且给用户留有自定义中断向量;

④具有一定的数据和代码空间,至少4K的ROM和2K 的RAM;⑤CPU有将堆栈指针和其他CPU寄存器读出和存储到堆栈和内存中的指令。对于以上条件,MC9S12DP256b和其编译器Codewarrior都能满足。

2 移植过程

图1 UC/OS-II 2.51版的软硬件结构体系图1显示了UC/OS-II 2.51版移植到MC9S12DP256b时的软硬件结构体系。应用程序软件使用Codewarrior编译器,硬件利用MC9S12DP256b 单片机。嵌入式系统UC/OS-II共由3部分组成,一部分是与处理器无关的代码,在移植中可直接使用,无需更改;一部分是与应用相关的代码,其中INCLUDES.H用来配置头文件,OS_CFG.H用来配置需要的UC/OS-II资源;另一部分就是处理器相关的代码,这部分是移植的重点,其中OS_CPU.H定义了与处理器相关的常量,宏和类型,OS_CPU_C.C中包括了与处理器相关的代码。在OS_CPU_C.C中共有五个重要的函数:OSStartHighRdy(), OSCtxSw(), OSIntCtxSw(), OSTaskStkInit(), OSTickISR()。这几个函数都是与STAR12 CPU的内部寄存器和堆栈处理有关联的,OSTickISR()还和MS9S12DP256b的时间模块有关联。

2.1 STAR12 CPU堆栈介绍

在移植中关键就是如何构造任务堆栈及如何在切换任务时调整堆栈指针,因而需要对STAR CPU的堆栈调用有详细的了解。STAR12 CPU的内部寄存器有:16位累加器D(也可分作两个8位累加器A和B),变址寄存器IX,变址寄存器IY,堆栈指针SP,程序计数器PC和8位条件码寄存器CCR。当中断发生时,所有的寄存器都会按一定顺序自动的保存到堆栈中,如图2所示。

图2 STAR12 CPU中断发生时的堆栈变化2.2 文件OS_CPU.H的移植

从图2可以看出,STAR12 CPU的堆栈指针是向下增长的,因而在OS_CPU.H中要宏定义对应变量为1。CPU的开关中断采用文献]2[中介绍的方法1,而定时中断采用有输出比较功能的TC7。此CPU 还提供了专门的软中断指令swi,这对于移植是非常有利的。下面列出了移植后的关键代码:

#define OS_STK_GROWTH 1

#define OS_ENTER_CRITICAL() __asm sei

#define OS_EXIT_CRITICAL() __asm cli

#define OS_TICK_OC 7

#define OS_TASK_SW() __asm swi

2.3函数OSTaskStkInit()的移植

函数OSTaskStkInit()的功能是初始化任务堆栈,在任务建立时会调用它。当多任务启动和任务切换时,会通过中断返回指令把已准备就绪的优先级最高的任务的堆栈内容返回。因而,必须模仿中断发生时的堆栈内容来初始化堆栈。下面显示了此函数移植后的关键代码:

INT16U *wstk; //字堆栈指针

INT16U *OffsetAddress; //任务偏址指针

INT8U *bstk; //字节堆栈指针

INT8U regPage; //任务页地址

wstk = (INT16U *)ptos; //堆栈栈顶

*--wstk = (INT16U)pdata; //数据参数地址OffsetAddress = (INT16U*)&task; //任务偏地址regPage = (INT8U)task; //任务页地址

*--wstk = (INT16U)*OffsetAddress; //偏址入栈

相关文档
最新文档