王俊璞,張東杰,李文魁
(1.上海交通大學 儀器科學與工程系,上海 200240;2.海軍工程大學)
?
基于QPC狀態(tài)機的溫度控制方案設計
王俊璞1,張東杰1,李文魁2
(1.上海交通大學 儀器科學與工程系,上海 200240;2.海軍工程大學)
QPC(Quantum Platform C)是一套軟件框架,提供狀態(tài)機和事件驅動編程功能。首先從編碼角度研究了QPC應用編程,然后設計了一套溫度控制方案,展示QPC狀態(tài)機、事件驅動在嵌入式軟件設計中的應用。最后將該方案在一套硬件平臺進行了編碼實現(xiàn),達到了良好的溫控效果。
QPC;狀態(tài)機;事件驅動;溫度控制
QPC是Miro Semak博士[1]設計的基于狀態(tài)機和事件驅動編程的軟件框架,包括事件處理器QEP(Quantum Event Processor)、實時框架QF(Quantum Framework)和調試組件QS(Quantum Spy)三部分。其中,QEP提供用戶設計使用的狀態(tài)機和事件結構,QF負責調度和運行用戶創(chuàng)建的狀態(tài)機,QS用于跟蹤和收集狀態(tài)機、事件等系統(tǒng)信息。
和嵌入式RTOS相比,使用QPC框架代碼復用度更高,應用開發(fā)也更簡單。使用RTOS時,用戶主要工作是進行任務分解和任務執(zhí)行邏輯設計,通過調用任務管理函數(shù)和任務通信函數(shù)的方式實現(xiàn)多任務運行。使用QPC時,用戶主要工作是設計狀態(tài)機和狀態(tài)機之間的通信事件,通過擴展QPC狀態(tài)機和事件的方式創(chuàng)建用戶狀態(tài)機和事件,然后啟動QF運行這些狀態(tài)機,實現(xiàn)系統(tǒng)功能。因此,使用QPC進行嵌入式開發(fā)需要了解QPC應用在代碼層級狀態(tài)機、事件的創(chuàng)建和使用等。
QPC主要提供基于狀態(tài)機和事件驅動的編程機制,因此,相應的軟件開發(fā)以設計狀態(tài)機和事件為主,狀態(tài)機用來分解系統(tǒng)并實現(xiàn)其功能,事件則實現(xiàn)狀態(tài)機和狀態(tài)機之間的通信。狀態(tài)機由一個或多個狀態(tài)組成,每個狀態(tài)都可以響應特定的事件,并發(fā)送事件給自身或其他狀態(tài)機。比如,一個標準鍵盤程序可以分解為大寫輸入狀態(tài)和小寫輸入狀態(tài),當Caps鍵按下時(收到鍵盤事件,內容為Caps鍵),在兩個狀態(tài)之間切換;當字母鍵按下時,發(fā)送鍵盤事件以及大寫或小寫字母給相應程序。
1.1QPC狀態(tài)機
QPC的狀態(tài)機以活動(或活動對象)的概念和形式體現(xiàn)?;顒永^承于狀態(tài)機,能夠實現(xiàn)狀態(tài)切換和響應事件等功能。
(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活動只需要調用活動的構造函數(shù)和啟動函數(shù),然后啟動QPC實時框架QF就可以了。如進行A/D轉換活動的過程代碼如下:
ADInspector_ctor(); //構造函數(shù)中關聯(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)響應事件和發(fā)送事件實現(xiàn)活動功能。如A/D活動可以分解為A/D檢測狀態(tài)ADInspector_polling和A/D標定狀態(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),進行常規(guī)的A/D轉換并把轉換的結果以事件方式發(fā)送給相關的活動;在A/D標定狀態(tài),如果A/D芯片自帶零位和滿度校準功能,啟動相關功能即可,如果沒有,則把對應的信號數(shù)據(jù)作為零位和滿度數(shù)據(jù)處理。
(4) 狀態(tài)轉換
QPC狀態(tài)機的狀態(tài)轉換直接調用QPC轉換函數(shù)即可,如在A/D檢測狀態(tài)收到啟動標定事件,然后轉換到標定狀態(tài)的部分代碼如下:
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);
//轉換到標定狀態(tài)
break;
}
……
}
1.2QPC事件
(1) 事件結構
QPC定義了默認的事件結構QEvt(包含了一個信號變量sig,用來標記事件類型,事件類型是一個常量,由系統(tǒng)統(tǒng)一定義和管理),用戶可以使用擴展的方式創(chuàng)建自定義事件,如A/D轉換結束事件的結構代碼可以定義如下:
typedef struct {
QEvt super; //繼承QPC事件
uint32_t value;//A/D轉換結果
} ADFinishEvt;
(2) 事件定義
QPC的事件是根據(jù)事件結構定義的變量,可以直接定義或使用QPC提供的事件生成函數(shù)動態(tài)定義。直接定義及填充事件內容的代碼如下:
ADFinishEvt adEvt; //定義事件
adEvt.sig = AD_FINISH_SIG;
//標記事件類型為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)定義使用的內存空間由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);
溫度控制一般采用負反饋的控制方式,使用溫度傳感器將溫度信號轉換為電信號,然后經(jīng)A/D轉換送到單片機處理,單片機根據(jù)溫度設定值和當前溫度值計算輸出量,并控制執(zhí)行器輸出。
考慮到設計的通用性,本文設計3個QPC活動來實現(xiàn)溫度控制:負責A/D轉換的AO_ADInspector活動、負責溫度變換和計算控制量的AO_TemperatureMonitor活動和負責執(zhí)行器輸出的AO_ActuatorManager活動。
AO_ADInspector活動用來封裝及屏蔽A/D轉換設計中的可變因素,包括高速或低速的A/D采樣周期選擇和A/D轉換結束查詢或中斷判斷方式;AO_TemperatureMonitor活動用來封裝和屏蔽傳感器到溫度的變換計算以及PID、神經(jīng)元等控制算法選擇;AO_ActuatorManager活動用來封裝和屏蔽開關量執(zhí)行器或閥值執(zhí)行器選擇給設計帶來的變化。
為了保證溫度控制過程的實時性(溫度采樣、計算控制量和執(zhí)行器輸出同時)以及避免設計中的時序沖突,本文設計溫度采樣周期為A/D采樣周期的整數(shù)倍,控制周期為溫度采樣周期的整數(shù)倍,例如A/D采樣周期選擇0.25 s,則溫度采樣周期可以選擇1 s,控制周期可以選擇4 s。使用這種方式時,AO_ADInspector活動、AO_TemperatureMonitor活動和AO_ActuatorManager活動運行時的基本關系如圖1所示(圖中省略AO前綴)。圖中,AD_SAMPLE是溫度采樣信號,由QF定時發(fā)出,PWM_OFF信號用于開關量執(zhí)行器的PWM控制(閥值控制則不需要)。

