王俊璞,張東杰,李文魁
(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應用在代碼層級狀態機、事件的創建和使用等。
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);
溫度控制一般采用負反饋的控制方式,使用溫度傳感器將溫度信號轉換為電信號,然后經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活動狀態圖
本文選擇溫度傳感器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)