基于QPC状态机的温度控制方案设计
2016-08-31王俊璞张东杰李文魁
王俊璞,张东杰,李文魁
(1.上海交通大学 仪器科学与工程系,上海 200240;2.海军工程大学)
基于QPC状态机的温度控制方案设计
王俊璞1,张东杰1,李文魁2
(1.上海交通大学 仪器科学与工程系,上海 200240;2.海军工程大学)
QPC(Quantum Platform C)是一套软件框架,提供状态机和事件驱动编程功能。首先从编码角度研究了QPC应用编程,然后设计了一套温度控制方案,展示QPC状态机、事件驱动在嵌入式软件设计中的应用。最后将该方案在一套硬件平台进行了编码实现,达到了良好的温控效果。
QPC;状态机;事件驱动;温度控制
引 言
QPC是Miro Semak博士[1]设计的基于状态机和事件驱动编程的软件框架,包括事件处理器QEP(Quantum Event Processor)、实时框架QF(Quantum Framework)和调试组件QS(Quantum Spy)三部分。其中,QEP提供用户设计使用的状态机和事件结构,QF负责调度和运行用户创建的状态机,QS用于跟踪和收集状态机、事件等系统信息。
和嵌入式RTOS相比,使用QPC框架代码复用度更高,应用开发也更简单。使用RTOS时,用户主要工作是进行任务分解和任务执行逻辑设计,通过调用任务管理函数和任务通信函数的方式实现多任务运行。使用QPC时,用户主要工作是设计状态机和状态机之间的通信事件,通过扩展QPC状态机和事件的方式创建用户状态机和事件,然后启动QF运行这些状态机,实现系统功能。因此,使用QPC进行嵌入式开发需要了解QPC应用在代码层级状态机、事件的创建和使用等。
1 QPC应用编程
QPC主要提供基于状态机和事件驱动的编程机制,因此,相应的软件开发以设计状态机和事件为主,状态机用来分解系统并实现其功能,事件则实现状态机和状态机之间的通信。状态机由一个或多个状态组成,每个状态都可以响应特定的事件,并发送事件给自身或其他状态机。比如,一个标准键盘程序可以分解为大写输入状态和小写输入状态,当Caps键按下时(收到键盘事件,内容为Caps键),在两个状态之间切换;当字母键按下时,发送键盘事件以及大写或小写字母给相应程序。
1.1QPC状态机
QPC的状态机以活动(或活动对象)的概念和形式体现。活动继承于状态机,能够实现状态切换和响应事件等功能。
(1) 活动定义
QPC定义了默认的活动结构QActive,用户通过扩展QActive的方式自定义活动结构。如自定义A/D转换活动结构的代码如下:
typedef struct ADInspectorTag {
QActive super; //继承QPC活动
QTimeEvt timeEvtSample; //内嵌一个QPC定时器
} ADInspector; //A/D活动结构声明
定义好活动结构后,就可以直接定义活动了,代码如下:
ADInspector l_adInspector; //定义A/D活动(变量)
为了让用户定义的活动能够被QPC识别和运行,需要将其向下转型为QPC默认活动类型QActive,代码如下:QActive* const AO_ADInspector = (QActive*)&l_adInspector;
(2) 活动运行
运行QPC活动只需要调用活动的构造函数和启动函数,然后启动QPC实时框架QF就可以了。如进行A/D转换活动的过程代码如下:
ADInspector_ctor(); //构造函数中关联了A/D活动定义
QACTIVE_START(AO_ADInspector, 2U, l_adInspectorQSto, Q_DIM(l_adInspectorQSto),
(void *)0, 512, (QEvt *)0);
//活动优先级为2,事件序列为adInspectorQSto
return QF_run(); //启动QPC实时框架
(3) 状态分解
QPC活动由状态组成,通过状态响应事件和发送事件实现活动功能。如A/D活动可以分解为A/D检测状态ADInspector_polling和A/D标定状态ADInspector_calibrating,它们的定义代码如下:
QState ADInspector_polling(ADInspector * const me, QEvt const * const e);
QState ADInspector_calibrating(ADInspector * const me, QEvt const * const e);
在A/D检测状态,进行常规的A/D转换并把转换的结果以事件方式发送给相关的活动;在A/D标定状态,如果A/D芯片自带零位和满度校准功能,启动相关功能即可,如果没有,则把对应的信号数据作为零位和满度数据处理。
(4) 状态转换
QPC状态机的状态转换直接调用QPC转换函数即可,如在A/D检测状态收到启动标定事件,然后转换到标定状态的部分代码如下:
QState ADInspector_polling(ADInspector * const me, QEvt const * const e) {
……
switch (e->sig) {
case AD_CALI_START_SIG: {
QTimeEvt_disarm(&me->timeEvtSample);
//关闭采样定时器
status = Q_TRAN(&ADInspector_calibrating);
//转换到标定状态
break;
}
……
}
1.2QPC事件
(1) 事件结构
QPC定义了默认的事件结构QEvt(包含了一个信号变量sig,用来标记事件类型,事件类型是一个常量,由系统统一定义和管理),用户可以使用扩展的方式创建自定义事件,如A/D转换结束事件的结构代码可以定义如下:
typedef struct {
QEvt super; //继承QPC事件
uint32_t value;//A/D转换结果
} ADFinishEvt;
(2) 事件定义
QPC的事件是根据事件结构定义的变量,可以直接定义或使用QPC提供的事件生成函数动态定义。直接定义及填充事件内容的代码如下:
ADFinishEvt adEvt; //定义事件
adEvt.sig = AD_FINISH_SIG;
//标记事件类型为AD_FINISH_SIG
adEvt.value = 0x0; //事件参数value赋值
动态定义事件代码如下:
ADFinishEvt* pAdEvt;
//定义事件指针,指向一个事件
pAdEvt = Q_NEW(ADFinishEvt, AD_FINISH_SIG);
//申请一个AD_FINISH_SIG事件
pAdEvt->value = 0x0;
//事件参数value赋值
其中,事件动态定义使用的内存空间由QPC管理。
(3) 事件传递
按照事件传递方式,QPC事件类型可以分为POST事件和PUBLIC事件。POST事件直接发送给指定的活动,PUBLIC事件发送给订阅该事件的活动。它们的代码如下:
//发送事件pAdEvt给AO_TemperatureMonitor活动QActive_postFIFO(AO_TemperatureMonitor, (QEvt*)pAdEvt);
//订阅同步事件,事件类型为SYNCHRONOUS_SIG
QActive_subscribe((QActive *)me, SYNCHRONOUS_SIG);
//向订阅者发送事件synEvt,synEvt信号类型为
//SYNCHRO NOUS_SIG
QF_PUBLISH(synEvt, 0);
2 温度控制方案设计
温度控制一般采用负反馈的控制方式,使用温度传感器将温度信号转换为电信号,然后经A/D转换送到单片机处理,单片机根据温度设定值和当前温度值计算输出量,并控制执行器输出。
考虑到设计的通用性,本文设计3个QPC活动来实现温度控制:负责A/D转换的AO_ADInspector活动、负责温度变换和计算控制量的AO_TemperatureMonitor活动和负责执行器输出的AO_ActuatorManager活动。
AO_ADInspector活动用来封装及屏蔽A/D转换设计中的可变因素,包括高速或低速的A/D采样周期选择和A/D转换结束查询或中断判断方式;AO_TemperatureMonitor活动用来封装和屏蔽传感器到温度的变换计算以及PID、神经元等控制算法选择;AO_ActuatorManager活动用来封装和屏蔽开关量执行器或阀值执行器选择给设计带来的变化。
为了保证温度控制过程的实时性(温度采样、计算控制量和执行器输出同时)以及避免设计中的时序冲突,本文设计温度采样周期为A/D采样周期的整数倍,控制周期为温度采样周期的整数倍,例如A/D采样周期选择0.25 s,则温度采样周期可以选择1 s,控制周期可以选择4 s。使用这种方式时,AO_ADInspector活动、AO_TemperatureMonitor活动和AO_ActuatorManager活动运行时的基本关系如图1所示(图中省略AO前缀)。图中,AD_SAMPLE是温度采样信号,由QF定时发出,PWM_OFF信号用于开关量执行器的PWM控制(阀值控制则不需要)。
图1 温度控制活动序列图
AO_ADInspector活动、AO_TemperatureMonitor活动和AO_ActuatorManager活动的内部运行情况分别如图2~图4所示。其中,AO_ADInspector活动包括了标定处理,标定信号AD_CALIBRATE_START、AD_CALIBRATE_END、AD_CALIBRATE_ZERO和AD_CALIBRATE_FULL可以由键盘程序或者通信程序发出。
图2 AO_ADInspector活动状态图
3 实验验证
本文选择温度传感器PT1000、A/D转换芯片AD7793作为温度采样的硬件部分,具有加热和制冷功能的帕尔贴元件作为执行器,采用ARM Cortex-M3为内核的芯片STM32F103RC和位置式PID算法对本文温控方案进行编码实现。然后测量温度数据并绘制温控曲线如图5所示。其中,时刻0的温度为环境温度,20 ℃为目标温度,在700 s后温度稳定度达到0.01 ℃。
图3 AO_TemperatureMonitor活动状态图
图4 AO_ActuatorManager活动状态图
图5 温度测控曲线(稳态误差0.01℃)
结 语
本文使用QPC设计了温度控制方案,并在ARM芯片上进行了编码实现。整个软件开发过程和温度控制效果表明,QPC提供的状态机策略和事件驱动机制符合嵌入式产品的自然特征,能保证嵌入式产品软件设计、实现和运行的一致性,有利于保证产品稳定性和技术指标实现。同时,QPC框架的使用减少了软件设计和维护的工作量,提高了软件开发效率,增强了代码的稳定性和可维护性。
[1] Miro Samek.Practical UML STATECHARTS in C/C++,Event-Driven Programming for Embedded Systems[M].Second Edition.Amsterdam:Elsevier Inc,2008.
王俊璞(助理研究员)、李文魁(副教授),研究方向为导航与控制;张东杰(工程硕士),研究方向为智能仪器。
Temperature Control Scheme Based on QPC State Machine
Wang Junpu1,Zhang Dongjie1,Li Wenkui2
(1.Department of Instrument Science and Engineering,Shanghai Jiaotong University,Shanghai 200240,China;2.Naval University of Engineering)
QPC(Quantum Platform C) is a software framework with the functions of state machine and event driven programming.From the point of programming and application,this paper first studies the QPC.Then a scheme of temperature control is designed to show the usage of QPC state machine and event driven programming in the embedded software development.Finally,the scheme is implemented on the hardware platform,which achieves a satisfying result.
QPC;state machine;event driven;temperature control
TP31
A
(责任编辑:薛士然2015-11-04)