圖1 溫度控制活動序列圖
AO_ADInspector活動、AO_TemperatureMonitor活動和AO_ActuatorManager活動的內部運行情況分別如圖2~圖4所示。其中,AO_ADInspector活動包括了標定處理,標定信號AD_CALIBRATE_START、AD_CALIBRATE_END、AD_CALIBRATE_ZERO和AD_CALIBRATE_FULL可以由鍵盤程序或者通信程序發(fā)出。

圖2 AO_ADInspector活動狀態(tài)圖
本文選擇溫度傳感器PT1000、A/D轉換芯片AD7793作為溫度采樣的硬件部分,具有加熱和制冷功能的帕爾貼元件作為執(zhí)行器,采用ARM Cortex-M3為內核的芯片STM32F103RC和位置式PID算法對本文溫控方案進行編碼實現(xiàn)。然后測量溫度數(shù)據(jù)并繪制溫控曲線如圖5所示。其中,時刻0的溫度為環(huán)境溫度,20 ℃為目標溫度,在700 s后溫度穩(wěn)定度達到0.01 ℃。

圖3 AO_TemperatureMonitor活動狀態(tài)圖

圖4 AO_ActuatorManager活動狀態(tài)圖

圖5 溫度測控曲線(穩(wěn)態(tài)誤差0.01℃)
本文使用QPC設計了溫度控制方案,并在ARM芯片上進行了編碼實現(xiàn)。整個軟件開發(fā)過程和溫度控制效果表明,QPC提供的狀態(tài)機策略和事件驅動機制符合嵌入式產品的自然特征,能保證嵌入式產品軟件設計、實現(xiàn)和運行的一致性,有利于保證產品穩(wěn)定性和技術指標實現(xiàn)。同時,QPC框架的使用減少了軟件設計和維護的工作量,提高了軟件開發(fā)效率,增強了代碼的穩(wěn)定性和可維護性。
[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)