王俊璞,張東杰,李文魁
(1.上海交通大學(xué) 儀器科學(xué)與工程系,上海 200240;2.海軍工程大學(xué))
?
基于QPC狀態(tài)機(jī)的溫度控制方案設(shè)計
王俊璞1,張東杰1,李文魁2
(1.上海交通大學(xué) 儀器科學(xué)與工程系,上海 200240;2.海軍工程大學(xué))
QPC(Quantum Platform C)是一套軟件框架,提供狀態(tài)機(jī)和事件驅(qū)動編程功能。首先從編碼角度研究了QPC應(yīng)用編程,然后設(shè)計了一套溫度控制方案,展示QPC狀態(tài)機(jī)、事件驅(qū)動在嵌入式軟件設(shè)計中的應(yīng)用。最后將該方案在一套硬件平臺進(jìn)行了編碼實現(xiàn),達(dá)到了良好的溫控效果。
QPC;狀態(tài)機(jī);事件驅(qū)動;溫度控制
QPC是Miro Semak博士[1]設(shè)計的基于狀態(tài)機(jī)和事件驅(qū)動編程的軟件框架,包括事件處理器QEP(Quantum Event Processor)、實時框架QF(Quantum Framework)和調(diào)試組件QS(Quantum Spy)三部分。其中,QEP提供用戶設(shè)計使用的狀態(tài)機(jī)和事件結(jié)構(gòu),QF負(fù)責(zé)調(diào)度和運行用戶創(chuàng)建的狀態(tài)機(jī),QS用于跟蹤和收集狀態(tài)機(jī)、事件等系統(tǒng)信息。
和嵌入式RTOS相比,使用QPC框架代碼復(fù)用度更高,應(yīng)用開發(fā)也更簡單。使用RTOS時,用戶主要工作是進(jìn)行任務(wù)分解和任務(wù)執(zhí)行邏輯設(shè)計,通過調(diào)用任務(wù)管理函數(shù)和任務(wù)通信函數(shù)的方式實現(xiàn)多任務(wù)運行。使用QPC時,用戶主要工作是設(shè)計狀態(tài)機(jī)和狀態(tài)機(jī)之間的通信事件,通過擴(kuò)展QPC狀態(tài)機(jī)和事件的方式創(chuàng)建用戶狀態(tài)機(jī)和事件,然后啟動QF運行這些狀態(tài)機(jī),實現(xiàn)系統(tǒng)功能。因此,使用QPC進(jìn)行嵌入式開發(fā)需要了解QPC應(yīng)用在代碼層級狀態(tài)機(jī)、事件的創(chuàng)建和使用等。
QPC主要提供基于狀態(tài)機(jī)和事件驅(qū)動的編程機(jī)制,因此,相應(yīng)的軟件開發(fā)以設(shè)計狀態(tài)機(jī)和事件為主,狀態(tài)機(jī)用來分解系統(tǒng)并實現(xiàn)其功能,事件則實現(xiàn)狀態(tài)機(jī)和狀態(tài)機(jī)之間的通信。狀態(tài)機(jī)由一個或多個狀態(tài)組成,每個狀態(tài)都可以響應(yīng)特定的事件,并發(fā)送事件給自身或其他狀態(tài)機(jī)。比如,一個標(biāo)準(zhǔn)鍵盤程序可以分解為大寫輸入狀態(tài)和小寫輸入狀態(tài),當(dāng)Caps鍵按下時(收到鍵盤事件,內(nèi)容為Caps鍵),在兩個狀態(tài)之間切換;當(dāng)字母鍵按下時,發(fā)送鍵盤事件以及大寫或小寫字母給相應(yīng)程序。
1.1QPC狀態(tài)機(jī)
QPC的狀態(tài)機(jī)以活動(或活動對象)的概念和形式體現(xiàn)?;顒永^承于狀態(tài)機(jī),能夠?qū)崿F(xiàn)狀態(tài)切換和響應(yīng)事件等功能。
(1) 活動定義
QPC定義了默認(rèn)的活動結(jié)構(gòu)QActive,用戶通過擴(kuò)展QActive的方式自定義活動結(jié)構(gòu)。如自定義A/D轉(zhuǎn)換活動結(jié)構(gòu)的代碼如下:
typedef struct ADInspectorTag {
QActive super; //繼承QPC活動
QTimeEvt timeEvtSample; //內(nèi)嵌一個QPC定時器
} ADInspector; //A/D活動結(jié)構(gòu)聲明
定義好活動結(jié)構(gòu)后,就可以直接定義活動了,代碼如下:
ADInspector l_adInspector; //定義A/D活動(變量)
為了讓用戶定義的活動能夠被QPC識別和運行,需要將其向下轉(zhuǎn)型為QPC默認(rèn)活動類型QActive,代碼如下:QActive* const AO_ADInspector = (QActive*)&l_adInspector;
(2) 活動運行
運行QPC活動只需要調(diào)用活動的構(gòu)造函數(shù)和啟動函數(shù),然后啟動QPC實時框架QF就可以了。如進(jìn)行A/D轉(zhuǎn)換活動的過程代碼如下:
ADInspector_ctor(); //構(gòu)造函數(shù)中關(guān)聯(lián)了A/D活動定義
QACTIVE_START(AO_ADInspector, 2U, l_adInspectorQSto, Q_DIM(l_adInspectorQSto),
(void *)0, 512, (QEvt *)0);
//活動優(yōu)先級為2,事件序列為adInspectorQSto
return QF_run(); //啟動QPC實時框架
(3) 狀態(tài)分解
QPC活動由狀態(tài)組成,通過狀態(tài)響應(yīng)事件和發(fā)送事件實現(xiàn)活動功能。如A/D活動可以分解為A/D檢測狀態(tài)ADInspector_polling和A/D標(biāo)定狀態(tài)ADInspector_calibrating,它們的定義代碼如下:
QState ADInspector_polling(ADInspector * const me, QEvt const * const e);
QState ADInspector_calibrating(ADInspector * const me, QEvt const * const e);
在A/D檢測狀態(tài),進(jìn)行常規(guī)的A/D轉(zhuǎn)換并把轉(zhuǎn)換的結(jié)果以事件方式發(fā)送給相關(guān)的活動;在A/D標(biāo)定狀態(tài),如果A/D芯片自帶零位和滿度校準(zhǔn)功能,啟動相關(guān)功能即可,如果沒有,則把對應(yīng)的信號數(shù)據(jù)作為零位和滿度數(shù)據(jù)處理。
(4) 狀態(tài)轉(zhuǎn)換
QPC狀態(tài)機(jī)的狀態(tài)轉(zhuǎn)換直接調(diào)用QPC轉(zhuǎn)換函數(shù)即可,如在A/D檢測狀態(tài)收到啟動標(biāo)定事件,然后轉(zhuǎn)換到標(biāo)定狀態(tài)的部分代碼如下:
QState ADInspector_polling(ADInspector * const me, QEvt const * const e) {
……
switch (e->sig) {
case AD_CALI_START_SIG: {
QTimeEvt_disarm(&me->timeEvtSample);
//關(guān)閉采樣定時器
status = Q_TRAN(&ADInspector_calibrating);
//轉(zhuǎn)換到標(biāo)定狀態(tài)
break;
}
……
}
1.2QPC事件
(1) 事件結(jié)構(gòu)
QPC定義了默認(rèn)的事件結(jié)構(gòu)QEvt(包含了一個信號變量sig,用來標(biāo)記事件類型,事件類型是一個常量,由系統(tǒng)統(tǒng)一定義和管理),用戶可以使用擴(kuò)展的方式創(chuàng)建自定義事件,如A/D轉(zhuǎn)換結(jié)束事件的結(jié)構(gòu)代碼可以定義如下:
typedef struct {
QEvt super; //繼承QPC事件
uint32_t value;//A/D轉(zhuǎn)換結(jié)果
} ADFinishEvt;
(2) 事件定義
QPC的事件是根據(jù)事件結(jié)構(gòu)定義的變量,可以直接定義或使用QPC提供的事件生成函數(shù)動態(tài)定義。直接定義及填充事件內(nèi)容的代碼如下:
ADFinishEvt adEvt; //定義事件
adEvt.sig = AD_FINISH_SIG;
//標(biāo)記事件類型為AD_FINISH_SIG
adEvt.value = 0x0; //事件參數(shù)value賦值
動態(tài)定義事件代碼如下:
ADFinishEvt* pAdEvt;
//定義事件指針,指向一個事件
pAdEvt = Q_NEW(ADFinishEvt, AD_FINISH_SIG);
//申請一個AD_FINISH_SIG事件
pAdEvt->value = 0x0;
//事件參數(shù)value賦值
其中,事件動態(tài)定義使用的內(nèi)存空間由QPC管理。
(3) 事件傳遞
按照事件傳遞方式,QPC事件類型可以分為POST事件和PUBLIC事件。POST事件直接發(fā)送給指定的活動,PUBLIC事件發(fā)送給訂閱該事件的活動。它們的代碼如下:
//發(fā)送事件pAdEvt給AO_TemperatureMonitor活動QActive_postFIFO(AO_TemperatureMonitor, (QEvt*)pAdEvt);
//訂閱同步事件,事件類型為SYNCHRONOUS_SIG
QActive_subscribe((QActive *)me, SYNCHRONOUS_SIG);
//向訂閱者發(fā)送事件synEvt,synEvt信號類型為
//SYNCHRO NOUS_SIG
QF_PUBLISH(synEvt, 0);
溫度控制一般采用負(fù)反饋的控制方式,使用溫度傳感器將溫度信號轉(zhuǎn)換為電信號,然后經(jīng)A/D轉(zhuǎn)換送到單片機(jī)處理,單片機(jī)根據(jù)溫度設(shè)定值和當(dāng)前溫度值計算輸出量,并控制執(zhí)行器輸出。
考慮到設(shè)計的通用性,本文設(shè)計3個QPC活動來實現(xiàn)溫度控制:負(fù)責(zé)A/D轉(zhuǎn)換的AO_ADInspector活動、負(fù)責(zé)溫度變換和計算控制量的AO_TemperatureMonitor活動和負(fù)責(zé)執(zhí)行器輸出的AO_ActuatorManager活動。
AO_ADInspector活動用來封裝及屏蔽A/D轉(zhuǎn)換設(shè)計中的可變因素,包括高速或低速的A/D采樣周期選擇和A/D轉(zhuǎn)換結(jié)束查詢或中斷判斷方式;AO_TemperatureMonitor活動用來封裝和屏蔽傳感器到溫度的變換計算以及PID、神經(jīng)元等控制算法選擇;AO_ActuatorManager活動用來封裝和屏蔽開關(guān)量執(zhí)行器或閥值執(zhí)行器選擇給設(shè)計帶來的變化。
為了保證溫度控制過程的實時性(溫度采樣、計算控制量和執(zhí)行器輸出同時)以及避免設(shè)計中的時序沖突,本文設(shè)計溫度采樣周期為A/D采樣周期的整數(shù)倍,控制周期為溫度采樣周期的整數(shù)倍,例如A/D采樣周期選擇0.25 s,則溫度采樣周期可以選擇1 s,控制周期可以選擇4 s。使用這種方式時,AO_ADInspector活動、AO_TemperatureMonitor活動和AO_ActuatorManager活動運行時的基本關(guān)系如圖1所示(圖中省略AO前綴)。圖中,AD_SAMPLE是溫度采樣信號,由QF定時發(fā)出,PWM_OFF信號用于開關(guān)量執(zhí)行器的PWM控制(閥值控制則不需要)。
圖1 溫度控制活動序列圖
AO_ADInspector活動、AO_TemperatureMonitor活動和AO_ActuatorManager活動的內(nèi)部運行情況分別如圖2~圖4所示。其中,AO_ADInspector活動包括了標(biāo)定處理,標(biāo)定信號AD_CALIBRATE_START、AD_CALIBRATE_END、AD_CALIBRATE_ZERO和AD_CALIBRATE_FULL可以由鍵盤程序或者通信程序發(fā)出。
圖2 AO_ADInspector活動狀態(tài)圖
本文選擇溫度傳感器PT1000、A/D轉(zhuǎn)換芯片AD7793作為溫度采樣的硬件部分,具有加熱和制冷功能的帕爾貼元件作為執(zhí)行器,采用ARM Cortex-M3為內(nèi)核的芯片STM32F103RC和位置式PID算法對本文溫控方案進(jìn)行編碼實現(xiàn)。然后測量溫度數(shù)據(jù)并繪制溫控曲線如圖5所示。其中,時刻0的溫度為環(huán)境溫度,20 ℃為目標(biāo)溫度,在700 s后溫度穩(wěn)定度達(dá)到0.01 ℃。
圖3 AO_TemperatureMonitor活動狀態(tài)圖
圖4 AO_ActuatorManager活動狀態(tài)圖
圖5 溫度測控曲線(穩(wěn)態(tài)誤差0.01℃)
本文使用QPC設(shè)計了溫度控制方案,并在ARM芯片上進(jìn)行了編碼實現(xiàn)。整個軟件開發(fā)過程和溫度控制效果表明,QPC提供的狀態(tài)機(jī)策略和事件驅(qū)動機(jī)制符合嵌入式產(chǎn)品的自然特征,能保證嵌入式產(chǎn)品軟件設(shè)計、實現(xiàn)和運行的一致性,有利于保證產(chǎn)品穩(wěn)定性和技術(shù)指標(biāo)實現(xiàn)。同時,QPC框架的使用減少了軟件設(shè)計和維護(hù)的工作量,提高了軟件開發(fā)效率,增強(qiáng)了代碼的穩(wěn)定性和可維護(hù)性。
[1] Miro Samek.Practical UML STATECHARTS in C/C++,Event-Driven Programming for Embedded Systems[M].Second Edition.Amsterdam:Elsevier Inc,2008.
王俊璞(助理研究員)、李文魁(副教授),研究方向為導(dǎo)航與控制;張東杰(工程碩士),研究方向為智能儀器。
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
(責(zé)任編輯:薛士然2015-11-04)